| 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 <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" |
| 16 #include "content/renderer/media/media_stream.h" | 16 #include "content/renderer/media/media_stream.h" |
| 17 #include "content/renderer/media/media_stream_audio_source.h" | 17 #include "content/renderer/media/media_stream_audio_source.h" |
| 18 #include "content/renderer/media/media_stream_dispatcher.h" | 18 #include "content/renderer/media/media_stream_dispatcher.h" |
| 19 #include "content/renderer/media/media_stream_video_capturer_source.h" | 19 #include "content/renderer/media/media_stream_video_capturer_source.h" |
| 20 #include "content/renderer/media/media_stream_video_track.h" | 20 #include "content/renderer/media/media_stream_video_track.h" |
| 21 #include "content/renderer/media/peer_connection_tracker.h" | 21 #include "content/renderer/media/peer_connection_tracker.h" |
| 22 #include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h" | 22 #include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h" |
| 23 #include "content/renderer/media/webrtc_audio_capturer.h" | 23 #include "content/renderer/media/webrtc_audio_capturer.h" |
| 24 #include "content/renderer/media/webrtc_logging.h" | 24 #include "content/renderer/media/webrtc_logging.h" |
| 25 #include "content/renderer/media/webrtc_uma_histograms.h" | 25 #include "content/renderer/media/webrtc_uma_histograms.h" |
| 26 #include "content/renderer/render_thread_impl.h" | 26 #include "content/renderer/render_thread_impl.h" |
| 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/WebMediaDeviceInfo.h" | 28 #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h" |
| 29 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 29 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
| 30 #include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h
" |
| 30 #include "third_party/WebKit/public/web/WebDocument.h" | 31 #include "third_party/WebKit/public/web/WebDocument.h" |
| 31 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 32 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 32 | 33 |
| 33 namespace content { | 34 namespace content { |
| 34 namespace { | 35 namespace { |
| 35 | 36 |
| 36 void CopyStreamConstraints(const blink::WebMediaConstraints& constraints, | 37 void CopyStreamConstraints(const blink::WebMediaConstraints& constraints, |
| 37 StreamOptions::Constraints* mandatory, | 38 StreamOptions::Constraints* mandatory, |
| 38 StreamOptions::Constraints* optional) { | 39 StreamOptions::Constraints* optional) { |
| 39 blink::WebVector<blink::WebMediaConstraint> mandatory_constraints; | 40 blink::WebVector<blink::WebMediaConstraint> mandatory_constraints; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 55 | 56 |
| 56 static int g_next_request_id = 0; | 57 static int g_next_request_id = 0; |
| 57 | 58 |
| 58 } // namespace | 59 } // namespace |
| 59 | 60 |
| 60 struct UserMediaClientImpl::MediaDevicesRequestInfo { | 61 struct UserMediaClientImpl::MediaDevicesRequestInfo { |
| 61 MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request, | 62 MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request, |
| 62 int audio_input_request_id, | 63 int audio_input_request_id, |
| 63 int video_input_request_id, | 64 int video_input_request_id, |
| 64 int audio_output_request_id) | 65 int audio_output_request_id) |
| 65 : request(request), | 66 : media_devices_request(request), |
| 66 audio_input_request_id(audio_input_request_id), | 67 audio_input_request_id(audio_input_request_id), |
| 67 video_input_request_id(video_input_request_id), | 68 video_input_request_id(video_input_request_id), |
| 68 audio_output_request_id(audio_output_request_id), | 69 audio_output_request_id(audio_output_request_id), |
| 69 has_audio_input_returned(false), | 70 has_audio_input_returned(false), |
| 70 has_video_input_returned(false), | 71 has_video_input_returned(false), |
| 71 has_audio_output_returned(false) {} | 72 has_audio_output_returned(false) {} |
| 72 | 73 |
| 73 blink::WebMediaDevicesRequest request; | 74 MediaDevicesRequestInfo( |
| 75 const blink::WebMediaStreamTrackSourcesRequest& request, |
| 76 int audio_input_request_id, |
| 77 int video_input_request_id) |
| 78 : sources_request(request), |
| 79 audio_input_request_id(audio_input_request_id), |
| 80 video_input_request_id(video_input_request_id), |
| 81 audio_output_request_id(-1), |
| 82 has_audio_input_returned(false), |
| 83 has_video_input_returned(false), |
| 84 has_audio_output_returned(false) {} |
| 85 |
| 86 bool IsSourcesRequest() { |
| 87 // We can't check isNull() on |media_devices_request| and |sources_request|, |
| 88 // because in unit tests they will always be null. |
| 89 return audio_output_request_id == -1; |
| 90 } |
| 91 |
| 92 blink::WebMediaDevicesRequest media_devices_request; |
| 93 blink::WebMediaStreamTrackSourcesRequest sources_request; |
| 74 int audio_input_request_id; | 94 int audio_input_request_id; |
| 75 int video_input_request_id; | 95 int video_input_request_id; |
| 76 int audio_output_request_id; | 96 int audio_output_request_id; |
| 77 bool has_audio_input_returned; | 97 bool has_audio_input_returned; |
| 78 bool has_video_input_returned; | 98 bool has_video_input_returned; |
| 79 bool has_audio_output_returned; | 99 bool has_audio_output_returned; |
| 80 StreamDeviceInfoArray audio_input_devices; | 100 StreamDeviceInfoArray audio_input_devices; |
| 81 StreamDeviceInfoArray video_input_devices; | 101 StreamDeviceInfoArray video_input_devices; |
| 82 StreamDeviceInfoArray audio_output_devices; | 102 StreamDeviceInfoArray audio_output_devices; |
| 83 }; | 103 }; |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 void UserMediaClientImpl::cancelMediaDevicesRequest( | 273 void UserMediaClientImpl::cancelMediaDevicesRequest( |
| 254 const blink::WebMediaDevicesRequest& media_devices_request) { | 274 const blink::WebMediaDevicesRequest& media_devices_request) { |
| 255 DCHECK(CalledOnValidThread()); | 275 DCHECK(CalledOnValidThread()); |
| 256 MediaDevicesRequestInfo* request = | 276 MediaDevicesRequestInfo* request = |
| 257 FindMediaDevicesRequestInfo(media_devices_request); | 277 FindMediaDevicesRequestInfo(media_devices_request); |
| 258 if (!request) | 278 if (!request) |
| 259 return; | 279 return; |
| 260 CancelAndDeleteMediaDevicesRequest(request); | 280 CancelAndDeleteMediaDevicesRequest(request); |
| 261 } | 281 } |
| 262 | 282 |
| 283 void UserMediaClientImpl::requestSources( |
| 284 const blink::WebMediaStreamTrackSourcesRequest& sources_request) { |
| 285 // We don't call UpdateWebRTCMethodCount() here to track the API count in UMA |
| 286 // stats. This is instead counted in MediaStreamTrack::getSources in blink. |
| 287 DCHECK(CalledOnValidThread()); |
| 288 |
| 289 int audio_input_request_id = g_next_request_id++; |
| 290 int video_input_request_id = g_next_request_id++; |
| 291 |
| 292 // |sources_request| can't be mocked, so in tests it will be empty (the |
| 293 // underlying pointer is null). In order to use this function in a test we |
| 294 // need to check if it isNull. |
| 295 GURL security_origin; |
| 296 if (!sources_request.isNull()) |
| 297 security_origin = GURL(sources_request.origin().utf8()); |
| 298 |
| 299 DVLOG(1) << "UserMediaClientImpl::requestSources(" |
| 300 << audio_input_request_id |
| 301 << ", " << video_input_request_id |
| 302 << ", " << security_origin.spec() << ")"; |
| 303 |
| 304 media_devices_requests_.push_back(new MediaDevicesRequestInfo( |
| 305 sources_request, |
| 306 audio_input_request_id, |
| 307 video_input_request_id)); |
| 308 |
| 309 media_stream_dispatcher_->EnumerateDevices( |
| 310 audio_input_request_id, |
| 311 weak_factory_.GetWeakPtr(), |
| 312 MEDIA_DEVICE_AUDIO_CAPTURE, |
| 313 security_origin); |
| 314 |
| 315 media_stream_dispatcher_->EnumerateDevices( |
| 316 video_input_request_id, |
| 317 weak_factory_.GetWeakPtr(), |
| 318 MEDIA_DEVICE_VIDEO_CAPTURE, |
| 319 security_origin); |
| 320 } |
| 321 |
| 263 // Callback from MediaStreamDispatcher. | 322 // Callback from MediaStreamDispatcher. |
| 264 // The requested stream have been generated by the MediaStreamDispatcher. | 323 // The requested stream have been generated by the MediaStreamDispatcher. |
| 265 void UserMediaClientImpl::OnStreamGenerated( | 324 void UserMediaClientImpl::OnStreamGenerated( |
| 266 int request_id, | 325 int request_id, |
| 267 const std::string& label, | 326 const std::string& label, |
| 268 const StreamDeviceInfoArray& audio_array, | 327 const StreamDeviceInfoArray& audio_array, |
| 269 const StreamDeviceInfoArray& video_array) { | 328 const StreamDeviceInfoArray& video_array) { |
| 270 DCHECK(CalledOnValidThread()); | 329 DCHECK(CalledOnValidThread()); |
| 271 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerated stream:" << label; | 330 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerated stream:" << label; |
| 272 | 331 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 media_stream_dispatcher_->StopStreamDevice(*device_it); | 388 media_stream_dispatcher_->StopStreamDevice(*device_it); |
| 330 } | 389 } |
| 331 | 390 |
| 332 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); | 391 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); |
| 333 device_it != video_array.end(); ++device_it) { | 392 device_it != video_array.end(); ++device_it) { |
| 334 if (!FindLocalSource(*device_it)) | 393 if (!FindLocalSource(*device_it)) |
| 335 media_stream_dispatcher_->StopStreamDevice(*device_it); | 394 media_stream_dispatcher_->StopStreamDevice(*device_it); |
| 336 } | 395 } |
| 337 } | 396 } |
| 338 | 397 |
| 398 void UserMediaClientImpl::FinalizeEnumerateDevices( |
| 399 MediaDevicesRequestInfo* request) { |
| 400 // All devices are ready for copying. We use a hashed audio output device id |
| 401 // as the group id for input and output audio devices. If an input device |
| 402 // doesn't have an associated output device, we use the input device's own id. |
| 403 // We don't support group id for video devices, that's left empty. |
| 404 blink::WebVector<blink::WebMediaDeviceInfo> |
| 405 devices(request->audio_input_devices.size() + |
| 406 request->video_input_devices.size() + |
| 407 request->audio_output_devices.size()); |
| 408 for (size_t i = 0; i < request->audio_input_devices.size(); ++i) { |
| 409 const MediaStreamDevice& device = request->audio_input_devices[i].device; |
| 410 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE); |
| 411 std::string group_id = base::UintToString(base::Hash( |
| 412 !device.matched_output_device_id.empty() ? |
| 413 device.matched_output_device_id : |
| 414 device.id)); |
| 415 devices[i].initialize( |
| 416 blink::WebString::fromUTF8(device.id), |
| 417 blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
| 418 blink::WebString::fromUTF8(device.name), |
| 419 blink::WebString::fromUTF8(group_id)); |
| 420 } |
| 421 size_t offset = request->audio_input_devices.size(); |
| 422 for (size_t i = 0; i < request->video_input_devices.size(); ++i) { |
| 423 const MediaStreamDevice& device = request->video_input_devices[i].device; |
| 424 DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE); |
| 425 devices[offset + i].initialize( |
| 426 blink::WebString::fromUTF8(device.id), |
| 427 blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, |
| 428 blink::WebString::fromUTF8(device.name), |
| 429 blink::WebString()); |
| 430 } |
| 431 offset += request->video_input_devices.size(); |
| 432 for (size_t i = 0; i < request->audio_output_devices.size(); ++i) { |
| 433 const MediaStreamDevice& device = request->audio_output_devices[i].device; |
| 434 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_OUTPUT); |
| 435 devices[offset + i].initialize( |
| 436 blink::WebString::fromUTF8(device.id), |
| 437 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, |
| 438 blink::WebString::fromUTF8(device.name), |
| 439 blink::WebString::fromUTF8(base::UintToString(base::Hash(device.id)))); |
| 440 } |
| 441 |
| 442 EnumerateDevicesSucceded(&request->media_devices_request, devices); |
| 443 } |
| 444 |
| 445 void UserMediaClientImpl::FinalizeEnumerateSources( |
| 446 MediaDevicesRequestInfo* request) { |
| 447 blink::WebVector<blink::WebSourceInfo> |
| 448 sources(request->audio_input_devices.size() + |
| 449 request->video_input_devices.size()); |
| 450 for (size_t i = 0; i < request->audio_input_devices.size(); ++i) { |
| 451 const MediaStreamDevice& device = request->audio_input_devices[i].device; |
| 452 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE); |
| 453 std::string group_id = base::UintToString(base::Hash( |
| 454 !device.matched_output_device_id.empty() ? |
| 455 device.matched_output_device_id : |
| 456 device.id)); |
| 457 sources[i].initialize(blink::WebString::fromUTF8(device.id), |
| 458 blink::WebSourceInfo::SourceKindAudio, |
| 459 blink::WebString::fromUTF8(device.name), |
| 460 blink::WebSourceInfo::VideoFacingModeNone); |
| 461 } |
| 462 size_t offset = request->audio_input_devices.size(); |
| 463 for (size_t i = 0; i < request->video_input_devices.size(); ++i) { |
| 464 const MediaStreamDevice& device = request->video_input_devices[i].device; |
| 465 DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE); |
| 466 blink::WebSourceInfo::VideoFacingMode video_facing; |
| 467 switch (device.video_facing) { |
| 468 case MEDIA_VIDEO_FACING_USER: |
| 469 video_facing = blink::WebSourceInfo::VideoFacingModeUser; |
| 470 break; |
| 471 case MEDIA_VIDEO_FACING_ENVIRONMENT: |
| 472 video_facing = blink::WebSourceInfo::VideoFacingModeEnvironment; |
| 473 break; |
| 474 default: |
| 475 video_facing = blink::WebSourceInfo::VideoFacingModeNone; |
| 476 } |
| 477 sources[offset + i].initialize(blink::WebString::fromUTF8(device.id), |
| 478 blink::WebSourceInfo::SourceKindVideo, |
| 479 blink::WebString::fromUTF8(device.name), |
| 480 video_facing); |
| 481 } |
| 482 |
| 483 EnumerateSourcesSucceded(&request->sources_request, sources); |
| 484 } |
| 485 |
| 339 // Callback from MediaStreamDispatcher. | 486 // Callback from MediaStreamDispatcher. |
| 340 // The requested stream failed to be generated. | 487 // The requested stream failed to be generated. |
| 341 void UserMediaClientImpl::OnStreamGenerationFailed( | 488 void UserMediaClientImpl::OnStreamGenerationFailed( |
| 342 int request_id, | 489 int request_id, |
| 343 MediaStreamRequestResult result) { | 490 MediaStreamRequestResult result) { |
| 344 DCHECK(CalledOnValidThread()); | 491 DCHECK(CalledOnValidThread()); |
| 345 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerationFailed(" | 492 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerationFailed(" |
| 346 << request_id << ")"; | 493 << request_id << ")"; |
| 347 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 494 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 348 if (!request_info) { | 495 if (!request_info) { |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 request->video_input_devices = device_array; | 678 request->video_input_devices = device_array; |
| 532 } else { | 679 } else { |
| 533 DCHECK_EQ(request->audio_output_request_id, request_id); | 680 DCHECK_EQ(request->audio_output_request_id, request_id); |
| 534 request->has_audio_output_returned = true; | 681 request->has_audio_output_returned = true; |
| 535 DCHECK(request->audio_output_devices.empty()); | 682 DCHECK(request->audio_output_devices.empty()); |
| 536 request->audio_output_devices = device_array; | 683 request->audio_output_devices = device_array; |
| 537 } | 684 } |
| 538 | 685 |
| 539 if (!request->has_audio_input_returned || | 686 if (!request->has_audio_input_returned || |
| 540 !request->has_video_input_returned || | 687 !request->has_video_input_returned || |
| 541 !request->has_audio_output_returned) { | 688 (!request->IsSourcesRequest() && !request->has_audio_output_returned)) { |
| 542 // Wait for the rest of the devices to complete. | 689 // Wait for the rest of the devices to complete. |
| 543 return; | 690 return; |
| 544 } | 691 } |
| 545 | 692 |
| 546 // All devices are ready for copying. We use a hashed audio output device id | 693 if (request->IsSourcesRequest()) |
| 547 // as the group id for input and output audio devices. If an input device | 694 FinalizeEnumerateSources(request); |
| 548 // doesn't have an associated output device, we use the input device's own id. | 695 else |
| 549 // We don't support group id for video devices, that's left empty. | 696 FinalizeEnumerateDevices(request); |
| 550 blink::WebVector<blink::WebMediaDeviceInfo> | |
| 551 devices(request->audio_input_devices.size() + | |
| 552 request->video_input_devices.size() + | |
| 553 request->audio_output_devices.size()); | |
| 554 for (size_t i = 0; i < request->audio_input_devices.size(); ++i) { | |
| 555 const MediaStreamDevice& device = request->audio_input_devices[i].device; | |
| 556 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE); | |
| 557 std::string group_id = base::UintToString(base::Hash( | |
| 558 !device.matched_output_device_id.empty() ? | |
| 559 device.matched_output_device_id : | |
| 560 device.id)); | |
| 561 devices[i].initialize( | |
| 562 blink::WebString::fromUTF8(device.id), | |
| 563 blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, | |
| 564 blink::WebString::fromUTF8(device.name), | |
| 565 blink::WebString::fromUTF8(group_id)); | |
| 566 } | |
| 567 size_t offset = request->audio_input_devices.size(); | |
| 568 for (size_t i = 0; i < request->video_input_devices.size(); ++i) { | |
| 569 const MediaStreamDevice& device = request->video_input_devices[i].device; | |
| 570 DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE); | |
| 571 devices[offset + i].initialize( | |
| 572 blink::WebString::fromUTF8(device.id), | |
| 573 blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, | |
| 574 blink::WebString::fromUTF8(device.name), | |
| 575 blink::WebString()); | |
| 576 } | |
| 577 offset += request->video_input_devices.size(); | |
| 578 for (size_t i = 0; i < request->audio_output_devices.size(); ++i) { | |
| 579 const MediaStreamDevice& device = request->audio_output_devices[i].device; | |
| 580 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_OUTPUT); | |
| 581 devices[offset + i].initialize( | |
| 582 blink::WebString::fromUTF8(device.id), | |
| 583 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, | |
| 584 blink::WebString::fromUTF8(device.name), | |
| 585 blink::WebString::fromUTF8(base::UintToString(base::Hash(device.id)))); | |
| 586 } | |
| 587 | 697 |
| 588 EnumerateDevicesSucceded(&request->request, devices); | |
| 589 CancelAndDeleteMediaDevicesRequest(request); | 698 CancelAndDeleteMediaDevicesRequest(request); |
| 590 } | 699 } |
| 591 | 700 |
| 592 void UserMediaClientImpl::OnDeviceOpened( | 701 void UserMediaClientImpl::OnDeviceOpened( |
| 593 int request_id, | 702 int request_id, |
| 594 const std::string& label, | 703 const std::string& label, |
| 595 const StreamDeviceInfo& video_device) { | 704 const StreamDeviceInfo& video_device) { |
| 596 DVLOG(1) << "UserMediaClientImpl::OnDeviceOpened(" | 705 DVLOG(1) << "UserMediaClientImpl::OnDeviceOpened(" |
| 597 << request_id << ", " << label << ")"; | 706 << request_id << ", " << label << ")"; |
| 598 NOTIMPLEMENTED(); | 707 NOTIMPLEMENTED(); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 break; | 777 break; |
| 669 } | 778 } |
| 670 } | 779 } |
| 671 | 780 |
| 672 void UserMediaClientImpl::EnumerateDevicesSucceded( | 781 void UserMediaClientImpl::EnumerateDevicesSucceded( |
| 673 blink::WebMediaDevicesRequest* request, | 782 blink::WebMediaDevicesRequest* request, |
| 674 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { | 783 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { |
| 675 request->requestSucceeded(devices); | 784 request->requestSucceeded(devices); |
| 676 } | 785 } |
| 677 | 786 |
| 787 void UserMediaClientImpl::EnumerateSourcesSucceded( |
| 788 blink::WebMediaStreamTrackSourcesRequest* request, |
| 789 blink::WebVector<blink::WebSourceInfo>& sources) { |
| 790 request->requestSucceeded(sources); |
| 791 } |
| 792 |
| 678 const blink::WebMediaStreamSource* UserMediaClientImpl::FindLocalSource( | 793 const blink::WebMediaStreamSource* UserMediaClientImpl::FindLocalSource( |
| 679 const StreamDeviceInfo& device) const { | 794 const StreamDeviceInfo& device) const { |
| 680 for (LocalStreamSources::const_iterator it = local_sources_.begin(); | 795 for (LocalStreamSources::const_iterator it = local_sources_.begin(); |
| 681 it != local_sources_.end(); ++it) { | 796 it != local_sources_.end(); ++it) { |
| 682 MediaStreamSource* const source = | 797 MediaStreamSource* const source = |
| 683 static_cast<MediaStreamSource*>(it->extraData()); | 798 static_cast<MediaStreamSource*>(it->extraData()); |
| 684 const StreamDeviceInfo& active_device = source->device_info(); | 799 const StreamDeviceInfo& active_device = source->device_info(); |
| 685 if (active_device.device.id == device.device.id && | 800 if (active_device.device.id == device.device.id && |
| 686 active_device.device.type == device.device.type && | 801 active_device.device.type == device.device.type && |
| 687 active_device.session_id == device.session_id) { | 802 active_device.session_id == device.session_id) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 } | 875 } |
| 761 } | 876 } |
| 762 return NULL; | 877 return NULL; |
| 763 } | 878 } |
| 764 | 879 |
| 765 UserMediaClientImpl::MediaDevicesRequestInfo* | 880 UserMediaClientImpl::MediaDevicesRequestInfo* |
| 766 UserMediaClientImpl::FindMediaDevicesRequestInfo( | 881 UserMediaClientImpl::FindMediaDevicesRequestInfo( |
| 767 const blink::WebMediaDevicesRequest& request) { | 882 const blink::WebMediaDevicesRequest& request) { |
| 768 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 883 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
| 769 for (; it != media_devices_requests_.end(); ++it) { | 884 for (; it != media_devices_requests_.end(); ++it) { |
| 770 if ((*it)->request == request) | 885 if ((*it)->media_devices_request == request) |
| 771 return (*it); | 886 return (*it); |
| 772 } | 887 } |
| 773 return NULL; | 888 return NULL; |
| 774 } | 889 } |
| 775 | 890 |
| 776 void UserMediaClientImpl::CancelAndDeleteMediaDevicesRequest( | 891 void UserMediaClientImpl::CancelAndDeleteMediaDevicesRequest( |
| 777 MediaDevicesRequestInfo* request) { | 892 MediaDevicesRequestInfo* request) { |
| 778 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 893 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
| 779 for (; it != media_devices_requests_.end(); ++it) { | 894 for (; it != media_devices_requests_.end(); ++it) { |
| 780 if ((*it) == request) { | 895 if ((*it) == request) { |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 return; | 1061 return; |
| 947 } | 1062 } |
| 948 } | 1063 } |
| 949 } | 1064 } |
| 950 | 1065 |
| 951 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { | 1066 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { |
| 952 return !sources_waiting_for_callback_.empty(); | 1067 return !sources_waiting_for_callback_.empty(); |
| 953 } | 1068 } |
| 954 | 1069 |
| 955 } // namespace content | 1070 } // namespace content |
| OLD | NEW |