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 |