+#include <dlfcn.h>
+
+//These symbols may not be present
+static struct{
+ CFStringRef kCVImageBufferColorPrimaries_ITU_R_2020;
+ CFStringRef kCVImageBufferTransferFunction_ITU_R_2020;
+ CFStringRef kCVImageBufferYCbCrMatrix_ITU_R_2020;
+
+ CFStringRef kVTCompressionPropertyKey_H264EntropyMode;
+ CFStringRef kVTH264EntropyMode_CAVLC;
+ CFStringRef kVTH264EntropyMode_CABAC;
+
+ CFStringRef kVTProfileLevel_H264_Baseline_4_0;
+ CFStringRef kVTProfileLevel_H264_Baseline_4_2;
+ CFStringRef kVTProfileLevel_H264_Baseline_5_0;
+ CFStringRef kVTProfileLevel_H264_Baseline_5_1;
+ CFStringRef kVTProfileLevel_H264_Baseline_5_2;
+ CFStringRef kVTProfileLevel_H264_Baseline_AutoLevel;
+ CFStringRef kVTProfileLevel_H264_Main_4_2;
+ CFStringRef kVTProfileLevel_H264_Main_5_1;
+ CFStringRef kVTProfileLevel_H264_Main_5_2;
+ CFStringRef kVTProfileLevel_H264_Main_AutoLevel;
+ CFStringRef kVTProfileLevel_H264_High_3_0;
+ CFStringRef kVTProfileLevel_H264_High_3_1;
+ CFStringRef kVTProfileLevel_H264_High_3_2;
+ CFStringRef kVTProfileLevel_H264_High_4_0;
+ CFStringRef kVTProfileLevel_H264_High_4_1;
+ CFStringRef kVTProfileLevel_H264_High_4_2;
+ CFStringRef kVTProfileLevel_H264_High_5_1;
+ CFStringRef kVTProfileLevel_H264_High_5_2;
+ CFStringRef kVTProfileLevel_H264_High_AutoLevel;
+
+ CFStringRef kVTCompressionPropertyKey_RealTime;
+
+ CFStringRef kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder;
+ CFStringRef kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder;
+} compat_keys;
+
+#define GET_SYM(symbol, defaultVal) \
+do{ \
+ CFStringRef cfstr = *(CFStringRef*)dlsym(RTLD_DEFAULT, #symbol); \
+ if(!cfstr) \
+ compat_keys.symbol = CFSTR(defaultVal); \
+ else \
+ compat_keys.symbol = cfstr; \
+}while(0)
+
+static pthread_once_t once_ctrl = PTHREAD_ONCE_INIT;
+
+static void loadVTEncSymbols(){
+ GET_SYM(kCVImageBufferColorPrimaries_ITU_R_2020, "ITU_R_2020");
+ GET_SYM(kCVImageBufferTransferFunction_ITU_R_2020, "ITU_R_2020");
+ GET_SYM(kCVImageBufferYCbCrMatrix_ITU_R_2020, "ITU_R_2020");
+
+ GET_SYM(kVTCompressionPropertyKey_H264EntropyMode, "H264EntropyMode");
+ GET_SYM(kVTH264EntropyMode_CAVLC, "CAVLC");
+ GET_SYM(kVTH264EntropyMode_CABAC, "CABAC");
+
+ GET_SYM(kVTProfileLevel_H264_Baseline_4_0, "H264_Baseline_4_0");
+ GET_SYM(kVTProfileLevel_H264_Baseline_4_2, "H264_Baseline_4_2");
+ GET_SYM(kVTProfileLevel_H264_Baseline_5_0, "H264_Baseline_5_0");
+ GET_SYM(kVTProfileLevel_H264_Baseline_5_1, "H264_Baseline_5_1");
+ GET_SYM(kVTProfileLevel_H264_Baseline_5_2, "H264_Baseline_5_2");
+ GET_SYM(kVTProfileLevel_H264_Baseline_AutoLevel, "H264_Baseline_AutoLevel");
+ GET_SYM(kVTProfileLevel_H264_Main_4_2, "H264_Main_4_2");
+ GET_SYM(kVTProfileLevel_H264_Main_5_1, "H264_Main_5_1");
+ GET_SYM(kVTProfileLevel_H264_Main_5_2, "H264_Main_5_2");
+ GET_SYM(kVTProfileLevel_H264_Main_AutoLevel, "H264_Main_AutoLevel");
+ GET_SYM(kVTProfileLevel_H264_High_3_0, "H264_High_3_0");
+ GET_SYM(kVTProfileLevel_H264_High_3_1, "H264_High_3_1");
+ GET_SYM(kVTProfileLevel_H264_High_3_2, "H264_High_3_2");
+ GET_SYM(kVTProfileLevel_H264_High_4_0, "H264_High_4_0");
+ GET_SYM(kVTProfileLevel_H264_High_4_1, "H264_High_4_1");
+ GET_SYM(kVTProfileLevel_H264_High_4_2, "H264_High_4_2");
+ GET_SYM(kVTProfileLevel_H264_High_5_1, "H264_High_5_1");
+ GET_SYM(kVTProfileLevel_H264_High_5_2, "H264_High_5_2");
+ GET_SYM(kVTProfileLevel_H264_High_AutoLevel, "H264_High_AutoLevel");
+
+ GET_SYM(kVTCompressionPropertyKey_RealTime, "RealTime");
+
+ GET_SYM(kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
+ "EnableHardwareAcceleratedVideoEncoder");
+ GET_SYM(kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder,
+ "RequireHardwareAcceleratedVideoEncoder");
+}