OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/media_stream_impl.h" | 5 #include "content/renderer/media/media_stream_impl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" | 27 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" |
28 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 28 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
29 #include "third_party/WebKit/public/web/WebDocument.h" | 29 #include "third_party/WebKit/public/web/WebDocument.h" |
30 #include "third_party/WebKit/public/web/WebFrame.h" | 30 #include "third_party/WebKit/public/web/WebFrame.h" |
31 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" | 31 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" |
32 | 32 |
33 namespace content { | 33 namespace content { |
34 namespace { | 34 namespace { |
35 | 35 |
36 std::string GetStreamConstraint( | 36 std::string GetStreamConstraint( |
37 const WebKit::WebMediaConstraints& constraints, const std::string& key, | 37 const blink::WebMediaConstraints& constraints, const std::string& key, |
38 bool is_mandatory) { | 38 bool is_mandatory) { |
39 if (constraints.isNull()) | 39 if (constraints.isNull()) |
40 return std::string(); | 40 return std::string(); |
41 | 41 |
42 WebKit::WebString value; | 42 blink::WebString value; |
43 if (is_mandatory) { | 43 if (is_mandatory) { |
44 constraints.getMandatoryConstraintValue(UTF8ToUTF16(key), value); | 44 constraints.getMandatoryConstraintValue(UTF8ToUTF16(key), value); |
45 } else { | 45 } else { |
46 constraints.getOptionalConstraintValue(UTF8ToUTF16(key), value); | 46 constraints.getOptionalConstraintValue(UTF8ToUTF16(key), value); |
47 } | 47 } |
48 return UTF16ToUTF8(value); | 48 return UTF16ToUTF8(value); |
49 } | 49 } |
50 | 50 |
51 void UpdateRequestOptions( | 51 void UpdateRequestOptions( |
52 const WebKit::WebUserMediaRequest& user_media_request, | 52 const blink::WebUserMediaRequest& user_media_request, |
53 StreamOptions* options) { | 53 StreamOptions* options) { |
54 if (options->audio_type != content::MEDIA_NO_SERVICE) { | 54 if (options->audio_type != content::MEDIA_NO_SERVICE) { |
55 std::string audio_stream_source = GetStreamConstraint( | 55 std::string audio_stream_source = GetStreamConstraint( |
56 user_media_request.audioConstraints(), kMediaStreamSource, true); | 56 user_media_request.audioConstraints(), kMediaStreamSource, true); |
57 if (audio_stream_source == kMediaStreamSourceTab) { | 57 if (audio_stream_source == kMediaStreamSourceTab) { |
58 options->audio_type = content::MEDIA_TAB_AUDIO_CAPTURE; | 58 options->audio_type = content::MEDIA_TAB_AUDIO_CAPTURE; |
59 options->audio_device_id = GetStreamConstraint( | 59 options->audio_device_id = GetStreamConstraint( |
60 user_media_request.audioConstraints(), | 60 user_media_request.audioConstraints(), |
61 kMediaStreamSourceId, true); | 61 kMediaStreamSourceId, true); |
62 } else if (audio_stream_source == kMediaStreamSourceSystem) { | 62 } else if (audio_stream_source == kMediaStreamSourceSystem) { |
(...skipping 18 matching lines...) Expand all Loading... |
81 options->video_device_id = GetStreamConstraint( | 81 options->video_device_id = GetStreamConstraint( |
82 user_media_request.videoConstraints(), | 82 user_media_request.videoConstraints(), |
83 kMediaStreamSourceId, true); | 83 kMediaStreamSourceId, true); |
84 } | 84 } |
85 } | 85 } |
86 } | 86 } |
87 | 87 |
88 static int g_next_request_id = 0; | 88 static int g_next_request_id = 0; |
89 | 89 |
90 webrtc::MediaStreamInterface* GetNativeMediaStream( | 90 webrtc::MediaStreamInterface* GetNativeMediaStream( |
91 const WebKit::WebMediaStream& web_stream) { | 91 const blink::WebMediaStream& web_stream) { |
92 content::MediaStreamExtraData* extra_data = | 92 content::MediaStreamExtraData* extra_data = |
93 static_cast<content::MediaStreamExtraData*>(web_stream.extraData()); | 93 static_cast<content::MediaStreamExtraData*>(web_stream.extraData()); |
94 if (!extra_data) | 94 if (!extra_data) |
95 return NULL; | 95 return NULL; |
96 return extra_data->stream().get(); | 96 return extra_data->stream().get(); |
97 } | 97 } |
98 | 98 |
99 void GetDefaultOutputDeviceParams( | 99 void GetDefaultOutputDeviceParams( |
100 int* output_sample_rate, int* output_buffer_size) { | 100 int* output_sample_rate, int* output_buffer_size) { |
101 // Fetch the default audio output hardware config. | 101 // Fetch the default audio output hardware config. |
102 media::AudioHardwareConfig* hardware_config = | 102 media::AudioHardwareConfig* hardware_config = |
103 RenderThreadImpl::current()->GetAudioHardwareConfig(); | 103 RenderThreadImpl::current()->GetAudioHardwareConfig(); |
104 *output_sample_rate = hardware_config->GetOutputSampleRate(); | 104 *output_sample_rate = hardware_config->GetOutputSampleRate(); |
105 *output_buffer_size = hardware_config->GetOutputBufferSize(); | 105 *output_buffer_size = hardware_config->GetOutputBufferSize(); |
106 } | 106 } |
107 | 107 |
108 void RemoveSource(const WebKit::WebMediaStreamSource& source, | 108 void RemoveSource(const blink::WebMediaStreamSource& source, |
109 std::vector<WebKit::WebMediaStreamSource>* sources) { | 109 std::vector<blink::WebMediaStreamSource>* sources) { |
110 for (std::vector<WebKit::WebMediaStreamSource>::iterator it = | 110 for (std::vector<blink::WebMediaStreamSource>::iterator it = |
111 sources->begin(); | 111 sources->begin(); |
112 it != sources->end(); ++it) { | 112 it != sources->end(); ++it) { |
113 if (source.id() == it->id()) { | 113 if (source.id() == it->id()) { |
114 sources->erase(it); | 114 sources->erase(it); |
115 return; | 115 return; |
116 } | 116 } |
117 } | 117 } |
118 } | 118 } |
119 | 119 |
120 } // namespace | 120 } // namespace |
121 | 121 |
122 MediaStreamImpl::MediaStreamImpl( | 122 MediaStreamImpl::MediaStreamImpl( |
123 RenderView* render_view, | 123 RenderView* render_view, |
124 MediaStreamDispatcher* media_stream_dispatcher, | 124 MediaStreamDispatcher* media_stream_dispatcher, |
125 MediaStreamDependencyFactory* dependency_factory) | 125 MediaStreamDependencyFactory* dependency_factory) |
126 : RenderViewObserver(render_view), | 126 : RenderViewObserver(render_view), |
127 dependency_factory_(dependency_factory), | 127 dependency_factory_(dependency_factory), |
128 media_stream_dispatcher_(media_stream_dispatcher) { | 128 media_stream_dispatcher_(media_stream_dispatcher) { |
129 } | 129 } |
130 | 130 |
131 MediaStreamImpl::~MediaStreamImpl() { | 131 MediaStreamImpl::~MediaStreamImpl() { |
132 } | 132 } |
133 | 133 |
134 void MediaStreamImpl::requestUserMedia( | 134 void MediaStreamImpl::requestUserMedia( |
135 const WebKit::WebUserMediaRequest& user_media_request) { | 135 const blink::WebUserMediaRequest& user_media_request) { |
136 // Save histogram data so we can see how much GetUserMedia is used. | 136 // Save histogram data so we can see how much GetUserMedia is used. |
137 // The histogram counts the number of calls to the JS API | 137 // The histogram counts the number of calls to the JS API |
138 // webGetUserMedia. | 138 // webGetUserMedia. |
139 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); | 139 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); |
140 DCHECK(CalledOnValidThread()); | 140 DCHECK(CalledOnValidThread()); |
141 int request_id = g_next_request_id++; | 141 int request_id = g_next_request_id++; |
142 StreamOptions options(MEDIA_NO_SERVICE, MEDIA_NO_SERVICE); | 142 StreamOptions options(MEDIA_NO_SERVICE, MEDIA_NO_SERVICE); |
143 WebKit::WebFrame* frame = NULL; | 143 blink::WebFrame* frame = NULL; |
144 GURL security_origin; | 144 GURL security_origin; |
145 bool enable_automatic_output_device_selection = false; | 145 bool enable_automatic_output_device_selection = false; |
146 | 146 |
147 // |user_media_request| can't be mocked. So in order to test at all we check | 147 // |user_media_request| can't be mocked. So in order to test at all we check |
148 // if it isNull. | 148 // if it isNull. |
149 if (user_media_request.isNull()) { | 149 if (user_media_request.isNull()) { |
150 // We are in a test. | 150 // We are in a test. |
151 options.audio_type = MEDIA_DEVICE_AUDIO_CAPTURE; | 151 options.audio_type = MEDIA_DEVICE_AUDIO_CAPTURE; |
152 options.video_type = MEDIA_DEVICE_VIDEO_CAPTURE; | 152 options.video_type = MEDIA_DEVICE_VIDEO_CAPTURE; |
153 } else { | 153 } else { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 enable_automatic_output_device_selection)); | 193 enable_automatic_output_device_selection)); |
194 | 194 |
195 media_stream_dispatcher_->GenerateStream( | 195 media_stream_dispatcher_->GenerateStream( |
196 request_id, | 196 request_id, |
197 AsWeakPtr(), | 197 AsWeakPtr(), |
198 options, | 198 options, |
199 security_origin); | 199 security_origin); |
200 } | 200 } |
201 | 201 |
202 void MediaStreamImpl::cancelUserMediaRequest( | 202 void MediaStreamImpl::cancelUserMediaRequest( |
203 const WebKit::WebUserMediaRequest& user_media_request) { | 203 const blink::WebUserMediaRequest& user_media_request) { |
204 DCHECK(CalledOnValidThread()); | 204 DCHECK(CalledOnValidThread()); |
205 UserMediaRequestInfo* request = FindUserMediaRequestInfo(user_media_request); | 205 UserMediaRequestInfo* request = FindUserMediaRequestInfo(user_media_request); |
206 if (request) { | 206 if (request) { |
207 // We can't abort the stream generation process. | 207 // We can't abort the stream generation process. |
208 // Instead, erase the request. Once the stream is generated we will stop the | 208 // Instead, erase the request. Once the stream is generated we will stop the |
209 // stream if the request does not exist. | 209 // stream if the request does not exist. |
210 DeleteUserMediaRequestInfo(request); | 210 DeleteUserMediaRequestInfo(request); |
211 } | 211 } |
212 } | 212 } |
213 | 213 |
214 WebKit::WebMediaStream MediaStreamImpl::GetMediaStream( | 214 blink::WebMediaStream MediaStreamImpl::GetMediaStream( |
215 const GURL& url) { | 215 const GURL& url) { |
216 return WebKit::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url); | 216 return blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url); |
217 } | 217 } |
218 | 218 |
219 bool MediaStreamImpl::IsMediaStream(const GURL& url) { | 219 bool MediaStreamImpl::IsMediaStream(const GURL& url) { |
220 WebKit::WebMediaStream web_stream( | 220 blink::WebMediaStream web_stream( |
221 WebKit::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url)); | 221 blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url)); |
222 | 222 |
223 if (web_stream.isNull() || !web_stream.extraData()) | 223 if (web_stream.isNull() || !web_stream.extraData()) |
224 return false; // This is not a valid stream. | 224 return false; // This is not a valid stream. |
225 | 225 |
226 webrtc::MediaStreamInterface* stream = GetNativeMediaStream(web_stream); | 226 webrtc::MediaStreamInterface* stream = GetNativeMediaStream(web_stream); |
227 return (stream && | 227 return (stream && |
228 (!stream->GetVideoTracks().empty() || !stream->GetAudioTracks().empty())); | 228 (!stream->GetVideoTracks().empty() || !stream->GetAudioTracks().empty())); |
229 } | 229 } |
230 | 230 |
231 scoped_refptr<VideoFrameProvider> | 231 scoped_refptr<VideoFrameProvider> |
232 MediaStreamImpl::GetVideoFrameProvider( | 232 MediaStreamImpl::GetVideoFrameProvider( |
233 const GURL& url, | 233 const GURL& url, |
234 const base::Closure& error_cb, | 234 const base::Closure& error_cb, |
235 const VideoFrameProvider::RepaintCB& repaint_cb) { | 235 const VideoFrameProvider::RepaintCB& repaint_cb) { |
236 DCHECK(CalledOnValidThread()); | 236 DCHECK(CalledOnValidThread()); |
237 WebKit::WebMediaStream web_stream(GetMediaStream(url)); | 237 blink::WebMediaStream web_stream(GetMediaStream(url)); |
238 | 238 |
239 if (web_stream.isNull() || !web_stream.extraData()) | 239 if (web_stream.isNull() || !web_stream.extraData()) |
240 return NULL; // This is not a valid stream. | 240 return NULL; // This is not a valid stream. |
241 | 241 |
242 DVLOG(1) << "MediaStreamImpl::GetVideoFrameProvider stream:" | 242 DVLOG(1) << "MediaStreamImpl::GetVideoFrameProvider stream:" |
243 << UTF16ToUTF8(web_stream.id()); | 243 << UTF16ToUTF8(web_stream.id()); |
244 | 244 |
245 webrtc::MediaStreamInterface* stream = GetNativeMediaStream(web_stream); | 245 webrtc::MediaStreamInterface* stream = GetNativeMediaStream(web_stream); |
246 if (stream) | 246 if (stream) |
247 return CreateVideoFrameProvider(stream, error_cb, repaint_cb); | 247 return CreateVideoFrameProvider(stream, error_cb, repaint_cb); |
248 NOTREACHED(); | 248 NOTREACHED(); |
249 return NULL; | 249 return NULL; |
250 } | 250 } |
251 | 251 |
252 scoped_refptr<MediaStreamAudioRenderer> | 252 scoped_refptr<MediaStreamAudioRenderer> |
253 MediaStreamImpl::GetAudioRenderer(const GURL& url) { | 253 MediaStreamImpl::GetAudioRenderer(const GURL& url) { |
254 DCHECK(CalledOnValidThread()); | 254 DCHECK(CalledOnValidThread()); |
255 WebKit::WebMediaStream web_stream(GetMediaStream(url)); | 255 blink::WebMediaStream web_stream(GetMediaStream(url)); |
256 | 256 |
257 if (web_stream.isNull() || !web_stream.extraData()) | 257 if (web_stream.isNull() || !web_stream.extraData()) |
258 return NULL; // This is not a valid stream. | 258 return NULL; // This is not a valid stream. |
259 | 259 |
260 DVLOG(1) << "MediaStreamImpl::GetAudioRenderer stream:" | 260 DVLOG(1) << "MediaStreamImpl::GetAudioRenderer stream:" |
261 << UTF16ToUTF8(web_stream.id()); | 261 << UTF16ToUTF8(web_stream.id()); |
262 | 262 |
263 MediaStreamExtraData* extra_data = | 263 MediaStreamExtraData* extra_data = |
264 static_cast<MediaStreamExtraData*>(web_stream.extraData()); | 264 static_cast<MediaStreamExtraData*>(web_stream.extraData()); |
265 | 265 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 device_it != video_array.end(); ++device_it) { | 313 device_it != video_array.end(); ++device_it) { |
314 if (!FindLocalSource(*device_it)) | 314 if (!FindLocalSource(*device_it)) |
315 media_stream_dispatcher_->StopStreamDevice(*device_it); | 315 media_stream_dispatcher_->StopStreamDevice(*device_it); |
316 } | 316 } |
317 | 317 |
318 DVLOG(1) << "Request ID not found"; | 318 DVLOG(1) << "Request ID not found"; |
319 return; | 319 return; |
320 } | 320 } |
321 request_info->generated = true; | 321 request_info->generated = true; |
322 | 322 |
323 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_source_vector( | 323 blink::WebVector<blink::WebMediaStreamSource> audio_source_vector( |
324 audio_array.size()); | 324 audio_array.size()); |
325 | 325 |
326 StreamDeviceInfoArray overridden_audio_array = audio_array; | 326 StreamDeviceInfoArray overridden_audio_array = audio_array; |
327 if (!request_info->enable_automatic_output_device_selection) { | 327 if (!request_info->enable_automatic_output_device_selection) { |
328 // If the GetUserMedia request did not explicitly set the constraint | 328 // If the GetUserMedia request did not explicitly set the constraint |
329 // kMediaStreamRenderToAssociatedSink, the output device parameters must | 329 // kMediaStreamRenderToAssociatedSink, the output device parameters must |
330 // be removed. | 330 // be removed. |
331 for (StreamDeviceInfoArray::iterator it = overridden_audio_array.begin(); | 331 for (StreamDeviceInfoArray::iterator it = overridden_audio_array.begin(); |
332 it != overridden_audio_array.end(); ++it) { | 332 it != overridden_audio_array.end(); ++it) { |
333 it->device.matched_output_device_id = ""; | 333 it->device.matched_output_device_id = ""; |
334 it->device.matched_output = MediaStreamDevice::AudioDeviceParameters(); | 334 it->device.matched_output = MediaStreamDevice::AudioDeviceParameters(); |
335 } | 335 } |
336 } | 336 } |
337 CreateWebKitSourceVector(label, overridden_audio_array, | 337 CreateWebKitSourceVector(label, overridden_audio_array, |
338 WebKit::WebMediaStreamSource::TypeAudio, | 338 blink::WebMediaStreamSource::TypeAudio, |
339 request_info->frame, | 339 request_info->frame, |
340 audio_source_vector); | 340 audio_source_vector); |
341 | 341 |
342 WebKit::WebVector<WebKit::WebMediaStreamSource> video_source_vector( | 342 blink::WebVector<blink::WebMediaStreamSource> video_source_vector( |
343 video_array.size()); | 343 video_array.size()); |
344 CreateWebKitSourceVector(label, video_array, | 344 CreateWebKitSourceVector(label, video_array, |
345 WebKit::WebMediaStreamSource::TypeVideo, | 345 blink::WebMediaStreamSource::TypeVideo, |
346 request_info->frame, | 346 request_info->frame, |
347 video_source_vector); | 347 video_source_vector); |
348 WebKit::WebUserMediaRequest* request = &(request_info->request); | 348 blink::WebUserMediaRequest* request = &(request_info->request); |
349 WebKit::WebString webkit_id = UTF8ToUTF16(label); | 349 blink::WebString webkit_id = UTF8ToUTF16(label); |
350 WebKit::WebMediaStream* web_stream = &(request_info->web_stream); | 350 blink::WebMediaStream* web_stream = &(request_info->web_stream); |
351 | 351 |
352 WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_track_vector( | 352 blink::WebVector<blink::WebMediaStreamTrack> audio_track_vector( |
353 audio_array.size()); | 353 audio_array.size()); |
354 for (size_t i = 0; i < audio_track_vector.size(); ++i) { | 354 for (size_t i = 0; i < audio_track_vector.size(); ++i) { |
355 audio_track_vector[i].initialize(audio_source_vector[i]); | 355 audio_track_vector[i].initialize(audio_source_vector[i]); |
356 request_info->sources.push_back(audio_source_vector[i]); | 356 request_info->sources.push_back(audio_source_vector[i]); |
357 } | 357 } |
358 | 358 |
359 WebKit::WebVector<WebKit::WebMediaStreamTrack> video_track_vector( | 359 blink::WebVector<blink::WebMediaStreamTrack> video_track_vector( |
360 video_array.size()); | 360 video_array.size()); |
361 for (size_t i = 0; i < video_track_vector.size(); ++i) { | 361 for (size_t i = 0; i < video_track_vector.size(); ++i) { |
362 video_track_vector[i].initialize(video_source_vector[i]); | 362 video_track_vector[i].initialize(video_source_vector[i]); |
363 request_info->sources.push_back(video_source_vector[i]); | 363 request_info->sources.push_back(video_source_vector[i]); |
364 } | 364 } |
365 | 365 |
366 web_stream->initialize(webkit_id, audio_track_vector, | 366 web_stream->initialize(webkit_id, audio_track_vector, |
367 video_track_vector); | 367 video_track_vector); |
368 | 368 |
369 // WebUserMediaRequest don't have an implementation in unit tests. | 369 // WebUserMediaRequest don't have an implementation in unit tests. |
370 // Therefore we need to check for isNull here. | 370 // Therefore we need to check for isNull here. |
371 WebKit::WebMediaConstraints audio_constraints = request->isNull() ? | 371 blink::WebMediaConstraints audio_constraints = request->isNull() ? |
372 WebKit::WebMediaConstraints() : request->audioConstraints(); | 372 blink::WebMediaConstraints() : request->audioConstraints(); |
373 WebKit::WebMediaConstraints video_constraints = request->isNull() ? | 373 blink::WebMediaConstraints video_constraints = request->isNull() ? |
374 WebKit::WebMediaConstraints() : request->videoConstraints(); | 374 blink::WebMediaConstraints() : request->videoConstraints(); |
375 | 375 |
376 dependency_factory_->CreateNativeMediaSources( | 376 dependency_factory_->CreateNativeMediaSources( |
377 RenderViewObserver::routing_id(), | 377 RenderViewObserver::routing_id(), |
378 audio_constraints, video_constraints, web_stream, | 378 audio_constraints, video_constraints, web_stream, |
379 base::Bind(&MediaStreamImpl::OnCreateNativeSourcesComplete, AsWeakPtr())); | 379 base::Bind(&MediaStreamImpl::OnCreateNativeSourcesComplete, AsWeakPtr())); |
380 } | 380 } |
381 | 381 |
382 // Callback from MediaStreamDispatcher. | 382 // Callback from MediaStreamDispatcher. |
383 // The requested stream failed to be generated. | 383 // The requested stream failed to be generated. |
384 void MediaStreamImpl::OnStreamGenerationFailed(int request_id) { | 384 void MediaStreamImpl::OnStreamGenerationFailed(int request_id) { |
(...skipping 22 matching lines...) Expand all Loading... |
407 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); | 407 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); |
408 if (user_media_request) { | 408 if (user_media_request) { |
409 DeleteUserMediaRequestInfo(user_media_request); | 409 DeleteUserMediaRequestInfo(user_media_request); |
410 } | 410 } |
411 StopUnreferencedSources(false); | 411 StopUnreferencedSources(false); |
412 } | 412 } |
413 | 413 |
414 void MediaStreamImpl::CreateWebKitSourceVector( | 414 void MediaStreamImpl::CreateWebKitSourceVector( |
415 const std::string& label, | 415 const std::string& label, |
416 const StreamDeviceInfoArray& devices, | 416 const StreamDeviceInfoArray& devices, |
417 WebKit::WebMediaStreamSource::Type type, | 417 blink::WebMediaStreamSource::Type type, |
418 WebKit::WebFrame* frame, | 418 blink::WebFrame* frame, |
419 WebKit::WebVector<WebKit::WebMediaStreamSource>& webkit_sources) { | 419 blink::WebVector<blink::WebMediaStreamSource>& webkit_sources) { |
420 CHECK_EQ(devices.size(), webkit_sources.size()); | 420 CHECK_EQ(devices.size(), webkit_sources.size()); |
421 for (size_t i = 0; i < devices.size(); ++i) { | 421 for (size_t i = 0; i < devices.size(); ++i) { |
422 const char* track_type = | 422 const char* track_type = |
423 (type == WebKit::WebMediaStreamSource::TypeAudio) ? "a" : "v"; | 423 (type == blink::WebMediaStreamSource::TypeAudio) ? "a" : "v"; |
424 std::string source_id = base::StringPrintf("%s%s%u", label.c_str(), | 424 std::string source_id = base::StringPrintf("%s%s%u", label.c_str(), |
425 track_type, | 425 track_type, |
426 static_cast<unsigned int>(i)); | 426 static_cast<unsigned int>(i)); |
427 | 427 |
428 const WebKit::WebMediaStreamSource* existing_source = | 428 const blink::WebMediaStreamSource* existing_source = |
429 FindLocalSource(devices[i]); | 429 FindLocalSource(devices[i]); |
430 if (existing_source) { | 430 if (existing_source) { |
431 webkit_sources[i] = *existing_source; | 431 webkit_sources[i] = *existing_source; |
432 DVLOG(1) << "Source already exist. Reusing source with id " | 432 DVLOG(1) << "Source already exist. Reusing source with id " |
433 << webkit_sources[i]. id().utf8(); | 433 << webkit_sources[i]. id().utf8(); |
434 continue; | 434 continue; |
435 } | 435 } |
436 webkit_sources[i].initialize( | 436 webkit_sources[i].initialize( |
437 UTF8ToUTF16(source_id), | 437 UTF8ToUTF16(source_id), |
438 type, | 438 type, |
439 UTF8ToUTF16(devices[i].device.name)); | 439 UTF8ToUTF16(devices[i].device.name)); |
440 MediaStreamSourceExtraData* source_extra_data( | 440 MediaStreamSourceExtraData* source_extra_data( |
441 new content::MediaStreamSourceExtraData( | 441 new content::MediaStreamSourceExtraData( |
442 devices[i], | 442 devices[i], |
443 base::Bind(&MediaStreamImpl::OnLocalSourceStop, AsWeakPtr()))); | 443 base::Bind(&MediaStreamImpl::OnLocalSourceStop, AsWeakPtr()))); |
444 // |source_extra_data| is owned by webkit_sources[i]. | 444 // |source_extra_data| is owned by webkit_sources[i]. |
445 webkit_sources[i].setExtraData(source_extra_data); | 445 webkit_sources[i].setExtraData(source_extra_data); |
446 webkit_sources[i].setDeviceId(UTF8ToUTF16( | 446 webkit_sources[i].setDeviceId(UTF8ToUTF16( |
447 base::IntToString(devices[i].session_id))); | 447 base::IntToString(devices[i].session_id))); |
448 local_sources_.push_back(LocalStreamSource(frame, webkit_sources[i])); | 448 local_sources_.push_back(LocalStreamSource(frame, webkit_sources[i])); |
449 } | 449 } |
450 } | 450 } |
451 | 451 |
452 // Callback from MediaStreamDependencyFactory when the sources in |web_stream| | 452 // Callback from MediaStreamDependencyFactory when the sources in |web_stream| |
453 // have been generated. | 453 // have been generated. |
454 void MediaStreamImpl::OnCreateNativeSourcesComplete( | 454 void MediaStreamImpl::OnCreateNativeSourcesComplete( |
455 WebKit::WebMediaStream* web_stream, | 455 blink::WebMediaStream* web_stream, |
456 bool request_succeeded) { | 456 bool request_succeeded) { |
457 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(web_stream); | 457 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(web_stream); |
458 if (!request_info) { | 458 if (!request_info) { |
459 // This can happen if the request is canceled or the frame reloads while | 459 // This can happen if the request is canceled or the frame reloads while |
460 // MediaStreamDependencyFactory is creating the sources. | 460 // MediaStreamDependencyFactory is creating the sources. |
461 DVLOG(1) << "Request ID not found"; | 461 DVLOG(1) << "Request ID not found"; |
462 return; | 462 return; |
463 } | 463 } |
464 | 464 |
465 // Create a native representation of the stream. | 465 // Create a native representation of the stream. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 NOTIMPLEMENTED(); | 504 NOTIMPLEMENTED(); |
505 } | 505 } |
506 | 506 |
507 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { | 507 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { |
508 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" | 508 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" |
509 << request_id << ")"; | 509 << request_id << ")"; |
510 NOTIMPLEMENTED(); | 510 NOTIMPLEMENTED(); |
511 } | 511 } |
512 | 512 |
513 void MediaStreamImpl::CompleteGetUserMediaRequest( | 513 void MediaStreamImpl::CompleteGetUserMediaRequest( |
514 const WebKit::WebMediaStream& stream, | 514 const blink::WebMediaStream& stream, |
515 WebKit::WebUserMediaRequest* request_info, | 515 blink::WebUserMediaRequest* request_info, |
516 bool request_succeeded) { | 516 bool request_succeeded) { |
517 if (request_succeeded) { | 517 if (request_succeeded) { |
518 request_info->requestSucceeded(stream); | 518 request_info->requestSucceeded(stream); |
519 } else { | 519 } else { |
520 request_info->requestFailed(); | 520 request_info->requestFailed(); |
521 } | 521 } |
522 } | 522 } |
523 | 523 |
524 const WebKit::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( | 524 const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( |
525 const StreamDeviceInfo& device) const { | 525 const StreamDeviceInfo& device) const { |
526 for (LocalStreamSources::const_iterator it = local_sources_.begin(); | 526 for (LocalStreamSources::const_iterator it = local_sources_.begin(); |
527 it != local_sources_.end(); ++it) { | 527 it != local_sources_.end(); ++it) { |
528 MediaStreamSourceExtraData* extra_data = | 528 MediaStreamSourceExtraData* extra_data = |
529 static_cast<MediaStreamSourceExtraData*>( | 529 static_cast<MediaStreamSourceExtraData*>( |
530 it->source.extraData()); | 530 it->source.extraData()); |
531 const StreamDeviceInfo& active_device = extra_data->device_info(); | 531 const StreamDeviceInfo& active_device = extra_data->device_info(); |
532 if (active_device.device.id == device.device.id && | 532 if (active_device.device.id == device.device.id && |
533 active_device.session_id == device.session_id) { | 533 active_device.session_id == device.session_id) { |
534 return &it->source; | 534 return &it->source; |
535 } | 535 } |
536 } | 536 } |
537 return NULL; | 537 return NULL; |
538 } | 538 } |
539 | 539 |
540 bool MediaStreamImpl::FindSourceInRequests( | 540 bool MediaStreamImpl::FindSourceInRequests( |
541 const WebKit::WebMediaStreamSource& source) const { | 541 const blink::WebMediaStreamSource& source) const { |
542 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin(); | 542 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin(); |
543 req_it != user_media_requests_.end(); ++req_it) { | 543 req_it != user_media_requests_.end(); ++req_it) { |
544 const std::vector<WebKit::WebMediaStreamSource>& sources = | 544 const std::vector<blink::WebMediaStreamSource>& sources = |
545 (*req_it)->sources; | 545 (*req_it)->sources; |
546 for (std::vector<WebKit::WebMediaStreamSource>::const_iterator source_it = | 546 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = |
547 sources.begin(); | 547 sources.begin(); |
548 source_it != sources.end(); ++source_it) { | 548 source_it != sources.end(); ++source_it) { |
549 if (source_it->id() == source.id()) { | 549 if (source_it->id() == source.id()) { |
550 return true; | 550 return true; |
551 } | 551 } |
552 } | 552 } |
553 } | 553 } |
554 return false; | 554 return false; |
555 } | 555 } |
556 | 556 |
557 MediaStreamImpl::UserMediaRequestInfo* | 557 MediaStreamImpl::UserMediaRequestInfo* |
558 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { | 558 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { |
559 UserMediaRequests::iterator it = user_media_requests_.begin(); | 559 UserMediaRequests::iterator it = user_media_requests_.begin(); |
560 for (; it != user_media_requests_.end(); ++it) { | 560 for (; it != user_media_requests_.end(); ++it) { |
561 if ((*it)->request_id == request_id) | 561 if ((*it)->request_id == request_id) |
562 return (*it); | 562 return (*it); |
563 } | 563 } |
564 return NULL; | 564 return NULL; |
565 } | 565 } |
566 | 566 |
567 MediaStreamImpl::UserMediaRequestInfo* | 567 MediaStreamImpl::UserMediaRequestInfo* |
568 MediaStreamImpl::FindUserMediaRequestInfo( | 568 MediaStreamImpl::FindUserMediaRequestInfo( |
569 const WebKit::WebUserMediaRequest& request) { | 569 const blink::WebUserMediaRequest& request) { |
570 UserMediaRequests::iterator it = user_media_requests_.begin(); | 570 UserMediaRequests::iterator it = user_media_requests_.begin(); |
571 for (; it != user_media_requests_.end(); ++it) { | 571 for (; it != user_media_requests_.end(); ++it) { |
572 if ((*it)->request == request) | 572 if ((*it)->request == request) |
573 return (*it); | 573 return (*it); |
574 } | 574 } |
575 return NULL; | 575 return NULL; |
576 } | 576 } |
577 | 577 |
578 MediaStreamImpl::UserMediaRequestInfo* | 578 MediaStreamImpl::UserMediaRequestInfo* |
579 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) { | 579 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) { |
580 UserMediaRequests::iterator it = user_media_requests_.begin(); | 580 UserMediaRequests::iterator it = user_media_requests_.begin(); |
581 for (; it != user_media_requests_.end(); ++it) { | 581 for (; it != user_media_requests_.end(); ++it) { |
582 if ((*it)->generated && (*it)->web_stream.id() == UTF8ToUTF16(label)) | 582 if ((*it)->generated && (*it)->web_stream.id() == UTF8ToUTF16(label)) |
583 return (*it); | 583 return (*it); |
584 } | 584 } |
585 return NULL; | 585 return NULL; |
586 } | 586 } |
587 | 587 |
588 MediaStreamImpl::UserMediaRequestInfo* | 588 MediaStreamImpl::UserMediaRequestInfo* |
589 MediaStreamImpl::FindUserMediaRequestInfo( | 589 MediaStreamImpl::FindUserMediaRequestInfo( |
590 WebKit::WebMediaStream* web_stream) { | 590 blink::WebMediaStream* web_stream) { |
591 UserMediaRequests::iterator it = user_media_requests_.begin(); | 591 UserMediaRequests::iterator it = user_media_requests_.begin(); |
592 for (; it != user_media_requests_.end(); ++it) { | 592 for (; it != user_media_requests_.end(); ++it) { |
593 if (&((*it)->web_stream) == web_stream) | 593 if (&((*it)->web_stream) == web_stream) |
594 return (*it); | 594 return (*it); |
595 } | 595 } |
596 return NULL; | 596 return NULL; |
597 } | 597 } |
598 | 598 |
599 void MediaStreamImpl::DeleteUserMediaRequestInfo( | 599 void MediaStreamImpl::DeleteUserMediaRequestInfo( |
600 UserMediaRequestInfo* request) { | 600 UserMediaRequestInfo* request) { |
601 UserMediaRequests::iterator it = user_media_requests_.begin(); | 601 UserMediaRequests::iterator it = user_media_requests_.begin(); |
602 for (; it != user_media_requests_.end(); ++it) { | 602 for (; it != user_media_requests_.end(); ++it) { |
603 if ((*it) == request) { | 603 if ((*it) == request) { |
604 user_media_requests_.erase(it); | 604 user_media_requests_.erase(it); |
605 return; | 605 return; |
606 } | 606 } |
607 } | 607 } |
608 NOTREACHED(); | 608 NOTREACHED(); |
609 } | 609 } |
610 | 610 |
611 void MediaStreamImpl::FrameDetached(WebKit::WebFrame* frame) { | 611 void MediaStreamImpl::FrameDetached(blink::WebFrame* frame) { |
612 // Do same thing as FrameWillClose. | 612 // Do same thing as FrameWillClose. |
613 FrameWillClose(frame); | 613 FrameWillClose(frame); |
614 } | 614 } |
615 | 615 |
616 void MediaStreamImpl::FrameWillClose(WebKit::WebFrame* frame) { | 616 void MediaStreamImpl::FrameWillClose(blink::WebFrame* frame) { |
617 // Loop through all UserMediaRequests and find the requests that belong to the | 617 // Loop through all UserMediaRequests and find the requests that belong to the |
618 // frame that is being closed. | 618 // frame that is being closed. |
619 UserMediaRequests::iterator request_it = user_media_requests_.begin(); | 619 UserMediaRequests::iterator request_it = user_media_requests_.begin(); |
620 while (request_it != user_media_requests_.end()) { | 620 while (request_it != user_media_requests_.end()) { |
621 if ((*request_it)->frame == frame) { | 621 if ((*request_it)->frame == frame) { |
622 DVLOG(1) << "MediaStreamImpl::FrameWillClose: " | 622 DVLOG(1) << "MediaStreamImpl::FrameWillClose: " |
623 << "Cancel user media request " << (*request_it)->request_id; | 623 << "Cancel user media request " << (*request_it)->request_id; |
624 // If the request is not generated, it means that a request | 624 // If the request is not generated, it means that a request |
625 // has been sent to the MediaStreamDispatcher to generate a stream | 625 // has been sent to the MediaStreamDispatcher to generate a stream |
626 // but MediaStreamDispatcher has not yet responded and we need to cancel | 626 // but MediaStreamDispatcher has not yet responded and we need to cancel |
(...skipping 26 matching lines...) Expand all Loading... |
653 DVLOG(1) << "MediaStreamImpl::OnLocalMediaStreamStop(" << label << ")"; | 653 DVLOG(1) << "MediaStreamImpl::OnLocalMediaStreamStop(" << label << ")"; |
654 | 654 |
655 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); | 655 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); |
656 if (user_media_request) { | 656 if (user_media_request) { |
657 DeleteUserMediaRequestInfo(user_media_request); | 657 DeleteUserMediaRequestInfo(user_media_request); |
658 } | 658 } |
659 StopUnreferencedSources(true); | 659 StopUnreferencedSources(true); |
660 } | 660 } |
661 | 661 |
662 void MediaStreamImpl::OnLocalSourceStop( | 662 void MediaStreamImpl::OnLocalSourceStop( |
663 const WebKit::WebMediaStreamSource& source) { | 663 const blink::WebMediaStreamSource& source) { |
664 DCHECK(CalledOnValidThread()); | 664 DCHECK(CalledOnValidThread()); |
665 | 665 |
666 StopLocalSource(source, true); | 666 StopLocalSource(source, true); |
667 | 667 |
668 bool device_found = false; | 668 bool device_found = false; |
669 for (LocalStreamSources::iterator device_it = local_sources_.begin(); | 669 for (LocalStreamSources::iterator device_it = local_sources_.begin(); |
670 device_it != local_sources_.end(); ++device_it) { | 670 device_it != local_sources_.end(); ++device_it) { |
671 if (device_it->source.id() == source.id()) { | 671 if (device_it->source.id() == source.id()) { |
672 device_found = true; | 672 device_found = true; |
673 local_sources_.erase(device_it); | 673 local_sources_.erase(device_it); |
(...skipping 10 matching lines...) Expand all Loading... |
684 RemoveSource(source, &(*it)->sources); | 684 RemoveSource(source, &(*it)->sources); |
685 if ((*it)->sources.empty()) { | 685 if ((*it)->sources.empty()) { |
686 it = user_media_requests_.erase(it); | 686 it = user_media_requests_.erase(it); |
687 } else { | 687 } else { |
688 ++it; | 688 ++it; |
689 } | 689 } |
690 } | 690 } |
691 } | 691 } |
692 | 692 |
693 void MediaStreamImpl::StopLocalSource( | 693 void MediaStreamImpl::StopLocalSource( |
694 const WebKit::WebMediaStreamSource& source, | 694 const blink::WebMediaStreamSource& source, |
695 bool notify_dispatcher) { | 695 bool notify_dispatcher) { |
696 MediaStreamSourceExtraData* extra_data = | 696 MediaStreamSourceExtraData* extra_data = |
697 static_cast<MediaStreamSourceExtraData*> (source.extraData()); | 697 static_cast<MediaStreamSourceExtraData*> (source.extraData()); |
698 CHECK(extra_data); | 698 CHECK(extra_data); |
699 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" | 699 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" |
700 << "{device_id = " << extra_data->device_info().device.id << "})"; | 700 << "{device_id = " << extra_data->device_info().device.id << "})"; |
701 | 701 |
702 if (source.type() == WebKit::WebMediaStreamSource::TypeAudio) { | 702 if (source.type() == blink::WebMediaStreamSource::TypeAudio) { |
703 if (extra_data->GetAudioCapturer()) { | 703 if (extra_data->GetAudioCapturer()) { |
704 extra_data->GetAudioCapturer()->Stop(); | 704 extra_data->GetAudioCapturer()->Stop(); |
705 } | 705 } |
706 } | 706 } |
707 | 707 |
708 if (notify_dispatcher) | 708 if (notify_dispatcher) |
709 media_stream_dispatcher_->StopStreamDevice(extra_data->device_info()); | 709 media_stream_dispatcher_->StopStreamDevice(extra_data->device_info()); |
710 | 710 |
711 WebKit::WebMediaStreamSource writable_source(source); | 711 blink::WebMediaStreamSource writable_source(source); |
712 writable_source.setReadyState( | 712 writable_source.setReadyState( |
713 WebKit::WebMediaStreamSource::ReadyStateEnded); | 713 blink::WebMediaStreamSource::ReadyStateEnded); |
714 writable_source.setExtraData(NULL); | 714 writable_source.setExtraData(NULL); |
715 } | 715 } |
716 | 716 |
717 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) { | 717 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) { |
718 LocalStreamSources::iterator source_it = local_sources_.begin(); | 718 LocalStreamSources::iterator source_it = local_sources_.begin(); |
719 while (source_it != local_sources_.end()) { | 719 while (source_it != local_sources_.end()) { |
720 if (!FindSourceInRequests(source_it->source)) { | 720 if (!FindSourceInRequests(source_it->source)) { |
721 StopLocalSource(source_it->source, notify_dispatcher); | 721 StopLocalSource(source_it->source, notify_dispatcher); |
722 source_it = local_sources_.erase(source_it); | 722 source_it = local_sources_.erase(source_it); |
723 } else { | 723 } else { |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 stream_stop_callback_ = stop_callback; | 848 stream_stop_callback_ = stop_callback; |
849 } | 849 } |
850 | 850 |
851 void MediaStreamExtraData::OnLocalStreamStop() { | 851 void MediaStreamExtraData::OnLocalStreamStop() { |
852 if (!stream_stop_callback_.is_null()) | 852 if (!stream_stop_callback_.is_null()) |
853 stream_stop_callback_.Run(stream_->label()); | 853 stream_stop_callback_.Run(stream_->label()); |
854 } | 854 } |
855 | 855 |
856 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( | 856 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( |
857 int request_id, | 857 int request_id, |
858 WebKit::WebFrame* frame, | 858 blink::WebFrame* frame, |
859 const WebKit::WebUserMediaRequest& request, | 859 const blink::WebUserMediaRequest& request, |
860 bool enable_automatic_output_device_selection) | 860 bool enable_automatic_output_device_selection) |
861 : request_id(request_id), | 861 : request_id(request_id), |
862 generated(false), | 862 generated(false), |
863 enable_automatic_output_device_selection( | 863 enable_automatic_output_device_selection( |
864 enable_automatic_output_device_selection), | 864 enable_automatic_output_device_selection), |
865 frame(frame), | 865 frame(frame), |
866 request(request) { | 866 request(request) { |
867 } | 867 } |
868 | 868 |
869 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { | 869 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { |
870 } | 870 } |
871 | 871 |
872 } // namespace content | 872 } // namespace content |
OLD | NEW |