Index: content/renderer/media/user_media_client_impl.cc |
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc |
index 82e5bf0e3b009ec80c02ea501a1035847f2c0919..3262a4cde71a68df1c02b9035c2c1c78033e3b81 100644 |
--- a/content/renderer/media/user_media_client_impl.cc |
+++ b/content/renderer/media/user_media_client_impl.cc |
@@ -18,6 +18,7 @@ |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/threading/thread_task_runner_handle.h" |
+#include "build/build_config.h" |
#include "content/public/renderer/render_frame.h" |
#include "content/renderer/media/local_media_stream_audio_source.h" |
#include "content/renderer/media/media_stream.h" |
@@ -123,53 +124,36 @@ bool IsSameSource(const blink::WebMediaStreamSource& source, |
return IsSameDevice(device, other_device); |
} |
-static int g_next_request_id = 0; |
- |
-} // namespace |
+blink::WebMediaDeviceInfo::MediaDeviceKind ToMediaDeviceKind( |
+ MediaDeviceType type) { |
+ switch (type) { |
+ case MEDIA_DEVICE_TYPE_AUDIO_INPUT: |
+ return blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput; |
+ case MEDIA_DEVICE_TYPE_VIDEO_INPUT: |
+ return blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput; |
+ case MEDIA_DEVICE_TYPE_AUDIO_OUTPUT: |
+ return blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput; |
+ default: |
+ NOTREACHED(); |
+ return blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput; |
+ } |
+} |
-struct UserMediaClientImpl::MediaDevicesRequestInfo { |
- MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request, |
- int audio_input_request_id, |
- int video_input_request_id, |
- int audio_output_request_id) |
- : media_devices_request(request), |
- audio_input_request_id(audio_input_request_id), |
- video_input_request_id(video_input_request_id), |
- audio_output_request_id(audio_output_request_id), |
- has_audio_input_returned(false), |
- has_video_input_returned(false), |
- has_audio_output_returned(false) {} |
- |
- MediaDevicesRequestInfo( |
- const blink::WebMediaStreamTrackSourcesRequest& request, |
- int audio_input_request_id, |
- int video_input_request_id) |
- : sources_request(request), |
- audio_input_request_id(audio_input_request_id), |
- video_input_request_id(video_input_request_id), |
- audio_output_request_id(-1), |
- has_audio_input_returned(false), |
- has_video_input_returned(false), |
- has_audio_output_returned(false) {} |
- |
- bool IsSourcesRequest() { |
- // We can't check isNull() on |media_devices_request| and |sources_request|, |
- // because in unit tests they will always be null. |
- return audio_output_request_id == -1; |
+blink::WebSourceInfo::VideoFacingMode ToVideoFacingMode( |
+ const std::string& device_label) { |
+#if defined(OS_ANDROID) |
+ if (device_label.find("front") != std::string::npos) { |
+ return blink::WebSourceInfo::VideoFacingModeUser; |
+ } else if (device_label.find("back") != std::string::npos) { |
+ return blink::WebSourceInfo::VideoFacingModeEnvironment; |
} |
+#endif |
+ return blink::WebSourceInfo::VideoFacingModeNone; |
+} |
- blink::WebMediaDevicesRequest media_devices_request; |
- blink::WebMediaStreamTrackSourcesRequest sources_request; |
- int audio_input_request_id; |
- int video_input_request_id; |
- int audio_output_request_id; |
- bool has_audio_input_returned; |
- bool has_video_input_returned; |
- bool has_audio_output_returned; |
- StreamDeviceInfoArray audio_input_devices; |
- StreamDeviceInfoArray video_input_devices; |
- StreamDeviceInfoArray audio_output_devices; |
-}; |
+static int g_next_request_id = 0; |
+ |
+} // namespace |
UserMediaClientImpl::UserMediaClientImpl( |
RenderFrame* render_frame, |
@@ -290,10 +274,6 @@ void UserMediaClientImpl::requestMediaDevices( |
UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES); |
DCHECK(CalledOnValidThread()); |
- int audio_input_request_id = g_next_request_id++; |
- int video_input_request_id = g_next_request_id++; |
- int audio_output_request_id = g_next_request_id++; |
- |
// |media_devices_request| can't be mocked, so in tests it will be empty (the |
// underlying pointer is null). In order to use this function in a test we |
// need to check if it isNull. |
@@ -301,33 +281,11 @@ void UserMediaClientImpl::requestMediaDevices( |
if (!media_devices_request.isNull()) |
security_origin = media_devices_request.getSecurityOrigin(); |
- DVLOG(1) << "UserMediaClientImpl::requestMediaDevices(" |
- << audio_input_request_id << ", " << video_input_request_id << ", " |
- << audio_output_request_id << ", " << security_origin << ")"; |
- |
- media_devices_requests_.push_back(new MediaDevicesRequestInfo( |
- media_devices_request, |
- audio_input_request_id, |
- video_input_request_id, |
- audio_output_request_id)); |
- |
- media_stream_dispatcher_->EnumerateDevices( |
- audio_input_request_id, |
- weak_factory_.GetWeakPtr(), |
- MEDIA_DEVICE_AUDIO_CAPTURE, |
- security_origin); |
- |
- media_stream_dispatcher_->EnumerateDevices( |
- video_input_request_id, |
- weak_factory_.GetWeakPtr(), |
- MEDIA_DEVICE_VIDEO_CAPTURE, |
- security_origin); |
- |
- media_stream_dispatcher_->EnumerateDevices( |
- audio_output_request_id, |
- weak_factory_.GetWeakPtr(), |
- MEDIA_DEVICE_AUDIO_OUTPUT, |
- security_origin); |
+ GetMediaDevicesDispatcher()->EnumerateDevices( |
+ true /* audio input */, true /* video input */, true /* audio output */, |
+ security_origin, |
+ base::Bind(&UserMediaClientImpl::FinalizeEnumerateDevices, |
+ weak_factory_.GetWeakPtr(), media_devices_request)); |
} |
void UserMediaClientImpl::requestSources( |
@@ -336,9 +294,6 @@ void UserMediaClientImpl::requestSources( |
// stats. This is instead counted in MediaStreamTrack::getSources in blink. |
DCHECK(CalledOnValidThread()); |
- int audio_input_request_id = g_next_request_id++; |
- int video_input_request_id = g_next_request_id++; |
- |
// |sources_request| can't be mocked, so in tests it will be empty (the |
// underlying pointer is null). In order to use this function in a test we |
// need to check if it isNull. |
@@ -346,25 +301,10 @@ void UserMediaClientImpl::requestSources( |
if (!sources_request.isNull()) |
security_origin = sources_request.origin(); |
- DVLOG(1) << "UserMediaClientImpl::requestSources(" << audio_input_request_id |
- << ", " << video_input_request_id << ", " << security_origin << ")"; |
- |
- media_devices_requests_.push_back(new MediaDevicesRequestInfo( |
- sources_request, |
- audio_input_request_id, |
- video_input_request_id)); |
- |
- media_stream_dispatcher_->EnumerateDevices( |
- audio_input_request_id, |
- weak_factory_.GetWeakPtr(), |
- MEDIA_DEVICE_AUDIO_CAPTURE, |
- security_origin); |
- |
- media_stream_dispatcher_->EnumerateDevices( |
- video_input_request_id, |
- weak_factory_.GetWeakPtr(), |
- MEDIA_DEVICE_VIDEO_CAPTURE, |
- security_origin); |
+ GetMediaDevicesDispatcher()->EnumerateDevices( |
+ true /* audio input */, true /* video input */, false /* audio output */, |
+ security_origin, base::Bind(&UserMediaClientImpl::FinalizeGetSources, |
+ weak_factory_.GetWeakPtr(), sources_request)); |
} |
void UserMediaClientImpl::setMediaDeviceChangeObserver( |
@@ -456,83 +396,55 @@ void UserMediaClientImpl::OnStreamGeneratedForCancelledRequest( |
} |
void UserMediaClientImpl::FinalizeEnumerateDevices( |
- MediaDevicesRequestInfo* request) { |
- blink::WebVector<blink::WebMediaDeviceInfo> |
- devices(request->audio_input_devices.size() + |
- request->video_input_devices.size() + |
- request->audio_output_devices.size()); |
- for (size_t i = 0; i < request->audio_input_devices.size(); ++i) { |
- const MediaStreamDevice& device = request->audio_input_devices[i].device; |
- DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE); |
- |
- devices[i].initialize(blink::WebString::fromUTF8(device.id), |
- blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
- blink::WebString::fromUTF8(device.name), |
- blink::WebString::fromUTF8(device.group_id)); |
- } |
- size_t offset = request->audio_input_devices.size(); |
- for (size_t i = 0; i < request->video_input_devices.size(); ++i) { |
- const MediaStreamDevice& device = request->video_input_devices[i].device; |
- DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE); |
- devices[offset + i].initialize( |
- blink::WebString::fromUTF8(device.id), |
- blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, |
- blink::WebString::fromUTF8(device.name), |
- blink::WebString()); |
- } |
- offset += request->video_input_devices.size(); |
- for (size_t i = 0; i < request->audio_output_devices.size(); ++i) { |
- const MediaStreamDevice& device = request->audio_output_devices[i].device; |
- DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_OUTPUT); |
- devices[offset + i].initialize( |
- blink::WebString::fromUTF8(device.id), |
- blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, |
- blink::WebString::fromUTF8(device.name), |
- blink::WebString::fromUTF8(device.group_id)); |
+ blink::WebMediaDevicesRequest request, |
+ const EnumerationResult& result) { |
+ DCHECK_EQ(static_cast<size_t>(NUM_MEDIA_DEVICE_TYPES), result.size()); |
+ |
+ blink::WebVector<blink::WebMediaDeviceInfo> devices( |
+ result[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size() + |
+ result[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size() + |
+ result[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].size()); |
+ size_t index = 0; |
+ for (size_t i = 0; i < NUM_MEDIA_DEVICE_TYPES; ++i) { |
+ blink::WebMediaDeviceInfo::MediaDeviceKind device_kind = |
+ ToMediaDeviceKind(static_cast<MediaDeviceType>(i)); |
+ for (const auto& device_info : result[i]) { |
+ devices[index++].initialize( |
+ blink::WebString::fromUTF8(device_info.device_id), device_kind, |
+ blink::WebString::fromUTF8(device_info.label), |
+ blink::WebString::fromUTF8(device_info.group_id)); |
+ } |
} |
- EnumerateDevicesSucceded(&request->media_devices_request, devices); |
+ EnumerateDevicesSucceded(&request, devices); |
} |
-void UserMediaClientImpl::FinalizeEnumerateSources( |
- MediaDevicesRequestInfo* request) { |
- blink::WebVector<blink::WebSourceInfo> |
- sources(request->audio_input_devices.size() + |
- request->video_input_devices.size()); |
- for (size_t i = 0; i < request->audio_input_devices.size(); ++i) { |
- const MediaStreamDevice& device = request->audio_input_devices[i].device; |
- DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE); |
- std::string group_id = base::UintToString(base::Hash( |
- !device.matched_output_device_id.empty() ? |
- device.matched_output_device_id : |
- device.id)); |
- sources[i].initialize(blink::WebString::fromUTF8(device.id), |
- blink::WebSourceInfo::SourceKindAudio, |
- blink::WebString::fromUTF8(device.name), |
- blink::WebSourceInfo::VideoFacingModeNone); |
+void UserMediaClientImpl::FinalizeGetSources( |
+ blink::WebMediaStreamTrackSourcesRequest request, |
+ const EnumerationResult& result) { |
+ DCHECK_EQ(static_cast<size_t>(NUM_MEDIA_DEVICE_TYPES), result.size()); |
+ |
+ blink::WebVector<blink::WebSourceInfo> sources( |
+ result[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size() + |
+ result[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size()); |
+ size_t index = 0; |
+ for (const auto& device_info : result[MEDIA_DEVICE_TYPE_AUDIO_INPUT]) { |
+ sources[index++].initialize( |
+ blink::WebString::fromUTF8(device_info.device_id), |
+ blink::WebSourceInfo::SourceKindAudio, |
+ blink::WebString::fromUTF8(device_info.label), |
+ blink::WebSourceInfo::VideoFacingModeNone); |
} |
- size_t offset = request->audio_input_devices.size(); |
- for (size_t i = 0; i < request->video_input_devices.size(); ++i) { |
- const MediaStreamDevice& device = request->video_input_devices[i].device; |
- DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE); |
- blink::WebSourceInfo::VideoFacingMode video_facing; |
- switch (device.video_facing) { |
- case MEDIA_VIDEO_FACING_USER: |
- video_facing = blink::WebSourceInfo::VideoFacingModeUser; |
- break; |
- case MEDIA_VIDEO_FACING_ENVIRONMENT: |
- video_facing = blink::WebSourceInfo::VideoFacingModeEnvironment; |
- break; |
- default: |
- video_facing = blink::WebSourceInfo::VideoFacingModeNone; |
- } |
- sources[offset + i].initialize(blink::WebString::fromUTF8(device.id), |
- blink::WebSourceInfo::SourceKindVideo, |
- blink::WebString::fromUTF8(device.name), |
- video_facing); |
+ |
+ for (const auto& device_info : result[MEDIA_DEVICE_TYPE_VIDEO_INPUT]) { |
+ sources[index++].initialize( |
+ blink::WebString::fromUTF8(device_info.device_id), |
+ blink::WebSourceInfo::SourceKindVideo, |
+ blink::WebString::fromUTF8(device_info.label), |
+ ToVideoFacingMode(device_info.label)); |
} |
- EnumerateSourcesSucceded(&request->sources_request, sources); |
+ EnumerateSourcesSucceded(&request, sources); |
} |
// Callback from MediaStreamDispatcher. |
@@ -742,37 +654,7 @@ void UserMediaClientImpl::OnCreateNativeTracksCompleted( |
void UserMediaClientImpl::OnDevicesEnumerated( |
int request_id, |
const StreamDeviceInfoArray& device_array) { |
- DVLOG(1) << "UserMediaClientImpl::OnDevicesEnumerated(" << request_id << ")"; |
- |
- MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); |
- if (!request) |
- return; |
- |
- if (request_id == request->audio_input_request_id) { |
- request->has_audio_input_returned = true; |
- request->audio_input_devices = device_array; |
- } else if (request_id == request->video_input_request_id) { |
- request->has_video_input_returned = true; |
- request->video_input_devices = device_array; |
- } else { |
- DCHECK_EQ(request->audio_output_request_id, request_id); |
- request->has_audio_output_returned = true; |
- request->audio_output_devices = device_array; |
- } |
- |
- if (!request->has_audio_input_returned || |
- !request->has_video_input_returned || |
- (!request->IsSourcesRequest() && !request->has_audio_output_returned)) { |
- // Wait for the rest of the devices to complete. |
- return; |
- } |
- |
- if (request->IsSourcesRequest()) |
- FinalizeEnumerateSources(request); |
- else |
- FinalizeEnumerateDevices(request); |
- |
- CancelAndDeleteMediaDevicesRequest(request); |
+ NOTREACHED(); |
} |
void UserMediaClientImpl::OnDeviceOpened( |
@@ -983,51 +865,6 @@ void UserMediaClientImpl::DeleteAllUserMediaRequests() { |
} |
} |
-UserMediaClientImpl::MediaDevicesRequestInfo* |
-UserMediaClientImpl::FindMediaDevicesRequestInfo( |
- int request_id) { |
- MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
- for (; it != media_devices_requests_.end(); ++it) { |
- if ((*it)->audio_input_request_id == request_id || |
- (*it)->video_input_request_id == request_id || |
- (*it)->audio_output_request_id == request_id) { |
- return (*it); |
- } |
- } |
- return NULL; |
-} |
- |
-UserMediaClientImpl::MediaDevicesRequestInfo* |
-UserMediaClientImpl::FindMediaDevicesRequestInfo( |
- const blink::WebMediaDevicesRequest& request) { |
- MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
- for (; it != media_devices_requests_.end(); ++it) { |
- if ((*it)->media_devices_request == request) |
- return (*it); |
- } |
- return NULL; |
-} |
- |
-void UserMediaClientImpl::CancelAndDeleteMediaDevicesRequest( |
- MediaDevicesRequestInfo* request) { |
- MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
- for (; it != media_devices_requests_.end(); ++it) { |
- if ((*it) == request) { |
- // Cancel device enumeration. |
- media_stream_dispatcher_->StopEnumerateDevices( |
- request->audio_input_request_id, weak_factory_.GetWeakPtr()); |
- media_stream_dispatcher_->StopEnumerateDevices( |
- request->video_input_request_id, weak_factory_.GetWeakPtr()); |
- media_stream_dispatcher_->StopEnumerateDevices( |
- request->audio_output_request_id, weak_factory_.GetWeakPtr()); |
- |
- media_devices_requests_.erase(it); |
- return; |
- } |
- } |
- NOTREACHED(); |
-} |
- |
void UserMediaClientImpl::WillCommitProvisionalLoad() { |
// Cancel all outstanding UserMediaRequests. |
DeleteAllUserMediaRequests(); |
@@ -1040,6 +877,11 @@ void UserMediaClientImpl::WillCommitProvisionalLoad() { |
} |
} |
+void UserMediaClientImpl::SetMediaDevicesDispatcherForTesting( |
+ ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher) { |
+ media_devices_dispatcher_ = std::move(media_devices_dispatcher); |
+} |
+ |
void UserMediaClientImpl::OnLocalSourceStopped( |
const blink::WebMediaStreamSource& source) { |
DCHECK(CalledOnValidThread()); |
@@ -1068,6 +910,16 @@ void UserMediaClientImpl::StopLocalSource( |
source_impl->StopSource(); |
} |
+const ::mojom::MediaDevicesDispatcherHostPtr& |
+UserMediaClientImpl::GetMediaDevicesDispatcher() { |
+ if (!media_devices_dispatcher_) { |
+ render_frame()->GetRemoteInterfaces()->GetInterface( |
+ mojo::GetProxy(&media_devices_dispatcher_)); |
+ } |
+ |
+ return media_devices_dispatcher_; |
+} |
+ |
UserMediaClientImpl::UserMediaRequestInfo::UserMediaRequestInfo( |
int request_id, |
const blink::WebUserMediaRequest& request, |