| 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/hash.h" | 9 #include "base/hash.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 // Wait for the tracks to be started successfully or to fail. | 329 // Wait for the tracks to be started successfully or to fail. |
| 330 request_info->CallbackOnTracksStarted( | 330 request_info->CallbackOnTracksStarted( |
| 331 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, | 331 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, |
| 332 weak_factory_.GetWeakPtr())); | 332 weak_factory_.GetWeakPtr())); |
| 333 } | 333 } |
| 334 | 334 |
| 335 // Callback from MediaStreamDispatcher. | 335 // Callback from MediaStreamDispatcher. |
| 336 // The requested stream failed to be generated. | 336 // The requested stream failed to be generated. |
| 337 void MediaStreamImpl::OnStreamGenerationFailed( | 337 void MediaStreamImpl::OnStreamGenerationFailed( |
| 338 int request_id, | 338 int request_id, |
| 339 content::MediaStreamRequestResult result) { | 339 MediaStreamRequestResult result) { |
| 340 DCHECK(CalledOnValidThread()); | 340 DCHECK(CalledOnValidThread()); |
| 341 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" | 341 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" |
| 342 << request_id << ")"; | 342 << request_id << ")"; |
| 343 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 343 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 344 if (!request_info) { | 344 if (!request_info) { |
| 345 // This can happen if the request is canceled or the frame reloads while | 345 // This can happen if the request is canceled or the frame reloads while |
| 346 // MediaStreamDispatcher is processing the request. | 346 // MediaStreamDispatcher is processing the request. |
| 347 DVLOG(1) << "Request ID not found"; | 347 DVLOG(1) << "Request ID not found"; |
| 348 return; | 348 return; |
| 349 } | 349 } |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 blink::WebMediaStreamSource::TypeAudio, | 487 blink::WebMediaStreamSource::TypeAudio, |
| 488 constraints, | 488 constraints, |
| 489 &webkit_source); | 489 &webkit_source); |
| 490 (*webkit_tracks)[i].initialize(webkit_source); | 490 (*webkit_tracks)[i].initialize(webkit_source); |
| 491 request->StartAudioTrack((*webkit_tracks)[i], constraints); | 491 request->StartAudioTrack((*webkit_tracks)[i], constraints); |
| 492 } | 492 } |
| 493 } | 493 } |
| 494 | 494 |
| 495 void MediaStreamImpl::OnCreateNativeTracksCompleted( | 495 void MediaStreamImpl::OnCreateNativeTracksCompleted( |
| 496 UserMediaRequestInfo* request, | 496 UserMediaRequestInfo* request, |
| 497 content::MediaStreamRequestResult result) { | 497 MediaStreamRequestResult result, |
| 498 const blink::WebString& result_name) { |
| 498 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" | 499 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" |
| 499 << "{request_id = " << request->request_id << "} " | 500 << "{request_id = " << request->request_id << "} " |
| 500 << "{result = " << result << "})"; | 501 << "{result = " << result << "})"; |
| 501 if (result == content::MEDIA_DEVICE_OK) | 502 if (result == content::MEDIA_DEVICE_OK) |
| 502 GetUserMediaRequestSucceeded(request->web_stream, &request->request); | 503 GetUserMediaRequestSucceeded(request->web_stream, &request->request); |
| 503 else | 504 else |
| 504 GetUserMediaRequestFailed(&request->request, result); | 505 GetUserMediaRequestTrackStartedFailed(&request->request, |
| 506 result, |
| 507 result_name); |
| 505 | 508 |
| 506 DeleteUserMediaRequestInfo(request); | 509 DeleteUserMediaRequestInfo(request); |
| 507 } | 510 } |
| 508 | 511 |
| 509 void MediaStreamImpl::OnDevicesEnumerated( | 512 void MediaStreamImpl::OnDevicesEnumerated( |
| 510 int request_id, | 513 int request_id, |
| 511 const StreamDeviceInfoArray& device_array) { | 514 const StreamDeviceInfoArray& device_array) { |
| 512 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; | 515 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; |
| 513 | 516 |
| 514 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); | 517 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 | 602 |
| 600 void MediaStreamImpl::GetUserMediaRequestSucceeded( | 603 void MediaStreamImpl::GetUserMediaRequestSucceeded( |
| 601 const blink::WebMediaStream& stream, | 604 const blink::WebMediaStream& stream, |
| 602 blink::WebUserMediaRequest* request_info) { | 605 blink::WebUserMediaRequest* request_info) { |
| 603 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; | 606 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; |
| 604 request_info->requestSucceeded(stream); | 607 request_info->requestSucceeded(stream); |
| 605 } | 608 } |
| 606 | 609 |
| 607 void MediaStreamImpl::GetUserMediaRequestFailed( | 610 void MediaStreamImpl::GetUserMediaRequestFailed( |
| 608 blink::WebUserMediaRequest* request_info, | 611 blink::WebUserMediaRequest* request_info, |
| 609 content::MediaStreamRequestResult result) { | 612 MediaStreamRequestResult result) { |
| 610 switch (result) { | 613 switch (result) { |
| 611 case MEDIA_DEVICE_OK: | 614 case MEDIA_DEVICE_OK: |
| 612 NOTREACHED(); | 615 NOTREACHED(); |
| 613 break; | 616 break; |
| 614 case MEDIA_DEVICE_PERMISSION_DENIED: | 617 case MEDIA_DEVICE_PERMISSION_DENIED: |
| 615 request_info->requestDenied(); | 618 request_info->requestDenied(); |
| 616 break; | 619 break; |
| 617 case MEDIA_DEVICE_PERMISSION_DISMISSED: | 620 case MEDIA_DEVICE_PERMISSION_DISMISSED: |
| 618 request_info->requestFailedUASpecific("PermissionDismissedError"); | 621 request_info->requestFailedUASpecific("PermissionDismissedError"); |
| 619 break; | 622 break; |
| 620 case MEDIA_DEVICE_INVALID_STATE: | 623 case MEDIA_DEVICE_INVALID_STATE: |
| 621 request_info->requestFailedUASpecific("InvalidStateError"); | 624 request_info->requestFailedUASpecific("InvalidStateError"); |
| 622 break; | 625 break; |
| 623 case MEDIA_DEVICE_NO_HARDWARE: | 626 case MEDIA_DEVICE_NO_HARDWARE: |
| 624 request_info->requestFailedUASpecific("DevicesNotFoundError"); | 627 request_info->requestFailedUASpecific("DevicesNotFoundError"); |
| 625 break; | 628 break; |
| 626 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: | 629 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: |
| 627 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); | 630 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); |
| 628 break; | 631 break; |
| 629 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: | 632 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: |
| 630 request_info->requestFailedUASpecific("TabCaptureError"); | 633 request_info->requestFailedUASpecific("TabCaptureError"); |
| 631 break; | 634 break; |
| 632 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: | 635 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: |
| 633 request_info->requestFailedUASpecific("ScreenCaptureError"); | 636 request_info->requestFailedUASpecific("ScreenCaptureError"); |
| 634 break; | 637 break; |
| 635 case MEDIA_DEVICE_CAPTURE_FAILURE: | 638 case MEDIA_DEVICE_CAPTURE_FAILURE: |
| 636 request_info->requestFailedUASpecific("DeviceCaptureError"); | 639 request_info->requestFailedUASpecific("DeviceCaptureError"); |
| 637 break; | 640 break; |
| 641 default: |
| 642 NOTREACHED(); |
| 643 request_info->requestFailed(); |
| 644 break; |
| 645 } |
| 646 } |
| 647 |
| 648 void MediaStreamImpl::GetUserMediaRequestTrackStartedFailed( |
| 649 blink::WebUserMediaRequest* request_info, |
| 650 MediaStreamRequestResult result, |
| 651 const blink::WebString& result_name) { |
| 652 switch (result) { |
| 653 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: |
| 654 request_info->requestFailedConstraint(result_name); |
| 655 break; |
| 638 case MEDIA_DEVICE_TRACK_START_FAILURE: | 656 case MEDIA_DEVICE_TRACK_START_FAILURE: |
| 639 request_info->requestFailedUASpecific("TrackStartError"); | 657 request_info->requestFailedUASpecific("TrackStartError"); |
| 640 break; | 658 break; |
| 641 default: | 659 default: |
| 660 NOTREACHED(); |
| 642 request_info->requestFailed(); | 661 request_info->requestFailed(); |
| 643 break; | 662 break; |
| 644 } | 663 } |
| 645 } | 664 } |
| 646 | 665 |
| 647 void MediaStreamImpl::EnumerateDevicesSucceded( | 666 void MediaStreamImpl::EnumerateDevicesSucceded( |
| 648 blink::WebMediaDevicesRequest* request, | 667 blink::WebMediaDevicesRequest* request, |
| 649 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { | 668 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { |
| 650 request->requestSucceeded(devices); | 669 request->requestSucceeded(devices); |
| 651 } | 670 } |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 | 826 |
| 808 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( | 827 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( |
| 809 int request_id, | 828 int request_id, |
| 810 const blink::WebUserMediaRequest& request, | 829 const blink::WebUserMediaRequest& request, |
| 811 bool enable_automatic_output_device_selection) | 830 bool enable_automatic_output_device_selection) |
| 812 : request_id(request_id), | 831 : request_id(request_id), |
| 813 generated(false), | 832 generated(false), |
| 814 enable_automatic_output_device_selection( | 833 enable_automatic_output_device_selection( |
| 815 enable_automatic_output_device_selection), | 834 enable_automatic_output_device_selection), |
| 816 request(request), | 835 request(request), |
| 817 request_failed_(false) { | 836 request_result_(MEDIA_DEVICE_OK), |
| 837 request_result_name_("") { |
| 818 } | 838 } |
| 819 | 839 |
| 820 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { | 840 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { |
| 821 DVLOG(1) << "~UserMediaRequestInfo"; | 841 DVLOG(1) << "~UserMediaRequestInfo"; |
| 822 } | 842 } |
| 823 | 843 |
| 824 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack( | 844 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack( |
| 825 const blink::WebMediaStreamTrack& track, | 845 const blink::WebMediaStreamTrack& track, |
| 826 const blink::WebMediaConstraints& constraints) { | 846 const blink::WebMediaConstraints& constraints) { |
| 827 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); | 847 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 855 } | 875 } |
| 856 | 876 |
| 857 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( | 877 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( |
| 858 const ResourcesReady& callback) { | 878 const ResourcesReady& callback) { |
| 859 DCHECK(ready_callback_.is_null()); | 879 DCHECK(ready_callback_.is_null()); |
| 860 ready_callback_ = callback; | 880 ready_callback_ = callback; |
| 861 CheckAllTracksStarted(); | 881 CheckAllTracksStarted(); |
| 862 } | 882 } |
| 863 | 883 |
| 864 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( | 884 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( |
| 865 MediaStreamSource* source, bool success) { | 885 MediaStreamSource* source, |
| 866 DVLOG(1) << "OnTrackStarted result " << success; | 886 MediaStreamRequestResult result, |
| 887 const blink::WebString& result_name) { |
| 888 DVLOG(1) << "OnTrackStarted result " << result; |
| 867 std::vector<MediaStreamSource*>::iterator it = | 889 std::vector<MediaStreamSource*>::iterator it = |
| 868 std::find(sources_waiting_for_callback_.begin(), | 890 std::find(sources_waiting_for_callback_.begin(), |
| 869 sources_waiting_for_callback_.end(), | 891 sources_waiting_for_callback_.end(), |
| 870 source); | 892 source); |
| 871 DCHECK(it != sources_waiting_for_callback_.end()); | 893 DCHECK(it != sources_waiting_for_callback_.end()); |
| 872 sources_waiting_for_callback_.erase(it); | 894 sources_waiting_for_callback_.erase(it); |
| 873 // All tracks must be started successfully. Otherwise the request is a | 895 // All tracks must be started successfully. Otherwise the request is a |
| 874 // failure. | 896 // failure. |
| 875 if (!success) | 897 if (result != MEDIA_DEVICE_OK) { |
| 876 request_failed_ = true; | 898 request_result_ = result; |
| 899 request_result_name_ = result_name; |
| 900 } |
| 901 |
| 877 CheckAllTracksStarted(); | 902 CheckAllTracksStarted(); |
| 878 } | 903 } |
| 879 | 904 |
| 880 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { | 905 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { |
| 881 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { | 906 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { |
| 882 ready_callback_.Run( | 907 ready_callback_.Run(this, request_result_, request_result_name_); |
| 883 this, | |
| 884 request_failed_ ? MEDIA_DEVICE_TRACK_START_FAILURE : MEDIA_DEVICE_OK); | |
| 885 } | 908 } |
| 886 } | 909 } |
| 887 | 910 |
| 888 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( | 911 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( |
| 889 const blink::WebMediaStreamSource& source) const { | 912 const blink::WebMediaStreamSource& source) const { |
| 890 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = | 913 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = |
| 891 sources_.begin(); | 914 sources_.begin(); |
| 892 source_it != sources_.end(); ++source_it) { | 915 source_it != sources_.end(); ++source_it) { |
| 893 if (source_it->id() == source.id()) | 916 if (source_it->id() == source.id()) |
| 894 return true; | 917 return true; |
| 895 } | 918 } |
| 896 return false; | 919 return false; |
| 897 } | 920 } |
| 898 | 921 |
| 899 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource( | 922 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource( |
| 900 const blink::WebMediaStreamSource& source) { | 923 const blink::WebMediaStreamSource& source) { |
| 901 for (std::vector<blink::WebMediaStreamSource>::iterator it = | 924 for (std::vector<blink::WebMediaStreamSource>::iterator it = |
| 902 sources_.begin(); | 925 sources_.begin(); |
| 903 it != sources_.end(); ++it) { | 926 it != sources_.end(); ++it) { |
| 904 if (source.id() == it->id()) { | 927 if (source.id() == it->id()) { |
| 905 sources_.erase(it); | 928 sources_.erase(it); |
| 906 return; | 929 return; |
| 907 } | 930 } |
| 908 } | 931 } |
| 909 } | 932 } |
| 910 | 933 |
| 911 } // namespace content | 934 } // namespace content |
| OLD | NEW |