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

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

Issue 287383002: Implement getMediaDevices. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Code review fix, a minor test refactoring. And rebase, sorry. Created 6 years, 7 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/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);

Powered by Google App Engine
This is Rietveld 408576698