| Index: content/browser/renderer_host/media/video_capture_manager.cc
|
| diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc
|
| index 4e104b4cbcd1ac3ec29ca0e70adada1181d3fc38..cbfdecf584521e7c9ce7071b8de31bcdfe3b14d8 100644
|
| --- a/content/browser/renderer_host/media/video_capture_manager.cc
|
| +++ b/content/browser/renderer_host/media/video_capture_manager.cc
|
| @@ -7,10 +7,12 @@
|
| #include <set>
|
|
|
| #include "base/bind.h"
|
| +#include "base/logging.h"
|
| #include "base/stl_util.h"
|
| #include "content/browser/renderer_host/media/video_capture_controller.h"
|
| #include "content/browser/renderer_host/media/video_capture_controller_event_handler.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/common/media_stream_request.h"
|
| #include "media/video/capture/fake_video_capture_device.h"
|
| #include "media/video/capture/video_capture_device.h"
|
|
|
| @@ -116,7 +118,10 @@ void VideoCaptureManager::Stop(
|
|
|
| void VideoCaptureManager::Error(
|
| const media::VideoCaptureSessionId& capture_session_id) {
|
| - PostOnError(capture_session_id, kDeviceNotAvailable);
|
| + device_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&VideoCaptureManager::PostOnError, this, capture_session_id,
|
| + kDeviceNotAvailable));
|
| }
|
|
|
| void VideoCaptureManager::UseFakeDevice() {
|
| @@ -133,8 +138,9 @@ void VideoCaptureManager::OnEnumerateDevices() {
|
| for (media::VideoCaptureDevice::Names::iterator it =
|
| device_names.begin(); it != device_names.end(); ++it) {
|
| bool opened = DeviceOpened(*it);
|
| + // NOTE: Only support enumeration of the MEDIA_DEVICE_VIDEO_CAPTURE type.
|
| devices.push_back(StreamDeviceInfo(
|
| - content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE, it->device_name,
|
| + content::MEDIA_DEVICE_VIDEO_CAPTURE, it->device_name,
|
| it->unique_id, opened));
|
| }
|
|
|
| @@ -151,8 +157,10 @@ void VideoCaptureManager::OnOpen(int capture_session_id,
|
| // use that opened device.
|
| media::VideoCaptureDevice* video_capture_device = GetOpenedDevice(device);
|
| if (video_capture_device) {
|
| - devices_[capture_session_id] = video_capture_device;
|
| - PostOnOpened(capture_session_id);
|
| + DeviceEntry& new_entry = devices_[capture_session_id];
|
| + new_entry.stream_type = device.stream_type;
|
| + new_entry.capture_device = video_capture_device;
|
| + PostOnOpened(device.stream_type, capture_session_id);
|
| return;
|
| }
|
|
|
| @@ -161,53 +169,70 @@ void VideoCaptureManager::OnOpen(int capture_session_id,
|
| vc_device_name.device_name = device.name;
|
| vc_device_name.unique_id = device.device_id;
|
|
|
| - if (!use_fake_device_) {
|
| - video_capture_device = media::VideoCaptureDevice::Create(vc_device_name);
|
| - } else {
|
| + if (use_fake_device_) {
|
| video_capture_device =
|
| media::FakeVideoCaptureDevice::Create(vc_device_name);
|
| + } else {
|
| + switch (device.stream_type) {
|
| + case content::MEDIA_DEVICE_VIDEO_CAPTURE:
|
| + video_capture_device =
|
| + media::VideoCaptureDevice::Create(vc_device_name);
|
| + break;
|
| + case content::MEDIA_TAB_VIDEO_CAPTURE:
|
| + // TODO(miu): Replace this stub with the actual implementation in a
|
| + // later change.
|
| + video_capture_device =
|
| + media::FakeVideoCaptureDevice::Create(vc_device_name);
|
| + break;
|
| + default:
|
| + NOTIMPLEMENTED();
|
| + break;
|
| + }
|
| }
|
| if (!video_capture_device) {
|
| PostOnError(capture_session_id, kDeviceNotAvailable);
|
| return;
|
| }
|
|
|
| - devices_[capture_session_id] = video_capture_device;
|
| - PostOnOpened(capture_session_id);
|
| + DeviceEntry& new_entry = devices_[capture_session_id];
|
| + new_entry.stream_type = device.stream_type;
|
| + new_entry.capture_device = video_capture_device;
|
| + PostOnOpened(device.stream_type, capture_session_id);
|
| }
|
|
|
| void VideoCaptureManager::OnClose(int capture_session_id) {
|
| DCHECK(IsOnDeviceThread());
|
| DVLOG(1) << "VideoCaptureManager::OnClose, id " << capture_session_id;
|
|
|
| - media::VideoCaptureDevice* video_capture_device = NULL;
|
| VideoCaptureDevices::iterator device_it = devices_.find(capture_session_id);
|
| - if (device_it != devices_.end()) {
|
| - video_capture_device = device_it->second;
|
| - devices_.erase(device_it);
|
| + if (device_it == devices_.end()) {
|
| + return;
|
| + }
|
| + const DeviceEntry removed_entry = device_it->second;
|
| + devices_.erase(device_it);
|
|
|
| - Controllers::iterator cit = controllers_.find(video_capture_device);
|
| - if (cit != controllers_.end()) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&VideoCaptureController::StopSession,
|
| - cit->second->controller, capture_session_id));
|
| - }
|
| + Controllers::iterator cit = controllers_.find(removed_entry.capture_device);
|
| + if (cit != controllers_.end()) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&VideoCaptureController::StopSession,
|
| + cit->second->controller, capture_session_id));
|
| + }
|
|
|
| - if (!DeviceInUse(video_capture_device)) {
|
| - // No other users of this device, deallocate (if not done already) and
|
| - // delete the device. No need to take care of the controller, that is done
|
| - // by |OnStop|.
|
| - video_capture_device->DeAllocate();
|
| - Controllers::iterator cit = controllers_.find(video_capture_device);
|
| - if (cit != controllers_.end()) {
|
| - delete cit->second;
|
| - controllers_.erase(cit);
|
| - }
|
| - delete video_capture_device;
|
| + if (!DeviceInUse(removed_entry.capture_device)) {
|
| + // No other users of this device, deallocate (if not done already) and
|
| + // delete the device. No need to take care of the controller, that is done
|
| + // by |OnStop|.
|
| + removed_entry.capture_device->DeAllocate();
|
| + Controllers::iterator cit = controllers_.find(removed_entry.capture_device);
|
| + if (cit != controllers_.end()) {
|
| + delete cit->second;
|
| + controllers_.erase(cit);
|
| }
|
| + delete removed_entry.capture_device;
|
| }
|
| - PostOnClosed(capture_session_id);
|
| +
|
| + PostOnClosed(removed_entry.stream_type, capture_session_id);
|
| }
|
|
|
| void VideoCaptureManager::OnStart(
|
| @@ -249,7 +274,7 @@ void VideoCaptureManager::OnStop(
|
|
|
| VideoCaptureDevices::iterator it = devices_.find(capture_session_id);
|
| if (it != devices_.end()) {
|
| - media::VideoCaptureDevice* video_capture_device = it->second;
|
| + media::VideoCaptureDevice* video_capture_device = it->second.capture_device;
|
| // Possible errors are signaled to video_capture_receiver by
|
| // video_capture_device. video_capture_receiver to perform actions.
|
| video_capture_device->Stop();
|
| @@ -273,24 +298,24 @@ void VideoCaptureManager::OnStop(
|
| }
|
| }
|
|
|
| -void VideoCaptureManager::OnOpened(int capture_session_id) {
|
| +void VideoCaptureManager::OnOpened(content::MediaStreamDeviceType stream_type,
|
| + int capture_session_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| if (!listener_) {
|
| // Listener has been removed.
|
| return;
|
| }
|
| - listener_->Opened(content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE,
|
| - capture_session_id);
|
| + listener_->Opened(stream_type, capture_session_id);
|
| }
|
|
|
| -void VideoCaptureManager::OnClosed(int capture_session_id) {
|
| +void VideoCaptureManager::OnClosed(content::MediaStreamDeviceType stream_type,
|
| + int capture_session_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| if (!listener_) {
|
| // Listener has been removed.
|
| return;
|
| }
|
| - listener_->Closed(content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE,
|
| - capture_session_id);
|
| + listener_->Closed(stream_type, capture_session_id);
|
| }
|
|
|
| void VideoCaptureManager::OnDevicesEnumerated(
|
| @@ -300,35 +325,37 @@ void VideoCaptureManager::OnDevicesEnumerated(
|
| // Listener has been removed.
|
| return;
|
| }
|
| - listener_->DevicesEnumerated(content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE,
|
| - devices);
|
| + // NOTE: Only support enumeration of the MEDIA_DEVICE_VIDEO_CAPTURE type.
|
| + listener_->DevicesEnumerated(content::MEDIA_DEVICE_VIDEO_CAPTURE, devices);
|
| }
|
|
|
| -void VideoCaptureManager::OnError(int capture_session_id,
|
| +void VideoCaptureManager::OnError(content::MediaStreamDeviceType stream_type,
|
| + int capture_session_id,
|
| MediaStreamProviderError error) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| if (!listener_) {
|
| // Listener has been removed.
|
| return;
|
| }
|
| - listener_->Error(content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE,
|
| - capture_session_id, error);
|
| + listener_->Error(stream_type, capture_session_id, error);
|
| }
|
|
|
| -void VideoCaptureManager::PostOnOpened(int capture_session_id) {
|
| +void VideoCaptureManager::PostOnOpened(
|
| + content::MediaStreamDeviceType stream_type, int capture_session_id) {
|
| DCHECK(IsOnDeviceThread());
|
| BrowserThread::PostTask(BrowserThread::IO,
|
| FROM_HERE,
|
| base::Bind(&VideoCaptureManager::OnOpened, this,
|
| - capture_session_id));
|
| + stream_type, capture_session_id));
|
| }
|
|
|
| -void VideoCaptureManager::PostOnClosed(int capture_session_id) {
|
| +void VideoCaptureManager::PostOnClosed(
|
| + content::MediaStreamDeviceType stream_type, int capture_session_id) {
|
| DCHECK(IsOnDeviceThread());
|
| BrowserThread::PostTask(BrowserThread::IO,
|
| FROM_HERE,
|
| base::Bind(&VideoCaptureManager::OnClosed, this,
|
| - capture_session_id));
|
| + stream_type, capture_session_id));
|
| }
|
|
|
| void VideoCaptureManager::PostOnDevicesEnumerated(
|
| @@ -342,12 +369,16 @@ void VideoCaptureManager::PostOnDevicesEnumerated(
|
|
|
| void VideoCaptureManager::PostOnError(int capture_session_id,
|
| MediaStreamProviderError error) {
|
| - // Don't check thread here, can be called from both IO thread and device
|
| - // thread.
|
| + DCHECK(IsOnDeviceThread());
|
| + content::MediaStreamDeviceType stream_type =
|
| + content::MEDIA_DEVICE_VIDEO_CAPTURE;
|
| + VideoCaptureDevices::const_iterator it = devices_.find(capture_session_id);
|
| + if (it != devices_.end())
|
| + stream_type = it->second.stream_type;
|
| BrowserThread::PostTask(BrowserThread::IO,
|
| FROM_HERE,
|
| base::Bind(&VideoCaptureManager::OnError, this,
|
| - capture_session_id, error));
|
| + stream_type, capture_session_id, error));
|
| }
|
|
|
| bool VideoCaptureManager::IsOnDeviceThread() const {
|
| @@ -371,7 +402,8 @@ bool VideoCaptureManager::DeviceOpened(
|
|
|
| for (VideoCaptureDevices::iterator it = devices_.begin();
|
| it != devices_.end(); ++it) {
|
| - if (device_name.unique_id == it->second->device_name().unique_id) {
|
| + if (device_name.unique_id ==
|
| + it->second.capture_device->device_name().unique_id) {
|
| // We've found the device!
|
| return true;
|
| }
|
| @@ -385,8 +417,9 @@ media::VideoCaptureDevice* VideoCaptureManager::GetOpenedDevice(
|
|
|
| for (VideoCaptureDevices::iterator it = devices_.begin();
|
| it != devices_.end(); it++) {
|
| - if (device_info.device_id == it->second->device_name().unique_id) {
|
| - return it->second;
|
| + if (device_info.device_id ==
|
| + it->second.capture_device->device_name().unique_id) {
|
| + return it->second.capture_device;
|
| }
|
| }
|
| return NULL;
|
| @@ -398,7 +431,7 @@ bool VideoCaptureManager::DeviceInUse(
|
|
|
| for (VideoCaptureDevices::iterator it = devices_.begin();
|
| it != devices_.end(); ++it) {
|
| - if (video_capture_device == it->second) {
|
| + if (video_capture_device == it->second.capture_device) {
|
| // We've found the device!
|
| return true;
|
| }
|
| @@ -479,7 +512,7 @@ media::VideoCaptureDevice* VideoCaptureManager::GetDeviceInternal(
|
| DCHECK(IsOnDeviceThread());
|
| VideoCaptureDevices::iterator dit = devices_.find(capture_session_id);
|
| if (dit != devices_.end()) {
|
| - return dit->second;
|
| + return dit->second.capture_device;
|
| }
|
|
|
| // Solution for not using MediaStreamManager.
|
| @@ -491,7 +524,8 @@ media::VideoCaptureDevice* VideoCaptureManager::GetDeviceInternal(
|
| // No devices available.
|
| return NULL;
|
| }
|
| - StreamDeviceInfo device(content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE,
|
| + // NOTE: Only support enumeration of the MEDIA_DEVICE_VIDEO_CAPTURE type.
|
| + StreamDeviceInfo device(content::MEDIA_DEVICE_VIDEO_CAPTURE,
|
| device_names.front().device_name,
|
| device_names.front().unique_id, false);
|
|
|
| @@ -500,7 +534,7 @@ media::VideoCaptureDevice* VideoCaptureManager::GetDeviceInternal(
|
|
|
| VideoCaptureDevices::iterator dit = devices_.find(capture_session_id);
|
| if (dit != devices_.end()) {
|
| - return dit->second;
|
| + return dit->second.capture_device;
|
| }
|
| }
|
| return NULL;
|
|
|