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; |
} |