| 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 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 device_it != video_array.end(); ++device_it) { | 335 device_it != video_array.end(); ++device_it) { |
| 336 if (!FindLocalSource(*device_it)) | 336 if (!FindLocalSource(*device_it)) |
| 337 media_stream_dispatcher_->StopStreamDevice(*device_it); | 337 media_stream_dispatcher_->StopStreamDevice(*device_it); |
| 338 } | 338 } |
| 339 } | 339 } |
| 340 | 340 |
| 341 // Callback from MediaStreamDispatcher. | 341 // Callback from MediaStreamDispatcher. |
| 342 // The requested stream failed to be generated. | 342 // The requested stream failed to be generated. |
| 343 void MediaStreamImpl::OnStreamGenerationFailed( | 343 void MediaStreamImpl::OnStreamGenerationFailed( |
| 344 int request_id, | 344 int request_id, |
| 345 content::MediaStreamRequestResult result) { | 345 MediaStreamRequestResult result) { |
| 346 DCHECK(CalledOnValidThread()); | 346 DCHECK(CalledOnValidThread()); |
| 347 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" | 347 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" |
| 348 << request_id << ")"; | 348 << request_id << ")"; |
| 349 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 349 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 350 if (!request_info) { | 350 if (!request_info) { |
| 351 // This can happen if the request is canceled or the frame reloads while | 351 // This can happen if the request is canceled or the frame reloads while |
| 352 // MediaStreamDispatcher is processing the request. | 352 // MediaStreamDispatcher is processing the request. |
| 353 DVLOG(1) << "Request ID not found"; | 353 DVLOG(1) << "Request ID not found"; |
| 354 return; | 354 return; |
| 355 } | 355 } |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 blink::WebMediaStreamSource::TypeAudio, | 493 blink::WebMediaStreamSource::TypeAudio, |
| 494 constraints, | 494 constraints, |
| 495 &webkit_source); | 495 &webkit_source); |
| 496 (*webkit_tracks)[i].initialize(webkit_source); | 496 (*webkit_tracks)[i].initialize(webkit_source); |
| 497 request->StartAudioTrack((*webkit_tracks)[i], constraints); | 497 request->StartAudioTrack((*webkit_tracks)[i], constraints); |
| 498 } | 498 } |
| 499 } | 499 } |
| 500 | 500 |
| 501 void MediaStreamImpl::OnCreateNativeTracksCompleted( | 501 void MediaStreamImpl::OnCreateNativeTracksCompleted( |
| 502 UserMediaRequestInfo* request, | 502 UserMediaRequestInfo* request, |
| 503 content::MediaStreamRequestResult result) { | 503 MediaStreamRequestResult result, |
| 504 const blink::WebString& result_name) { |
| 504 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" | 505 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" |
| 505 << "{request_id = " << request->request_id << "} " | 506 << "{request_id = " << request->request_id << "} " |
| 506 << "{result = " << result << "})"; | 507 << "{result = " << result << "})"; |
| 507 if (result == content::MEDIA_DEVICE_OK) | 508 if (result == content::MEDIA_DEVICE_OK) |
| 508 GetUserMediaRequestSucceeded(request->web_stream, &request->request); | 509 GetUserMediaRequestSucceeded(request->web_stream, &request->request); |
| 509 else | 510 else |
| 510 GetUserMediaRequestFailed(&request->request, result); | 511 GetUserMediaRequestTrackStartedFailed(&request->request, |
| 512 result, |
| 513 result_name); |
| 511 | 514 |
| 512 DeleteUserMediaRequestInfo(request); | 515 DeleteUserMediaRequestInfo(request); |
| 513 } | 516 } |
| 514 | 517 |
| 515 void MediaStreamImpl::OnDevicesEnumerated( | 518 void MediaStreamImpl::OnDevicesEnumerated( |
| 516 int request_id, | 519 int request_id, |
| 517 const StreamDeviceInfoArray& device_array) { | 520 const StreamDeviceInfoArray& device_array) { |
| 518 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; | 521 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; |
| 519 | 522 |
| 520 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); | 523 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 void MediaStreamImpl::GetUserMediaRequestSucceeded( | 609 void MediaStreamImpl::GetUserMediaRequestSucceeded( |
| 607 const blink::WebMediaStream& stream, | 610 const blink::WebMediaStream& stream, |
| 608 blink::WebUserMediaRequest* request_info) { | 611 blink::WebUserMediaRequest* request_info) { |
| 609 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; | 612 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; |
| 610 LogUserMediaRequestResult(MEDIA_DEVICE_OK); | 613 LogUserMediaRequestResult(MEDIA_DEVICE_OK); |
| 611 request_info->requestSucceeded(stream); | 614 request_info->requestSucceeded(stream); |
| 612 } | 615 } |
| 613 | 616 |
| 614 void MediaStreamImpl::GetUserMediaRequestFailed( | 617 void MediaStreamImpl::GetUserMediaRequestFailed( |
| 615 blink::WebUserMediaRequest* request_info, | 618 blink::WebUserMediaRequest* request_info, |
| 616 content::MediaStreamRequestResult result) { | 619 MediaStreamRequestResult result) { |
| 617 LogUserMediaRequestResult(result); | 620 LogUserMediaRequestResult(result); |
| 618 switch (result) { | 621 switch (result) { |
| 619 case MEDIA_DEVICE_OK: | 622 case MEDIA_DEVICE_OK: |
| 620 NOTREACHED(); | 623 NOTREACHED(); |
| 621 break; | 624 break; |
| 622 case MEDIA_DEVICE_PERMISSION_DENIED: | 625 case MEDIA_DEVICE_PERMISSION_DENIED: |
| 623 request_info->requestDenied(); | 626 request_info->requestDenied(); |
| 624 break; | 627 break; |
| 625 case MEDIA_DEVICE_PERMISSION_DISMISSED: | 628 case MEDIA_DEVICE_PERMISSION_DISMISSED: |
| 626 request_info->requestFailedUASpecific("PermissionDismissedError"); | 629 request_info->requestFailedUASpecific("PermissionDismissedError"); |
| 627 break; | 630 break; |
| 628 case MEDIA_DEVICE_INVALID_STATE: | 631 case MEDIA_DEVICE_INVALID_STATE: |
| 629 request_info->requestFailedUASpecific("InvalidStateError"); | 632 request_info->requestFailedUASpecific("InvalidStateError"); |
| 630 break; | 633 break; |
| 631 case MEDIA_DEVICE_NO_HARDWARE: | 634 case MEDIA_DEVICE_NO_HARDWARE: |
| 632 request_info->requestFailedUASpecific("DevicesNotFoundError"); | 635 request_info->requestFailedUASpecific("DevicesNotFoundError"); |
| 633 break; | 636 break; |
| 634 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: | 637 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: |
| 635 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); | 638 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); |
| 636 break; | 639 break; |
| 637 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: | 640 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: |
| 638 request_info->requestFailedUASpecific("TabCaptureError"); | 641 request_info->requestFailedUASpecific("TabCaptureError"); |
| 639 break; | 642 break; |
| 640 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: | 643 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: |
| 641 request_info->requestFailedUASpecific("ScreenCaptureError"); | 644 request_info->requestFailedUASpecific("ScreenCaptureError"); |
| 642 break; | 645 break; |
| 643 case MEDIA_DEVICE_CAPTURE_FAILURE: | 646 case MEDIA_DEVICE_CAPTURE_FAILURE: |
| 644 request_info->requestFailedUASpecific("DeviceCaptureError"); | 647 request_info->requestFailedUASpecific("DeviceCaptureError"); |
| 645 break; | 648 break; |
| 649 default: |
| 650 NOTREACHED(); |
| 651 request_info->requestFailed(); |
| 652 break; |
| 653 } |
| 654 } |
| 655 |
| 656 void MediaStreamImpl::GetUserMediaRequestTrackStartedFailed( |
| 657 blink::WebUserMediaRequest* request_info, |
| 658 MediaStreamRequestResult result, |
| 659 const blink::WebString& result_name) { |
| 660 switch (result) { |
| 661 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: |
| 662 request_info->requestFailedConstraint(result_name); |
| 663 break; |
| 646 case MEDIA_DEVICE_TRACK_START_FAILURE: | 664 case MEDIA_DEVICE_TRACK_START_FAILURE: |
| 647 request_info->requestFailedUASpecific("TrackStartError"); | 665 request_info->requestFailedUASpecific("TrackStartError"); |
| 648 break; | 666 break; |
| 649 default: | 667 default: |
| 668 NOTREACHED(); |
| 650 request_info->requestFailed(); | 669 request_info->requestFailed(); |
| 651 break; | 670 break; |
| 652 } | 671 } |
| 653 } | 672 } |
| 654 | 673 |
| 655 void MediaStreamImpl::EnumerateDevicesSucceded( | 674 void MediaStreamImpl::EnumerateDevicesSucceded( |
| 656 blink::WebMediaDevicesRequest* request, | 675 blink::WebMediaDevicesRequest* request, |
| 657 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { | 676 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { |
| 658 request->requestSucceeded(devices); | 677 request->requestSucceeded(devices); |
| 659 } | 678 } |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 825 | 844 |
| 826 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( | 845 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( |
| 827 int request_id, | 846 int request_id, |
| 828 const blink::WebUserMediaRequest& request, | 847 const blink::WebUserMediaRequest& request, |
| 829 bool enable_automatic_output_device_selection) | 848 bool enable_automatic_output_device_selection) |
| 830 : request_id(request_id), | 849 : request_id(request_id), |
| 831 generated(false), | 850 generated(false), |
| 832 enable_automatic_output_device_selection( | 851 enable_automatic_output_device_selection( |
| 833 enable_automatic_output_device_selection), | 852 enable_automatic_output_device_selection), |
| 834 request(request), | 853 request(request), |
| 835 request_failed_(false) { | 854 request_result_(MEDIA_DEVICE_OK), |
| 855 request_result_name_("") { |
| 836 } | 856 } |
| 837 | 857 |
| 838 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { | 858 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { |
| 839 DVLOG(1) << "~UserMediaRequestInfo"; | 859 DVLOG(1) << "~UserMediaRequestInfo"; |
| 840 } | 860 } |
| 841 | 861 |
| 842 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack( | 862 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack( |
| 843 const blink::WebMediaStreamTrack& track, | 863 const blink::WebMediaStreamTrack& track, |
| 844 const blink::WebMediaConstraints& constraints) { | 864 const blink::WebMediaConstraints& constraints) { |
| 845 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); | 865 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 873 } | 893 } |
| 874 | 894 |
| 875 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( | 895 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( |
| 876 const ResourcesReady& callback) { | 896 const ResourcesReady& callback) { |
| 877 DCHECK(ready_callback_.is_null()); | 897 DCHECK(ready_callback_.is_null()); |
| 878 ready_callback_ = callback; | 898 ready_callback_ = callback; |
| 879 CheckAllTracksStarted(); | 899 CheckAllTracksStarted(); |
| 880 } | 900 } |
| 881 | 901 |
| 882 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( | 902 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( |
| 883 MediaStreamSource* source, bool success) { | 903 MediaStreamSource* source, |
| 884 DVLOG(1) << "OnTrackStarted result " << success; | 904 MediaStreamRequestResult result, |
| 905 const blink::WebString& result_name) { |
| 906 DVLOG(1) << "OnTrackStarted result " << result; |
| 885 std::vector<MediaStreamSource*>::iterator it = | 907 std::vector<MediaStreamSource*>::iterator it = |
| 886 std::find(sources_waiting_for_callback_.begin(), | 908 std::find(sources_waiting_for_callback_.begin(), |
| 887 sources_waiting_for_callback_.end(), | 909 sources_waiting_for_callback_.end(), |
| 888 source); | 910 source); |
| 889 DCHECK(it != sources_waiting_for_callback_.end()); | 911 DCHECK(it != sources_waiting_for_callback_.end()); |
| 890 sources_waiting_for_callback_.erase(it); | 912 sources_waiting_for_callback_.erase(it); |
| 891 // All tracks must be started successfully. Otherwise the request is a | 913 // All tracks must be started successfully. Otherwise the request is a |
| 892 // failure. | 914 // failure. |
| 893 if (!success) | 915 if (result != MEDIA_DEVICE_OK) { |
| 894 request_failed_ = true; | 916 request_result_ = result; |
| 917 request_result_name_ = result_name; |
| 918 } |
| 919 |
| 895 CheckAllTracksStarted(); | 920 CheckAllTracksStarted(); |
| 896 } | 921 } |
| 897 | 922 |
| 898 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { | 923 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { |
| 899 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { | 924 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { |
| 900 ready_callback_.Run( | 925 ready_callback_.Run(this, request_result_, request_result_name_); |
| 901 this, | |
| 902 request_failed_ ? MEDIA_DEVICE_TRACK_START_FAILURE : MEDIA_DEVICE_OK); | |
| 903 } | 926 } |
| 904 } | 927 } |
| 905 | 928 |
| 906 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( | 929 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( |
| 907 const blink::WebMediaStreamSource& source) const { | 930 const blink::WebMediaStreamSource& source) const { |
| 908 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = | 931 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = |
| 909 sources_.begin(); | 932 sources_.begin(); |
| 910 source_it != sources_.end(); ++source_it) { | 933 source_it != sources_.end(); ++source_it) { |
| 911 if (source_it->id() == source.id()) | 934 if (source_it->id() == source.id()) |
| 912 return true; | 935 return true; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 924 return; | 947 return; |
| 925 } | 948 } |
| 926 } | 949 } |
| 927 } | 950 } |
| 928 | 951 |
| 929 bool MediaStreamImpl::UserMediaRequestInfo::HasPendingSources() const { | 952 bool MediaStreamImpl::UserMediaRequestInfo::HasPendingSources() const { |
| 930 return !sources_waiting_for_callback_.empty(); | 953 return !sources_waiting_for_callback_.empty(); |
| 931 } | 954 } |
| 932 | 955 |
| 933 } // namespace content | 956 } // namespace content |
| OLD | NEW |