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 5d7884eb4f676b064722e49a85da749e1d684ceb..d5a7005697097964a4606bf6786037c9e5942bac 100644 |
--- a/content/browser/renderer_host/media/media_stream_manager.cc |
+++ b/content/browser/renderer_host/media/media_stream_manager.cc |
@@ -49,6 +49,7 @@ |
#include "media/base/audio_parameters.h" |
#include "media/base/channel_layout.h" |
#include "media/base/media_switches.h" |
+#include "media/capture/video/video_capture_device_factory.h" |
#include "media/capture/video/video_capture_system.h" |
#include "url/gurl.h" |
#include "url/origin.h" |
@@ -401,17 +402,6 @@ 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))); |
- } |
- |
base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); |
// BrowserMainLoop always creates the PowerMonitor instance before creating |
// MediaStreamManager, but power_monitor may be NULL in unit tests. |
@@ -431,6 +421,40 @@ MediaStreamManager::~MediaStreamManager() { |
power_monitor->RemoveObserver(this); |
} |
+// static |
+std::unique_ptr<MediaStreamManager> MediaStreamManager::CreateWithDefaults( |
+ media::AudioSystem* audio_system) { |
+ std::unique_ptr<MediaStreamManager> result( |
+ new MediaStreamManager(audio_system)); |
+ result->InitializeWithDefaults(); |
+ return result; |
+} |
+ |
+// static |
+std::unique_ptr<MediaStreamManager> |
+MediaStreamManager::CreateWithCustomVideoCaptureDeviceTaskRunner( |
+ media::AudioSystem* audio_system, |
+ scoped_refptr<base::SingleThreadTaskRunner> device_task_runner) { |
+ std::unique_ptr<MediaStreamManager> result( |
+ new MediaStreamManager(audio_system)); |
+ result->InitializeWithCustomVideoCaptureDeviceTaskRunner( |
+ std::move(device_task_runner)); |
+ return result; |
+} |
+ |
+// static |
+std::unique_ptr<MediaStreamManager> |
+MediaStreamManager::CreateWithCustomVideoCaptureSystem( |
+ media::AudioSystem* audio_system, |
+ std::unique_ptr<media::VideoCaptureSystem> video_capture_system, |
+ scoped_refptr<base::SingleThreadTaskRunner> device_task_runner) { |
+ std::unique_ptr<MediaStreamManager> result( |
+ new MediaStreamManager(audio_system)); |
+ result->InitializeWithCustomVideoCaptureSystem( |
+ std::move(video_capture_system), std::move(device_task_runner)); |
+ return result; |
+} |
+ |
VideoCaptureManager* MediaStreamManager::video_capture_manager() { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK(video_capture_manager_.get()); |
@@ -1214,8 +1238,74 @@ void MediaStreamManager::FinalizeMediaAccessRequest( |
DeleteRequest(label); |
} |
-void MediaStreamManager::InitializeDeviceManagersOnIOThread() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+void MediaStreamManager::InitializeWithDefaults() { |
+ scoped_refptr<base::SingleThreadTaskRunner> 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 |
+ InitializeWithCustomVideoCaptureDeviceTaskRunner( |
+ std::move(device_task_runner)); |
+} |
+ |
+void MediaStreamManager::InitializeWithCustomVideoCaptureDeviceTaskRunner( |
+ 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) == false) { |
miu
2017/04/03 21:31:23
Usually, the style is:
if (!BrowserThread::Curr
chfremer
2017/04/04 21:59:32
Done.
|
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&MediaStreamManager:: |
+ InitializeWithCustomVideoCaptureDeviceTaskRunner, |
+ base::Unretained(this), base::Passed(&device_task_runner))); |
+ return; |
+ } |
+ |
+ PerformCommonInitializationRoutines(); |
+ |
+ auto video_capture_system = base::MakeUnique<media::VideoCaptureSystemImpl>( |
+ media::VideoCaptureDeviceFactory::CreateFactory( |
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::UI))); |
+ video_capture_manager_ = new VideoCaptureManager( |
+ std::move(video_capture_system), std::move(device_task_runner)); |
+ video_capture_manager_->RegisterListener(this); |
+ |
+ media_devices_manager_.reset( |
+ new MediaDevicesManager(audio_system_, video_capture_manager_, this)); |
+} |
+ |
+void MediaStreamManager::InitializeWithCustomVideoCaptureSystem( |
+ 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) == false) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&MediaStreamManager::InitializeWithCustomVideoCaptureSystem, |
+ base::Unretained(this), base::Passed(&video_capture_system), |
+ std::move(device_task_runner))); |
+ return; |
+ } |
+ |
+ PerformCommonInitializationRoutines(); |
+ |
+ video_capture_manager_ = new VideoCaptureManager( |
+ std::move(video_capture_system), std::move(device_task_runner)); |
+ video_capture_manager_->RegisterListener(this); |
+ |
+ media_devices_manager_.reset( |
+ new MediaDevicesManager(audio_system_, video_capture_manager_, this)); |
+} |
+ |
+void MediaStreamManager::PerformCommonInitializationRoutines() { |
miu
2017/04/03 21:31:23
After reviewing all these CreateXXX() and Initiali
chfremer
2017/04/04 21:59:32
Thanks. That allows eliminating a lot of ugliness
|
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
// 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 +1318,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,25 +1342,6 @@ 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_->RegisterListener(this); |
- |
- media_devices_manager_.reset( |
- new MediaDevicesManager(audio_system_, video_capture_manager_, this)); |
} |
void MediaStreamManager::Opened(MediaStreamType stream_type, |