From 5a309716dd90e1812016255f6ab06e6819d84fc8 Mon Sep 17 00:00:00 2001 From: "xians@chromium.org" Date: Fri, 6 Jul 2012 12:03:05 +0000 Subject: Pepper needs to repeatedly call enumeration API in order to get a synchronous up-to-date device list. This heavily loads the IO thread since the enumeration is done on IO thread. This patch moves the device thread from VideoCaptureManager to MediaStreamManager, so that audio and video can share one device thread, and also allow running audio device API on this shared device thread. BUG=132701,130113 TEST=content_unittests Review URL: https://chromiumcodereview.appspot.com/10662049 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@145584 0039d316-1c4b-4281-b951-d872f2087c98 --- media/video/capture/win/video_capture_device_win.cc | 12 +++++++++++- media/video/capture/win/video_capture_device_win.h | 8 ++++---- 2 files changed, 15 insertions(+), 5 deletions(-) (limited to 'media/video') diff --git a/media/video/capture/win/video_capture_device_win.cc b/media/video/capture/win/video_capture_device_win.cc index 55b5a16..05d5b43 100644 --- a/media/video/capture/win/video_capture_device_win.cc +++ b/media/video/capture/win/video_capture_device_win.cc @@ -180,7 +180,6 @@ static const char kGoogleCameraAdapter[] = "google camera adapter"; void VideoCaptureDevice::GetDeviceNames(Names* device_names) { DCHECK(device_names); - base::win::ScopedCOMInitializer coinit; ScopedComPtr dev_enum; HRESULT hr = dev_enum.CreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC); @@ -255,9 +254,11 @@ VideoCaptureDeviceWin::VideoCaptureDeviceWin(const Name& device_name) : device_name_(device_name), state_(kIdle), observer_(NULL) { + DetachFromThread(); } VideoCaptureDeviceWin::~VideoCaptureDeviceWin() { + DCHECK(CalledOnValidThread()); if (media_control_) media_control_->Stop(); @@ -276,6 +277,7 @@ VideoCaptureDeviceWin::~VideoCaptureDeviceWin() { } bool VideoCaptureDeviceWin::Init() { + DCHECK(CalledOnValidThread()); HRESULT hr = GetDeviceFilter(device_name_, capture_filter_.Receive()); if (!capture_filter_) { DVLOG(2) << "Failed to create capture filter."; @@ -331,6 +333,7 @@ void VideoCaptureDeviceWin::Allocate( int height, int frame_rate, VideoCaptureDevice::EventHandler* observer) { + DCHECK(CalledOnValidThread()); if (state_ != kIdle) return; @@ -427,6 +430,7 @@ void VideoCaptureDeviceWin::Allocate( } void VideoCaptureDeviceWin::Start() { + DCHECK(CalledOnValidThread()); if (state_ != kAllocated) return; @@ -440,6 +444,7 @@ void VideoCaptureDeviceWin::Start() { } void VideoCaptureDeviceWin::Stop() { + DCHECK(CalledOnValidThread()); if (state_ != kCapturing) return; @@ -453,6 +458,7 @@ void VideoCaptureDeviceWin::Stop() { } void VideoCaptureDeviceWin::DeAllocate() { + DCHECK(CalledOnValidThread()); if (state_ == kIdle) return; @@ -475,6 +481,7 @@ void VideoCaptureDeviceWin::DeAllocate() { } const VideoCaptureDevice::Name& VideoCaptureDeviceWin::device_name() { + DCHECK(CalledOnValidThread()); return device_name_; } @@ -485,6 +492,7 @@ void VideoCaptureDeviceWin::FrameReceived(const uint8* buffer, } bool VideoCaptureDeviceWin::CreateCapabilityMap() { + DCHECK(CalledOnValidThread()); ScopedComPtr stream_config; HRESULT hr = output_capture_pin_.QueryInterface(stream_config.Receive()); if (FAILED(hr)) { @@ -594,6 +602,7 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap() { int VideoCaptureDeviceWin::GetBestMatchedCapability(int requested_width, int requested_height, int requested_frame_rate) { + DCHECK(CalledOnValidThread()); std::list diff_list; // Loop through the candidates to create a list of differentials between the @@ -653,6 +662,7 @@ int VideoCaptureDeviceWin::GetBestMatchedCapability(int requested_width, } void VideoCaptureDeviceWin::SetErrorState(const char* reason) { + DCHECK(CalledOnValidThread()); DVLOG(1) << reason; state_ = kError; observer_->OnError(); diff --git a/media/video/capture/win/video_capture_device_win.h b/media/video/capture/win/video_capture_device_win.h index 1f7e03a..7e9f65b 100644 --- a/media/video/capture/win/video_capture_device_win.h +++ b/media/video/capture/win/video_capture_device_win.h @@ -17,8 +17,8 @@ #include #include +#include "base/threading/non_thread_safe.h" #include "base/threading/thread.h" -#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_comptr.h" #include "media/video/capture/video_capture_device.h" #include "media/video/capture/video_capture_types.h" @@ -27,8 +27,10 @@ namespace media { +// All the methods in the class can only be run on a COM initialized thread. class VideoCaptureDeviceWin - : public VideoCaptureDevice, + : public base::NonThreadSafe, + public VideoCaptureDevice, public SinkFilterObserver { public: explicit VideoCaptureDeviceWin(const Name& device_name); @@ -64,8 +66,6 @@ class VideoCaptureDeviceWin int GetBestMatchedCapability(int width, int height, int frame_rate); void SetErrorState(const char* reason); - base::win::ScopedCOMInitializer initialize_com_; - Name device_name_; InternalState state_; VideoCaptureDevice::EventHandler* observer_; -- cgit v1.1