| Index: media/base/mac/videotoolbox_glue.mm
|
| diff --git a/media/base/mac/videotoolbox_glue.mm b/media/base/mac/videotoolbox_glue.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7cffc46a79116c80301bc12c40a62d69550fcad2
|
| --- /dev/null
|
| +++ b/media/base/mac/videotoolbox_glue.mm
|
| @@ -0,0 +1,218 @@
|
| +// Copyright 2014 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/base/mac/videotoolbox_glue.h"
|
| +
|
| +#include <dlfcn.h>
|
| +#import <Foundation/Foundation.h>
|
| +
|
| +#include "base/lazy_instance.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +
|
| +// This class stores VideoToolbox library symbol pointers.
|
| +struct VideoToolboxGlue::Library {
|
| + typedef OSStatus (*VTCompressionSessionCreateMethod)(
|
| + CFAllocatorRef,
|
| + int32_t,
|
| + int32_t,
|
| + CoreMediaGlue::CMVideoCodecType,
|
| + CFDictionaryRef,
|
| + CFDictionaryRef,
|
| + CFAllocatorRef,
|
| + VTCompressionOutputCallback,
|
| + void*,
|
| + VTCompressionSessionRef*);
|
| + typedef OSStatus (*VTCompressionSessionEncodeFrameMethod)(
|
| + VTCompressionSessionRef,
|
| + CVImageBufferRef,
|
| + CoreMediaGlue::CMTime,
|
| + CoreMediaGlue::CMTime,
|
| + CFDictionaryRef,
|
| + void*,
|
| + VTEncodeInfoFlags*);
|
| + typedef CVPixelBufferPoolRef (*VTCompressionSessionGetPixelBufferPoolMethod)(
|
| + VTCompressionSessionRef);
|
| + typedef void (*VTCompressionSessionInvalidateMethod)(VTCompressionSessionRef);
|
| + typedef OSStatus (*VTSessionSetPropertyMethod)(VTSessionRef,
|
| + CFStringRef,
|
| + CFTypeRef);
|
| +
|
| + VTCompressionSessionCreateMethod VTCompressionSessionCreate;
|
| + VTCompressionSessionEncodeFrameMethod VTCompressionSessionEncodeFrame;
|
| + VTCompressionSessionGetPixelBufferPoolMethod
|
| + VTCompressionSessionGetPixelBufferPool;
|
| + VTCompressionSessionInvalidateMethod VTCompressionSessionInvalidate;
|
| + VTSessionSetPropertyMethod VTSessionSetProperty;
|
| +
|
| + CFStringRef* kVTCompressionPropertyKey_AllowFrameReordering;
|
| + CFStringRef* kVTCompressionPropertyKey_AverageBitRate;
|
| + CFStringRef* kVTCompressionPropertyKey_ColorPrimaries;
|
| + CFStringRef* kVTCompressionPropertyKey_ExpectedFrameRate;
|
| + CFStringRef* kVTCompressionPropertyKey_MaxKeyFrameInterval;
|
| + CFStringRef* kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration;
|
| + CFStringRef* kVTCompressionPropertyKey_ProfileLevel;
|
| + CFStringRef* kVTCompressionPropertyKey_RealTime;
|
| + CFStringRef* kVTCompressionPropertyKey_TransferFunction;
|
| + CFStringRef* kVTCompressionPropertyKey_YCbCrMatrix;
|
| + CFStringRef* kVTEncodeFrameOptionKey_ForceKeyFrame;
|
| + CFStringRef* kVTProfileLevel_H264_Baseline_AutoLevel;
|
| + CFStringRef* kVTProfileLevel_H264_Main_AutoLevel;
|
| + CFStringRef* kVTProfileLevel_H264_Extended_AutoLevel;
|
| + CFStringRef* kVTProfileLevel_H264_High_AutoLevel;
|
| + CFStringRef*
|
| + kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder;
|
| +};
|
| +
|
| +// Lazy-instance responsible for loading VideoToolbox.
|
| +class VideoToolboxGlue::Loader {
|
| + public:
|
| + Loader() {
|
| + NSBundle* bundle = [NSBundle
|
| + bundleWithPath:@"/System/Library/Frameworks/VideoToolbox.framework"];
|
| + const char* path = [[bundle executablePath] fileSystemRepresentation];
|
| + if (!path)
|
| + return;
|
| +
|
| + handle_ = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
|
| + if (!handle_)
|
| + return;
|
| +
|
| +#define LOAD_SYMBOL(SYMBOL) \
|
| + if (!LoadSymbol(#SYMBOL, reinterpret_cast<void**>(&library_.SYMBOL))) \
|
| + return;
|
| +
|
| + LOAD_SYMBOL(VTCompressionSessionCreate)
|
| + LOAD_SYMBOL(VTCompressionSessionEncodeFrame)
|
| + LOAD_SYMBOL(VTCompressionSessionGetPixelBufferPool)
|
| + LOAD_SYMBOL(VTCompressionSessionInvalidate)
|
| + LOAD_SYMBOL(VTSessionSetProperty)
|
| +
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_AllowFrameReordering)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_AverageBitRate)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_ColorPrimaries)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_ExpectedFrameRate)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_MaxKeyFrameInterval)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_ProfileLevel)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_RealTime)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_TransferFunction)
|
| + LOAD_SYMBOL(kVTCompressionPropertyKey_YCbCrMatrix)
|
| + LOAD_SYMBOL(kVTEncodeFrameOptionKey_ForceKeyFrame);
|
| + LOAD_SYMBOL(kVTProfileLevel_H264_Baseline_AutoLevel)
|
| + LOAD_SYMBOL(kVTProfileLevel_H264_Main_AutoLevel)
|
| + LOAD_SYMBOL(kVTProfileLevel_H264_Extended_AutoLevel)
|
| + LOAD_SYMBOL(kVTProfileLevel_H264_High_AutoLevel)
|
| + LOAD_SYMBOL(
|
| + kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder)
|
| +
|
| +#undef LOAD_SYMBOL
|
| +
|
| + glue_.library_ = &library_;
|
| + }
|
| +
|
| + const VideoToolboxGlue* glue() const {
|
| + return (glue_.library_) ? &glue_ : NULL;
|
| + }
|
| +
|
| + private:
|
| + bool LoadSymbol(const char* name, void** symbol_out) {
|
| + *symbol_out = dlsym(handle_, name);
|
| + return *symbol_out != NULL;
|
| + }
|
| +
|
| + Library library_;
|
| + VideoToolboxGlue glue_;
|
| + void* handle_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Loader);
|
| +};
|
| +
|
| +static base::LazyInstance<VideoToolboxGlue::Loader> g_videotoolbox_loader =
|
| + LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +// static
|
| +const VideoToolboxGlue* VideoToolboxGlue::Get() {
|
| + return g_videotoolbox_loader.Get().glue();
|
| +}
|
| +
|
| +VideoToolboxGlue::VideoToolboxGlue() : library_(NULL) {
|
| +}
|
| +
|
| +OSStatus VideoToolboxGlue::VTCompressionSessionCreate(
|
| + CFAllocatorRef allocator,
|
| + int32_t width,
|
| + int32_t height,
|
| + CoreMediaGlue::CMVideoCodecType codecType,
|
| + CFDictionaryRef encoderSpecification,
|
| + CFDictionaryRef sourceImageBufferAttributes,
|
| + CFAllocatorRef compressedDataAllocator,
|
| + VTCompressionOutputCallback outputCallback,
|
| + void* outputCallbackRefCon,
|
| + VTCompressionSessionRef* compressionSessionOut) const {
|
| + return library_->VTCompressionSessionCreate(allocator,
|
| + width,
|
| + height,
|
| + codecType,
|
| + encoderSpecification,
|
| + sourceImageBufferAttributes,
|
| + compressedDataAllocator,
|
| + outputCallback,
|
| + outputCallbackRefCon,
|
| + compressionSessionOut);
|
| +}
|
| +
|
| +OSStatus VideoToolboxGlue::VTCompressionSessionEncodeFrame(
|
| + VTCompressionSessionRef session,
|
| + CVImageBufferRef imageBuffer,
|
| + CoreMediaGlue::CMTime presentationTimeStamp,
|
| + CoreMediaGlue::CMTime duration,
|
| + CFDictionaryRef frameProperties,
|
| + void* sourceFrameRefCon,
|
| + VTEncodeInfoFlags* infoFlagsOut) const {
|
| + return library_->VTCompressionSessionEncodeFrame(session,
|
| + imageBuffer,
|
| + presentationTimeStamp,
|
| + duration,
|
| + frameProperties,
|
| + sourceFrameRefCon,
|
| + infoFlagsOut);
|
| +}
|
| +
|
| +CVPixelBufferPoolRef VideoToolboxGlue::VTCompressionSessionGetPixelBufferPool(
|
| + VTCompressionSessionRef session) const {
|
| + return library_->VTCompressionSessionGetPixelBufferPool(session);
|
| +}
|
| +
|
| +void VideoToolboxGlue::VTCompressionSessionInvalidate(
|
| + VTCompressionSessionRef session) const {
|
| + library_->VTCompressionSessionInvalidate(session);
|
| +}
|
| +
|
| +OSStatus VideoToolboxGlue::VTSessionSetProperty(VTSessionRef session,
|
| + CFStringRef propertyKey,
|
| + CFTypeRef propertyValue) const {
|
| + return library_->VTSessionSetProperty(session, propertyKey, propertyValue);
|
| +}
|
| +
|
| +#define KEY_ACCESSOR(KEY) \
|
| + CFStringRef VideoToolboxGlue::KEY() const { return *library_->KEY; }
|
| +
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_AllowFrameReordering)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_AverageBitRate)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_ColorPrimaries)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_ExpectedFrameRate)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_MaxKeyFrameInterval)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_ProfileLevel)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_RealTime)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_TransferFunction)
|
| +KEY_ACCESSOR(kVTCompressionPropertyKey_YCbCrMatrix)
|
| +KEY_ACCESSOR(kVTEncodeFrameOptionKey_ForceKeyFrame)
|
| +KEY_ACCESSOR(kVTProfileLevel_H264_Baseline_AutoLevel)
|
| +KEY_ACCESSOR(kVTProfileLevel_H264_Main_AutoLevel)
|
| +KEY_ACCESSOR(kVTProfileLevel_H264_Extended_AutoLevel)
|
| +KEY_ACCESSOR(kVTProfileLevel_H264_High_AutoLevel)
|
| +KEY_ACCESSOR(kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder)
|
| +
|
| +#undef KEY_ACCESSOR
|
|
|