Chromium Code Reviews| 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); |