Chromium Code Reviews| Index: media/video/capture/mac/avfoundation_glue.mm |
| diff --git a/media/video/capture/mac/avfoundation_glue.mm b/media/video/capture/mac/avfoundation_glue.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..59d5b68ed2bf28e22fcf8ba4eba92732feb2199a |
| --- /dev/null |
| +++ b/media/video/capture/mac/avfoundation_glue.mm |
| @@ -0,0 +1,89 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#import "media/video/capture/mac/avfoundation_glue.h" |
| + |
| +#include <dlfcn.h> |
| + |
| +#include "base/mac/mac_util.h" |
| + |
| +BOOL AVFoundationGlue::IsAVFoundationSupported() { |
| + return (base::mac::IsOSLionOrLater() && [AvFoundationBundle() load]); |
| +} |
| + |
| +NSBundle const* AVFoundationGlue::AvFoundationBundle() { |
| + static NSBundle* bundle = [NSBundle |
| + bundleWithPath:@"/System/Library/Frameworks/AVFoundation.framework"]; |
| + return bundle; |
| +} |
| + |
| +void* AVFoundationGlue::AvFoundationLibraryHandle() { |
| + const char* library_path = |
| + [[AvFoundationBundle() executablePath] fileSystemRepresentation]; |
| + if (library_path == NULL) { |
| + DCHECK(false); |
| + return NULL; |
| + } |
| + static void* library_handle = dlopen(library_path, RTLD_LAZY | RTLD_LOCAL); |
| + DCHECK(library_handle) << dlerror(); |
| + return library_handle; |
| +} |
| + |
| +NSString* AVFoundationGlue::AvCaptureDeviceWasConnectedNotification() { |
| + return ReadNSStringPtr("AVCaptureDeviceWasConnectedNotification"); |
| +} |
| + |
| +NSString* AVFoundationGlue::AvCaptureDeviceWasDisconnectedNotification() { |
| + return ReadNSStringPtr("AVCaptureDeviceWasDisconnectedNotification"); |
| +} |
| + |
| +NSString* AVFoundationGlue::AvMediaTypeVideo() { |
| + return ReadNSStringPtr("AVMediaTypeVideo"); |
| +} |
| + |
| +NSString* AVFoundationGlue::AvMediaTypeAudio() { |
| + return ReadNSStringPtr("AVMediaTypeAudio"); |
| +} |
| + |
| +NSString* AVFoundationGlue::AvMediaTypeMuxed() { |
| + return ReadNSStringPtr("AVMediaTypeMuxed"); |
| +} |
| + |
| +NSString* AVFoundationGlue::ReadNSStringPtr(char const* const symbol) { |
| + NSString** stringPointer = (NSString**)dlsym(AvFoundationLibraryHandle(), |
|
Robert Sesek
2013/10/18 18:18:15
You should use reinterpret_cast<> since C-style ca
mcasas
2013/10/19 20:37:08
Done.
|
| + symbol); |
| + DCHECK(stringPointer) << dlerror(); |
| + return *stringPointer; |
| +} |
| + |
| +@implementation AVCaptureDeviceGlue |
| + |
| ++ (NSArray*)devices { |
| + Class avcClass = |
| + [AVFoundationGlue::AvFoundationBundle() classNamed:@"AVCaptureDevice"]; |
| + SEL selectorDevices = NSSelectorFromString(@"devices"); |
| + if ([avcClass respondsToSelector:selectorDevices]) { |
| + return [avcClass performSelector:selectorDevices]; |
| + } |
| + return nil; |
| +} |
| + |
| ++ (BOOL)hasMediaType:(NSString*)mediaType |
| + forCaptureDevice:(CrAVCaptureDevice*)device { |
| + SEL selectorHasMediaType = NSSelectorFromString(@"hasMediaType:"); |
| + if ([device respondsToSelector:selectorHasMediaType]) { |
| + return [device hasMediaType:mediaType]; |
| + } |
| + return NO; |
| +} |
| + |
| ++ (NSString*)uniqueID:(CrAVCaptureDevice*)device { |
| + SEL selectorUniqueID = NSSelectorFromString(@"uniqueID"); |
| + if ([device respondsToSelector:selectorUniqueID]) { |
| + return [device uniqueID]; |
| + } |
| + return nil; |
| +} |
| + |
| +@end // @implementation AVCaptureDevice |