summaryrefslogtreecommitdiffstats
path: root/media/video
diff options
context:
space:
mode:
authorxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-06 12:03:05 +0000
committerxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-06 12:03:05 +0000
commit5a309716dd90e1812016255f6ab06e6819d84fc8 (patch)
treeb5abd4c8e254b684ae5a452c3ff15bd2111b3c18 /media/video
parent3919f5403f926c501b6802214340f4f7b7872e56 (diff)
downloadchromium_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.cc12
-rw-r--r--media/video/capture/win/video_capture_device_win.h8
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_;