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 156faa979ae312549795cf909aecd8d093000fe7..2711aac7ce99c23aed5401e5a251fea86f556e35 100644 |
--- a/content/browser/renderer_host/media/media_stream_manager.cc |
+++ b/content/browser/renderer_host/media/media_stream_manager.cc |
@@ -49,7 +49,8 @@ |
#include "media/base/audio_parameters.h" |
#include "media/base/channel_layout.h" |
#include "media/base/media_switches.h" |
-#include "media/capture/video/video_capture_system.h" |
+#include "media/capture/video/video_capture_device_factory.h" |
+#include "media/capture/video/video_capture_system_impl.h" |
#include "url/gurl.h" |
#include "url/origin.h" |
@@ -393,6 +394,12 @@ void MediaStreamManager::SendMessageToNativeLog(const std::string& message) { |
} |
MediaStreamManager::MediaStreamManager(media::AudioSystem* audio_system) |
+ : MediaStreamManager(audio_system, nullptr, nullptr) {} |
+ |
+MediaStreamManager::MediaStreamManager( |
+ media::AudioSystem* audio_system, |
+ std::unique_ptr<media::VideoCaptureSystem> video_capture_system, |
+ scoped_refptr<base::SingleThreadTaskRunner> device_task_runner) |
: audio_system_(audio_system), |
#if defined(OS_WIN) |
video_capture_thread_("VideoCaptureThread"), |
@@ -401,16 +408,23 @@ MediaStreamManager::MediaStreamManager(media::AudioSystem* audio_system) |
switches::kUseFakeUIForMediaStream)) { |
DCHECK(audio_system_); |
- // Some unit tests create the MSM in the IO thread and assumes the |
- // initialization is done synchronously. |
- if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
- InitializeDeviceManagersOnIOThread(); |
- } else { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&MediaStreamManager::InitializeDeviceManagersOnIOThread, |
- base::Unretained(this))); |
+ if (!video_capture_system) { |
+ video_capture_system = base::MakeUnique<media::VideoCaptureSystemImpl>( |
+ media::VideoCaptureDeviceFactory::CreateFactory( |
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::UI))); |
+ } |
+ if (!device_task_runner) { |
+ device_task_runner = audio_system_->GetTaskRunner(); |
+#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()); |
+ device_task_runner = video_capture_thread_.task_runner(); |
+#endif |
} |
+ InitializeMaybeAsync(std::move(video_capture_system), |
+ std::move(device_task_runner)); |
base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); |
// BrowserMainLoop always creates the PowerMonitor instance before creating |
@@ -1214,8 +1228,21 @@ void MediaStreamManager::FinalizeMediaAccessRequest( |
DeleteRequest(label); |
} |
-void MediaStreamManager::InitializeDeviceManagersOnIOThread() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+void MediaStreamManager::InitializeMaybeAsync( |
+ std::unique_ptr<media::VideoCaptureSystem> video_capture_system, |
+ scoped_refptr<base::SingleThreadTaskRunner> device_task_runner) { |
+ // Some unit tests initialize the MSM in the IO thread and assume the |
+ // initialization is done synchronously. Other clients call this from a |
+ // different thread and expect initialization to run asynchronously. |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&MediaStreamManager::InitializeMaybeAsync, |
+ base::Unretained(this), base::Passed(&video_capture_system), |
+ std::move(device_task_runner))); |
+ return; |
+ } |
+ |
// Store a pointer to |this| on the IO thread to avoid having to jump to the |
// UI thread to fetch a pointer to the MSM. In particular on Android, it can |
// be problematic to post to a UI thread from arbitrary worker threads since |
@@ -1228,7 +1255,6 @@ void MediaStreamManager::InitializeDeviceManagersOnIOThread() { |
tracked_objects::ScopedTracker tracking_profile1( |
FROM_HERE_WITH_EXPLICIT_FUNCTION( |
"457525 MediaStreamManager::InitializeDeviceManagersOnIOThread 1")); |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
// TODO(dalecurtis): Remove ScopedTracker below once crbug.com/457525 is |
// fixed. |
@@ -1253,21 +1279,9 @@ void MediaStreamManager::InitializeDeviceManagersOnIOThread() { |
tracked_objects::ScopedTracker tracking_profile4( |
FROM_HERE_WITH_EXPLICIT_FUNCTION( |
"457525 MediaStreamManager::InitializeDeviceManagersOnIOThread 4")); |
- auto video_capture_system = base::MakeUnique<media::VideoCaptureSystem>( |
- media::VideoCaptureDeviceFactory::CreateFactory( |
- BrowserThread::GetTaskRunnerForThread(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_ = new VideoCaptureManager( |
- std::move(video_capture_system), video_capture_thread_.task_runner()); |
-#else |
- video_capture_manager_ = new VideoCaptureManager( |
- std::move(video_capture_system), audio_system_->GetTaskRunner()); |
-#endif |
+ video_capture_manager_ = new VideoCaptureManager( |
+ std::move(video_capture_system), std::move(device_task_runner)); |
video_capture_manager_->RegisterListener(this); |
media_devices_manager_.reset( |