| 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..047e07ae4fd0fc6c6da6aefd2f79dfe08dadff94 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,26 @@ 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) {}
|
| +
|
| + 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::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 +280,45 @@ void UserMediaClientImpl::cancelMediaDevicesRequest(
|
| CancelAndDeleteMediaDevicesRequest(request);
|
| }
|
|
|
| +void UserMediaClientImpl::requestSources(
|
| + const blink::WebMediaStreamTrackSourcesRequest& sources_request) {
|
| + // We don't call UpdateWebRTCMethodCount() here to track the API count in UMA
|
| + // 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.
|
| + 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 +395,94 @@ 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);
|
| +}
|
| +
|
| +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);
|
| +}
|
| +
|
| // Callback from MediaStreamDispatcher.
|
| // The requested stream failed to be generated.
|
| void UserMediaClientImpl::OnStreamGenerationFailed(
|
| @@ -538,54 +685,16 @@ void UserMediaClientImpl::OnDevicesEnumerated(
|
|
|
| if (!request->has_audio_input_returned ||
|
| !request->has_video_input_returned ||
|
| - !request->has_audio_output_returned) {
|
| + (!request->IsSourcesRequest() && !request->has_audio_output_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))));
|
| - }
|
| + if (request->IsSourcesRequest())
|
| + FinalizeEnumerateSources(request);
|
| + else
|
| + FinalizeEnumerateDevices(request);
|
|
|
| - EnumerateDevicesSucceded(&request->request, devices);
|
| CancelAndDeleteMediaDevicesRequest(request);
|
| }
|
|
|
| @@ -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;
|
|
|