Commit ac1db38b authored by mcasas's avatar mcasas Committed by Commit bot

Retry: Win Video Capture: Create an STA |video_capture_thread_| from MediaStreamManager.

(This CL is tries to fix http://crrev.com/700503002 that was reverted
due to some failing Android content_browsertests.)

Original message ------------------------------------------------------

YCWebCameraSource.ax causes a huge amount of Chrome crashes. This CL
changes the initialization model of the Device Thread, a.k.a Audio
Thread, from Multiple Thread appartment model to Single Thread model,
MTA -> STA.

We'll monitor the crash rate in the Canaries to see if it has the
desired effect.

BUG=427192, 421991

Review URL: https://codereview.chromium.org/706443002

Cr-Commit-Position: refs/heads/master@{#302689}
parent 3a94d804
...@@ -234,6 +234,11 @@ class MediaStreamDispatcherHostTest : public testing::Test { ...@@ -234,6 +234,11 @@ class MediaStreamDispatcherHostTest : public testing::Test {
media_stream_manager_->video_capture_manager() media_stream_manager_->video_capture_manager()
->video_capture_device_factory()); ->video_capture_device_factory());
DCHECK(video_capture_device_factory_); DCHECK(video_capture_device_factory_);
#if defined(OS_WIN)
// Override the Video Capture Thread that MediaStreamManager constructs.
media_stream_manager_->video_capture_manager()->set_device_task_runner(
base::MessageLoopProxy::current());
#endif
MockResourceContext* mock_resource_context = MockResourceContext* mock_resource_context =
static_cast<MockResourceContext*>( static_cast<MockResourceContext*>(
......
...@@ -360,6 +360,9 @@ MediaStreamManager::EnumerationCache::~EnumerationCache() { ...@@ -360,6 +360,9 @@ MediaStreamManager::EnumerationCache::~EnumerationCache() {
MediaStreamManager::MediaStreamManager() MediaStreamManager::MediaStreamManager()
: audio_manager_(NULL), : audio_manager_(NULL),
#if defined(OS_WIN)
video_capture_thread_("VideoCaptureThread"),
#endif
monitoring_started_(false), monitoring_started_(false),
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
has_checked_keyboard_mic_(false), has_checked_keyboard_mic_(false),
...@@ -369,6 +372,9 @@ MediaStreamManager::MediaStreamManager() ...@@ -369,6 +372,9 @@ MediaStreamManager::MediaStreamManager()
MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager) MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager)
: audio_manager_(audio_manager), : audio_manager_(audio_manager),
#if defined(OS_WIN)
video_capture_thread_("VideoCaptureThread"),
#endif
monitoring_started_(false), monitoring_started_(false),
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
has_checked_keyboard_mic_(false), has_checked_keyboard_mic_(false),
...@@ -1595,7 +1601,16 @@ void MediaStreamManager::InitializeDeviceManagersOnIOThread() { ...@@ -1595,7 +1601,16 @@ void MediaStreamManager::InitializeDeviceManagersOnIOThread() {
video_capture_manager_ = video_capture_manager_ =
new VideoCaptureManager(media::VideoCaptureDeviceFactory::CreateFactory( new VideoCaptureManager(media::VideoCaptureDeviceFactory::CreateFactory(
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI))); BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)));
#if defined(OS_WIN)
// Use an STA Video Capture Thread to try to avoid crashes on enumeration of
// buggy third party Direct Show modules, http://crbug.com/428958.
video_capture_thread_.init_com_with_mta(false);
CHECK(video_capture_thread_.Start());
video_capture_manager_->Register(this,
video_capture_thread_.message_loop_proxy());
#else
video_capture_manager_->Register(this, device_task_runner_); video_capture_manager_->Register(this, device_task_runner_);
#endif
} }
void MediaStreamManager::Opened(MediaStreamType stream_type, void MediaStreamManager::Opened(MediaStreamType stream_type,
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/power_monitor/power_observer.h" #include "base/power_monitor/power_observer.h"
#include "base/system_monitor/system_monitor.h" #include "base/system_monitor/system_monitor.h"
#include "base/threading/thread.h"
#include "content/browser/renderer_host/media/media_stream_provider.h" #include "content/browser/renderer_host/media/media_stream_provider.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "content/common/media/media_stream_options.h" #include "content/common/media/media_stream_options.h"
...@@ -382,6 +383,9 @@ class CONTENT_EXPORT MediaStreamManager ...@@ -382,6 +383,9 @@ class CONTENT_EXPORT MediaStreamManager
media::AudioManager* const audio_manager_; // not owned media::AudioManager* const audio_manager_; // not owned
scoped_refptr<AudioInputDeviceManager> audio_input_device_manager_; scoped_refptr<AudioInputDeviceManager> audio_input_device_manager_;
scoped_refptr<VideoCaptureManager> video_capture_manager_; scoped_refptr<VideoCaptureManager> video_capture_manager_;
#if defined(OS_WIN)
base::Thread video_capture_thread_;
#endif
// Indicator of device monitoring state. // Indicator of device monitoring state.
bool monitoring_started_; bool monitoring_started_;
......
...@@ -131,6 +131,13 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { ...@@ -131,6 +131,13 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider {
return video_capture_device_factory_.get(); return video_capture_device_factory_.get();
} }
#if defined(OS_WIN)
void set_device_task_runner(
const scoped_refptr<base::SingleThreadTaskRunner>& device_task_runner) {
device_task_runner_ = device_task_runner;
}
#endif
private: private:
~VideoCaptureManager() override; ~VideoCaptureManager() override;
struct DeviceEntry; struct DeviceEntry;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment