| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "media/video/capture/mac/coremedia_glue.h" | |
| 6 | |
| 7 #include <dlfcn.h> | |
| 8 | |
| 9 #include "base/logging.h" | |
| 10 #include "base/lazy_instance.h" | |
| 11 | |
| 12 namespace { | |
| 13 | |
| 14 // This class is used to retrieve some CoreMedia library functions. It must be | |
| 15 // used as a LazyInstance so that it is initialised once and in a thread-safe | |
| 16 // way. Normally no work is done in constructors: LazyInstance is an exception. | |
| 17 class CoreMediaLibraryInternal { | |
| 18 public: | |
| 19 typedef CoreMediaGlue::CMTime (*CMTimeMakeMethod)(int64_t, int32_t); | |
| 20 typedef CVImageBufferRef (*CMSampleBufferGetImageBufferMethod)( | |
| 21 CoreMediaGlue::CMSampleBufferRef); | |
| 22 typedef FourCharCode (*CMFormatDescriptionGetMediaSubTypeMethod)( | |
| 23 CoreMediaGlue::CMFormatDescriptionRef desc); | |
| 24 typedef CoreMediaGlue::CMVideoDimensions | |
| 25 (*CMVideoFormatDescriptionGetDimensionsMethod)( | |
| 26 CoreMediaGlue::CMVideoFormatDescriptionRef videoDesc); | |
| 27 | |
| 28 CoreMediaLibraryInternal() { | |
| 29 NSBundle* bundle = [NSBundle | |
| 30 bundleWithPath:@"/System/Library/Frameworks/CoreMedia.framework"]; | |
| 31 | |
| 32 const char* path = [[bundle executablePath] fileSystemRepresentation]; | |
| 33 CHECK(path); | |
| 34 void* library_handle = dlopen(path, RTLD_LAZY | RTLD_LOCAL); | |
| 35 CHECK(library_handle) << dlerror(); | |
| 36 | |
| 37 // Now extract the methods. | |
| 38 cm_time_make_ = reinterpret_cast<CMTimeMakeMethod>( | |
| 39 dlsym(library_handle, "CMTimeMake")); | |
| 40 CHECK(cm_time_make_) << dlerror(); | |
| 41 | |
| 42 cm_sample_buffer_get_image_buffer_method_ = | |
| 43 reinterpret_cast<CMSampleBufferGetImageBufferMethod>( | |
| 44 dlsym(library_handle, "CMSampleBufferGetImageBuffer")); | |
| 45 CHECK(cm_sample_buffer_get_image_buffer_method_) << dlerror(); | |
| 46 | |
| 47 cm_format_description_get_media_sub_type_method_ = | |
| 48 reinterpret_cast<CMFormatDescriptionGetMediaSubTypeMethod>( | |
| 49 dlsym(library_handle, "CMFormatDescriptionGetMediaSubType")); | |
| 50 CHECK(cm_format_description_get_media_sub_type_method_) << dlerror(); | |
| 51 | |
| 52 cm_video_format_description_get_dimensions_method_ = | |
| 53 reinterpret_cast<CMVideoFormatDescriptionGetDimensionsMethod>( | |
| 54 dlsym(library_handle, "CMVideoFormatDescriptionGetDimensions")); | |
| 55 CHECK(cm_video_format_description_get_dimensions_method_) << dlerror(); | |
| 56 } | |
| 57 | |
| 58 const CMTimeMakeMethod& cm_time_make() const { return cm_time_make_; } | |
| 59 const CMSampleBufferGetImageBufferMethod& | |
| 60 cm_sample_buffer_get_image_buffer_method() const { | |
| 61 return cm_sample_buffer_get_image_buffer_method_; | |
| 62 } | |
| 63 const CMFormatDescriptionGetMediaSubTypeMethod& | |
| 64 cm_format_description_get_media_sub_type_method() const { | |
| 65 return cm_format_description_get_media_sub_type_method_; | |
| 66 } | |
| 67 const CMVideoFormatDescriptionGetDimensionsMethod& | |
| 68 cm_video_format_description_get_dimensions_method() const { | |
| 69 return cm_video_format_description_get_dimensions_method_; | |
| 70 } | |
| 71 | |
| 72 private: | |
| 73 CMTimeMakeMethod cm_time_make_; | |
| 74 CMSampleBufferGetImageBufferMethod cm_sample_buffer_get_image_buffer_method_; | |
| 75 CMFormatDescriptionGetMediaSubTypeMethod | |
| 76 cm_format_description_get_media_sub_type_method_; | |
| 77 CMVideoFormatDescriptionGetDimensionsMethod | |
| 78 cm_video_format_description_get_dimensions_method_; | |
| 79 | |
| 80 DISALLOW_COPY_AND_ASSIGN(CoreMediaLibraryInternal); | |
| 81 }; | |
| 82 | |
| 83 } // namespace | |
| 84 | |
| 85 static base::LazyInstance<CoreMediaLibraryInternal> g_coremedia_handle = | |
| 86 LAZY_INSTANCE_INITIALIZER; | |
| 87 | |
| 88 // static | |
| 89 CoreMediaGlue::CMTime CoreMediaGlue::CMTimeMake(int64_t value, | |
| 90 int32_t timescale) { | |
| 91 return g_coremedia_handle.Get().cm_time_make()(value, timescale); | |
| 92 } | |
| 93 | |
| 94 // static | |
| 95 CVImageBufferRef CoreMediaGlue::CMSampleBufferGetImageBuffer( | |
| 96 CMSampleBufferRef buffer) { | |
| 97 return g_coremedia_handle.Get().cm_sample_buffer_get_image_buffer_method()( | |
| 98 buffer); | |
| 99 } | |
| 100 | |
| 101 // static | |
| 102 FourCharCode CoreMediaGlue::CMFormatDescriptionGetMediaSubType( | |
| 103 CMFormatDescriptionRef desc) { | |
| 104 return g_coremedia_handle.Get() | |
| 105 .cm_format_description_get_media_sub_type_method()(desc); | |
| 106 } | |
| 107 | |
| 108 // static | |
| 109 CoreMediaGlue::CMVideoDimensions | |
| 110 CoreMediaGlue::CMVideoFormatDescriptionGetDimensions( | |
| 111 CMVideoFormatDescriptionRef videoDesc) { | |
| 112 return g_coremedia_handle.Get() | |
| 113 .cm_video_format_description_get_dimensions_method()(videoDesc); | |
| 114 } | |
| OLD | NEW |