diff options
Diffstat (limited to 'chromium/media/video/capture/mac/coremedia_glue.mm')
-rw-r--r-- | chromium/media/video/capture/mac/coremedia_glue.mm | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/chromium/media/video/capture/mac/coremedia_glue.mm b/chromium/media/video/capture/mac/coremedia_glue.mm new file mode 100644 index 00000000000..f94256b6c92 --- /dev/null +++ b/chromium/media/video/capture/mac/coremedia_glue.mm @@ -0,0 +1,70 @@ +// 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. + +#include "media/video/capture/mac/coremedia_glue.h" + +#include <dlfcn.h> + +#include "base/logging.h" +#include "base/lazy_instance.h" + +namespace { + +// This class is used to retrieve some CoreMedia library functions. It must be +// used as a LazyInstance so that it is initialised once and in a thread-safe +// way. Normally no work is done in constructors: LazyInstance is an exception. +class CoreMediaLibraryInternal { + public: + typedef CoreMediaGlue::CMTime (*CMTimeMakeMethod)(int64_t, int32_t); + typedef CVImageBufferRef (*CMSampleBufferGetImageBufferMethod)( + CoreMediaGlue::CMSampleBufferRef); + + CoreMediaLibraryInternal() { + NSBundle* bundle = [NSBundle + bundleWithPath:@"/System/Library/Frameworks/CoreMedia.framework"]; + + const char* path = [[bundle executablePath] fileSystemRepresentation]; + CHECK(path); + void* library_handle = dlopen(path, RTLD_LAZY | RTLD_LOCAL); + CHECK(library_handle) << dlerror(); + + // Now extract the methods. + cm_time_make_ = reinterpret_cast<CMTimeMakeMethod>( + dlsym(library_handle, "CMTimeMake")); + CHECK(cm_time_make_) << dlerror(); + + cm_sample_buffer_get_image_buffer_method_ = + reinterpret_cast<CMSampleBufferGetImageBufferMethod>( + dlsym(library_handle, "CMSampleBufferGetImageBuffer")); + CHECK(cm_sample_buffer_get_image_buffer_method_) << dlerror(); + } + + const CMTimeMakeMethod& cm_time_make() const { return cm_time_make_; } + const CMSampleBufferGetImageBufferMethod& + cm_sample_buffer_get_image_buffer_method() const { + return cm_sample_buffer_get_image_buffer_method_; + } + + private: + CMTimeMakeMethod cm_time_make_; + CMSampleBufferGetImageBufferMethod cm_sample_buffer_get_image_buffer_method_; + + DISALLOW_COPY_AND_ASSIGN(CoreMediaLibraryInternal); +}; + +} // namespace + +static base::LazyInstance<CoreMediaLibraryInternal> g_coremedia_handle = + LAZY_INSTANCE_INITIALIZER; + +CoreMediaGlue::CMTime CoreMediaGlue::CMTimeMake(int64_t value, + int32_t timescale) { + return g_coremedia_handle.Get().cm_time_make()(value, timescale); +} + +CVImageBufferRef CoreMediaGlue::CMSampleBufferGetImageBuffer( + CMSampleBufferRef buffer) { + return g_coremedia_handle.Get().cm_sample_buffer_get_image_buffer_method()( + buffer); +} |