Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(917)

Unified Diff: content/renderer/media/user_media_client_impl.cc

Issue 562643003: Implement WebUserMediaClient::requestSources (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code review. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
« no previous file with comments | « content/renderer/media/user_media_client_impl.h ('k') | content/renderer/media/user_media_client_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698