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 e1bb11196e0a3830eac72eff46bf3c17cf0a2cfe..8fccec7cce1704a084f31e23494b89508ce1dc72 100644 |
--- a/content/renderer/media/media_stream_impl.cc |
+++ b/content/renderer/media/media_stream_impl.cc |
@@ -22,6 +22,7 @@ |
#include "content/renderer/media/webrtc_uma_histograms.h" |
#include "content/renderer/render_thread_impl.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" |
@@ -53,6 +54,25 @@ static int g_next_request_id = 0; |
} // namespace |
+struct MediaStreamImpl::MediaDevicesRequestInfo { |
+ MediaDevicesRequestInfo(blink::WebMediaDevicesRequest request, |
no longer working on chromium
2014/06/02 11:57:42
const blink::WebMediaDevicesRequest& ?
Henrik Grunell
2014/06/03 07:52:27
Done.
|
+ 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; |
no longer working on chromium
2014/06/02 11:57:42
nit, const, if the request won't be changed afterw
Henrik Grunell
2014/06/03 07:52:27
Can't be const, we're making a call on it later wh
|
+ int audio_input_request_id; |
+ int video_input_request_id; |
+ bool has_audio_input_returned; |
+ bool has_video_input_returned; |
+ StreamDeviceInfoArray audio_input_devices; |
+ StreamDeviceInfoArray video_input_devices; |
+}; |
+ |
MediaStreamImpl::MediaStreamImpl( |
RenderView* render_view, |
MediaStreamDispatcher* media_stream_dispatcher, |
@@ -170,6 +190,58 @@ void MediaStreamImpl::cancelUserMediaRequest( |
} |
} |
+void MediaStreamImpl::requestMediaDevices( |
+ const blink::WebMediaDevicesRequest& media_devices_request) { |
+ // TODO(grunell): UMA stats? |
no longer working on chromium
2014/06/02 11:57:42
are you going to address this in this CL?
Henrik Grunell
2014/06/03 07:52:27
Yes, done.
|
+ DCHECK(CalledOnValidThread()); |
+ |
+ int audio_input_request_id = g_next_request_id++; |
no longer working on chromium
2014/06/02 11:57:42
what happen if media_devices_request contains only
Henrik Grunell
2014/06/03 07:52:27
getMediaDevices() always requests enumeration of a
|
+ int video_input_request_id = g_next_request_id++; |
+ |
+ // |media_devices_request| can't be mocked. So in order to test at all we |
no longer working on chromium
2014/06/02 11:57:42
confusing comment, please fix it.
Henrik Grunell
2014/06/03 07:52:27
Done.
|
+ // check if it isNull. |
+ GURL security_origin; |
+ if (!media_devices_request.isNull()) |
no longer working on chromium
2014/06/02 11:57:42
are you saying that media_devices_request.isNull()
Henrik Grunell
2014/06/03 07:52:27
Yes.
|
+ security_origin = GURL(media_devices_request.securityOrigin().toString()); |
+ |
+ DVLOG(1) << "MediaStreamImpl::requestMediaDevices(" << audio_input_request_id |
+ << ", " << video_input_request_id << ", " |
+ << security_origin.spec() << ")"; |
+ |
+ 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( |
no longer working on chromium
2014/06/02 11:57:42
same question here, what happen if media_devices_r
Henrik Grunell
2014/06/03 07:52:27
Same answer. :)
|
+ 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) |
+ return; |
+ |
+ // 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); |
+} |
+ |
// Callback from MediaStreamDispatcher. |
// The requested stream have been generated by the MediaStreamDispatcher. |
void MediaStreamImpl::OnStreamGenerated( |
@@ -418,9 +490,63 @@ void MediaStreamImpl::OnCreateNativeTracksCompleted( |
void MediaStreamImpl::OnDevicesEnumerated( |
int request_id, |
const StreamDeviceInfoArray& device_array) { |
- DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" |
- << request_id << ")"; |
- NOTIMPLEMENTED(); |
+ DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; |
+ |
+ 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()); |
+ } |
+ |
+ EnumerateDevicesSucceded(&request->request, devices); |
+ |
+ // 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); |
} |
void MediaStreamImpl::OnDeviceOpened( |
@@ -485,6 +611,12 @@ void MediaStreamImpl::GetUserMediaRequestFailed( |
} |
} |
+void MediaStreamImpl::EnumerateDevicesSucceded( |
+ blink::WebMediaDevicesRequest* request, |
+ blink::WebVector<blink::WebMediaDeviceInfo>& devices) { |
+ request->requestSucceeded(devices); |
+} |
+ |
const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( |
const StreamDeviceInfo& device) const { |
for (LocalStreamSources::const_iterator it = local_sources_.begin(); |
@@ -534,6 +666,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(); |
+ 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); |