Index: content/browser/renderer_host/media/media_stream_manager.cc |
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc |
index 3d506f7303b44a7f7696ea3368cb1b71317a6f77..0124f21297f8b4a311d4e42bf88b1ee92fe53458 100644 |
--- a/content/browser/renderer_host/media/media_stream_manager.cc |
+++ b/content/browser/renderer_host/media/media_stream_manager.cc |
@@ -360,6 +360,9 @@ MediaStreamManager::EnumerationCache::~EnumerationCache() { |
MediaStreamManager::MediaStreamManager() |
: audio_manager_(NULL), |
+#if defined(OS_WIN) |
+ video_capture_thread_("VideoCaptureThread"), |
+#endif |
monitoring_started_(false), |
#if defined(OS_CHROMEOS) |
has_checked_keyboard_mic_(false), |
@@ -369,6 +372,9 @@ MediaStreamManager::MediaStreamManager() |
MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager) |
: audio_manager_(audio_manager), |
+#if defined(OS_WIN) |
+ video_capture_thread_("VideoCaptureThread"), |
+#endif |
monitoring_started_(false), |
#if defined(OS_CHROMEOS) |
has_checked_keyboard_mic_(false), |
@@ -1595,7 +1601,16 @@ void MediaStreamManager::InitializeDeviceManagersOnIOThread() { |
video_capture_manager_ = |
new VideoCaptureManager(media::VideoCaptureDeviceFactory::CreateFactory( |
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_); |
+#endif |
} |
void MediaStreamManager::Opened(MediaStreamType stream_type, |