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(){ |
tommi (sloooow) - chröme
2014/05/30 12:37:51
space before {
mcasas
2014/05/30 14:08:50
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 +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), |
tommi (sloooow) - chröme
2014/05/30 12:37:51
indent
mcasas
2014/05/30 14:08:50
Done.
|
+ base::Bind(&RunDevicesEnumeratedCallback, callback)); |
} |
} |