11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/mac/videotoolbox_glue.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <dlfcn.h>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#import <Foundation/Foundation.h>
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/lazy_instance.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This class stores VideoToolbox library symbol pointers.
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct VideoToolboxGlue::Library {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef OSStatus (*VTCompressionSessionCreateMethod)(
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CFAllocatorRef,
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int32_t,
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int32_t,
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CoreMediaGlue::CMVideoCodecType,
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CFDictionaryRef,
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CFDictionaryRef,
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CFAllocatorRef,
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      VTCompressionOutputCallback,
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      void*,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      VTCompressionSessionRef*);
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef OSStatus (*VTCompressionSessionEncodeFrameMethod)(
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      VTCompressionSessionRef,
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CVImageBufferRef,
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CoreMediaGlue::CMTime,
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CoreMediaGlue::CMTime,
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CFDictionaryRef,
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      void*,
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      VTEncodeInfoFlags*);
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef CVPixelBufferPoolRef (*VTCompressionSessionGetPixelBufferPoolMethod)(
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      VTCompressionSessionRef);
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef void (*VTCompressionSessionInvalidateMethod)(VTCompressionSessionRef);
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef OSStatus (*VTSessionSetPropertyMethod)(VTSessionRef,
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 CFStringRef,
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 CFTypeRef);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  VTCompressionSessionCreateMethod VTCompressionSessionCreate;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  VTCompressionSessionEncodeFrameMethod VTCompressionSessionEncodeFrame;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  VTCompressionSessionGetPixelBufferPoolMethod
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      VTCompressionSessionGetPixelBufferPool;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  VTCompressionSessionInvalidateMethod VTCompressionSessionInvalidate;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  VTSessionSetPropertyMethod VTSessionSetProperty;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_AllowFrameReordering;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_AverageBitRate;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_ColorPrimaries;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_ExpectedFrameRate;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_MaxKeyFrameInterval;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_ProfileLevel;
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_RealTime;
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_TransferFunction;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTCompressionPropertyKey_YCbCrMatrix;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTEncodeFrameOptionKey_ForceKeyFrame;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTProfileLevel_H264_Baseline_AutoLevel;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTProfileLevel_H264_Main_AutoLevel;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTProfileLevel_H264_Extended_AutoLevel;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef* kVTProfileLevel_H264_High_AutoLevel;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef*
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder;
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Lazy-instance responsible for loading VideoToolbox.
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass VideoToolboxGlue::Loader {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Loader() {
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NSBundle* bundle = [NSBundle
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bundleWithPath:@"/System/Library/Frameworks/VideoToolbox.framework"];
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char* path = [[bundle executablePath] fileSystemRepresentation];
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!path)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    handle_ = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!handle_)
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LOAD_SYMBOL(SYMBOL)                                             \
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!LoadSymbol(#SYMBOL, reinterpret_cast<void**>(&library_.SYMBOL))) \
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(VTCompressionSessionCreate)
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(VTCompressionSessionEncodeFrame)
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(VTCompressionSessionGetPixelBufferPool)
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(VTCompressionSessionInvalidate)
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(VTSessionSetProperty)
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_AllowFrameReordering)
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_AverageBitRate)
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_ColorPrimaries)
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_ExpectedFrameRate)
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_MaxKeyFrameInterval)
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration)
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_ProfileLevel)
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_RealTime)
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_TransferFunction)
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTCompressionPropertyKey_YCbCrMatrix)
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTEncodeFrameOptionKey_ForceKeyFrame);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTProfileLevel_H264_Baseline_AutoLevel)
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTProfileLevel_H264_Main_AutoLevel)
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTProfileLevel_H264_Extended_AutoLevel)
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(kVTProfileLevel_H264_High_AutoLevel)
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOAD_SYMBOL(
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder)
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LOAD_SYMBOL
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    glue_.library_ = &library_;
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const VideoToolboxGlue* glue() const {
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (glue_.library_) ? &glue_ : NULL;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool LoadSymbol(const char* name, void** symbol_out) {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *symbol_out = dlsym(handle_, name);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return *symbol_out != NULL;
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Library library_;
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  VideoToolboxGlue glue_;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void* handle_;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(Loader);
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic base::LazyInstance<VideoToolboxGlue::Loader> g_videotoolbox_loader =
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LAZY_INSTANCE_INITIALIZER;
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst VideoToolboxGlue* VideoToolboxGlue::Get() {
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return g_videotoolbox_loader.Get().glue();
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciVideoToolboxGlue::VideoToolboxGlue() : library_(NULL) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOSStatus VideoToolboxGlue::VTCompressionSessionCreate(
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CFAllocatorRef allocator,
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int32_t width,
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int32_t height,
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CoreMediaGlue::CMVideoCodecType codecType,
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CFDictionaryRef encoderSpecification,
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CFDictionaryRef sourceImageBufferAttributes,
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CFAllocatorRef compressedDataAllocator,
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VTCompressionOutputCallback outputCallback,
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    void* outputCallbackRefCon,
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VTCompressionSessionRef* compressionSessionOut) const {
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return library_->VTCompressionSessionCreate(allocator,
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              width,
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              height,
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              codecType,
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              encoderSpecification,
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              sourceImageBufferAttributes,
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              compressedDataAllocator,
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              outputCallback,
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              outputCallbackRefCon,
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              compressionSessionOut);
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOSStatus VideoToolboxGlue::VTCompressionSessionEncodeFrame(
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VTCompressionSessionRef session,
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CVImageBufferRef imageBuffer,
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CoreMediaGlue::CMTime presentationTimeStamp,
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CoreMediaGlue::CMTime duration,
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CFDictionaryRef frameProperties,
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    void* sourceFrameRefCon,
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VTEncodeInfoFlags* infoFlagsOut) const {
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return library_->VTCompressionSessionEncodeFrame(session,
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   imageBuffer,
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   presentationTimeStamp,
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   duration,
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   frameProperties,
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   sourceFrameRefCon,
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   infoFlagsOut);
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCVPixelBufferPoolRef VideoToolboxGlue::VTCompressionSessionGetPixelBufferPool(
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VTCompressionSessionRef session) const {
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return library_->VTCompressionSessionGetPixelBufferPool(session);
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid VideoToolboxGlue::VTCompressionSessionInvalidate(
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VTCompressionSessionRef session) const {
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  library_->VTCompressionSessionInvalidate(session);
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOSStatus VideoToolboxGlue::VTSessionSetProperty(VTSessionRef session,
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                CFStringRef propertyKey,
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                CFTypeRef propertyValue) const {
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return library_->VTSessionSetProperty(session, propertyKey, propertyValue);
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define KEY_ACCESSOR(KEY) \
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CFStringRef VideoToolboxGlue::KEY() const { return *library_->KEY; }
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_AllowFrameReordering)
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_AverageBitRate)
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_ColorPrimaries)
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_ExpectedFrameRate)
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_MaxKeyFrameInterval)
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration)
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_ProfileLevel)
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_RealTime)
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_TransferFunction)
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTCompressionPropertyKey_YCbCrMatrix)
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTEncodeFrameOptionKey_ForceKeyFrame)
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTProfileLevel_H264_Baseline_AutoLevel)
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTProfileLevel_H264_Main_AutoLevel)
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTProfileLevel_H264_Extended_AutoLevel)
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTProfileLevel_H264_High_AutoLevel)
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKEY_ACCESSOR(kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder)
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef KEY_ACCESSOR
219