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

Unified Diff: content/browser/renderer_host/media/media_stream_manager.cc

Issue 8480028: support video device enumeration from renderer process. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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/browser/renderer_host/media/media_stream_manager.cc
===================================================================
--- content/browser/renderer_host/media/media_stream_manager.cc (revision 111389)
+++ content/browser/renderer_host/media/media_stream_manager.cc (working copy)
@@ -50,32 +50,44 @@
}
struct MediaStreamManager::DeviceRequest {
+ enum RequestState {
+ kNotRequested = 0,
+ kRequested,
+ kOpening,
+ kDone,
+ kError
+ };
+
+ enum RequestType {
+ kGenerateStream = 0,
+ kEnumerateVideoDevices,
+ kOpenVideoDevice
+ };
+
DeviceRequest()
: requester(NULL),
- state(kNumMediaStreamTypes, kNotRequested) {
+ state(kNumMediaStreamTypes, kNotRequested),
+ type(kGenerateStream) {
options.audio = false;
options.video_option = StreamOptions::kNoCamera;
}
+
DeviceRequest(MediaStreamRequester* requester,
const StreamOptions& request_options)
: requester(requester),
options(request_options),
- state(kNumMediaStreamTypes, kNotRequested) {
+ state(kNumMediaStreamTypes, kNotRequested),
+ type(kGenerateStream) {
DCHECK(requester);
}
+
~DeviceRequest() {}
- enum RequestState {
- kNotRequested = 0,
- kRequested,
- kOpening,
- kDone,
- kError
- };
-
MediaStreamRequester* requester;
StreamOptions options;
std::vector<RequestState> state;
+ RequestType type;
+ std::string requested_device_id;
StreamDeviceInfoArray audio_devices;
StreamDeviceInfoArray video_devices;
};
@@ -119,34 +131,8 @@
// Create a new request based on options.
DeviceRequest new_request = DeviceRequest(requester, options);
- if (Requested(new_request.options, kAudioCapture)) {
- new_request.state[kAudioCapture] = DeviceRequest::kRequested;
- }
- if (Requested(new_request.options, kVideoCapture)) {
- new_request.state[kVideoCapture] = DeviceRequest::kRequested;
- }
-
- // Create a label for this request and verify it is unique.
- std::string request_label;
- do {
- request_label = RandomLabel();
- } while (requests_.find(request_label) != requests_.end());
-
- requests_.insert(std::make_pair(request_label, new_request));
-
- // Get user confirmation to use capture devices.
- // Need to make an asynchronous call to make sure the |requester| gets the
- // |label| before it would receive any event.
- BrowserThread::PostTask(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage,
- base::Unretained(device_settings_.get()),
- request_label, render_process_id,
- render_view_id, options,
- security_origin));
-
- (*label) = request_label;
+ StartEnumeration(&new_request, render_process_id, render_view_id,
+ security_origin, label);
}
void MediaStreamManager::CancelRequests(MediaStreamRequester* requester) {
@@ -202,6 +188,89 @@
}
}
+void MediaStreamManager::EnumerateVideoDevices(
+ MediaStreamRequester* requester,
+ int render_process_id,
+ int render_view_id,
+ const std::string& security_origin,
+ std::string* label) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ // Create a new request.
+ StreamOptions options(false, StreamOptions::kFacingUser);
+ DeviceRequest new_request = DeviceRequest(requester, options);
+ new_request.type = DeviceRequest::kEnumerateVideoDevices;
+
+ StartEnumeration(&new_request, render_process_id, render_view_id,
+ security_origin, label);
+}
+
+void MediaStreamManager::OpenVideoDevice(
+ MediaStreamRequester* requester,
+ int render_process_id,
+ int render_view_id,
+ const std::string& device_id,
+ const std::string& security_origin,
+ std::string* label) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ // Create a new request.
+ StreamOptions options(false, StreamOptions::kFacingUser);
+ DeviceRequest new_request = DeviceRequest(requester, options);
+ new_request.type = DeviceRequest::kOpenVideoDevice;
+ new_request.requested_device_id = device_id;
+
+ StartEnumeration(&new_request, render_process_id, render_view_id,
+ security_origin, label);
+}
+
+void MediaStreamManager::StartEnumeration(
+ DeviceRequest* new_request,
+ int render_process_id,
+ int render_view_id,
+ const std::string& security_origin,
+ std::string* label) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ if (Requested(new_request->options, kAudioCapture)) {
+ new_request->state[kAudioCapture] = DeviceRequest::kRequested;
+ if (!enumeration_in_progress_[kAudioCapture]) {
+ enumeration_in_progress_[kAudioCapture] = true;
+ GetDeviceManager(kAudioCapture)->EnumerateDevices();
+ }
+ }
+ if (Requested(new_request->options, kVideoCapture)) {
+ new_request->state[kVideoCapture] = DeviceRequest::kRequested;
+ if (!enumeration_in_progress_[kVideoCapture]) {
+ enumeration_in_progress_[kVideoCapture] = true;
+ GetDeviceManager(kVideoCapture)->EnumerateDevices();
+ }
+ }
+
+ // Create a label for this request and verify it is unique.
+ std::string request_label;
+ do {
+ request_label = RandomLabel();
+ } while (requests_.find(request_label) != requests_.end());
+
+ requests_.insert(std::make_pair(request_label, *new_request));
+
+ // Get user confirmation to use capture devices.
+ // Need to make an asynchronous call to make sure the |requester| gets the
+ // |label| before it would receive any event.
+ if (new_request->type == DeviceRequest::kGenerateStream) {
+ BrowserThread::PostTask(BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage,
+ base::Unretained(device_settings_.get()),
+ request_label, render_process_id,
+ render_view_id, new_request->options,
+ security_origin));
+ }
+
+ (*label) = request_label;
+}
+
void MediaStreamManager::Opened(MediaStreamType stream_type,
int capture_session_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
@@ -254,8 +323,13 @@
return;
}
- request->requester->StreamGenerated(label, request->audio_devices,
- request->video_devices);
+ if (request->type == DeviceRequest::kOpenVideoDevice) {
+ DCHECK_NE(request->options.video_option, StreamOptions::kNoCamera);
+ request->requester->VideoDeviceOpened(label, request->video_devices[0]);
+ } else {
mflodman_chromium_OOO 2011/11/29 02:30:56 The else case will include DeviceRequest::kEnumera
wjia(left Chromium) 2011/11/30 00:14:23 Done.
+ request->requester->StreamGenerated(label, request->audio_devices,
+ request->video_devices);
+ }
}
void MediaStreamManager::Closed(MediaStreamType stream_type,
@@ -281,7 +355,32 @@
}
for (std::list<std::string>::iterator it = label_list.begin();
it != label_list.end(); ++it) {
- device_settings_->AvailableDevices(*it, stream_type, devices);
+ DeviceRequest& request = requests_[*it];
+ if (request.type == DeviceRequest::kEnumerateVideoDevices) {
+ DCHECK_NE(request.options.video_option, StreamOptions::kNoCamera);
+ request.requester->VideoDevicesEnumerated(*it, devices);
+ requests_.erase(*it);
+ } else if (request.type == DeviceRequest::kOpenVideoDevice) {
+ DCHECK_NE(request.options.video_option, StreamOptions::kNoCamera);
+ for (StreamDeviceInfoArray::const_iterator device_it = devices.begin();
+ device_it != devices.end(); device_it++) {
+ if (request.requested_device_id == device_it->device_id) {
+ StreamDeviceInfo device = *device_it;
+ device.in_use = false;
+ device.session_id =
+ GetDeviceManager(device_it->stream_type)->Open(device);
+ request.state[device_it->stream_type] = DeviceRequest::kOpening;
+ request.video_devices.push_back(device);
+ break;
+ }
+ }
+ } else {
+ BrowserThread::PostTask(BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&MediaStreamDeviceSettings::AvailableDevices,
+ base::Unretained(device_settings_.get()),
+ *it, stream_type, devices));
+ }
}
label_list.clear();
enumeration_in_progress_[stream_type] = false;
@@ -336,15 +435,6 @@
}
}
-void MediaStreamManager::GetDevices(const std::string& label,
- MediaStreamType stream_type) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (!enumeration_in_progress_[stream_type]) {
- enumeration_in_progress_[stream_type] = true;
- GetDeviceManager(stream_type)->EnumerateDevices();
- }
-}
-
void MediaStreamManager::DevicesAccepted(const std::string& label,
const StreamDeviceInfoArray& devices) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
@@ -396,7 +486,15 @@
// Erase this request and report an error.
DeviceRequests::iterator it = requests_.find(label);
if (it != requests_.end()) {
- it->second.requester->StreamGenerationFailed(label);
+ if (it->second.type == DeviceRequest::kEnumerateVideoDevices) {
+ DCHECK_NE(it->second.options.video_option, StreamOptions::kNoCamera);
+ it->second.requester->VideoDevicesEnumerationFailed(label);
+ } else if (it->second.type == DeviceRequest::kOpenVideoDevice) {
+ DCHECK_NE(it->second.options.video_option, StreamOptions::kNoCamera);
+ it->second.requester->VideoDeviceOpenFailed(label);
+ } else {
+ it->second.requester->StreamGenerationFailed(label);
+ }
requests_.erase(it);
return;
}

Powered by Google App Engine
This is Rietveld 408576698