| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/media_stream_impl.h" | 5 #include "content/renderer/media/media_stream_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 request_info); | 335 request_info); |
| 336 | 336 |
| 337 blink::WebString webkit_id = base::UTF8ToUTF16(label); | 337 blink::WebString webkit_id = base::UTF8ToUTF16(label); |
| 338 blink::WebMediaStream* web_stream = &(request_info->web_stream); | 338 blink::WebMediaStream* web_stream = &(request_info->web_stream); |
| 339 | 339 |
| 340 web_stream->initialize(webkit_id, audio_track_vector, | 340 web_stream->initialize(webkit_id, audio_track_vector, |
| 341 video_track_vector); | 341 video_track_vector); |
| 342 web_stream->setExtraData( | 342 web_stream->setExtraData( |
| 343 new MediaStream( | 343 new MediaStream( |
| 344 dependency_factory_, | 344 dependency_factory_, |
| 345 base::Bind(&MediaStreamImpl::OnLocalMediaStreamStop, AsWeakPtr()), | |
| 346 *web_stream)); | 345 *web_stream)); |
| 347 | 346 |
| 348 // Wait for the tracks to be started successfully or to fail. | 347 // Wait for the tracks to be started successfully or to fail. |
| 349 request_info->CallbackOnTracksStarted( | 348 request_info->CallbackOnTracksStarted( |
| 350 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, AsWeakPtr())); | 349 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, AsWeakPtr())); |
| 351 } | 350 } |
| 352 | 351 |
| 353 // Callback from MediaStreamDispatcher. | 352 // Callback from MediaStreamDispatcher. |
| 354 // The requested stream failed to be generated. | 353 // The requested stream failed to be generated. |
| 355 void MediaStreamImpl::OnStreamGenerationFailed( | 354 void MediaStreamImpl::OnStreamGenerationFailed( |
| 356 int request_id, | 355 int request_id, |
| 357 content::MediaStreamRequestResult result) { | 356 content::MediaStreamRequestResult result) { |
| 358 DCHECK(CalledOnValidThread()); | 357 DCHECK(CalledOnValidThread()); |
| 359 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" | 358 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" |
| 360 << request_id << ")"; | 359 << request_id << ")"; |
| 361 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 360 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 362 if (!request_info) { | 361 if (!request_info) { |
| 363 // This can happen if the request is canceled or the frame reloads while | 362 // This can happen if the request is canceled or the frame reloads while |
| 364 // MediaStreamDispatcher is processing the request. | 363 // MediaStreamDispatcher is processing the request. |
| 365 DVLOG(1) << "Request ID not found"; | 364 DVLOG(1) << "Request ID not found"; |
| 366 return; | 365 return; |
| 367 } | 366 } |
| 368 CompleteGetUserMediaRequest(request_info->web_stream, | 367 |
| 369 &request_info->request, | 368 GetUserMediaRequestFailed(&request_info->request, result); |
| 370 result); | |
| 371 DeleteUserMediaRequestInfo(request_info); | 369 DeleteUserMediaRequestInfo(request_info); |
| 372 } | 370 } |
| 373 | 371 |
| 374 // Callback from MediaStreamDispatcher. | 372 // Callback from MediaStreamDispatcher. |
| 375 // The browser process has stopped a device used by a MediaStream. | 373 // The browser process has stopped a device used by a MediaStream. |
| 376 void MediaStreamImpl::OnDeviceStopped( | 374 void MediaStreamImpl::OnDeviceStopped( |
| 377 const std::string& label, | 375 const std::string& label, |
| 378 const StreamDeviceInfo& device_info) { | 376 const StreamDeviceInfo& device_info) { |
| 379 DCHECK(CalledOnValidThread()); | 377 DCHECK(CalledOnValidThread()); |
| 380 DVLOG(1) << "MediaStreamImpl::OnDeviceStopped(" | 378 DVLOG(1) << "MediaStreamImpl::OnDeviceStopped(" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 392 blink::WebMediaStreamSource source(*source_ptr); | 390 blink::WebMediaStreamSource source(*source_ptr); |
| 393 StopLocalSource(source, false); | 391 StopLocalSource(source, false); |
| 394 | 392 |
| 395 for (LocalStreamSources::iterator device_it = local_sources_.begin(); | 393 for (LocalStreamSources::iterator device_it = local_sources_.begin(); |
| 396 device_it != local_sources_.end(); ++device_it) { | 394 device_it != local_sources_.end(); ++device_it) { |
| 397 if (device_it->source.id() == source.id()) { | 395 if (device_it->source.id() == source.id()) { |
| 398 local_sources_.erase(device_it); | 396 local_sources_.erase(device_it); |
| 399 break; | 397 break; |
| 400 } | 398 } |
| 401 } | 399 } |
| 402 | |
| 403 // Remove the reference to this source from all |user_media_requests_|. | |
| 404 // TODO(perkj): The below is not necessary once we don't need to support | |
| 405 // MediaStream::Stop(). | |
| 406 UserMediaRequests::iterator it = user_media_requests_.begin(); | |
| 407 while (it != user_media_requests_.end()) { | |
| 408 (*it)->RemoveSource(source); | |
| 409 if ((*it)->AreAllSourcesRemoved()) { | |
| 410 it = user_media_requests_.erase(it); | |
| 411 } else { | |
| 412 ++it; | |
| 413 } | |
| 414 } | |
| 415 } | 400 } |
| 416 | 401 |
| 417 void MediaStreamImpl::InitializeSourceObject( | 402 void MediaStreamImpl::InitializeSourceObject( |
| 418 const StreamDeviceInfo& device, | 403 const StreamDeviceInfo& device, |
| 419 blink::WebMediaStreamSource::Type type, | 404 blink::WebMediaStreamSource::Type type, |
| 420 const blink::WebMediaConstraints& constraints, | 405 const blink::WebMediaConstraints& constraints, |
| 421 blink::WebFrame* frame, | 406 blink::WebFrame* frame, |
| 422 blink::WebMediaStreamSource* webkit_source) { | 407 blink::WebMediaStreamSource* webkit_source) { |
| 423 const blink::WebMediaStreamSource* existing_source = | 408 const blink::WebMediaStreamSource* existing_source = |
| 424 FindLocalSource(device); | 409 FindLocalSource(device); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 request->StartAudioTrack((*webkit_tracks)[i], constraints); | 511 request->StartAudioTrack((*webkit_tracks)[i], constraints); |
| 527 } | 512 } |
| 528 } | 513 } |
| 529 | 514 |
| 530 void MediaStreamImpl::OnCreateNativeTracksCompleted( | 515 void MediaStreamImpl::OnCreateNativeTracksCompleted( |
| 531 UserMediaRequestInfo* request, | 516 UserMediaRequestInfo* request, |
| 532 content::MediaStreamRequestResult result) { | 517 content::MediaStreamRequestResult result) { |
| 533 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" | 518 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" |
| 534 << "{request_id = " << request->request_id << "} " | 519 << "{request_id = " << request->request_id << "} " |
| 535 << "{result = " << result << "})"; | 520 << "{result = " << result << "})"; |
| 536 CompleteGetUserMediaRequest(request->web_stream, &request->request, | 521 if (result == content::MEDIA_DEVICE_OK) |
| 537 result); | 522 GetUserMediaRequestSucceeded(request->web_stream, &request->request); |
| 538 if (result != MEDIA_DEVICE_OK) { | 523 else |
| 539 // TODO(perkj): Once we don't support MediaStream::Stop the |request_info| | 524 GetUserMediaRequestFailed(&request->request, result); |
| 540 // can be deleted even if the request succeeds. | 525 |
| 541 DeleteUserMediaRequestInfo(request); | 526 DeleteUserMediaRequestInfo(request); |
| 542 StopUnreferencedSources(true); | |
| 543 } | |
| 544 } | 527 } |
| 545 | 528 |
| 546 void MediaStreamImpl::OnDevicesEnumerated( | 529 void MediaStreamImpl::OnDevicesEnumerated( |
| 547 int request_id, | 530 int request_id, |
| 548 const StreamDeviceInfoArray& device_array) { | 531 const StreamDeviceInfoArray& device_array) { |
| 549 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" | 532 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" |
| 550 << request_id << ")"; | 533 << request_id << ")"; |
| 551 NOTIMPLEMENTED(); | 534 NOTIMPLEMENTED(); |
| 552 } | 535 } |
| 553 | 536 |
| 554 void MediaStreamImpl::OnDeviceOpened( | 537 void MediaStreamImpl::OnDeviceOpened( |
| 555 int request_id, | 538 int request_id, |
| 556 const std::string& label, | 539 const std::string& label, |
| 557 const StreamDeviceInfo& video_device) { | 540 const StreamDeviceInfo& video_device) { |
| 558 DVLOG(1) << "MediaStreamImpl::OnDeviceOpened(" | 541 DVLOG(1) << "MediaStreamImpl::OnDeviceOpened(" |
| 559 << request_id << ", " << label << ")"; | 542 << request_id << ", " << label << ")"; |
| 560 NOTIMPLEMENTED(); | 543 NOTIMPLEMENTED(); |
| 561 } | 544 } |
| 562 | 545 |
| 563 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { | 546 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { |
| 564 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" | 547 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" |
| 565 << request_id << ")"; | 548 << request_id << ")"; |
| 566 NOTIMPLEMENTED(); | 549 NOTIMPLEMENTED(); |
| 567 } | 550 } |
| 568 | 551 |
| 569 void MediaStreamImpl::CompleteGetUserMediaRequest( | 552 void MediaStreamImpl::GetUserMediaRequestSucceeded( |
| 570 const blink::WebMediaStream& stream, | 553 const blink::WebMediaStream& stream, |
| 554 blink::WebUserMediaRequest* request_info) { |
| 555 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; |
| 556 request_info->requestSucceeded(stream); |
| 557 } |
| 558 |
| 559 void MediaStreamImpl::GetUserMediaRequestFailed( |
| 571 blink::WebUserMediaRequest* request_info, | 560 blink::WebUserMediaRequest* request_info, |
| 572 content::MediaStreamRequestResult result) { | 561 content::MediaStreamRequestResult result) { |
| 573 | |
| 574 DVLOG(1) << "MediaStreamImpl::CompleteGetUserMediaRequest(" | |
| 575 << "result=" << result; | |
| 576 | |
| 577 switch (result) { | 562 switch (result) { |
| 578 case MEDIA_DEVICE_OK: | 563 case MEDIA_DEVICE_OK: |
| 579 request_info->requestSucceeded(stream); | 564 NOTREACHED(); |
| 580 break; | 565 break; |
| 581 case MEDIA_DEVICE_PERMISSION_DENIED: | 566 case MEDIA_DEVICE_PERMISSION_DENIED: |
| 582 request_info->requestDenied(); | 567 request_info->requestDenied(); |
| 583 break; | 568 break; |
| 584 case MEDIA_DEVICE_PERMISSION_DISMISSED: | 569 case MEDIA_DEVICE_PERMISSION_DISMISSED: |
| 585 request_info->requestFailedUASpecific("PermissionDismissedError"); | 570 request_info->requestFailedUASpecific("PermissionDismissedError"); |
| 586 break; | 571 break; |
| 587 case MEDIA_DEVICE_INVALID_STATE: | 572 case MEDIA_DEVICE_INVALID_STATE: |
| 588 request_info->requestFailedUASpecific("InvalidStateError"); | 573 request_info->requestFailedUASpecific("InvalidStateError"); |
| 589 break; | 574 break; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 620 const StreamDeviceInfo& active_device = source->device_info(); | 605 const StreamDeviceInfo& active_device = source->device_info(); |
| 621 if (active_device.device.id == device.device.id && | 606 if (active_device.device.id == device.device.id && |
| 622 active_device.device.type == device.device.type && | 607 active_device.device.type == device.device.type && |
| 623 active_device.session_id == device.session_id) { | 608 active_device.session_id == device.session_id) { |
| 624 return &it->source; | 609 return &it->source; |
| 625 } | 610 } |
| 626 } | 611 } |
| 627 return NULL; | 612 return NULL; |
| 628 } | 613 } |
| 629 | 614 |
| 630 bool MediaStreamImpl::IsSourceInRequests( | |
| 631 const blink::WebMediaStreamSource& source) const { | |
| 632 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin(); | |
| 633 req_it != user_media_requests_.end(); ++req_it) { | |
| 634 if ((*req_it)->IsSourceUsed(source)) | |
| 635 return true; | |
| 636 } | |
| 637 return false; | |
| 638 } | |
| 639 | |
| 640 MediaStreamImpl::UserMediaRequestInfo* | 615 MediaStreamImpl::UserMediaRequestInfo* |
| 641 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { | 616 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { |
| 642 UserMediaRequests::iterator it = user_media_requests_.begin(); | 617 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 643 for (; it != user_media_requests_.end(); ++it) { | 618 for (; it != user_media_requests_.end(); ++it) { |
| 644 if ((*it)->request_id == request_id) | 619 if ((*it)->request_id == request_id) |
| 645 return (*it); | 620 return (*it); |
| 646 } | 621 } |
| 647 return NULL; | 622 return NULL; |
| 648 } | 623 } |
| 649 | 624 |
| 650 MediaStreamImpl::UserMediaRequestInfo* | 625 MediaStreamImpl::UserMediaRequestInfo* |
| 651 MediaStreamImpl::FindUserMediaRequestInfo( | 626 MediaStreamImpl::FindUserMediaRequestInfo( |
| 652 const blink::WebUserMediaRequest& request) { | 627 const blink::WebUserMediaRequest& request) { |
| 653 UserMediaRequests::iterator it = user_media_requests_.begin(); | 628 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 654 for (; it != user_media_requests_.end(); ++it) { | 629 for (; it != user_media_requests_.end(); ++it) { |
| 655 if ((*it)->request == request) | 630 if ((*it)->request == request) |
| 656 return (*it); | 631 return (*it); |
| 657 } | 632 } |
| 658 return NULL; | 633 return NULL; |
| 659 } | 634 } |
| 660 | 635 |
| 661 MediaStreamImpl::UserMediaRequestInfo* | |
| 662 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) { | |
| 663 UserMediaRequests::iterator it = user_media_requests_.begin(); | |
| 664 for (; it != user_media_requests_.end(); ++it) { | |
| 665 if ((*it)->generated && (*it)->web_stream.id() == base::UTF8ToUTF16(label)) | |
| 666 return (*it); | |
| 667 } | |
| 668 return NULL; | |
| 669 } | |
| 670 | |
| 671 void MediaStreamImpl::DeleteUserMediaRequestInfo( | 636 void MediaStreamImpl::DeleteUserMediaRequestInfo( |
| 672 UserMediaRequestInfo* request) { | 637 UserMediaRequestInfo* request) { |
| 673 UserMediaRequests::iterator it = user_media_requests_.begin(); | 638 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 674 for (; it != user_media_requests_.end(); ++it) { | 639 for (; it != user_media_requests_.end(); ++it) { |
| 675 if ((*it) == request) { | 640 if ((*it) == request) { |
| 676 user_media_requests_.erase(it); | 641 user_media_requests_.erase(it); |
| 677 return; | 642 return; |
| 678 } | 643 } |
| 679 } | 644 } |
| 680 NOTREACHED(); | 645 NOTREACHED(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 while (sources_it != local_sources_.end()) { | 678 while (sources_it != local_sources_.end()) { |
| 714 if (sources_it->frame == frame) { | 679 if (sources_it->frame == frame) { |
| 715 StopLocalSource(sources_it->source, true); | 680 StopLocalSource(sources_it->source, true); |
| 716 sources_it = local_sources_.erase(sources_it); | 681 sources_it = local_sources_.erase(sources_it); |
| 717 } else { | 682 } else { |
| 718 ++sources_it; | 683 ++sources_it; |
| 719 } | 684 } |
| 720 } | 685 } |
| 721 } | 686 } |
| 722 | 687 |
| 723 void MediaStreamImpl::OnLocalMediaStreamStop( | |
| 724 const std::string& label) { | |
| 725 DVLOG(1) << "MediaStreamImpl::OnLocalMediaStreamStop(" << label << ")"; | |
| 726 | |
| 727 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); | |
| 728 if (user_media_request) { | |
| 729 DeleteUserMediaRequestInfo(user_media_request); | |
| 730 } | |
| 731 StopUnreferencedSources(true); | |
| 732 } | |
| 733 | |
| 734 void MediaStreamImpl::OnLocalSourceStopped( | 688 void MediaStreamImpl::OnLocalSourceStopped( |
| 735 const blink::WebMediaStreamSource& source) { | 689 const blink::WebMediaStreamSource& source) { |
| 736 DCHECK(CalledOnValidThread()); | 690 DCHECK(CalledOnValidThread()); |
| 691 DVLOG(1) << "MediaStreamImpl::OnLocalSourceStopped"; |
| 737 | 692 |
| 738 bool device_found = false; | 693 bool device_found = false; |
| 739 for (LocalStreamSources::iterator device_it = local_sources_.begin(); | 694 for (LocalStreamSources::iterator device_it = local_sources_.begin(); |
| 740 device_it != local_sources_.end(); ++device_it) { | 695 device_it != local_sources_.end(); ++device_it) { |
| 741 if (device_it->source.id() == source.id()) { | 696 if (device_it->source.id() == source.id()) { |
| 742 device_found = true; | 697 device_found = true; |
| 743 local_sources_.erase(device_it); | 698 local_sources_.erase(device_it); |
| 744 break; | 699 break; |
| 745 } | 700 } |
| 746 } | 701 } |
| 747 CHECK(device_found); | 702 CHECK(device_found); |
| 748 | 703 |
| 749 // Remove the reference to this source from all |user_media_requests_|. | |
| 750 // TODO(perkj): The below is not necessary once we don't need to support | |
| 751 // MediaStream::Stop(). | |
| 752 UserMediaRequests::iterator it = user_media_requests_.begin(); | |
| 753 while (it != user_media_requests_.end()) { | |
| 754 (*it)->RemoveSource(source); | |
| 755 if ((*it)->AreAllSourcesRemoved()) { | |
| 756 it = user_media_requests_.erase(it); | |
| 757 } else { | |
| 758 ++it; | |
| 759 } | |
| 760 } | |
| 761 | |
| 762 MediaStreamSource* source_impl = | 704 MediaStreamSource* source_impl = |
| 763 static_cast<MediaStreamSource*> (source.extraData()); | 705 static_cast<MediaStreamSource*> (source.extraData()); |
| 764 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); | 706 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); |
| 765 } | 707 } |
| 766 | 708 |
| 767 void MediaStreamImpl::StopLocalSource( | 709 void MediaStreamImpl::StopLocalSource( |
| 768 const blink::WebMediaStreamSource& source, | 710 const blink::WebMediaStreamSource& source, |
| 769 bool notify_dispatcher) { | 711 bool notify_dispatcher) { |
| 770 MediaStreamSource* source_impl = | 712 MediaStreamSource* source_impl = |
| 771 static_cast<MediaStreamSource*> (source.extraData()); | 713 static_cast<MediaStreamSource*> (source.extraData()); |
| 772 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" | 714 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" |
| 773 << "{device_id = " << source_impl->device_info().device.id << "})"; | 715 << "{device_id = " << source_impl->device_info().device.id << "})"; |
| 774 | 716 |
| 775 if (notify_dispatcher) | 717 if (notify_dispatcher) |
| 776 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); | 718 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); |
| 777 | 719 |
| 778 source_impl->ResetSourceStoppedCallback(); | 720 source_impl->ResetSourceStoppedCallback(); |
| 779 source_impl->StopSource(); | 721 source_impl->StopSource(); |
| 780 } | 722 } |
| 781 | 723 |
| 782 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) { | |
| 783 LocalStreamSources::iterator source_it = local_sources_.begin(); | |
| 784 while (source_it != local_sources_.end()) { | |
| 785 if (!IsSourceInRequests(source_it->source)) { | |
| 786 StopLocalSource(source_it->source, notify_dispatcher); | |
| 787 source_it = local_sources_.erase(source_it); | |
| 788 } else { | |
| 789 ++source_it; | |
| 790 } | |
| 791 } | |
| 792 } | |
| 793 | |
| 794 scoped_refptr<WebRtcAudioRenderer> MediaStreamImpl::CreateRemoteAudioRenderer( | 724 scoped_refptr<WebRtcAudioRenderer> MediaStreamImpl::CreateRemoteAudioRenderer( |
| 795 webrtc::MediaStreamInterface* stream, | 725 webrtc::MediaStreamInterface* stream, |
| 796 int render_frame_id) { | 726 int render_frame_id) { |
| 797 if (stream->GetAudioTracks().empty()) | 727 if (stream->GetAudioTracks().empty()) |
| 798 return NULL; | 728 return NULL; |
| 799 | 729 |
| 800 DVLOG(1) << "MediaStreamImpl::CreateRemoteAudioRenderer label:" | 730 DVLOG(1) << "MediaStreamImpl::CreateRemoteAudioRenderer label:" |
| 801 << stream->label(); | 731 << stream->label(); |
| 802 | 732 |
| 803 // TODO(tommi): Change the default value of session_id to be | 733 // TODO(tommi): Change the default value of session_id to be |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 | 835 |
| 906 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( | 836 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( |
| 907 const ResourcesReady& callback) { | 837 const ResourcesReady& callback) { |
| 908 DCHECK(ready_callback_.is_null()); | 838 DCHECK(ready_callback_.is_null()); |
| 909 ready_callback_ = callback; | 839 ready_callback_ = callback; |
| 910 CheckAllTracksStarted(); | 840 CheckAllTracksStarted(); |
| 911 } | 841 } |
| 912 | 842 |
| 913 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( | 843 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( |
| 914 MediaStreamSource* source, bool success) { | 844 MediaStreamSource* source, bool success) { |
| 915 DVLOG(1) << "OnTrackStarted"; | 845 DVLOG(1) << "OnTrackStarted result " << success; |
| 916 std::vector<MediaStreamSource*>::iterator it = | 846 std::vector<MediaStreamSource*>::iterator it = |
| 917 std::find(sources_waiting_for_callback_.begin(), | 847 std::find(sources_waiting_for_callback_.begin(), |
| 918 sources_waiting_for_callback_.end(), | 848 sources_waiting_for_callback_.end(), |
| 919 source); | 849 source); |
| 920 DCHECK(it != sources_waiting_for_callback_.end()); | 850 DCHECK(it != sources_waiting_for_callback_.end()); |
| 921 sources_waiting_for_callback_.erase(it); | 851 sources_waiting_for_callback_.erase(it); |
| 922 // All tracks must be started successfully. Otherwise the request is a | 852 // All tracks must be started successfully. Otherwise the request is a |
| 923 // failure. | 853 // failure. |
| 924 if (!success) | 854 if (!success) |
| 925 request_failed_ = true; | 855 request_failed_ = true; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 951 sources_.begin(); | 881 sources_.begin(); |
| 952 it != sources_.end(); ++it) { | 882 it != sources_.end(); ++it) { |
| 953 if (source.id() == it->id()) { | 883 if (source.id() == it->id()) { |
| 954 sources_.erase(it); | 884 sources_.erase(it); |
| 955 return; | 885 return; |
| 956 } | 886 } |
| 957 } | 887 } |
| 958 } | 888 } |
| 959 | 889 |
| 960 } // namespace content | 890 } // namespace content |
| OLD | NEW |