Chromium Code Reviews| Index: media/video/capture/mac/video_capture_device_factory_mac.mm |
| diff --git a/media/video/capture/mac/video_capture_device_factory_mac.mm b/media/video/capture/mac/video_capture_device_factory_mac.mm |
| index 0100ba1a038d28643b2dd5967170ae05d3d4681b..32bacafb795a7182627edf28c596ea332c4f01e1 100644 |
| --- a/media/video/capture/mac/video_capture_device_factory_mac.mm |
| +++ b/media/video/capture/mac/video_capture_device_factory_mac.mm |
| @@ -4,6 +4,9 @@ |
| #include "media/video/capture/mac/video_capture_device_factory_mac.h" |
| +#include "base/bind.h" |
| +#include "base/location.h" |
| +#include "base/task_runner_util.h" |
| #import "media/video/capture/mac/avfoundation_glue.h" |
| #include "media/video/capture/mac/video_capture_device_mac.h" |
| #import "media/video/capture/mac/video_capture_device_avfoundation_mac.h" |
| @@ -22,27 +25,41 @@ const struct NameAndVid { |
| // In device identifiers, the USB VID and PID are stored in 4 bytes each. |
| const size_t kVidPidSize = 4; |
| -VideoCaptureDeviceFactoryMac::VideoCaptureDeviceFactoryMac() { |
| +static VideoCaptureDevice::Names EnumerateDevicesUsingQTKit(){ |
| + // DCHECK that ui_device_thread_ belongs to me. |
|
perkj_chrome
2014/05/26 11:49:42
remove this comment.
mcasas
2014/05/26 13:00:18
Done.
|
| + VideoCaptureDevice::Names device_names; |
| + NSMutableDictionary* capture_devices = |
| + [[[NSMutableDictionary alloc] init] autorelease]; |
| + [VideoCaptureDeviceQTKit getDeviceNames:capture_devices]; |
| + for (NSString* key in capture_devices) { |
| + VideoCaptureDevice::Name name( |
| + [[capture_devices valueForKey:key] UTF8String], |
| + [key UTF8String], VideoCaptureDevice::Name::QTKIT); |
| + device_names.push_back(name); |
| + } |
| + return device_names; |
| +} |
| + |
| +static void RunDevicesEnumeratedCallback( |
| + const base::Callback<void(media::VideoCaptureDevice::Names&)>& callback, |
| + VideoCaptureDevice::Names device_names) { |
| + callback.Run(device_names); |
| +} |
| + |
| +VideoCaptureDeviceFactoryMac::VideoCaptureDeviceFactoryMac( |
| + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) |
| + : ui_task_runner_(ui_task_runner) { |
| thread_checker_.DetachFromThread(); |
| } |
| +VideoCaptureDeviceFactoryMac::~VideoCaptureDeviceFactoryMac() {} |
| + |
| scoped_ptr<VideoCaptureDevice> VideoCaptureDeviceFactoryMac::Create( |
| - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, |
| const VideoCaptureDevice::Name& device_name) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| DCHECK_NE(device_name.capture_api_type(), |
| VideoCaptureDevice::Name::API_TYPE_UNKNOWN); |
| - VideoCaptureDevice::Names device_names; |
| - GetDeviceNames(&device_names); |
| - VideoCaptureDevice::Names::iterator it = device_names.begin(); |
| - for (; it != device_names.end(); ++it) { |
| - if (it->id() == device_name.id()) |
| - break; |
| - } |
| - if (it == device_names.end()) |
| - return scoped_ptr<VideoCaptureDevice>(); |
| - |
| scoped_ptr<VideoCaptureDeviceMac> capture_device( |
| new VideoCaptureDeviceMac(device_name)); |
| if (!capture_device->Init(device_name.capture_api_type())) { |
| @@ -53,7 +70,7 @@ scoped_ptr<VideoCaptureDevice> VideoCaptureDeviceFactoryMac::Create( |
| } |
| void VideoCaptureDeviceFactoryMac::GetDeviceNames( |
| - VideoCaptureDevice::Names* const device_names) { |
| + VideoCaptureDevice::Names* device_names) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| // Loop through all available devices and add to |device_names|. |
| NSDictionary* capture_devices; |
| @@ -99,14 +116,20 @@ void VideoCaptureDeviceFactoryMac::GetDeviceNames( |
| } |
| } |
| } else { |
| + // We should not enumerate QTKit devices in Device Thread; |
| + NOTREACHED(); |
| + } |
| +} |
| + |
| +void VideoCaptureDeviceFactoryMac::EnumerateDeviceNames( |
| + const base::Callback<void(media::VideoCaptureDevice::Names&)>& callback) { |
| + if (AVFoundationGlue::IsAVFoundationSupported()) { |
| + VideoCaptureDeviceFactory::EnumerateDeviceNames(callback); |
|
perkj_chrome
2014/05/26 11:49:42
This seems fragile. Remove GetDevicesNames and to
mcasas
2014/05/26 13:00:18
Done.
|
| + } else { |
| DVLOG(1) << "Enumerating video capture devices using QTKit"; |
| - capture_devices = [VideoCaptureDeviceQTKit deviceNames]; |
| - for (NSString* key in capture_devices) { |
| - VideoCaptureDevice::Name name( |
| - [[capture_devices valueForKey:key] UTF8String], |
| - [key UTF8String], VideoCaptureDevice::Name::QTKIT); |
| - device_names->push_back(name); |
| - } |
| + base::PostTaskAndReplyWithResult(ui_task_runner_, FROM_HERE, |
| + base::Bind(&EnumerateDevicesUsingQTKit), |
| + base::Bind(&RunDevicesEnumeratedCallback, callback)); |
| } |
| } |