diff options
author | xians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-06 12:03:05 +0000 |
---|---|---|
committer | xians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-06 12:03:05 +0000 |
commit | 5a309716dd90e1812016255f6ab06e6819d84fc8 (patch) | |
tree | b5abd4c8e254b684ae5a452c3ff15bd2111b3c18 /media/video | |
parent | 3919f5403f926c501b6802214340f4f7b7872e56 (diff) | |
download | chromium_src-5a309716dd90e1812016255f6ab06e6819d84fc8.zip chromium_src-5a309716dd90e1812016255f6ab06e6819d84fc8.tar.gz chromium_src-5a309716dd90e1812016255f6ab06e6819d84fc8.tar.bz2 |
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
Diffstat (limited to 'media/video')
-rw-r--r-- | media/video/capture/win/video_capture_device_win.cc | 12 | ||||
-rw-r--r-- | media/video/capture/win/video_capture_device_win.h | 8 |
2 files changed, 15 insertions, 5 deletions
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<ICreateDevEnum> 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<IAMStreamConfig> 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<ResolutionDiff> 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 <map> #include <string> +#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_; |