Chromium Code Reviews| 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 4ed7bd6340178b5f1143f8248c539f591124854c..6276c0d52647ce1073fb58b4ad0af45c2d61cdd9 100644 |
| --- a/content/renderer/media/user_media_client_impl.cc |
| +++ b/content/renderer/media/user_media_client_impl.cc |
| @@ -27,6 +27,7 @@ |
| #include "third_party/WebKit/public/platform/WebMediaConstraints.h" |
| #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h" |
| #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
| +#include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h" |
| #include "third_party/WebKit/public/web/WebDocument.h" |
| #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| @@ -62,7 +63,7 @@ struct UserMediaClientImpl::MediaDevicesRequestInfo { |
| int audio_input_request_id, |
| int video_input_request_id, |
| int audio_output_request_id) |
| - : request(request), |
| + : 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), |
| @@ -70,7 +71,20 @@ struct UserMediaClientImpl::MediaDevicesRequestInfo { |
| has_video_input_returned(false), |
| has_audio_output_returned(false) {} |
| - blink::WebMediaDevicesRequest request; |
| + 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) {} |
| + |
| + blink::WebMediaDevicesRequest media_devices_request; |
| + blink::WebMediaStreamTrackSourcesRequest sources_request; |
| int audio_input_request_id; |
| int video_input_request_id; |
| int audio_output_request_id; |
| @@ -260,6 +274,45 @@ void UserMediaClientImpl::cancelMediaDevicesRequest( |
| CancelAndDeleteMediaDevicesRequest(request); |
| } |
| +void UserMediaClientImpl::requestSources( |
| + const blink::WebMediaStreamTrackSourcesRequest& sources_request) { |
| + // TODO |
|
perkj_chrome
2014/09/10 15:17:39
need name name and fix indentation. Is this intent
Henrik Grunell
2014/09/12 10:58:25
Removed, it's counted in blink.
|
| +// 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++; |
| + |
| + // |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. |
| + GURL security_origin; |
| + if (!sources_request.isNull()) |
| + security_origin = GURL(sources_request.origin().utf8()); |
| + |
| + DVLOG(1) << "UserMediaClientImpl::requestSources(" |
| + << audio_input_request_id |
| + << ", " << video_input_request_id |
| + << ", " << security_origin.spec() << ")"; |
| + |
| + 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); |
| +} |
| + |
| // Callback from MediaStreamDispatcher. |
| // The requested stream have been generated by the MediaStreamDispatcher. |
| void UserMediaClientImpl::OnStreamGenerated( |
| @@ -336,6 +389,96 @@ void UserMediaClientImpl::OnStreamGeneratedForCancelledRequest( |
| } |
| } |
| +void UserMediaClientImpl::FinalizeEnumerateDevices( |
| + MediaDevicesRequestInfo* request) { |
| + // All devices are ready for copying. We use a hashed audio output device id |
| + // as the group id for input and output audio devices. If an input device |
| + // doesn't have an associated output device, we use the input device's own id. |
| + // We don't support group id for video devices, that's left empty. |
| + 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); |
| + std::string group_id = base::UintToString(base::Hash( |
| + !device.matched_output_device_id.empty() ? |
| + device.matched_output_device_id : |
| + device.id)); |
| + devices[i].initialize( |
| + blink::WebString::fromUTF8(device.id), |
| + blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
| + blink::WebString::fromUTF8(device.name), |
| + blink::WebString::fromUTF8(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(base::UintToString(base::Hash(device.id)))); |
| + } |
| + |
| + EnumerateDevicesSucceded(&request->media_devices_request, devices); |
| + CancelAndDeleteMediaDevicesRequest(request); |
|
perkj_chrome
2014/09/10 15:17:39
code duplication. Can you move line 437 and 479 to
Henrik Grunell
2014/09/12 10:58:25
Well, it's not really duplicated. Above sets up a
perkj_chrome
2014/09/12 12:35:33
CancelAndDeleteMediaDevicesRequest is duplicated a
Henrik Grunell
2014/09/12 12:59:31
Done.
|
| +} |
| + |
| +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); |
| + } |
| + 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); |
| + } |
| + |
| + EnumerateSourcesSucceded(&request->sources_request, sources); |
| + CancelAndDeleteMediaDevicesRequest(request); |
| +} |
| + |
| // Callback from MediaStreamDispatcher. |
| // The requested stream failed to be generated. |
| void UserMediaClientImpl::OnStreamGenerationFailed( |
| @@ -537,56 +680,22 @@ void UserMediaClientImpl::OnDevicesEnumerated( |
| } |
| if (!request->has_audio_input_returned || |
| - !request->has_video_input_returned || |
| - !request->has_audio_output_returned) { |
| + !request->has_video_input_returned) { |
| // Wait for the rest of the devices to complete. |
| return; |
| } |
| - // All devices are ready for copying. We use a hashed audio output device id |
| - // as the group id for input and output audio devices. If an input device |
| - // doesn't have an associated output device, we use the input device's own id. |
| - // We don't support group id for video devices, that's left empty. |
| - 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); |
| - std::string group_id = base::UintToString(base::Hash( |
| - !device.matched_output_device_id.empty() ? |
| - device.matched_output_device_id : |
| - device.id)); |
| - devices[i].initialize( |
| - blink::WebString::fromUTF8(device.id), |
| - blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
| - blink::WebString::fromUTF8(device.name), |
| - blink::WebString::fromUTF8(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(base::UintToString(base::Hash(device.id)))); |
| + bool audio_output_devices_requested = request->audio_output_request_id != -1; |
| + |
| + if (audio_output_devices_requested && !request->has_audio_output_returned) { |
| + // Wait for the rest of the audio output devices to complete. |
| + return; |
| } |
| - EnumerateDevicesSucceded(&request->request, devices); |
| - CancelAndDeleteMediaDevicesRequest(request); |
| + if (audio_output_devices_requested) |
|
perkj_chrome
2014/09/10 15:17:39
why not check what type of request this is by look
Henrik Grunell
2014/09/12 10:58:25
Yes, that's better. Done.
|
| + FinalizeEnumerateDevices(request); |
| + else |
| + FinalizeEnumerateSources(request); |
| } |
| void UserMediaClientImpl::OnDeviceOpened( |
| @@ -675,6 +784,12 @@ void UserMediaClientImpl::EnumerateDevicesSucceded( |
| request->requestSucceeded(devices); |
| } |
| +void UserMediaClientImpl::EnumerateSourcesSucceded( |
| + blink::WebMediaStreamTrackSourcesRequest* request, |
| + blink::WebVector<blink::WebSourceInfo>& sources) { |
| + request->requestSucceeded(sources); |
| +} |
| + |
| const blink::WebMediaStreamSource* UserMediaClientImpl::FindLocalSource( |
| const StreamDeviceInfo& device) const { |
| for (LocalStreamSources::const_iterator it = local_sources_.begin(); |
| @@ -767,7 +882,7 @@ UserMediaClientImpl::FindMediaDevicesRequestInfo( |
| const blink::WebMediaDevicesRequest& request) { |
| MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
| for (; it != media_devices_requests_.end(); ++it) { |
| - if ((*it)->request == request) |
| + if ((*it)->media_devices_request == request) |
| return (*it); |
| } |
| return NULL; |