Index: content/browser/renderer_host/media/video_capture_manager.cc |
diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc |
index 6c90c91cae3343e18a7e1ec1bca1e433b953dd56..39bec47c66332c9a30d4bb9182902a358fe8314e 100644 |
--- a/content/browser/renderer_host/media/video_capture_manager.cc |
+++ b/content/browser/renderer_host/media/video_capture_manager.cc |
@@ -7,6 +7,7 @@ |
#include <set> |
#include "base/bind.h" |
+#include "base/bind_helpers.h" |
#include "base/logging.h" |
#include "base/message_loop/message_loop.h" |
#include "base/stl_util.h" |
@@ -19,6 +20,7 @@ |
#include "content/public/browser/desktop_media_id.h" |
#include "content/public/common/content_switches.h" |
#include "content/public/common/media_stream_request.h" |
+#include "media/base/bind_to_current_loop.h" |
#include "media/base/scoped_histogram_timer.h" |
#include "media/video/capture/video_capture_device.h" |
#include "media/video/capture/video_capture_device_factory.h" |
@@ -122,12 +124,28 @@ void VideoCaptureManager::EnumerateDevices(MediaStreamType stream_type) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DVLOG(1) << "VideoCaptureManager::EnumerateDevices, type " << stream_type; |
DCHECK(listener_); |
- base::PostTaskAndReplyWithResult( |
- device_task_runner_, FROM_HERE, |
- base::Bind(&VideoCaptureManager::GetAvailableDevicesInfoOnDeviceThread, |
- this, stream_type, devices_info_cache_), |
- base::Bind(&VideoCaptureManager::OnDevicesInfoEnumerated, this, |
- stream_type)); |
+ DCHECK_EQ(stream_type, MEDIA_DEVICE_VIDEO_CAPTURE); |
+ |
+ // Bind a callback to ConsolidateDevicesInfoOnDeviceThread() with an argument |
+ // for another callback to OnDevicesInfoEnumerated() to be run in the current |
+ // loop, i.e. IO loop. Pass a timer for UMA histogram collection. |
+ base::Callback<void(const media::VideoCaptureDevice::Names&)> |
+ devices_enumerated_callback = |
+ base::Bind(&VideoCaptureManager::ConsolidateDevicesInfoOnDeviceThread, |
+ this, |
+ media::BindToCurrentLoop(base::Bind( |
+ &VideoCaptureManager::OnDevicesInfoEnumerated, |
+ this, |
+ stream_type, |
+ base::Owned(new base::ElapsedTimer()))), |
+ stream_type, |
+ devices_info_cache_); |
+ // OK to use base::Unretained() since we own the VCDFactory and |this| is |
+ // bound in |devices_enumerated_callback|. |
+ device_task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&media::VideoCaptureDeviceFactory::EnumerateDeviceNames, |
+ base::Unretained(video_capture_device_factory_.get()), |
+ devices_enumerated_callback)); |
} |
int VideoCaptureManager::Open(const StreamDeviceInfo& device_info) { |
@@ -200,9 +218,7 @@ void VideoCaptureManager::DoStartDeviceOnDeviceThread( |
DeviceInfo* found = FindDeviceInfoById(entry->id, devices_info_cache_); |
if (found) { |
video_capture_device = |
- video_capture_device_factory_->Create( |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), |
- found->name); |
+ video_capture_device_factory_->Create(found->name); |
} |
break; |
} |
@@ -432,9 +448,12 @@ void VideoCaptureManager::OnClosed( |
void VideoCaptureManager::OnDevicesInfoEnumerated( |
MediaStreamType stream_type, |
+ base::ElapsedTimer* timer, |
const DeviceInfos& new_devices_info_cache) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- |
+ UMA_HISTOGRAM_TIMES( |
+ "Media.VideoCaptureManager.GetAvailableDevicesInfoOnDeviceThreadTime", |
+ timer->Elapsed()); |
if (!listener_) { |
// Listener has been removed. |
return; |
@@ -456,29 +475,13 @@ bool VideoCaptureManager::IsOnDeviceThread() const { |
return device_task_runner_->BelongsToCurrentThread(); |
} |
-VideoCaptureManager::DeviceInfos |
-VideoCaptureManager::GetAvailableDevicesInfoOnDeviceThread( |
+void VideoCaptureManager::ConsolidateDevicesInfoOnDeviceThread( |
+ base::Callback<void(const DeviceInfos&)> on_devices_enumerated_callback, |
MediaStreamType stream_type, |
- const DeviceInfos& old_device_info_cache) { |
- SCOPED_UMA_HISTOGRAM_TIMER( |
- "Media.VideoCaptureManager.GetAvailableDevicesInfoOnDeviceThreadTime"); |
+ const DeviceInfos& old_device_info_cache, |
+ const media::VideoCaptureDevice::Names& names_snapshot) { |
DCHECK(IsOnDeviceThread()); |
- media::VideoCaptureDevice::Names names_snapshot; |
- switch (stream_type) { |
- case MEDIA_DEVICE_VIDEO_CAPTURE: |
- // Cache the latest enumeration of video capture devices. |
- // We'll refer to this list again in OnOpen to avoid having to |
- // enumerate the devices again. |
- video_capture_device_factory_->GetDeviceNames(&names_snapshot); |
- break; |
- case MEDIA_DESKTOP_VIDEO_CAPTURE: |
- // Do nothing. |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- |
+ media::VideoCaptureDevice::Names current_devices(names_snapshot); |
tommi (sloooow) - chröme
2014/05/30 14:16:38
ah, so if the goal is actually to modify the array
mcasas
2014/05/30 19:42:48
I changed |names_snapshot| to scoped_ptr<>, so
Vi
|
// Construct |new_devices_info_cache| with the cached devices that are still |
// present in the system, and remove their names from |names_snapshot|, so we |
// keep there the truly new devices. |
@@ -487,11 +490,11 @@ VideoCaptureManager::GetAvailableDevicesInfoOnDeviceThread( |
old_device_info_cache.begin(); |
it_device_info != old_device_info_cache.end(); ++it_device_info) { |
for (media::VideoCaptureDevice::Names::iterator it = |
- names_snapshot.begin(); |
- it != names_snapshot.end(); ++it) { |
+ current_devices.begin(); |
+ it != current_devices.end(); ++it) { |
if (it_device_info->name.id() == it->id()) { |
new_devices_info_cache.push_back(*it_device_info); |
- names_snapshot.erase(it); |
+ current_devices.erase(it); |
break; |
} |
} |
@@ -499,8 +502,8 @@ VideoCaptureManager::GetAvailableDevicesInfoOnDeviceThread( |
// Get the supported capture formats for the new devices in |names_snapshot|. |
for (media::VideoCaptureDevice::Names::const_iterator it = |
- names_snapshot.begin(); |
- it != names_snapshot.end(); ++it) { |
+ current_devices.begin(); |
+ it != current_devices.end(); ++it) { |
media::VideoCaptureFormats supported_formats; |
DeviceInfo device_info(*it, media::VideoCaptureFormats()); |
video_capture_device_factory_->GetDeviceSupportedFormats( |
@@ -508,7 +511,8 @@ VideoCaptureManager::GetAvailableDevicesInfoOnDeviceThread( |
ConsolidateCaptureFormats(&device_info.supported_formats); |
new_devices_info_cache.push_back(device_info); |
} |
- return new_devices_info_cache; |
+ |
+ on_devices_enumerated_callback.Run(new_devices_info_cache); |
} |
VideoCaptureManager::DeviceEntry* |