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 |