Index: content/renderer/media/media_stream_impl.cc |
diff --git a/content/renderer/media/media_stream_impl.cc b/content/renderer/media/media_stream_impl.cc |
index b8af5a8c3474221b15d62b412ebd9294d3c7dc91..4303aae2c3e1e7087f97d1f89df54f303d7d79f0 100644 |
--- a/content/renderer/media/media_stream_impl.cc |
+++ b/content/renderer/media/media_stream_impl.cc |
@@ -6,10 +6,12 @@ |
#include <utility> |
+#include "base/command_line.h" |
mcasas
2014/05/27 12:08:23
Needed?
Henrik Grunell
2014/05/27 15:33:54
No, thanks.
|
#include "base/logging.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "content/public/common/content_switches.h" |
mcasas
2014/05/27 12:08:23
Needed?
Henrik Grunell
2014/05/27 15:33:54
Nope. Removed.
|
#include "content/renderer/media/media_stream.h" |
#include "content/renderer/media/media_stream_audio_renderer.h" |
#include "content/renderer/media/media_stream_audio_source.h" |
@@ -27,6 +29,7 @@ |
#include "content/renderer/render_thread_impl.h" |
#include "media/base/audio_hardware_config.h" |
#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/web/WebDocument.h" |
#include "third_party/WebKit/public/web/WebLocalFrame.h" |
@@ -80,6 +83,27 @@ MediaStreamImpl::MediaStreamImpl( |
MediaStreamImpl::~MediaStreamImpl() { |
} |
+// TODO(grunell): Device enumeration should probably be moved to its own class |
+// here or at other places in the code. |
+struct MediaStreamImpl::MediaDevicesRequestInfo { |
+ MediaDevicesRequestInfo(blink::WebMediaDevicesRequest request, |
+ int audio_input_request_id, |
+ int video_input_request_id) |
+ : request(request), |
+ audio_input_request_id(audio_input_request_id), |
+ video_input_request_id(video_input_request_id), |
+ has_audio_input_returned(false), |
+ has_video_input_returned(false) {} |
+ |
+ blink::WebMediaDevicesRequest request; |
+ int audio_input_request_id; |
+ int video_input_request_id; |
+ bool has_audio_input_returned; |
+ bool has_video_input_returned; |
+ StreamDeviceInfoArray audio_input_devices; |
mcasas
2014/05/27 12:08:23
I think this struct should be made a class
since i
Henrik Grunell
2014/05/27 15:33:54
What do you motivate that with, it's not clear to
|
+ StreamDeviceInfoArray video_input_devices; |
+}; |
+ |
void MediaStreamImpl::requestUserMedia( |
const blink::WebUserMediaRequest& user_media_request) { |
// Save histogram data so we can see how much GetUserMedia is used. |
@@ -185,6 +209,49 @@ void MediaStreamImpl::cancelUserMediaRequest( |
} |
} |
+void MediaStreamImpl::requestMediaDevices( |
+ const blink::WebMediaDevicesRequest& media_devices_request) { |
+ // TODO(grunell): UMA stats? |
+ DCHECK(CalledOnValidThread()); |
+ |
+ int audio_input_request_id = g_next_request_id++; |
+ int video_input_request_id = g_next_request_id++; |
+ GURL security_origin = |
+ GURL(media_devices_request.securityOrigin().toString()); |
+ |
+ media_devices_requests_.push_back(new MediaDevicesRequestInfo( |
+ media_devices_request, audio_input_request_id, video_input_request_id)); |
+ |
+ media_stream_dispatcher_->EnumerateDevices( |
+ audio_input_request_id, |
+ AsWeakPtr(), |
+ MEDIA_DEVICE_AUDIO_CAPTURE, |
+ security_origin); |
+ |
+ media_stream_dispatcher_->EnumerateDevices( |
+ video_input_request_id, |
+ AsWeakPtr(), |
+ MEDIA_DEVICE_VIDEO_CAPTURE, |
+ security_origin); |
+} |
+ |
+void MediaStreamImpl::cancelMediaDevicesRequest( |
+ const blink::WebMediaDevicesRequest& media_devices_request) { |
+ DCHECK(CalledOnValidThread()); |
+ MediaDevicesRequestInfo* request = |
+ FindMediaDevicesRequestInfo(media_devices_request); |
+ if (request) { |
mcasas
2014/05/27 12:08:23
if (!request)
return;
Henrik Grunell
2014/05/27 15:33:54
Done.
|
+ // Cancel device enumeration. |
+ media_stream_dispatcher_->StopEnumerateDevices( |
+ request->audio_input_request_id, |
+ AsWeakPtr()); |
+ media_stream_dispatcher_->StopEnumerateDevices( |
+ request->video_input_request_id, |
+ AsWeakPtr()); |
+ DeleteMediaDevicesRequestInfo(request); |
+ } |
+} |
+ |
blink::WebMediaStream MediaStreamImpl::GetMediaStream( |
const GURL& url) { |
return blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url); |
@@ -528,7 +595,61 @@ void MediaStreamImpl::OnDevicesEnumerated( |
const StreamDeviceInfoArray& device_array) { |
DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" |
mcasas
2014/05/27 12:08:23
Nit: fits in one line.
Henrik Grunell
2014/05/27 15:33:54
Done.
|
<< request_id << ")"; |
- NOTIMPLEMENTED(); |
+ |
+ MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); |
+ DCHECK(request); |
+ |
+ if (request_id == request->audio_input_request_id) { |
+ request->has_audio_input_returned = true; |
+ DCHECK(request->audio_input_devices.empty()); |
+ request->audio_input_devices = device_array; |
+ } else { |
+ DCHECK(request_id == request->video_input_request_id); |
+ request->has_video_input_returned = true; |
+ DCHECK(request->video_input_devices.empty()); |
+ request->video_input_devices = device_array; |
+ } |
+ |
+ if (!request->has_audio_input_returned || |
+ !request->has_video_input_returned) { |
+ // Wait for the rest of the devices to complete. |
+ return; |
+ } |
+ |
+ // Both audio and video devices are ready for copying. |
+ // TODO(grunell): Add support for output devices and group id. |
+ blink::WebVector<blink::WebMediaDeviceInfo> |
+ devices(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); |
+ devices[i].initialize(blink::WebString::fromUTF8(device.id), |
+ blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
+ blink::WebString::fromUTF8(device.name), |
+ blink::WebString()); |
+ } |
+ size_t audio_size = 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[audio_size + i].initialize( |
+ blink::WebString::fromUTF8(device.id), |
+ blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, |
+ blink::WebString::fromUTF8(device.name), |
+ blink::WebString()); |
+ } |
+ request->request.requestSucceeded(devices); |
+ |
+ // Cancel device enumeration. |
+ media_stream_dispatcher_->StopEnumerateDevices( |
perkj_chrome
2014/05/27 11:57:23
This is so silly. Can't we just change this now?
Henrik Grunell
2014/05/27 15:33:54
Seems pepper doesn't use the request as notificati
|
+ request->audio_input_request_id, |
+ AsWeakPtr()); |
+ media_stream_dispatcher_->StopEnumerateDevices( |
+ request->video_input_request_id, |
+ AsWeakPtr()); |
+ |
+ DeleteMediaDevicesRequestInfo(request); |
} |
void MediaStreamImpl::OnDeviceOpened( |
@@ -642,6 +763,42 @@ void MediaStreamImpl::DeleteUserMediaRequestInfo( |
NOTREACHED(); |
} |
+MediaStreamImpl::MediaDevicesRequestInfo* |
+MediaStreamImpl::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) { |
+ return (*it); |
+ } |
+ } |
+ return NULL; |
+} |
+ |
+MediaStreamImpl::MediaDevicesRequestInfo* |
+MediaStreamImpl::FindMediaDevicesRequestInfo( |
+ const blink::WebMediaDevicesRequest& request) { |
+ MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
mcasas
2014/05/27 12:08:23
I know this is copy-modified from previous code bu
Henrik Grunell
2014/05/27 15:33:54
It's a ScopedVector, can't use std::find.
|
+ for (; it != media_devices_requests_.end(); ++it) { |
+ if ((*it)->request == request) |
+ return (*it); |
+ } |
+ return NULL; |
+} |
+ |
+void MediaStreamImpl::DeleteMediaDevicesRequestInfo( |
+ MediaDevicesRequestInfo* request) { |
+ MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
+ for (; it != media_devices_requests_.end(); ++it) { |
+ if ((*it) == request) { |
+ media_devices_requests_.erase(it); |
+ return; |
+ } |
+ } |
+ NOTREACHED(); |
+} |
+ |
void MediaStreamImpl::FrameDetached(blink::WebFrame* frame) { |
// Do same thing as FrameWillClose. |
FrameWillClose(frame); |