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 GetUserMediaRequestFailed(&request->request, result, result_name); |
505 | 506 |
506 DeleteUserMediaRequestInfo(request); | 507 DeleteUserMediaRequestInfo(request); |
507 } | 508 } |
508 | 509 |
509 void MediaStreamImpl::OnDevicesEnumerated( | 510 void MediaStreamImpl::OnDevicesEnumerated( |
510 int request_id, | 511 int request_id, |
511 const StreamDeviceInfoArray& device_array) { | 512 const StreamDeviceInfoArray& device_array) { |
512 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; | 513 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; |
513 | 514 |
514 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); | 515 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
599 | 600 |
600 void MediaStreamImpl::GetUserMediaRequestSucceeded( | 601 void MediaStreamImpl::GetUserMediaRequestSucceeded( |
601 const blink::WebMediaStream& stream, | 602 const blink::WebMediaStream& stream, |
602 blink::WebUserMediaRequest* request_info) { | 603 blink::WebUserMediaRequest* request_info) { |
603 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; | 604 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; |
604 request_info->requestSucceeded(stream); | 605 request_info->requestSucceeded(stream); |
605 } | 606 } |
606 | 607 |
607 void MediaStreamImpl::GetUserMediaRequestFailed( | 608 void MediaStreamImpl::GetUserMediaRequestFailed( |
608 blink::WebUserMediaRequest* request_info, | 609 blink::WebUserMediaRequest* request_info, |
609 content::MediaStreamRequestResult result) { | 610 MediaStreamRequestResult result) { |
610 switch (result) { | 611 switch (result) { |
611 case MEDIA_DEVICE_OK: | 612 case MEDIA_DEVICE_OK: |
612 NOTREACHED(); | 613 NOTREACHED(); |
613 break; | 614 break; |
614 case MEDIA_DEVICE_PERMISSION_DENIED: | 615 case MEDIA_DEVICE_PERMISSION_DENIED: |
615 request_info->requestDenied(); | 616 request_info->requestDenied(); |
616 break; | 617 break; |
617 case MEDIA_DEVICE_PERMISSION_DISMISSED: | 618 case MEDIA_DEVICE_PERMISSION_DISMISSED: |
618 request_info->requestFailedUASpecific("PermissionDismissedError"); | 619 request_info->requestFailedUASpecific("PermissionDismissedError"); |
619 break; | 620 break; |
620 case MEDIA_DEVICE_INVALID_STATE: | 621 case MEDIA_DEVICE_INVALID_STATE: |
621 request_info->requestFailedUASpecific("InvalidStateError"); | 622 request_info->requestFailedUASpecific("InvalidStateError"); |
622 break; | 623 break; |
623 case MEDIA_DEVICE_NO_HARDWARE: | 624 case MEDIA_DEVICE_NO_HARDWARE: |
624 request_info->requestFailedUASpecific("DevicesNotFoundError"); | 625 request_info->requestFailedUASpecific("DevicesNotFoundError"); |
625 break; | 626 break; |
626 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: | 627 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: |
627 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); | 628 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); |
628 break; | 629 break; |
629 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: | 630 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: |
630 request_info->requestFailedUASpecific("TabCaptureError"); | 631 request_info->requestFailedUASpecific("TabCaptureError"); |
631 break; | 632 break; |
632 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: | 633 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: |
633 request_info->requestFailedUASpecific("ScreenCaptureError"); | 634 request_info->requestFailedUASpecific("ScreenCaptureError"); |
634 break; | 635 break; |
635 case MEDIA_DEVICE_CAPTURE_FAILURE: | 636 case MEDIA_DEVICE_CAPTURE_FAILURE: |
636 request_info->requestFailedUASpecific("DeviceCaptureError"); | 637 request_info->requestFailedUASpecific("DeviceCaptureError"); |
637 break; | 638 break; |
639 default: | |
miu
2014/07/30 19:37:23
It's generally not good practice to use "default"
jiajia.qin
2014/07/31 13:43:00
Done.
miu
2014/07/31 19:30:09
You should still call request_info->requestFailed(
jiajia.qin
2014/08/01 05:25:33
Done.
| |
640 request_info->requestFailed(); | |
641 break; | |
642 } | |
643 } | |
644 | |
645 void MediaStreamImpl::GetUserMediaRequestFailed( | |
miu
2014/07/30 19:37:23
IMHO, this shouldn't be a separate method. Can yo
jiajia.qin
2014/07/31 13:43:00
The new 3rd arg is only for 'TrackStartError'. For
| |
646 blink::WebUserMediaRequest* request_info, | |
647 MediaStreamRequestResult result, | |
648 const blink::WebString& result_name) { | |
649 switch (result) { | |
650 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: | |
651 request_info->requestFailedConstraint(result_name); | |
652 break; | |
638 case MEDIA_DEVICE_TRACK_START_FAILURE: | 653 case MEDIA_DEVICE_TRACK_START_FAILURE: |
639 request_info->requestFailedUASpecific("TrackStartError"); | 654 request_info->requestFailedUASpecific("TrackStartError"); |
640 break; | 655 break; |
641 default: | 656 default: |
642 request_info->requestFailed(); | 657 request_info->requestFailed(); |
643 break; | 658 break; |
644 } | 659 } |
645 } | 660 } |
646 | 661 |
647 void MediaStreamImpl::EnumerateDevicesSucceded( | 662 void MediaStreamImpl::EnumerateDevicesSucceded( |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
855 } | 870 } |
856 | 871 |
857 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( | 872 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( |
858 const ResourcesReady& callback) { | 873 const ResourcesReady& callback) { |
859 DCHECK(ready_callback_.is_null()); | 874 DCHECK(ready_callback_.is_null()); |
860 ready_callback_ = callback; | 875 ready_callback_ = callback; |
861 CheckAllTracksStarted(); | 876 CheckAllTracksStarted(); |
862 } | 877 } |
863 | 878 |
864 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( | 879 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( |
865 MediaStreamSource* source, bool success) { | 880 MediaStreamSource* source, |
866 DVLOG(1) << "OnTrackStarted result " << success; | 881 MediaStreamRequestResult result, |
882 const blink::WebString& result_name) { | |
883 DVLOG(1) << "OnTrackStarted result " << result; | |
867 std::vector<MediaStreamSource*>::iterator it = | 884 std::vector<MediaStreamSource*>::iterator it = |
868 std::find(sources_waiting_for_callback_.begin(), | 885 std::find(sources_waiting_for_callback_.begin(), |
869 sources_waiting_for_callback_.end(), | 886 sources_waiting_for_callback_.end(), |
870 source); | 887 source); |
871 DCHECK(it != sources_waiting_for_callback_.end()); | 888 DCHECK(it != sources_waiting_for_callback_.end()); |
872 sources_waiting_for_callback_.erase(it); | 889 sources_waiting_for_callback_.erase(it); |
873 // All tracks must be started successfully. Otherwise the request is a | 890 // All tracks must be started successfully. Otherwise the request is a |
874 // failure. | 891 // failure. |
875 if (!success) | 892 if (result != MEDIA_DEVICE_OK) |
876 request_failed_ = true; | 893 request_failed_ = true; |
877 CheckAllTracksStarted(); | 894 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { |
895 ready_callback_.Run(this, result, result_name); | |
896 } | |
878 } | 897 } |
879 | 898 |
880 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { | 899 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { |
881 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { | 900 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { |
882 ready_callback_.Run( | 901 ready_callback_.Run( |
883 this, | 902 this, |
884 request_failed_ ? MEDIA_DEVICE_TRACK_START_FAILURE : MEDIA_DEVICE_OK); | 903 request_failed_ ? MEDIA_DEVICE_TRACK_START_FAILURE : MEDIA_DEVICE_OK, |
904 ""); | |
885 } | 905 } |
886 } | 906 } |
887 | 907 |
888 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( | 908 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( |
889 const blink::WebMediaStreamSource& source) const { | 909 const blink::WebMediaStreamSource& source) const { |
890 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = | 910 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = |
891 sources_.begin(); | 911 sources_.begin(); |
892 source_it != sources_.end(); ++source_it) { | 912 source_it != sources_.end(); ++source_it) { |
893 if (source_it->id() == source.id()) | 913 if (source_it->id() == source.id()) |
894 return true; | 914 return true; |
895 } | 915 } |
896 return false; | 916 return false; |
897 } | 917 } |
898 | 918 |
899 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource( | 919 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource( |
900 const blink::WebMediaStreamSource& source) { | 920 const blink::WebMediaStreamSource& source) { |
901 for (std::vector<blink::WebMediaStreamSource>::iterator it = | 921 for (std::vector<blink::WebMediaStreamSource>::iterator it = |
902 sources_.begin(); | 922 sources_.begin(); |
903 it != sources_.end(); ++it) { | 923 it != sources_.end(); ++it) { |
904 if (source.id() == it->id()) { | 924 if (source.id() == it->id()) { |
905 sources_.erase(it); | 925 sources_.erase(it); |
906 return; | 926 return; |
907 } | 927 } |
908 } | 928 } |
909 } | 929 } |
910 | 930 |
911 } // namespace content | 931 } // namespace content |
OLD | NEW |