Chromium Code Reviews| 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/user_media_client_impl.h" | 5 #include "content/renderer/media/user_media_client_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 233 WillCommitProvisionalLoad(); | 233 WillCommitProvisionalLoad(); |
| 234 } | 234 } |
| 235 | 235 |
| 236 void UserMediaClientImpl::requestUserMedia( | 236 void UserMediaClientImpl::requestUserMedia( |
| 237 const blink::WebUserMediaRequest& user_media_request) { | 237 const blink::WebUserMediaRequest& user_media_request) { |
| 238 // Save histogram data so we can see how much GetUserMedia is used. | 238 // Save histogram data so we can see how much GetUserMedia is used. |
| 239 // The histogram counts the number of calls to the JS API | 239 // The histogram counts the number of calls to the JS API |
| 240 // webGetUserMedia. | 240 // webGetUserMedia. |
| 241 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); | 241 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); |
| 242 DCHECK(CalledOnValidThread()); | 242 DCHECK(CalledOnValidThread()); |
| 243 DCHECK(!user_media_request.isNull()); | |
| 244 // ownerDocument may be null if we are in a test. | |
| 245 // In that case, it's OK to not check frame(). | |
| 246 DCHECK(user_media_request.ownerDocument().isNull() || | |
| 247 render_frame()->GetWebFrame() == | |
| 248 static_cast<blink::WebFrame*>( | |
| 249 user_media_request.ownerDocument().frame())); | |
|
hbos_chromium
2016/12/05 16:30:31
I take it that this is still needed even though th
Guido Urdaneta
2016/12/05 17:23:52
For some definition of needed :)
It doesn't seem t
| |
| 243 | 250 |
| 244 if (RenderThreadImpl::current()) { | 251 if (RenderThreadImpl::current()) { |
| 245 RenderThreadImpl::current()->peer_connection_tracker()->TrackGetUserMedia( | 252 RenderThreadImpl::current()->peer_connection_tracker()->TrackGetUserMedia( |
| 246 user_media_request); | 253 user_media_request); |
| 247 } | 254 } |
| 248 | 255 |
| 249 int request_id = g_next_request_id++; | 256 int request_id = g_next_request_id++; |
| 250 std::unique_ptr<StreamControls> controls = base::MakeUnique<StreamControls>(); | 257 std::unique_ptr<StreamControls> controls = base::MakeUnique<StreamControls>(); |
| 251 | 258 |
| 252 // |user_media_request| can't be mocked. So in order to test at all we check | 259 bool enable_automatic_output_device_selection = false; |
| 253 // if it isNull. | 260 bool request_audio_input_devices = false; |
| 254 // TODO(guidou): Remove this test-specific code path. | 261 if (user_media_request.audio()) { |
| 255 if (user_media_request.isNull()) { | 262 CopyConstraintsToTrackControls(user_media_request.audioConstraints(), |
| 256 // We are in a test. | 263 &controls->audio, |
| 257 controls->audio.requested = true; | 264 &request_audio_input_devices); |
| 258 controls->video.requested = true; | 265 CopyHotwordAndLocalEchoToStreamControls( |
| 266 user_media_request.audioConstraints(), controls.get()); | |
| 267 // Check if this input device should be used to select a matching output | |
| 268 // device for audio rendering. | |
| 269 GetConstraintValueAsBoolean( | |
| 270 user_media_request.audioConstraints(), | |
| 271 &blink::WebMediaTrackConstraintSet::renderToAssociatedSink, | |
| 272 &enable_automatic_output_device_selection); | |
| 273 } | |
| 274 bool request_video_input_devices = false; | |
| 275 if (user_media_request.video()) { | |
| 276 CopyConstraintsToTrackControls(user_media_request.videoConstraints(), | |
| 277 &controls->video, | |
| 278 &request_video_input_devices); | |
| 279 } | |
| 280 | |
| 281 url::Origin security_origin = user_media_request.getSecurityOrigin(); | |
| 282 if (request_audio_input_devices || request_video_input_devices) { | |
| 283 GetMediaDevicesDispatcher()->EnumerateDevices( | |
| 284 request_audio_input_devices, request_video_input_devices, | |
| 285 false /* request_audio_output_devices */, security_origin, | |
| 286 base::Bind(&UserMediaClientImpl::SelectUserMediaDevice, | |
| 287 weak_factory_.GetWeakPtr(), request_id, user_media_request, | |
| 288 base::Passed(&controls), | |
| 289 enable_automatic_output_device_selection, security_origin)); | |
| 290 } else { | |
| 259 FinalizeRequestUserMedia( | 291 FinalizeRequestUserMedia( |
| 260 request_id, user_media_request, std::move(controls), | 292 request_id, user_media_request, std::move(controls), |
| 261 false /* automatic_output_device_selection */, url::Origin()); | 293 enable_automatic_output_device_selection, security_origin); |
| 262 } else { | |
| 263 // ownerDocument may be null if we are in a test. | |
| 264 // In that case, it's OK to not check frame(). | |
| 265 DCHECK(user_media_request.ownerDocument().isNull() || | |
| 266 render_frame()->GetWebFrame() == | |
| 267 static_cast<blink::WebFrame*>( | |
| 268 user_media_request.ownerDocument().frame())); | |
| 269 | |
| 270 bool enable_automatic_output_device_selection = false; | |
| 271 bool request_audio_input_devices = false; | |
| 272 if (user_media_request.audio()) { | |
| 273 CopyConstraintsToTrackControls(user_media_request.audioConstraints(), | |
| 274 &controls->audio, | |
| 275 &request_audio_input_devices); | |
| 276 CopyHotwordAndLocalEchoToStreamControls( | |
| 277 user_media_request.audioConstraints(), controls.get()); | |
| 278 // Check if this input device should be used to select a matching output | |
| 279 // device for audio rendering. | |
| 280 GetConstraintValueAsBoolean( | |
| 281 user_media_request.audioConstraints(), | |
| 282 &blink::WebMediaTrackConstraintSet::renderToAssociatedSink, | |
| 283 &enable_automatic_output_device_selection); | |
| 284 } | |
| 285 bool request_video_input_devices = false; | |
| 286 if (user_media_request.video()) { | |
| 287 CopyConstraintsToTrackControls(user_media_request.videoConstraints(), | |
| 288 &controls->video, | |
| 289 &request_video_input_devices); | |
| 290 } | |
| 291 | |
| 292 url::Origin security_origin = user_media_request.getSecurityOrigin(); | |
| 293 if (request_audio_input_devices || request_video_input_devices) { | |
| 294 GetMediaDevicesDispatcher()->EnumerateDevices( | |
| 295 request_audio_input_devices, request_video_input_devices, | |
| 296 false /* request_audio_output_devices */, security_origin, | |
| 297 base::Bind(&UserMediaClientImpl::SelectUserMediaDevice, | |
| 298 weak_factory_.GetWeakPtr(), request_id, user_media_request, | |
| 299 base::Passed(&controls), | |
| 300 enable_automatic_output_device_selection, | |
| 301 security_origin)); | |
| 302 } else { | |
| 303 FinalizeRequestUserMedia( | |
| 304 request_id, user_media_request, std::move(controls), | |
| 305 enable_automatic_output_device_selection, security_origin); | |
| 306 } | |
| 307 } | 294 } |
| 308 } | 295 } |
| 309 | 296 |
| 310 void UserMediaClientImpl::SelectUserMediaDevice( | 297 void UserMediaClientImpl::SelectUserMediaDevice( |
| 311 int request_id, | 298 int request_id, |
| 312 const blink::WebUserMediaRequest& user_media_request, | 299 const blink::WebUserMediaRequest& user_media_request, |
| 313 std::unique_ptr<StreamControls> controls, | 300 std::unique_ptr<StreamControls> controls, |
| 314 bool enable_automatic_output_device_selection, | 301 bool enable_automatic_output_device_selection, |
| 315 const url::Origin& security_origin, | 302 const url::Origin& security_origin, |
| 316 const EnumerationResult& device_enumeration) { | 303 const EnumerationResult& device_enumeration) { |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 425 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 439 if (!request_info) { | 426 if (!request_info) { |
| 440 // This can happen if the request is canceled or the frame reloads while | 427 // This can happen if the request is canceled or the frame reloads while |
| 441 // MediaStreamDispatcher is processing the request. | 428 // MediaStreamDispatcher is processing the request. |
| 442 DVLOG(1) << "Request ID not found"; | 429 DVLOG(1) << "Request ID not found"; |
| 443 OnStreamGeneratedForCancelledRequest(audio_array, video_array); | 430 OnStreamGeneratedForCancelledRequest(audio_array, video_array); |
| 444 return; | 431 return; |
| 445 } | 432 } |
| 446 request_info->generated = true; | 433 request_info->generated = true; |
| 447 | 434 |
| 448 // WebUserMediaRequest don't have an implementation in unit tests. | 435 DCHECK(!request_info->request.isNull()); |
| 449 // Therefore we need to check for isNull here and initialize the | |
| 450 // constraints. | |
| 451 blink::WebUserMediaRequest* request = &(request_info->request); | |
| 452 blink::WebMediaConstraints audio_constraints; | |
| 453 blink::WebMediaConstraints video_constraints; | |
| 454 if (request->isNull()) { | |
| 455 audio_constraints.initialize(); | |
| 456 video_constraints.initialize(); | |
| 457 } else { | |
| 458 audio_constraints = request->audioConstraints(); | |
| 459 video_constraints = request->videoConstraints(); | |
| 460 } | |
| 461 | |
| 462 blink::WebVector<blink::WebMediaStreamTrack> audio_track_vector( | 436 blink::WebVector<blink::WebMediaStreamTrack> audio_track_vector( |
| 463 audio_array.size()); | 437 audio_array.size()); |
| 464 CreateAudioTracks(audio_array, audio_constraints, &audio_track_vector, | 438 CreateAudioTracks(audio_array, request_info->request.audioConstraints(), |
| 465 request_info); | 439 &audio_track_vector, request_info); |
| 466 | 440 |
| 467 blink::WebVector<blink::WebMediaStreamTrack> video_track_vector( | 441 blink::WebVector<blink::WebMediaStreamTrack> video_track_vector( |
| 468 video_array.size()); | 442 video_array.size()); |
| 469 CreateVideoTracks(video_array, video_constraints, &video_track_vector, | 443 CreateVideoTracks(video_array, request_info->request.videoConstraints(), |
| 470 request_info); | 444 &video_track_vector, request_info); |
| 471 | 445 |
| 472 blink::WebString webkit_id = base::UTF8ToUTF16(label); | 446 blink::WebString webkit_id = base::UTF8ToUTF16(label); |
| 473 blink::WebMediaStream* web_stream = &(request_info->web_stream); | 447 blink::WebMediaStream* web_stream = &(request_info->web_stream); |
| 474 | 448 |
| 475 web_stream->initialize(webkit_id, audio_track_vector, | 449 web_stream->initialize(webkit_id, audio_track_vector, |
| 476 video_track_vector); | 450 video_track_vector); |
| 477 web_stream->setExtraData(new MediaStream()); | 451 web_stream->setExtraData(new MediaStream()); |
| 478 | 452 |
| 479 // Wait for the tracks to be started successfully or to fail. | 453 // Wait for the tracks to be started successfully or to fail. |
| 480 request_info->CallbackOnTracksStarted( | 454 request_info->CallbackOnTracksStarted( |
| (...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1093 | 1067 |
| 1094 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { | 1068 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { |
| 1095 return !sources_waiting_for_callback_.empty(); | 1069 return !sources_waiting_for_callback_.empty(); |
| 1096 } | 1070 } |
| 1097 | 1071 |
| 1098 void UserMediaClientImpl::OnDestruct() { | 1072 void UserMediaClientImpl::OnDestruct() { |
| 1099 delete this; | 1073 delete this; |
| 1100 } | 1074 } |
| 1101 | 1075 |
| 1102 } // namespace content | 1076 } // namespace content |
| OLD | NEW |