OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
Henrik Grunell
2014/09/02 06:47:53
Same here.
| |
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/user_media_client_impl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/hash.h" | 9 #include "base/hash.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
15 #include "content/public/renderer/render_frame.h" | 15 #include "content/public/renderer/render_frame.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
50 optional->push_back(StreamOptions::Constraint( | 50 optional->push_back(StreamOptions::Constraint( |
51 optional_constraints[i].m_name.utf8(), | 51 optional_constraints[i].m_name.utf8(), |
52 optional_constraints[i].m_value.utf8())); | 52 optional_constraints[i].m_value.utf8())); |
53 } | 53 } |
54 } | 54 } |
55 | 55 |
56 static int g_next_request_id = 0; | 56 static int g_next_request_id = 0; |
57 | 57 |
58 } // namespace | 58 } // namespace |
59 | 59 |
60 struct MediaStreamImpl::MediaDevicesRequestInfo { | 60 struct UserMediaClientImpl::MediaDevicesRequestInfo { |
61 MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request, | 61 MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request, |
62 int audio_input_request_id, | 62 int audio_input_request_id, |
63 int video_input_request_id, | 63 int video_input_request_id, |
64 int audio_output_request_id) | 64 int audio_output_request_id) |
65 : request(request), | 65 : request(request), |
66 audio_input_request_id(audio_input_request_id), | 66 audio_input_request_id(audio_input_request_id), |
67 video_input_request_id(video_input_request_id), | 67 video_input_request_id(video_input_request_id), |
68 audio_output_request_id(audio_output_request_id), | 68 audio_output_request_id(audio_output_request_id), |
69 has_audio_input_returned(false), | 69 has_audio_input_returned(false), |
70 has_video_input_returned(false), | 70 has_video_input_returned(false), |
71 has_audio_output_returned(false) {} | 71 has_audio_output_returned(false) {} |
72 | 72 |
73 blink::WebMediaDevicesRequest request; | 73 blink::WebMediaDevicesRequest request; |
74 int audio_input_request_id; | 74 int audio_input_request_id; |
75 int video_input_request_id; | 75 int video_input_request_id; |
76 int audio_output_request_id; | 76 int audio_output_request_id; |
77 bool has_audio_input_returned; | 77 bool has_audio_input_returned; |
78 bool has_video_input_returned; | 78 bool has_video_input_returned; |
79 bool has_audio_output_returned; | 79 bool has_audio_output_returned; |
80 StreamDeviceInfoArray audio_input_devices; | 80 StreamDeviceInfoArray audio_input_devices; |
81 StreamDeviceInfoArray video_input_devices; | 81 StreamDeviceInfoArray video_input_devices; |
82 StreamDeviceInfoArray audio_output_devices; | 82 StreamDeviceInfoArray audio_output_devices; |
83 }; | 83 }; |
84 | 84 |
85 MediaStreamImpl::MediaStreamImpl( | 85 UserMediaClientImpl::UserMediaClientImpl( |
86 RenderFrame* render_frame, | 86 RenderFrame* render_frame, |
87 PeerConnectionDependencyFactory* dependency_factory, | 87 PeerConnectionDependencyFactory* dependency_factory, |
88 scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher) | 88 scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher) |
89 : RenderFrameObserver(render_frame), | 89 : RenderFrameObserver(render_frame), |
90 dependency_factory_(dependency_factory), | 90 dependency_factory_(dependency_factory), |
91 media_stream_dispatcher_(media_stream_dispatcher.Pass()), | 91 media_stream_dispatcher_(media_stream_dispatcher.Pass()), |
92 weak_factory_(this) { | 92 weak_factory_(this) { |
93 DCHECK(dependency_factory_); | 93 DCHECK(dependency_factory_); |
94 DCHECK(media_stream_dispatcher_.get()); | 94 DCHECK(media_stream_dispatcher_.get()); |
95 } | 95 } |
96 | 96 |
97 MediaStreamImpl::~MediaStreamImpl() { | 97 UserMediaClientImpl::~UserMediaClientImpl() { |
98 // Force-close all outstanding user media requests and local sources here, | 98 // Force-close all outstanding user media requests and local sources here, |
99 // before the outstanding WeakPtrs are invalidated, to ensure a clean | 99 // before the outstanding WeakPtrs are invalidated, to ensure a clean |
100 // shutdown. | 100 // shutdown. |
101 FrameWillClose(); | 101 FrameWillClose(); |
102 } | 102 } |
103 | 103 |
104 void MediaStreamImpl::requestUserMedia( | 104 void UserMediaClientImpl::requestUserMedia( |
105 const blink::WebUserMediaRequest& user_media_request) { | 105 const blink::WebUserMediaRequest& user_media_request) { |
106 // Save histogram data so we can see how much GetUserMedia is used. | 106 // Save histogram data so we can see how much GetUserMedia is used. |
107 // The histogram counts the number of calls to the JS API | 107 // The histogram counts the number of calls to the JS API |
108 // webGetUserMedia. | 108 // webGetUserMedia. |
109 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); | 109 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); |
110 DCHECK(CalledOnValidThread()); | 110 DCHECK(CalledOnValidThread()); |
111 | 111 |
112 if (RenderThreadImpl::current()) { | 112 if (RenderThreadImpl::current()) { |
113 RenderThreadImpl::current()->peer_connection_tracker()->TrackGetUserMedia( | 113 RenderThreadImpl::current()->peer_connection_tracker()->TrackGetUserMedia( |
114 user_media_request); | 114 user_media_request); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
147 &options.mandatory_video, | 147 &options.mandatory_video, |
148 &options.optional_video); | 148 &options.optional_video); |
149 } | 149 } |
150 | 150 |
151 security_origin = GURL(user_media_request.securityOrigin().toString()); | 151 security_origin = GURL(user_media_request.securityOrigin().toString()); |
152 DCHECK(render_frame()->GetWebFrame() == | 152 DCHECK(render_frame()->GetWebFrame() == |
153 static_cast<blink::WebFrame*>( | 153 static_cast<blink::WebFrame*>( |
154 user_media_request.ownerDocument().frame())); | 154 user_media_request.ownerDocument().frame())); |
155 } | 155 } |
156 | 156 |
157 DVLOG(1) << "MediaStreamImpl::requestUserMedia(" << request_id << ", [ " | 157 DVLOG(1) << "UserMediaClientImpl::requestUserMedia(" << request_id << ", [ " |
158 << "audio=" << (options.audio_requested) | 158 << "audio=" << (options.audio_requested) |
159 << " select associated sink: " | 159 << " select associated sink: " |
160 << enable_automatic_output_device_selection | 160 << enable_automatic_output_device_selection |
161 << ", video=" << (options.video_requested) << " ], " | 161 << ", video=" << (options.video_requested) << " ], " |
162 << security_origin.spec() << ")"; | 162 << security_origin.spec() << ")"; |
163 | 163 |
164 std::string audio_device_id; | 164 std::string audio_device_id; |
165 bool mandatory_audio; | 165 bool mandatory_audio; |
166 options.GetFirstAudioConstraintByName(kMediaStreamSourceInfoId, | 166 options.GetFirstAudioConstraintByName(kMediaStreamSourceInfoId, |
167 &audio_device_id, &mandatory_audio); | 167 &audio_device_id, &mandatory_audio); |
(...skipping 16 matching lines...) Expand all Loading... | |
184 new UserMediaRequestInfo(request_id, user_media_request, | 184 new UserMediaRequestInfo(request_id, user_media_request, |
185 enable_automatic_output_device_selection)); | 185 enable_automatic_output_device_selection)); |
186 | 186 |
187 media_stream_dispatcher_->GenerateStream( | 187 media_stream_dispatcher_->GenerateStream( |
188 request_id, | 188 request_id, |
189 weak_factory_.GetWeakPtr(), | 189 weak_factory_.GetWeakPtr(), |
190 options, | 190 options, |
191 security_origin); | 191 security_origin); |
192 } | 192 } |
193 | 193 |
194 void MediaStreamImpl::cancelUserMediaRequest( | 194 void UserMediaClientImpl::cancelUserMediaRequest( |
195 const blink::WebUserMediaRequest& user_media_request) { | 195 const blink::WebUserMediaRequest& user_media_request) { |
196 DCHECK(CalledOnValidThread()); | 196 DCHECK(CalledOnValidThread()); |
197 UserMediaRequestInfo* request = FindUserMediaRequestInfo(user_media_request); | 197 UserMediaRequestInfo* request = FindUserMediaRequestInfo(user_media_request); |
198 if (request) { | 198 if (request) { |
199 // We can't abort the stream generation process. | 199 // We can't abort the stream generation process. |
200 // Instead, erase the request. Once the stream is generated we will stop the | 200 // Instead, erase the request. Once the stream is generated we will stop the |
201 // stream if the request does not exist. | 201 // stream if the request does not exist. |
202 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_EXPLICITLY_CANCELLED); | 202 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_EXPLICITLY_CANCELLED); |
203 DeleteUserMediaRequestInfo(request); | 203 DeleteUserMediaRequestInfo(request); |
204 } | 204 } |
205 } | 205 } |
206 | 206 |
207 void MediaStreamImpl::requestMediaDevices( | 207 void UserMediaClientImpl::requestMediaDevices( |
208 const blink::WebMediaDevicesRequest& media_devices_request) { | 208 const blink::WebMediaDevicesRequest& media_devices_request) { |
209 UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES); | 209 UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES); |
210 DCHECK(CalledOnValidThread()); | 210 DCHECK(CalledOnValidThread()); |
211 | 211 |
212 int audio_input_request_id = g_next_request_id++; | 212 int audio_input_request_id = g_next_request_id++; |
213 int video_input_request_id = g_next_request_id++; | 213 int video_input_request_id = g_next_request_id++; |
214 int audio_output_request_id = g_next_request_id++; | 214 int audio_output_request_id = g_next_request_id++; |
215 | 215 |
216 // |media_devices_request| can't be mocked, so in tests it will be empty (the | 216 // |media_devices_request| can't be mocked, so in tests it will be empty (the |
217 // underlying pointer is null). In order to use this function in a test we | 217 // underlying pointer is null). In order to use this function in a test we |
218 // need to check if it isNull. | 218 // need to check if it isNull. |
219 GURL security_origin; | 219 GURL security_origin; |
220 if (!media_devices_request.isNull()) | 220 if (!media_devices_request.isNull()) |
221 security_origin = GURL(media_devices_request.securityOrigin().toString()); | 221 security_origin = GURL(media_devices_request.securityOrigin().toString()); |
222 | 222 |
223 DVLOG(1) << "MediaStreamImpl::requestMediaDevices(" << audio_input_request_id | 223 DVLOG(1) << "UserMediaClientImpl::requestMediaDevices(" |
224 << audio_input_request_id | |
224 << ", " << video_input_request_id << ", " << audio_output_request_id | 225 << ", " << video_input_request_id << ", " << audio_output_request_id |
225 << ", " << security_origin.spec() << ")"; | 226 << ", " << security_origin.spec() << ")"; |
226 | 227 |
227 media_devices_requests_.push_back(new MediaDevicesRequestInfo( | 228 media_devices_requests_.push_back(new MediaDevicesRequestInfo( |
228 media_devices_request, | 229 media_devices_request, |
229 audio_input_request_id, | 230 audio_input_request_id, |
230 video_input_request_id, | 231 video_input_request_id, |
231 audio_output_request_id)); | 232 audio_output_request_id)); |
232 | 233 |
233 media_stream_dispatcher_->EnumerateDevices( | 234 media_stream_dispatcher_->EnumerateDevices( |
234 audio_input_request_id, | 235 audio_input_request_id, |
235 weak_factory_.GetWeakPtr(), | 236 weak_factory_.GetWeakPtr(), |
236 MEDIA_DEVICE_AUDIO_CAPTURE, | 237 MEDIA_DEVICE_AUDIO_CAPTURE, |
237 security_origin); | 238 security_origin); |
238 | 239 |
239 media_stream_dispatcher_->EnumerateDevices( | 240 media_stream_dispatcher_->EnumerateDevices( |
240 video_input_request_id, | 241 video_input_request_id, |
241 weak_factory_.GetWeakPtr(), | 242 weak_factory_.GetWeakPtr(), |
242 MEDIA_DEVICE_VIDEO_CAPTURE, | 243 MEDIA_DEVICE_VIDEO_CAPTURE, |
243 security_origin); | 244 security_origin); |
244 | 245 |
245 media_stream_dispatcher_->EnumerateDevices( | 246 media_stream_dispatcher_->EnumerateDevices( |
246 audio_output_request_id, | 247 audio_output_request_id, |
247 weak_factory_.GetWeakPtr(), | 248 weak_factory_.GetWeakPtr(), |
248 MEDIA_DEVICE_AUDIO_OUTPUT, | 249 MEDIA_DEVICE_AUDIO_OUTPUT, |
249 security_origin); | 250 security_origin); |
250 } | 251 } |
251 | 252 |
252 void MediaStreamImpl::cancelMediaDevicesRequest( | 253 void UserMediaClientImpl::cancelMediaDevicesRequest( |
253 const blink::WebMediaDevicesRequest& media_devices_request) { | 254 const blink::WebMediaDevicesRequest& media_devices_request) { |
254 DCHECK(CalledOnValidThread()); | 255 DCHECK(CalledOnValidThread()); |
255 MediaDevicesRequestInfo* request = | 256 MediaDevicesRequestInfo* request = |
256 FindMediaDevicesRequestInfo(media_devices_request); | 257 FindMediaDevicesRequestInfo(media_devices_request); |
257 if (!request) | 258 if (!request) |
258 return; | 259 return; |
259 CancelAndDeleteMediaDevicesRequest(request); | 260 CancelAndDeleteMediaDevicesRequest(request); |
260 } | 261 } |
261 | 262 |
262 // Callback from MediaStreamDispatcher. | 263 // Callback from MediaStreamDispatcher. |
263 // The requested stream have been generated by the MediaStreamDispatcher. | 264 // The requested stream have been generated by the MediaStreamDispatcher. |
264 void MediaStreamImpl::OnStreamGenerated( | 265 void UserMediaClientImpl::OnStreamGenerated( |
265 int request_id, | 266 int request_id, |
266 const std::string& label, | 267 const std::string& label, |
267 const StreamDeviceInfoArray& audio_array, | 268 const StreamDeviceInfoArray& audio_array, |
268 const StreamDeviceInfoArray& video_array) { | 269 const StreamDeviceInfoArray& video_array) { |
269 DCHECK(CalledOnValidThread()); | 270 DCHECK(CalledOnValidThread()); |
270 DVLOG(1) << "MediaStreamImpl::OnStreamGenerated stream:" << label; | 271 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerated stream:" << label; |
271 | 272 |
272 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 273 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
273 if (!request_info) { | 274 if (!request_info) { |
274 // This can happen if the request is canceled or the frame reloads while | 275 // This can happen if the request is canceled or the frame reloads while |
275 // MediaStreamDispatcher is processing the request. | 276 // MediaStreamDispatcher is processing the request. |
276 DVLOG(1) << "Request ID not found"; | 277 DVLOG(1) << "Request ID not found"; |
277 OnStreamGeneratedForCancelledRequest(audio_array, video_array); | 278 OnStreamGeneratedForCancelledRequest(audio_array, video_array); |
278 return; | 279 return; |
279 } | 280 } |
280 request_info->generated = true; | 281 request_info->generated = true; |
(...skipping 26 matching lines...) Expand all Loading... | |
307 blink::WebMediaStream* web_stream = &(request_info->web_stream); | 308 blink::WebMediaStream* web_stream = &(request_info->web_stream); |
308 | 309 |
309 web_stream->initialize(webkit_id, audio_track_vector, | 310 web_stream->initialize(webkit_id, audio_track_vector, |
310 video_track_vector); | 311 video_track_vector); |
311 web_stream->setExtraData( | 312 web_stream->setExtraData( |
312 new MediaStream( | 313 new MediaStream( |
313 *web_stream)); | 314 *web_stream)); |
314 | 315 |
315 // Wait for the tracks to be started successfully or to fail. | 316 // Wait for the tracks to be started successfully or to fail. |
316 request_info->CallbackOnTracksStarted( | 317 request_info->CallbackOnTracksStarted( |
317 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, | 318 base::Bind(&UserMediaClientImpl::OnCreateNativeTracksCompleted, |
318 weak_factory_.GetWeakPtr())); | 319 weak_factory_.GetWeakPtr())); |
319 } | 320 } |
320 | 321 |
321 void MediaStreamImpl::OnStreamGeneratedForCancelledRequest( | 322 void UserMediaClientImpl::OnStreamGeneratedForCancelledRequest( |
322 const StreamDeviceInfoArray& audio_array, | 323 const StreamDeviceInfoArray& audio_array, |
323 const StreamDeviceInfoArray& video_array) { | 324 const StreamDeviceInfoArray& video_array) { |
324 // Only stop the device if the device is not used in another MediaStream. | 325 // Only stop the device if the device is not used in another MediaStream. |
325 for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin(); | 326 for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin(); |
326 device_it != audio_array.end(); ++device_it) { | 327 device_it != audio_array.end(); ++device_it) { |
327 if (!FindLocalSource(*device_it)) | 328 if (!FindLocalSource(*device_it)) |
328 media_stream_dispatcher_->StopStreamDevice(*device_it); | 329 media_stream_dispatcher_->StopStreamDevice(*device_it); |
329 } | 330 } |
330 | 331 |
331 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); | 332 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); |
332 device_it != video_array.end(); ++device_it) { | 333 device_it != video_array.end(); ++device_it) { |
333 if (!FindLocalSource(*device_it)) | 334 if (!FindLocalSource(*device_it)) |
334 media_stream_dispatcher_->StopStreamDevice(*device_it); | 335 media_stream_dispatcher_->StopStreamDevice(*device_it); |
335 } | 336 } |
336 } | 337 } |
337 | 338 |
338 // Callback from MediaStreamDispatcher. | 339 // Callback from MediaStreamDispatcher. |
339 // The requested stream failed to be generated. | 340 // The requested stream failed to be generated. |
340 void MediaStreamImpl::OnStreamGenerationFailed( | 341 void UserMediaClientImpl::OnStreamGenerationFailed( |
341 int request_id, | 342 int request_id, |
342 MediaStreamRequestResult result) { | 343 MediaStreamRequestResult result) { |
343 DCHECK(CalledOnValidThread()); | 344 DCHECK(CalledOnValidThread()); |
344 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" | 345 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerationFailed(" |
345 << request_id << ")"; | 346 << request_id << ")"; |
346 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 347 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
347 if (!request_info) { | 348 if (!request_info) { |
348 // This can happen if the request is canceled or the frame reloads while | 349 // This can happen if the request is canceled or the frame reloads while |
349 // MediaStreamDispatcher is processing the request. | 350 // MediaStreamDispatcher is processing the request. |
350 DVLOG(1) << "Request ID not found"; | 351 DVLOG(1) << "Request ID not found"; |
351 return; | 352 return; |
352 } | 353 } |
353 | 354 |
354 GetUserMediaRequestFailed(&request_info->request, result); | 355 GetUserMediaRequestFailed(&request_info->request, result); |
355 DeleteUserMediaRequestInfo(request_info); | 356 DeleteUserMediaRequestInfo(request_info); |
356 } | 357 } |
357 | 358 |
358 // Callback from MediaStreamDispatcher. | 359 // Callback from MediaStreamDispatcher. |
359 // The browser process has stopped a device used by a MediaStream. | 360 // The browser process has stopped a device used by a MediaStream. |
360 void MediaStreamImpl::OnDeviceStopped( | 361 void UserMediaClientImpl::OnDeviceStopped( |
361 const std::string& label, | 362 const std::string& label, |
362 const StreamDeviceInfo& device_info) { | 363 const StreamDeviceInfo& device_info) { |
363 DCHECK(CalledOnValidThread()); | 364 DCHECK(CalledOnValidThread()); |
364 DVLOG(1) << "MediaStreamImpl::OnDeviceStopped(" | 365 DVLOG(1) << "UserMediaClientImpl::OnDeviceStopped(" |
365 << "{device_id = " << device_info.device.id << "})"; | 366 << "{device_id = " << device_info.device.id << "})"; |
366 | 367 |
367 const blink::WebMediaStreamSource* source_ptr = FindLocalSource(device_info); | 368 const blink::WebMediaStreamSource* source_ptr = FindLocalSource(device_info); |
368 if (!source_ptr) { | 369 if (!source_ptr) { |
369 // This happens if the same device is used in several guM requests or | 370 // This happens if the same device is used in several guM requests or |
370 // if a user happen stop a track from JS at the same time | 371 // if a user happen stop a track from JS at the same time |
371 // as the underlying media device is unplugged from the system. | 372 // as the underlying media device is unplugged from the system. |
372 return; | 373 return; |
373 } | 374 } |
374 // By creating |source| it is guaranteed that the blink::WebMediaStreamSource | 375 // By creating |source| it is guaranteed that the blink::WebMediaStreamSource |
375 // object is valid during the cleanup. | 376 // object is valid during the cleanup. |
376 blink::WebMediaStreamSource source(*source_ptr); | 377 blink::WebMediaStreamSource source(*source_ptr); |
377 StopLocalSource(source, false); | 378 StopLocalSource(source, false); |
378 | 379 |
379 for (LocalStreamSources::iterator device_it = local_sources_.begin(); | 380 for (LocalStreamSources::iterator device_it = local_sources_.begin(); |
380 device_it != local_sources_.end(); ++device_it) { | 381 device_it != local_sources_.end(); ++device_it) { |
381 if (device_it->id() == source.id()) { | 382 if (device_it->id() == source.id()) { |
382 local_sources_.erase(device_it); | 383 local_sources_.erase(device_it); |
383 break; | 384 break; |
384 } | 385 } |
385 } | 386 } |
386 } | 387 } |
387 | 388 |
388 void MediaStreamImpl::InitializeSourceObject( | 389 void UserMediaClientImpl::InitializeSourceObject( |
389 const StreamDeviceInfo& device, | 390 const StreamDeviceInfo& device, |
390 blink::WebMediaStreamSource::Type type, | 391 blink::WebMediaStreamSource::Type type, |
391 const blink::WebMediaConstraints& constraints, | 392 const blink::WebMediaConstraints& constraints, |
392 blink::WebMediaStreamSource* webkit_source) { | 393 blink::WebMediaStreamSource* webkit_source) { |
393 const blink::WebMediaStreamSource* existing_source = | 394 const blink::WebMediaStreamSource* existing_source = |
394 FindLocalSource(device); | 395 FindLocalSource(device); |
395 if (existing_source) { | 396 if (existing_source) { |
396 *webkit_source = *existing_source; | 397 *webkit_source = *existing_source; |
397 DVLOG(1) << "Source already exist. Reusing source with id " | 398 DVLOG(1) << "Source already exist. Reusing source with id " |
398 << webkit_source->id().utf8(); | 399 << webkit_source->id().utf8(); |
399 return; | 400 return; |
400 } | 401 } |
401 | 402 |
402 webkit_source->initialize( | 403 webkit_source->initialize( |
403 base::UTF8ToUTF16(device.device.id), | 404 base::UTF8ToUTF16(device.device.id), |
404 type, | 405 type, |
405 base::UTF8ToUTF16(device.device.name)); | 406 base::UTF8ToUTF16(device.device.name)); |
406 | 407 |
407 DVLOG(1) << "Initialize source object :" | 408 DVLOG(1) << "Initialize source object :" |
408 << "id = " << webkit_source->id().utf8() | 409 << "id = " << webkit_source->id().utf8() |
409 << ", name = " << webkit_source->name().utf8(); | 410 << ", name = " << webkit_source->name().utf8(); |
410 | 411 |
411 if (type == blink::WebMediaStreamSource::TypeVideo) { | 412 if (type == blink::WebMediaStreamSource::TypeVideo) { |
412 webkit_source->setExtraData( | 413 webkit_source->setExtraData( |
413 CreateVideoSource( | 414 CreateVideoSource( |
414 device, | 415 device, |
415 base::Bind(&MediaStreamImpl::OnLocalSourceStopped, | 416 base::Bind(&UserMediaClientImpl::OnLocalSourceStopped, |
416 weak_factory_.GetWeakPtr()))); | 417 weak_factory_.GetWeakPtr()))); |
417 } else { | 418 } else { |
418 DCHECK_EQ(blink::WebMediaStreamSource::TypeAudio, type); | 419 DCHECK_EQ(blink::WebMediaStreamSource::TypeAudio, type); |
419 MediaStreamAudioSource* audio_source( | 420 MediaStreamAudioSource* audio_source( |
420 new MediaStreamAudioSource( | 421 new MediaStreamAudioSource( |
421 RenderFrameObserver::routing_id(), | 422 RenderFrameObserver::routing_id(), |
422 device, | 423 device, |
423 base::Bind(&MediaStreamImpl::OnLocalSourceStopped, | 424 base::Bind(&UserMediaClientImpl::OnLocalSourceStopped, |
424 weak_factory_.GetWeakPtr()), | 425 weak_factory_.GetWeakPtr()), |
425 dependency_factory_)); | 426 dependency_factory_)); |
426 webkit_source->setExtraData(audio_source); | 427 webkit_source->setExtraData(audio_source); |
427 } | 428 } |
428 local_sources_.push_back(*webkit_source); | 429 local_sources_.push_back(*webkit_source); |
429 } | 430 } |
430 | 431 |
431 MediaStreamVideoSource* MediaStreamImpl::CreateVideoSource( | 432 MediaStreamVideoSource* UserMediaClientImpl::CreateVideoSource( |
432 const StreamDeviceInfo& device, | 433 const StreamDeviceInfo& device, |
433 const MediaStreamSource::SourceStoppedCallback& stop_callback) { | 434 const MediaStreamSource::SourceStoppedCallback& stop_callback) { |
434 return new content::MediaStreamVideoCapturerSource( | 435 return new content::MediaStreamVideoCapturerSource( |
435 device, | 436 device, |
436 stop_callback, | 437 stop_callback, |
437 new VideoCapturerDelegate(device)); | 438 new VideoCapturerDelegate(device)); |
438 } | 439 } |
439 | 440 |
440 void MediaStreamImpl::CreateVideoTracks( | 441 void UserMediaClientImpl::CreateVideoTracks( |
441 const StreamDeviceInfoArray& devices, | 442 const StreamDeviceInfoArray& devices, |
442 const blink::WebMediaConstraints& constraints, | 443 const blink::WebMediaConstraints& constraints, |
443 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 444 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, |
444 UserMediaRequestInfo* request) { | 445 UserMediaRequestInfo* request) { |
445 DCHECK_EQ(devices.size(), webkit_tracks->size()); | 446 DCHECK_EQ(devices.size(), webkit_tracks->size()); |
446 | 447 |
447 for (size_t i = 0; i < devices.size(); ++i) { | 448 for (size_t i = 0; i < devices.size(); ++i) { |
448 blink::WebMediaStreamSource webkit_source; | 449 blink::WebMediaStreamSource webkit_source; |
449 InitializeSourceObject(devices[i], | 450 InitializeSourceObject(devices[i], |
450 blink::WebMediaStreamSource::TypeVideo, | 451 blink::WebMediaStreamSource::TypeVideo, |
451 constraints, | 452 constraints, |
452 &webkit_source); | 453 &webkit_source); |
453 (*webkit_tracks)[i] = | 454 (*webkit_tracks)[i] = |
454 request->CreateAndStartVideoTrack(webkit_source, constraints); | 455 request->CreateAndStartVideoTrack(webkit_source, constraints); |
455 } | 456 } |
456 } | 457 } |
457 | 458 |
458 void MediaStreamImpl::CreateAudioTracks( | 459 void UserMediaClientImpl::CreateAudioTracks( |
459 const StreamDeviceInfoArray& devices, | 460 const StreamDeviceInfoArray& devices, |
460 const blink::WebMediaConstraints& constraints, | 461 const blink::WebMediaConstraints& constraints, |
461 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 462 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, |
462 UserMediaRequestInfo* request) { | 463 UserMediaRequestInfo* request) { |
463 DCHECK_EQ(devices.size(), webkit_tracks->size()); | 464 DCHECK_EQ(devices.size(), webkit_tracks->size()); |
464 | 465 |
465 // Log the device names for this request. | 466 // Log the device names for this request. |
466 for (StreamDeviceInfoArray::const_iterator it = devices.begin(); | 467 for (StreamDeviceInfoArray::const_iterator it = devices.begin(); |
467 it != devices.end(); ++it) { | 468 it != devices.end(); ++it) { |
468 WebRtcLogMessage(base::StringPrintf( | 469 WebRtcLogMessage(base::StringPrintf( |
(...skipping 19 matching lines...) Expand all Loading... | |
488 blink::WebMediaStreamSource webkit_source; | 489 blink::WebMediaStreamSource webkit_source; |
489 InitializeSourceObject(overridden_audio_array[i], | 490 InitializeSourceObject(overridden_audio_array[i], |
490 blink::WebMediaStreamSource::TypeAudio, | 491 blink::WebMediaStreamSource::TypeAudio, |
491 constraints, | 492 constraints, |
492 &webkit_source); | 493 &webkit_source); |
493 (*webkit_tracks)[i].initialize(webkit_source); | 494 (*webkit_tracks)[i].initialize(webkit_source); |
494 request->StartAudioTrack((*webkit_tracks)[i], constraints); | 495 request->StartAudioTrack((*webkit_tracks)[i], constraints); |
495 } | 496 } |
496 } | 497 } |
497 | 498 |
498 void MediaStreamImpl::OnCreateNativeTracksCompleted( | 499 void UserMediaClientImpl::OnCreateNativeTracksCompleted( |
499 UserMediaRequestInfo* request, | 500 UserMediaRequestInfo* request, |
500 MediaStreamRequestResult result, | 501 MediaStreamRequestResult result, |
501 const blink::WebString& result_name) { | 502 const blink::WebString& result_name) { |
502 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" | 503 DVLOG(1) << "UserMediaClientImpl::OnCreateNativeTracksComplete(" |
503 << "{request_id = " << request->request_id << "} " | 504 << "{request_id = " << request->request_id << "} " |
504 << "{result = " << result << "})"; | 505 << "{result = " << result << "})"; |
505 if (result == content::MEDIA_DEVICE_OK) | 506 if (result == content::MEDIA_DEVICE_OK) |
506 GetUserMediaRequestSucceeded(request->web_stream, &request->request); | 507 GetUserMediaRequestSucceeded(request->web_stream, &request->request); |
507 else | 508 else |
508 GetUserMediaRequestTrackStartedFailed(&request->request, | 509 GetUserMediaRequestTrackStartedFailed(&request->request, |
509 result, | 510 result, |
510 result_name); | 511 result_name); |
511 | 512 |
512 DeleteUserMediaRequestInfo(request); | 513 DeleteUserMediaRequestInfo(request); |
513 } | 514 } |
514 | 515 |
515 void MediaStreamImpl::OnDevicesEnumerated( | 516 void UserMediaClientImpl::OnDevicesEnumerated( |
516 int request_id, | 517 int request_id, |
517 const StreamDeviceInfoArray& device_array) { | 518 const StreamDeviceInfoArray& device_array) { |
518 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; | 519 DVLOG(1) << "UserMediaClientImpl::OnDevicesEnumerated(" << request_id << ")"; |
519 | 520 |
520 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); | 521 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); |
521 DCHECK(request); | 522 DCHECK(request); |
522 | 523 |
523 if (request_id == request->audio_input_request_id) { | 524 if (request_id == request->audio_input_request_id) { |
524 request->has_audio_input_returned = true; | 525 request->has_audio_input_returned = true; |
525 DCHECK(request->audio_input_devices.empty()); | 526 DCHECK(request->audio_input_devices.empty()); |
526 request->audio_input_devices = device_array; | 527 request->audio_input_devices = device_array; |
527 } else if (request_id == request->video_input_request_id) { | 528 } else if (request_id == request->video_input_request_id) { |
528 request->has_video_input_returned = true; | 529 request->has_video_input_returned = true; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
581 blink::WebString::fromUTF8(device.id), | 582 blink::WebString::fromUTF8(device.id), |
582 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, | 583 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, |
583 blink::WebString::fromUTF8(device.name), | 584 blink::WebString::fromUTF8(device.name), |
584 blink::WebString::fromUTF8(base::UintToString(base::Hash(device.id)))); | 585 blink::WebString::fromUTF8(base::UintToString(base::Hash(device.id)))); |
585 } | 586 } |
586 | 587 |
587 EnumerateDevicesSucceded(&request->request, devices); | 588 EnumerateDevicesSucceded(&request->request, devices); |
588 CancelAndDeleteMediaDevicesRequest(request); | 589 CancelAndDeleteMediaDevicesRequest(request); |
589 } | 590 } |
590 | 591 |
591 void MediaStreamImpl::OnDeviceOpened( | 592 void UserMediaClientImpl::OnDeviceOpened( |
592 int request_id, | 593 int request_id, |
593 const std::string& label, | 594 const std::string& label, |
594 const StreamDeviceInfo& video_device) { | 595 const StreamDeviceInfo& video_device) { |
595 DVLOG(1) << "MediaStreamImpl::OnDeviceOpened(" | 596 DVLOG(1) << "UserMediaClientImpl::OnDeviceOpened(" |
596 << request_id << ", " << label << ")"; | 597 << request_id << ", " << label << ")"; |
597 NOTIMPLEMENTED(); | 598 NOTIMPLEMENTED(); |
598 } | 599 } |
599 | 600 |
600 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { | 601 void UserMediaClientImpl::OnDeviceOpenFailed(int request_id) { |
601 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" | 602 DVLOG(1) << "UserMediaClientImpl::VideoDeviceOpenFailed(" |
602 << request_id << ")"; | 603 << request_id << ")"; |
603 NOTIMPLEMENTED(); | 604 NOTIMPLEMENTED(); |
604 } | 605 } |
605 | 606 |
606 void MediaStreamImpl::GetUserMediaRequestSucceeded( | 607 void UserMediaClientImpl::GetUserMediaRequestSucceeded( |
607 const blink::WebMediaStream& stream, | 608 const blink::WebMediaStream& stream, |
608 blink::WebUserMediaRequest* request_info) { | 609 blink::WebUserMediaRequest* request_info) { |
609 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; | 610 DVLOG(1) << "UserMediaClientImpl::GetUserMediaRequestSucceeded"; |
610 LogUserMediaRequestResult(MEDIA_DEVICE_OK); | 611 LogUserMediaRequestResult(MEDIA_DEVICE_OK); |
611 request_info->requestSucceeded(stream); | 612 request_info->requestSucceeded(stream); |
612 } | 613 } |
613 | 614 |
614 void MediaStreamImpl::GetUserMediaRequestFailed( | 615 void UserMediaClientImpl::GetUserMediaRequestFailed( |
615 blink::WebUserMediaRequest* request_info, | 616 blink::WebUserMediaRequest* request_info, |
616 MediaStreamRequestResult result) { | 617 MediaStreamRequestResult result) { |
617 LogUserMediaRequestResult(result); | 618 LogUserMediaRequestResult(result); |
618 switch (result) { | 619 switch (result) { |
619 case MEDIA_DEVICE_OK: | 620 case MEDIA_DEVICE_OK: |
620 NOTREACHED(); | 621 NOTREACHED(); |
621 break; | 622 break; |
622 case MEDIA_DEVICE_PERMISSION_DENIED: | 623 case MEDIA_DEVICE_PERMISSION_DENIED: |
623 request_info->requestDenied(); | 624 request_info->requestDenied(); |
624 break; | 625 break; |
(...skipping 18 matching lines...) Expand all Loading... | |
643 case MEDIA_DEVICE_CAPTURE_FAILURE: | 644 case MEDIA_DEVICE_CAPTURE_FAILURE: |
644 request_info->requestFailedUASpecific("DeviceCaptureError"); | 645 request_info->requestFailedUASpecific("DeviceCaptureError"); |
645 break; | 646 break; |
646 default: | 647 default: |
647 NOTREACHED(); | 648 NOTREACHED(); |
648 request_info->requestFailed(); | 649 request_info->requestFailed(); |
649 break; | 650 break; |
650 } | 651 } |
651 } | 652 } |
652 | 653 |
653 void MediaStreamImpl::GetUserMediaRequestTrackStartedFailed( | 654 void UserMediaClientImpl::GetUserMediaRequestTrackStartedFailed( |
654 blink::WebUserMediaRequest* request_info, | 655 blink::WebUserMediaRequest* request_info, |
655 MediaStreamRequestResult result, | 656 MediaStreamRequestResult result, |
656 const blink::WebString& result_name) { | 657 const blink::WebString& result_name) { |
657 switch (result) { | 658 switch (result) { |
658 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: | 659 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: |
659 request_info->requestFailedConstraint(result_name); | 660 request_info->requestFailedConstraint(result_name); |
660 break; | 661 break; |
661 case MEDIA_DEVICE_TRACK_START_FAILURE: | 662 case MEDIA_DEVICE_TRACK_START_FAILURE: |
662 request_info->requestFailedUASpecific("TrackStartError"); | 663 request_info->requestFailedUASpecific("TrackStartError"); |
663 break; | 664 break; |
664 default: | 665 default: |
665 NOTREACHED(); | 666 NOTREACHED(); |
666 request_info->requestFailed(); | 667 request_info->requestFailed(); |
667 break; | 668 break; |
668 } | 669 } |
669 } | 670 } |
670 | 671 |
671 void MediaStreamImpl::EnumerateDevicesSucceded( | 672 void UserMediaClientImpl::EnumerateDevicesSucceded( |
672 blink::WebMediaDevicesRequest* request, | 673 blink::WebMediaDevicesRequest* request, |
673 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { | 674 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { |
674 request->requestSucceeded(devices); | 675 request->requestSucceeded(devices); |
675 } | 676 } |
676 | 677 |
677 const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( | 678 const blink::WebMediaStreamSource* UserMediaClientImpl::FindLocalSource( |
678 const StreamDeviceInfo& device) const { | 679 const StreamDeviceInfo& device) const { |
679 for (LocalStreamSources::const_iterator it = local_sources_.begin(); | 680 for (LocalStreamSources::const_iterator it = local_sources_.begin(); |
680 it != local_sources_.end(); ++it) { | 681 it != local_sources_.end(); ++it) { |
681 MediaStreamSource* const source = | 682 MediaStreamSource* const source = |
682 static_cast<MediaStreamSource*>(it->extraData()); | 683 static_cast<MediaStreamSource*>(it->extraData()); |
683 const StreamDeviceInfo& active_device = source->device_info(); | 684 const StreamDeviceInfo& active_device = source->device_info(); |
684 if (active_device.device.id == device.device.id && | 685 if (active_device.device.id == device.device.id && |
685 active_device.device.type == device.device.type && | 686 active_device.device.type == device.device.type && |
686 active_device.session_id == device.session_id) { | 687 active_device.session_id == device.session_id) { |
687 return &(*it); | 688 return &(*it); |
688 } | 689 } |
689 } | 690 } |
690 return NULL; | 691 return NULL; |
691 } | 692 } |
692 | 693 |
693 MediaStreamImpl::UserMediaRequestInfo* | 694 UserMediaClientImpl::UserMediaRequestInfo* |
694 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { | 695 UserMediaClientImpl::FindUserMediaRequestInfo(int request_id) { |
695 UserMediaRequests::iterator it = user_media_requests_.begin(); | 696 UserMediaRequests::iterator it = user_media_requests_.begin(); |
696 for (; it != user_media_requests_.end(); ++it) { | 697 for (; it != user_media_requests_.end(); ++it) { |
697 if ((*it)->request_id == request_id) | 698 if ((*it)->request_id == request_id) |
698 return (*it); | 699 return (*it); |
699 } | 700 } |
700 return NULL; | 701 return NULL; |
701 } | 702 } |
702 | 703 |
703 MediaStreamImpl::UserMediaRequestInfo* | 704 UserMediaClientImpl::UserMediaRequestInfo* |
704 MediaStreamImpl::FindUserMediaRequestInfo( | 705 UserMediaClientImpl::FindUserMediaRequestInfo( |
705 const blink::WebUserMediaRequest& request) { | 706 const blink::WebUserMediaRequest& request) { |
706 UserMediaRequests::iterator it = user_media_requests_.begin(); | 707 UserMediaRequests::iterator it = user_media_requests_.begin(); |
707 for (; it != user_media_requests_.end(); ++it) { | 708 for (; it != user_media_requests_.end(); ++it) { |
708 if ((*it)->request == request) | 709 if ((*it)->request == request) |
709 return (*it); | 710 return (*it); |
710 } | 711 } |
711 return NULL; | 712 return NULL; |
712 } | 713 } |
713 | 714 |
714 void MediaStreamImpl::DeleteUserMediaRequestInfo( | 715 void UserMediaClientImpl::DeleteUserMediaRequestInfo( |
715 UserMediaRequestInfo* request) { | 716 UserMediaRequestInfo* request) { |
716 UserMediaRequests::iterator it = user_media_requests_.begin(); | 717 UserMediaRequests::iterator it = user_media_requests_.begin(); |
717 for (; it != user_media_requests_.end(); ++it) { | 718 for (; it != user_media_requests_.end(); ++it) { |
718 if ((*it) == request) { | 719 if ((*it) == request) { |
719 user_media_requests_.erase(it); | 720 user_media_requests_.erase(it); |
720 return; | 721 return; |
721 } | 722 } |
722 } | 723 } |
723 NOTREACHED(); | 724 NOTREACHED(); |
724 } | 725 } |
725 | 726 |
726 void MediaStreamImpl::DeleteAllUserMediaRequests() { | 727 void UserMediaClientImpl::DeleteAllUserMediaRequests() { |
727 UserMediaRequests::iterator request_it = user_media_requests_.begin(); | 728 UserMediaRequests::iterator request_it = user_media_requests_.begin(); |
728 while (request_it != user_media_requests_.end()) { | 729 while (request_it != user_media_requests_.end()) { |
729 DVLOG(1) << "MediaStreamImpl@" << this << "::DeleteAllUserMediaRequests: " | 730 DVLOG(1) << "UserMediaClientImpl@" << this |
731 << "::DeleteAllUserMediaRequests: " | |
730 << "Cancel user media request " << (*request_it)->request_id; | 732 << "Cancel user media request " << (*request_it)->request_id; |
731 // If the request is not generated, it means that a request | 733 // If the request is not generated, it means that a request |
732 // has been sent to the MediaStreamDispatcher to generate a stream | 734 // has been sent to the MediaStreamDispatcher to generate a stream |
733 // but MediaStreamDispatcher has not yet responded and we need to cancel | 735 // but MediaStreamDispatcher has not yet responded and we need to cancel |
734 // the request. | 736 // the request. |
735 if (!(*request_it)->generated) { | 737 if (!(*request_it)->generated) { |
736 DCHECK(!(*request_it)->HasPendingSources()); | 738 DCHECK(!(*request_it)->HasPendingSources()); |
737 media_stream_dispatcher_->CancelGenerateStream( | 739 media_stream_dispatcher_->CancelGenerateStream( |
738 (*request_it)->request_id, weak_factory_.GetWeakPtr()); | 740 (*request_it)->request_id, weak_factory_.GetWeakPtr()); |
739 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_NOT_GENERATED); | 741 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_NOT_GENERATED); |
740 } else { | 742 } else { |
741 DCHECK((*request_it)->HasPendingSources()); | 743 DCHECK((*request_it)->HasPendingSources()); |
742 LogUserMediaRequestWithNoResult( | 744 LogUserMediaRequestWithNoResult( |
743 MEDIA_STREAM_REQUEST_PENDING_MEDIA_TRACKS); | 745 MEDIA_STREAM_REQUEST_PENDING_MEDIA_TRACKS); |
744 } | 746 } |
745 request_it = user_media_requests_.erase(request_it); | 747 request_it = user_media_requests_.erase(request_it); |
746 } | 748 } |
747 } | 749 } |
748 | 750 |
749 MediaStreamImpl::MediaDevicesRequestInfo* | 751 UserMediaClientImpl::MediaDevicesRequestInfo* |
750 MediaStreamImpl::FindMediaDevicesRequestInfo( | 752 UserMediaClientImpl::FindMediaDevicesRequestInfo( |
751 int request_id) { | 753 int request_id) { |
752 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 754 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
753 for (; it != media_devices_requests_.end(); ++it) { | 755 for (; it != media_devices_requests_.end(); ++it) { |
754 if ((*it)->audio_input_request_id == request_id || | 756 if ((*it)->audio_input_request_id == request_id || |
755 (*it)->video_input_request_id == request_id || | 757 (*it)->video_input_request_id == request_id || |
756 (*it)->audio_output_request_id == request_id) { | 758 (*it)->audio_output_request_id == request_id) { |
757 return (*it); | 759 return (*it); |
758 } | 760 } |
759 } | 761 } |
760 return NULL; | 762 return NULL; |
761 } | 763 } |
762 | 764 |
763 MediaStreamImpl::MediaDevicesRequestInfo* | 765 UserMediaClientImpl::MediaDevicesRequestInfo* |
764 MediaStreamImpl::FindMediaDevicesRequestInfo( | 766 UserMediaClientImpl::FindMediaDevicesRequestInfo( |
765 const blink::WebMediaDevicesRequest& request) { | 767 const blink::WebMediaDevicesRequest& request) { |
766 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 768 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
767 for (; it != media_devices_requests_.end(); ++it) { | 769 for (; it != media_devices_requests_.end(); ++it) { |
768 if ((*it)->request == request) | 770 if ((*it)->request == request) |
769 return (*it); | 771 return (*it); |
770 } | 772 } |
771 return NULL; | 773 return NULL; |
772 } | 774 } |
773 | 775 |
774 void MediaStreamImpl::CancelAndDeleteMediaDevicesRequest( | 776 void UserMediaClientImpl::CancelAndDeleteMediaDevicesRequest( |
775 MediaDevicesRequestInfo* request) { | 777 MediaDevicesRequestInfo* request) { |
776 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 778 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
777 for (; it != media_devices_requests_.end(); ++it) { | 779 for (; it != media_devices_requests_.end(); ++it) { |
778 if ((*it) == request) { | 780 if ((*it) == request) { |
779 // Cancel device enumeration. | 781 // Cancel device enumeration. |
780 media_stream_dispatcher_->StopEnumerateDevices( | 782 media_stream_dispatcher_->StopEnumerateDevices( |
781 request->audio_input_request_id, weak_factory_.GetWeakPtr()); | 783 request->audio_input_request_id, weak_factory_.GetWeakPtr()); |
782 media_stream_dispatcher_->StopEnumerateDevices( | 784 media_stream_dispatcher_->StopEnumerateDevices( |
783 request->video_input_request_id, weak_factory_.GetWeakPtr()); | 785 request->video_input_request_id, weak_factory_.GetWeakPtr()); |
784 media_stream_dispatcher_->StopEnumerateDevices( | 786 media_stream_dispatcher_->StopEnumerateDevices( |
785 request->audio_output_request_id, weak_factory_.GetWeakPtr()); | 787 request->audio_output_request_id, weak_factory_.GetWeakPtr()); |
786 | 788 |
787 media_devices_requests_.erase(it); | 789 media_devices_requests_.erase(it); |
788 return; | 790 return; |
789 } | 791 } |
790 } | 792 } |
791 NOTREACHED(); | 793 NOTREACHED(); |
792 } | 794 } |
793 | 795 |
794 void MediaStreamImpl::FrameWillClose() { | 796 void UserMediaClientImpl::FrameWillClose() { |
795 // Cancel all outstanding UserMediaRequests. | 797 // Cancel all outstanding UserMediaRequests. |
796 DeleteAllUserMediaRequests(); | 798 DeleteAllUserMediaRequests(); |
797 | 799 |
798 // Loop through all current local sources and stop the sources. | 800 // Loop through all current local sources and stop the sources. |
799 LocalStreamSources::iterator sources_it = local_sources_.begin(); | 801 LocalStreamSources::iterator sources_it = local_sources_.begin(); |
800 while (sources_it != local_sources_.end()) { | 802 while (sources_it != local_sources_.end()) { |
801 StopLocalSource(*sources_it, true); | 803 StopLocalSource(*sources_it, true); |
802 sources_it = local_sources_.erase(sources_it); | 804 sources_it = local_sources_.erase(sources_it); |
803 } | 805 } |
804 } | 806 } |
805 | 807 |
806 void MediaStreamImpl::OnLocalSourceStopped( | 808 void UserMediaClientImpl::OnLocalSourceStopped( |
807 const blink::WebMediaStreamSource& source) { | 809 const blink::WebMediaStreamSource& source) { |
808 DCHECK(CalledOnValidThread()); | 810 DCHECK(CalledOnValidThread()); |
809 DVLOG(1) << "MediaStreamImpl::OnLocalSourceStopped"; | 811 DVLOG(1) << "UserMediaClientImpl::OnLocalSourceStopped"; |
810 | 812 |
811 bool device_found = false; | 813 bool device_found = false; |
812 for (LocalStreamSources::iterator device_it = local_sources_.begin(); | 814 for (LocalStreamSources::iterator device_it = local_sources_.begin(); |
813 device_it != local_sources_.end(); ++device_it) { | 815 device_it != local_sources_.end(); ++device_it) { |
814 if (device_it->id() == source.id()) { | 816 if (device_it->id() == source.id()) { |
815 device_found = true; | 817 device_found = true; |
816 local_sources_.erase(device_it); | 818 local_sources_.erase(device_it); |
817 break; | 819 break; |
818 } | 820 } |
819 } | 821 } |
820 CHECK(device_found); | 822 CHECK(device_found); |
821 | 823 |
822 MediaStreamSource* source_impl = | 824 MediaStreamSource* source_impl = |
823 static_cast<MediaStreamSource*>(source.extraData()); | 825 static_cast<MediaStreamSource*>(source.extraData()); |
824 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); | 826 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); |
825 } | 827 } |
826 | 828 |
827 void MediaStreamImpl::StopLocalSource( | 829 void UserMediaClientImpl::StopLocalSource( |
828 const blink::WebMediaStreamSource& source, | 830 const blink::WebMediaStreamSource& source, |
829 bool notify_dispatcher) { | 831 bool notify_dispatcher) { |
830 MediaStreamSource* source_impl = | 832 MediaStreamSource* source_impl = |
831 static_cast<MediaStreamSource*>(source.extraData()); | 833 static_cast<MediaStreamSource*>(source.extraData()); |
832 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" | 834 DVLOG(1) << "UserMediaClientImpl::StopLocalSource(" |
833 << "{device_id = " << source_impl->device_info().device.id << "})"; | 835 << "{device_id = " << source_impl->device_info().device.id << "})"; |
834 | 836 |
835 if (notify_dispatcher) | 837 if (notify_dispatcher) |
836 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); | 838 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); |
837 | 839 |
838 source_impl->ResetSourceStoppedCallback(); | 840 source_impl->ResetSourceStoppedCallback(); |
839 source_impl->StopSource(); | 841 source_impl->StopSource(); |
840 } | 842 } |
841 | 843 |
842 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( | 844 UserMediaClientImpl::UserMediaRequestInfo::UserMediaRequestInfo( |
843 int request_id, | 845 int request_id, |
844 const blink::WebUserMediaRequest& request, | 846 const blink::WebUserMediaRequest& request, |
845 bool enable_automatic_output_device_selection) | 847 bool enable_automatic_output_device_selection) |
846 : request_id(request_id), | 848 : request_id(request_id), |
847 generated(false), | 849 generated(false), |
848 enable_automatic_output_device_selection( | 850 enable_automatic_output_device_selection( |
849 enable_automatic_output_device_selection), | 851 enable_automatic_output_device_selection), |
850 request(request), | 852 request(request), |
851 request_result_(MEDIA_DEVICE_OK), | 853 request_result_(MEDIA_DEVICE_OK), |
852 request_result_name_("") { | 854 request_result_name_("") { |
853 } | 855 } |
854 | 856 |
855 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { | 857 UserMediaClientImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { |
856 DVLOG(1) << "~UserMediaRequestInfo"; | 858 DVLOG(1) << "~UserMediaRequestInfo"; |
857 } | 859 } |
858 | 860 |
859 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack( | 861 void UserMediaClientImpl::UserMediaRequestInfo::StartAudioTrack( |
860 const blink::WebMediaStreamTrack& track, | 862 const blink::WebMediaStreamTrack& track, |
861 const blink::WebMediaConstraints& constraints) { | 863 const blink::WebMediaConstraints& constraints) { |
862 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); | 864 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); |
863 MediaStreamAudioSource* native_source = | 865 MediaStreamAudioSource* native_source = |
864 static_cast <MediaStreamAudioSource*>(track.source().extraData()); | 866 static_cast <MediaStreamAudioSource*>(track.source().extraData()); |
865 DCHECK(native_source); | 867 DCHECK(native_source); |
866 | 868 |
867 sources_.push_back(track.source()); | 869 sources_.push_back(track.source()); |
868 sources_waiting_for_callback_.push_back(native_source); | 870 sources_waiting_for_callback_.push_back(native_source); |
869 native_source->AddTrack( | 871 native_source->AddTrack( |
870 track, constraints, base::Bind( | 872 track, constraints, base::Bind( |
871 &MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted, | 873 &UserMediaClientImpl::UserMediaRequestInfo::OnTrackStarted, |
872 AsWeakPtr())); | 874 AsWeakPtr())); |
873 } | 875 } |
874 | 876 |
875 blink::WebMediaStreamTrack | 877 blink::WebMediaStreamTrack |
876 MediaStreamImpl::UserMediaRequestInfo::CreateAndStartVideoTrack( | 878 UserMediaClientImpl::UserMediaRequestInfo::CreateAndStartVideoTrack( |
877 const blink::WebMediaStreamSource& source, | 879 const blink::WebMediaStreamSource& source, |
878 const blink::WebMediaConstraints& constraints) { | 880 const blink::WebMediaConstraints& constraints) { |
879 DCHECK(source.type() == blink::WebMediaStreamSource::TypeVideo); | 881 DCHECK(source.type() == blink::WebMediaStreamSource::TypeVideo); |
880 MediaStreamVideoSource* native_source = | 882 MediaStreamVideoSource* native_source = |
881 MediaStreamVideoSource::GetVideoSource(source); | 883 MediaStreamVideoSource::GetVideoSource(source); |
882 DCHECK(native_source); | 884 DCHECK(native_source); |
883 sources_.push_back(source); | 885 sources_.push_back(source); |
884 sources_waiting_for_callback_.push_back(native_source); | 886 sources_waiting_for_callback_.push_back(native_source); |
885 return MediaStreamVideoTrack::CreateVideoTrack( | 887 return MediaStreamVideoTrack::CreateVideoTrack( |
886 native_source, constraints, base::Bind( | 888 native_source, constraints, base::Bind( |
887 &MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted, | 889 &UserMediaClientImpl::UserMediaRequestInfo::OnTrackStarted, |
888 AsWeakPtr()), | 890 AsWeakPtr()), |
889 true); | 891 true); |
890 } | 892 } |
891 | 893 |
892 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( | 894 void UserMediaClientImpl::UserMediaRequestInfo::CallbackOnTracksStarted( |
893 const ResourcesReady& callback) { | 895 const ResourcesReady& callback) { |
894 DCHECK(ready_callback_.is_null()); | 896 DCHECK(ready_callback_.is_null()); |
895 ready_callback_ = callback; | 897 ready_callback_ = callback; |
896 CheckAllTracksStarted(); | 898 CheckAllTracksStarted(); |
897 } | 899 } |
898 | 900 |
899 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( | 901 void UserMediaClientImpl::UserMediaRequestInfo::OnTrackStarted( |
900 MediaStreamSource* source, | 902 MediaStreamSource* source, |
901 MediaStreamRequestResult result, | 903 MediaStreamRequestResult result, |
902 const blink::WebString& result_name) { | 904 const blink::WebString& result_name) { |
903 DVLOG(1) << "OnTrackStarted result " << result; | 905 DVLOG(1) << "OnTrackStarted result " << result; |
904 std::vector<MediaStreamSource*>::iterator it = | 906 std::vector<MediaStreamSource*>::iterator it = |
905 std::find(sources_waiting_for_callback_.begin(), | 907 std::find(sources_waiting_for_callback_.begin(), |
906 sources_waiting_for_callback_.end(), | 908 sources_waiting_for_callback_.end(), |
907 source); | 909 source); |
908 DCHECK(it != sources_waiting_for_callback_.end()); | 910 DCHECK(it != sources_waiting_for_callback_.end()); |
909 sources_waiting_for_callback_.erase(it); | 911 sources_waiting_for_callback_.erase(it); |
910 // All tracks must be started successfully. Otherwise the request is a | 912 // All tracks must be started successfully. Otherwise the request is a |
911 // failure. | 913 // failure. |
912 if (result != MEDIA_DEVICE_OK) { | 914 if (result != MEDIA_DEVICE_OK) { |
913 request_result_ = result; | 915 request_result_ = result; |
914 request_result_name_ = result_name; | 916 request_result_name_ = result_name; |
915 } | 917 } |
916 | 918 |
917 CheckAllTracksStarted(); | 919 CheckAllTracksStarted(); |
918 } | 920 } |
919 | 921 |
920 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { | 922 void UserMediaClientImpl::UserMediaRequestInfo::CheckAllTracksStarted() { |
921 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { | 923 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { |
922 ready_callback_.Run(this, request_result_, request_result_name_); | 924 ready_callback_.Run(this, request_result_, request_result_name_); |
923 } | 925 } |
924 } | 926 } |
925 | 927 |
926 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( | 928 bool UserMediaClientImpl::UserMediaRequestInfo::IsSourceUsed( |
927 const blink::WebMediaStreamSource& source) const { | 929 const blink::WebMediaStreamSource& source) const { |
928 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = | 930 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = |
929 sources_.begin(); | 931 sources_.begin(); |
930 source_it != sources_.end(); ++source_it) { | 932 source_it != sources_.end(); ++source_it) { |
931 if (source_it->id() == source.id()) | 933 if (source_it->id() == source.id()) |
932 return true; | 934 return true; |
933 } | 935 } |
934 return false; | 936 return false; |
935 } | 937 } |
936 | 938 |
937 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource( | 939 void UserMediaClientImpl::UserMediaRequestInfo::RemoveSource( |
938 const blink::WebMediaStreamSource& source) { | 940 const blink::WebMediaStreamSource& source) { |
939 for (std::vector<blink::WebMediaStreamSource>::iterator it = | 941 for (std::vector<blink::WebMediaStreamSource>::iterator it = |
940 sources_.begin(); | 942 sources_.begin(); |
941 it != sources_.end(); ++it) { | 943 it != sources_.end(); ++it) { |
942 if (source.id() == it->id()) { | 944 if (source.id() == it->id()) { |
943 sources_.erase(it); | 945 sources_.erase(it); |
944 return; | 946 return; |
945 } | 947 } |
946 } | 948 } |
947 } | 949 } |
948 | 950 |
949 bool MediaStreamImpl::UserMediaRequestInfo::HasPendingSources() const { | 951 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { |
950 return !sources_waiting_for_callback_.empty(); | 952 return !sources_waiting_for_callback_.empty(); |
951 } | 953 } |
952 | 954 |
953 } // namespace content | 955 } // namespace content |
OLD | NEW |