| Index: content/browser/renderer_host/media/media_stream_manager.cc
|
| ===================================================================
|
| --- content/browser/renderer_host/media/media_stream_manager.cc (revision 109718)
|
| +++ 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 {
|
| + request->requester->StreamGenerated(label, request->audio_devices,
|
| + request->video_devices);
|
| + }
|
| }
|
|
|
| void MediaStreamManager::Closed(MediaStreamType stream_type,
|
| @@ -281,7 +355,28 @@
|
| }
|
| 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 {
|
| + device_settings_->AvailableDevices(*it, stream_type, devices);
|
| + }
|
| }
|
| label_list.clear();
|
| enumeration_in_progress_[stream_type] = false;
|
| @@ -336,15 +431,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 +482,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;
|
| }
|
|
|