// 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. #ifndef MEDIA_BASE_MAC_VIDEOTOOLBOX_GLUE_H_ #define MEDIA_BASE_MAC_VIDEOTOOLBOX_GLUE_H_ #include "base/basictypes.h" #include "media/base/mac/coremedia_glue.h" #include "media/base/media_export.h" // VideoToolbox API is available in OS X 10.9 and iOS 8 (10.8 has support for // software encoding, but this class exposes the 10.9 API level). Chromium // requires OS X 10.6 or iOS 6. Linking with VideoToolbox therefore has to // happen at runtime. This class is defined to try and load the VideoToolbox // library. If it succeeds, clients can use VideoToolbox via this class. class MEDIA_EXPORT VideoToolboxGlue { public: class Loader; // Returns a glue object if VideoToolbox is supported or null otherwise. // Using a glue object allows to avoid expensive atomic operations on every // function call. The object has process life duration and must not be // deleted. static const VideoToolboxGlue* Get(); // Originally from VTErrors.h typedef UInt32 VTEncodeInfoFlags; enum { kVTEncodeInfo_Asynchronous = 1UL << 0, kVTEncodeInfo_FrameDropped = 1UL << 1, }; // Originally from VTCompressionSession.h typedef struct OpaqueVTCompressionSession* VTCompressionSessionRef; typedef void (*VTCompressionOutputCallback)( void* outputCallbackRefCon, void* sourceFrameRefCon, OSStatus status, VTEncodeInfoFlags infoFlags, CoreMediaGlue::CMSampleBufferRef sampleBuffer); // Originally from VTSession.h typedef CFTypeRef VTSessionRef; // Originally from VTCompressionProperties.h CFStringRef kVTCompressionPropertyKey_AllowFrameReordering() const; CFStringRef kVTCompressionPropertyKey_AverageBitRate() const; CFStringRef kVTCompressionPropertyKey_ColorPrimaries() const; CFStringRef kVTCompressionPropertyKey_ExpectedFrameRate() const; CFStringRef kVTCompressionPropertyKey_MaxFrameDelayCount() const; CFStringRef kVTCompressionPropertyKey_MaxKeyFrameInterval() const; CFStringRef kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration() const; CFStringRef kVTCompressionPropertyKey_ProfileLevel() const; CFStringRef kVTCompressionPropertyKey_RealTime() const; CFStringRef kVTCompressionPropertyKey_TransferFunction() const; CFStringRef kVTCompressionPropertyKey_YCbCrMatrix() const; CFStringRef kVTEncodeFrameOptionKey_ForceKeyFrame() const; CFStringRef kVTProfileLevel_H264_Baseline_AutoLevel() const; CFStringRef kVTProfileLevel_H264_Main_AutoLevel() const; CFStringRef kVTProfileLevel_H264_Extended_AutoLevel() const; CFStringRef kVTProfileLevel_H264_High_AutoLevel() const; CFStringRef kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder() const; // Originally from VTCompressionSession.h OSStatus 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; OSStatus VTCompressionSessionEncodeFrame( VTCompressionSessionRef session, CVImageBufferRef imageBuffer, CoreMediaGlue::CMTime presentationTimeStamp, CoreMediaGlue::CMTime duration, CFDictionaryRef frameProperties, void* sourceFrameRefCon, VTEncodeInfoFlags* infoFlagsOut) const; CVPixelBufferPoolRef VTCompressionSessionGetPixelBufferPool( VTCompressionSessionRef session) const; void VTCompressionSessionInvalidate(VTCompressionSessionRef session) const; OSStatus VTCompressionSessionCompleteFrames( VTCompressionSessionRef session, CoreMediaGlue::CMTime completeUntilPresentationTimeStamp) const; // Originally from VTSession.h OSStatus VTSessionSetProperty(VTSessionRef session, CFStringRef propertyKey, CFTypeRef propertyValue) const; private: struct Library; VideoToolboxGlue(); Library* library_; DISALLOW_COPY_AND_ASSIGN(VideoToolboxGlue); }; #endif // MEDIA_BASE_MAC_VIDEOTOOLBOX_GLUE_H_