| 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..7cfd43d21816b402c9d23c00c2c934e519e41031 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,40 @@ 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(){
|
| + 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 +69,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 +115,23 @@ 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) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (AVFoundationGlue::IsAVFoundationSupported()) {
|
| + VideoCaptureDevice::Names device_names;
|
| + GetDeviceNames(&device_names);
|
| + callback.Run(device_names);
|
| + } 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));
|
| }
|
| }
|
|
|
|
|