21#include <Availability.h>
22#include <CoreMedia/CoreMedia.h>
23#include <CoreVideo/CoreVideo.h>
26#include <TargetConditionals.h>
27#include <VideoToolbox/VideoToolbox.h>
45#if !HAVE_KCMVIDEOCODECTYPE_HEVC
49#if !HAVE_KCMVIDEOCODECTYPE_HEVCWITHALPHA
53#if !HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
58#if !HAVE_KVTQPMODULATIONLEVEL_DEFAULT
63#ifndef TARGET_CPU_ARM64
64# define TARGET_CPU_ARM64 0
68 size_t parameterSetIndex,
69 const uint8_t **parameterSetPointerOut,
70 size_t *parameterSetSizeOut,
71 size_t *parameterSetCountOut,
72 int *NALUnitHeaderLengthOut);
145#define GET_SYM(symbol, defaultVal) \
147 CFStringRef* handle = (CFStringRef*)dlsym(RTLD_DEFAULT, #symbol); \
149 compat_keys.symbol = CFSTR(defaultVal); \
151 compat_keys.symbol = *handle; \
157 compat_keys.CMVideoFormatDescriptionGetHEVCParameterSetAtIndex =
160 "CMVideoFormatDescriptionGetHEVCParameterSetAtIndex"
201 "TargetQualityForAlpha");
203 "PrioritizeEncodingSpeedOverQuality");
208 "EnableHardwareAcceleratedVideoEncoder");
210 "RequireHardwareAcceleratedVideoEncoder");
212 "EnableLowLatencyRateControl");
215 "MaximizePowerEfficiency");
217 "ReferenceBufferCount");
223#define H264_PROFILE_CONSTRAINED_HIGH (AV_PROFILE_H264_HIGH | AV_PROFILE_H264_CONSTRAINED)
310 CFStringRef encoder_id =
NULL;
312 CFIndex length, max_size;
315 status = VTSessionCopyProperty(vtctx->
session,
323 length = CFStringGetLength(encoder_id);
324 max_size = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8);
327 CFRelease(encoder_id);
331 CFStringGetCString(encoder_id,
334 kCFStringEncodingUTF8);
337 CFRelease(encoder_id);
344 CFStringRef profile_level,
345 CFNumberRef gamma_level,
346 CFDictionaryRef enc_info,
347 CFDictionaryRef pixel_buffer_info);
473 CMSampleBufferRef sample_buffer,
480 size_t src_size = CMSampleBufferGetTotalSampleSize(sample_buffer);
481 CMBlockBufferRef
block = CMSampleBufferGetDataBuffer(sample_buffer);
483 if (length_code_size > 4)
486 while (
offset < src_size) {
491 status = CMBlockBufferCopyDataBytes(
block,
496 if (status != kCMBlockBufferNoErr) {
500 for (
i = 0;
i < length_code_size;
i++) {
502 box_len |= size_buf[
i];
505 curr_src_len = box_len + length_code_size;
517 double alpha_quality)
532 return MKBETAG(
'a',
'p',
'c',
'o');
534 return MKBETAG(
'a',
'p',
'c',
's');
536 return MKBETAG(
'a',
'p',
'c',
'n');
538 return MKBETAG(
'a',
'p',
'c',
'h');
540 return MKBETAG(
'a',
'p',
'4',
'h');
542 return MKBETAG(
'a',
'p',
'4',
'x');
550 desc->log2_chroma_w == 0))
551 return MKBETAG(
'a',
'p',
'4',
'h');
553 return MKBETAG(
'a',
'p',
'c',
'n');
569 CMVideoFormatDescriptionRef vid_fmt,
573 size_t total_size = 0;
575 int is_count_bad = 0;
590 for (
i = 0;
i < ps_count || is_count_bad;
i++) {
604 if (
i > 0 && is_count_bad) status = 0;
623 CMVideoFormatDescriptionRef vid_fmt,
629 int is_count_bad = 0;
647 for (
i = 0;
i < ps_count || is_count_bad;
i++) {
659 if (
i > 0 && is_count_bad) status = 0;
665 if (dst_size < next_offset) {
688 CMVideoFormatDescriptionRef vid_fmt;
692 vid_fmt = CMSampleBufferGetFormatDescription(sample_buffer);
718 CFDataRef
data = CMFormatDescriptionGetExtension(vid_fmt, kCMFormatDescriptionExtension_VerbatimSampleDescription);
719 if (
data && CFGetTypeID(
data) == CFDataGetTypeID()) {
720 CFIndex
size = CFDataGetLength(
data);
736 void *sourceFrameCtx,
738 VTEncodeInfoFlags
flags,
739 CMSampleBufferRef sample_buffer)
743 BufNode *info = sourceFrameCtx;
758 if (!sample_buffer) {
762 CFRetain(sample_buffer);
779 CMSampleBufferRef sample_buffer,
783 CMVideoFormatDescriptionRef vid_fmt;
787 vid_fmt = CMSampleBufferGetFormatDescription(sample_buffer);
815 CFStringRef *profile_level_val)
825 *profile_level_val =
NULL;
832 switch (vtctx->
level) {
833 case 0: *profile_level_val =
834 compat_keys.kVTProfileLevel_H264_Baseline_AutoLevel;
break;
835 case 13: *profile_level_val = kVTProfileLevel_H264_Baseline_1_3;
break;
836 case 30: *profile_level_val = kVTProfileLevel_H264_Baseline_3_0;
break;
837 case 31: *profile_level_val = kVTProfileLevel_H264_Baseline_3_1;
break;
838 case 32: *profile_level_val = kVTProfileLevel_H264_Baseline_3_2;
break;
839 case 40: *profile_level_val =
840 compat_keys.kVTProfileLevel_H264_Baseline_4_0;
break;
841 case 41: *profile_level_val = kVTProfileLevel_H264_Baseline_4_1;
break;
842 case 42: *profile_level_val =
843 compat_keys.kVTProfileLevel_H264_Baseline_4_2;
break;
844 case 50: *profile_level_val =
845 compat_keys.kVTProfileLevel_H264_Baseline_5_0;
break;
846 case 51: *profile_level_val =
847 compat_keys.kVTProfileLevel_H264_Baseline_5_1;
break;
848 case 52: *profile_level_val =
849 compat_keys.kVTProfileLevel_H264_Baseline_5_2;
break;
854 *profile_level_val =
compat_keys.kVTProfileLevel_H264_ConstrainedBaseline_AutoLevel;
856 if (vtctx->
level != 0) {
859 "Level is auto-selected when constrained-baseline "
860 "profile is used. The output may be encoded with a "
861 "different level.\n");
866 switch (vtctx->
level) {
867 case 0: *profile_level_val =
868 compat_keys.kVTProfileLevel_H264_Main_AutoLevel;
break;
869 case 30: *profile_level_val = kVTProfileLevel_H264_Main_3_0;
break;
870 case 31: *profile_level_val = kVTProfileLevel_H264_Main_3_1;
break;
871 case 32: *profile_level_val = kVTProfileLevel_H264_Main_3_2;
break;
872 case 40: *profile_level_val = kVTProfileLevel_H264_Main_4_0;
break;
873 case 41: *profile_level_val = kVTProfileLevel_H264_Main_4_1;
break;
874 case 42: *profile_level_val =
876 case 50: *profile_level_val = kVTProfileLevel_H264_Main_5_0;
break;
877 case 51: *profile_level_val =
879 case 52: *profile_level_val =
885 *profile_level_val =
compat_keys.kVTProfileLevel_H264_ConstrainedHigh_AutoLevel;
887 if (vtctx->
level != 0) {
890 "Level is auto-selected when constrained-high profile "
891 "is used. The output may be encoded with a different "
897 switch (vtctx->
level) {
898 case 0: *profile_level_val =
899 compat_keys.kVTProfileLevel_H264_High_AutoLevel;
break;
900 case 30: *profile_level_val =
902 case 31: *profile_level_val =
904 case 32: *profile_level_val =
906 case 40: *profile_level_val =
908 case 41: *profile_level_val =
910 case 42: *profile_level_val =
912 case 50: *profile_level_val = kVTProfileLevel_H264_High_5_0;
break;
913 case 51: *profile_level_val =
915 case 52: *profile_level_val =
920 switch (vtctx->
level) {
921 case 0: *profile_level_val =
922 compat_keys.kVTProfileLevel_H264_Extended_AutoLevel;
break;
923 case 50: *profile_level_val =
924 compat_keys.kVTProfileLevel_H264_Extended_5_0;
break;
929 if (!*profile_level_val) {
944 CFStringRef *profile_level_val)
953 *profile_level_val =
NULL;
967 "main profile with %d bit input\n",
bit_depth);
974 "Invalid main10 profile with %d bit input\n",
bit_depth);
983 compat_keys.kVTProfileLevel_HEVC_Main42210_AutoLevel;
987 if (!*profile_level_val) {
998 int* av_pixel_format,
1001 const char *range_name;
1007 if (*av_pixel_format)
1012 "Could not get pixel format for color format '%s' range '%s'.\n",
1014 range_name ? range_name :
"Unknown");
1023 CFDictionarySetValue(dict,
1024 kCVImageBufferColorPrimariesKey,
1029 CFDictionarySetValue(dict,
1030 kCVImageBufferTransferFunctionKey,
1035 CFDictionarySetValue(dict,
1036 kCVImageBufferYCbCrMatrixKey,
1042 CFMutableDictionaryRef* dict)
1044 CFNumberRef cv_color_format_num =
NULL;
1045 CFNumberRef width_num =
NULL;
1046 CFNumberRef height_num =
NULL;
1047 CFMutableDictionaryRef pixel_buffer_info =
NULL;
1048 int cv_color_format;
1054 if (status)
return status;
1056 pixel_buffer_info = CFDictionaryCreateMutable(
1057 kCFAllocatorDefault,
1059 &kCFCopyStringDictionaryKeyCallBacks,
1060 &kCFTypeDictionaryValueCallBacks);
1062 if (!pixel_buffer_info)
goto pbinfo_nomem;
1064 cv_color_format_num = CFNumberCreate(kCFAllocatorDefault,
1065 kCFNumberSInt32Type,
1067 if (!cv_color_format_num)
goto pbinfo_nomem;
1069 CFDictionarySetValue(pixel_buffer_info,
1070 kCVPixelBufferPixelFormatTypeKey,
1071 cv_color_format_num);
1074 width_num = CFNumberCreate(kCFAllocatorDefault,
1075 kCFNumberSInt32Type,
1077 if (!width_num)
goto pbinfo_nomem;
1079 CFDictionarySetValue(pixel_buffer_info,
1080 kCVPixelBufferWidthKey,
1084 height_num = CFNumberCreate(kCFAllocatorDefault,
1085 kCFNumberSInt32Type,
1087 if (!height_num)
goto pbinfo_nomem;
1089 CFDictionarySetValue(pixel_buffer_info,
1090 kCVPixelBufferHeightKey,
1096 *dict = pixel_buffer_info;
1103 if (pixel_buffer_info) CFRelease(pixel_buffer_info);
1109 CFNumberRef *gamma_level)
1113 *gamma_level =
NULL;
1121 *gamma_level = CFNumberCreate(
NULL, kCFNumberFloat32Type, &gamma);
1133 const char *print_option_name,
1139 if (status == kVTPropertyNotSupportedErr) {
1142 "This device does not support the %s option. Value ignored.\n",
1144 }
else if (status != 0) {
1147 "Error setting %s: Error %d\n",
1155 const char* print_option_name,
1157 CFNumberRef value_cfnum = CFNumberCreate(kCFAllocatorDefault,
1161 if (value_cfnum ==
NULL) {
1167 CFRelease(value_cfnum);
1174 CFStringRef profile_level,
1175 CFNumberRef gamma_level,
1176 CFDictionaryRef enc_info,
1177 CFDictionaryRef pixel_buffer_info,
1178 bool constant_bit_rate,
1179 VTCompressionSessionRef *session)
1184 CFNumberRef bit_rate_num;
1185 CFNumberRef bytes_per_second;
1186 CFNumberRef one_second;
1187 CFArrayRef data_rate_limits;
1188 int64_t bytes_per_second_value = 0;
1192 int status = VTCompressionSessionCreate(kCFAllocatorDefault,
1198 kCFAllocatorDefault,
1203 if (status || !vtctx->
session) {
1206#if !TARGET_OS_IPHONE
1208 av_log(avctx,
AV_LOG_ERROR,
"Try -allow_sw 1. The hardware encoder may be busy, or not supported.\n");
1215#if defined (MAC_OS_X_VERSION_10_13) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13)
1216 if (__builtin_available(macOS 10.13, iOS 11.0, *)) {
1221 status = VTCopySupportedPropertyDictionaryForEncoder(avctx->
width,
1228 if (status != noErr) {
1240 av_log(avctx,
AV_LOG_ERROR,
"-q:v qscale not available for encoder. Use -b:v bitrate instead.\n");
1248 CFNumberRef quality_num = CFNumberCreate(kCFAllocatorDefault,
1249 kCFNumberFloat32Type,
1251 if (!quality_num)
return AVERROR(ENOMEM);
1253 status = VTSessionSetProperty(vtctx->
session,
1254 kVTCompressionPropertyKey_Quality,
1256 CFRelease(quality_num);
1258 bit_rate_num = CFNumberCreate(kCFAllocatorDefault,
1259 kCFNumberSInt32Type,
1261 if (!bit_rate_num)
return AVERROR(ENOMEM);
1263 if (constant_bit_rate) {
1264 status = VTSessionSetProperty(vtctx->
session,
1265 compat_keys.kVTCompressionPropertyKey_ConstantBitRate,
1267 if (status == kVTPropertyNotSupportedErr) {
1268 av_log(avctx,
AV_LOG_ERROR,
"-constant_bit_rate true is not supported by the encoder.\n");
1272 status = VTSessionSetProperty(vtctx->
session,
1273 kVTCompressionPropertyKey_AverageBitRate,
1277 CFRelease(bit_rate_num);
1286 status = VTSessionSetProperty(vtctx->
session,
1287 compat_keys.kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality,
1288 vtctx->
prio_speed ? kCFBooleanTrue : kCFBooleanFalse);
1290 av_log(avctx,
AV_LOG_WARNING,
"PrioritizeEncodingSpeedOverQuality property is not supported on this device. Ignoring.\n");
1296 bytes_per_second_value = max_rate >> 3;
1297 bytes_per_second = CFNumberCreate(kCFAllocatorDefault,
1298 kCFNumberSInt64Type,
1299 &bytes_per_second_value);
1300 if (!bytes_per_second) {
1303 one_second_value = 1;
1304 one_second = CFNumberCreate(kCFAllocatorDefault,
1305 kCFNumberSInt64Type,
1308 CFRelease(bytes_per_second);
1311 nums[0] = (
void *)bytes_per_second;
1312 nums[1] = (
void *)one_second;
1313 data_rate_limits = CFArrayCreate(kCFAllocatorDefault,
1314 (
const void **)nums,
1316 &kCFTypeArrayCallBacks);
1318 if (!data_rate_limits) {
1319 CFRelease(bytes_per_second);
1320 CFRelease(one_second);
1323 status = VTSessionSetProperty(vtctx->
session,
1324 kVTCompressionPropertyKey_DataRateLimits,
1327 CFRelease(bytes_per_second);
1328 CFRelease(one_second);
1329 CFRelease(data_rate_limits);
1345 CFNumberRef alpha_quality_num = CFNumberCreate(kCFAllocatorDefault,
1346 kCFNumberDoubleType,
1348 if (!alpha_quality_num)
return AVERROR(ENOMEM);
1350 status = VTSessionSetProperty(vtctx->
session,
1351 compat_keys.kVTCompressionPropertyKey_TargetQualityForAlpha,
1353 CFRelease(alpha_quality_num);
1358 "Error setting alpha quality: %d\n",
1364 if (profile_level) {
1365 status = VTSessionSetProperty(vtctx->
session,
1366 kVTCompressionPropertyKey_ProfileLevel,
1369 av_log(avctx,
AV_LOG_ERROR,
"Error setting profile/level property: %d. Output will be encoded using a supported profile/level combination.\n", status);
1374 CFNumberRef interval = CFNumberCreate(kCFAllocatorDefault,
1381 status = VTSessionSetProperty(vtctx->
session,
1382 kVTCompressionPropertyKey_MaxKeyFrameInterval,
1384 CFRelease(interval);
1387 av_log(avctx,
AV_LOG_ERROR,
"Error setting 'max key-frame interval' property: %d\n", status);
1393 status = VTSessionSetProperty(vtctx->
session,
1394 kVTCompressionPropertyKey_MoreFramesBeforeStart,
1397 if (status == kVTPropertyNotSupportedErr) {
1398 av_log(avctx,
AV_LOG_WARNING,
"frames_before property is not supported on this device. Ignoring.\n");
1399 }
else if (status) {
1405 status = VTSessionSetProperty(vtctx->
session,
1406 kVTCompressionPropertyKey_MoreFramesAfterEnd,
1409 if (status == kVTPropertyNotSupportedErr) {
1410 av_log(avctx,
AV_LOG_WARNING,
"frames_after property is not supported on this device. Ignoring.\n");
1411 }
else if (status) {
1419 CFMutableDictionaryRef par;
1426 num = CFNumberCreate(kCFAllocatorDefault,
1430 den = CFNumberCreate(kCFAllocatorDefault,
1436 par = CFDictionaryCreateMutable(kCFAllocatorDefault,
1438 &kCFCopyStringDictionaryKeyCallBacks,
1439 &kCFTypeDictionaryValueCallBacks);
1441 if (!par || !num || !den) {
1442 if (par) CFRelease(par);
1443 if (num) CFRelease(num);
1444 if (den) CFRelease(den);
1449 CFDictionarySetValue(
1451 kCMFormatDescriptionKey_PixelAspectRatioHorizontalSpacing,
1454 CFDictionarySetValue(
1456 kCMFormatDescriptionKey_PixelAspectRatioVerticalSpacing,
1459 status = VTSessionSetProperty(vtctx->
session,
1460 kVTCompressionPropertyKey_PixelAspectRatio,
1470 "Error setting pixel aspect ratio to %d:%d: %d.\n",
1481 status = VTSessionSetProperty(vtctx->
session,
1482 kVTCompressionPropertyKey_TransferFunction,
1492 status = VTSessionSetProperty(vtctx->
session,
1493 kVTCompressionPropertyKey_YCbCrMatrix,
1503 status = VTSessionSetProperty(vtctx->
session,
1504 kVTCompressionPropertyKey_ColorPrimaries,
1513 status = VTSessionSetProperty(vtctx->
session,
1514 kCVImageBufferGammaLevelKey,
1523 status = VTSessionSetProperty(vtctx->
session,
1524 kVTCompressionPropertyKey_AllowFrameReordering,
1528 av_log(avctx,
AV_LOG_ERROR,
"Error setting 'allow frame reordering' property: %d\n", status);
1538 status = VTSessionSetProperty(vtctx->
session,
1539 compat_keys.kVTCompressionPropertyKey_H264EntropyMode,
1548 status = VTSessionSetProperty(vtctx->
session,
1550 vtctx->
realtime ? kCFBooleanTrue : kCFBooleanFalse);
1559 compat_keys.kVTCompressionPropertyKey_AllowOpenGOP,
1564 if (avctx->
qmin >= 0) {
1566 compat_keys.kVTCompressionPropertyKey_MinAllowedFrameQP,
1575 if (avctx->
qmax >= 0) {
1577 compat_keys.kVTCompressionPropertyKey_MaxAllowedFrameQP,
1588 kVTCompressionPropertyKey_MaxH264SliceBytes,
1599 compat_keys.kVTCompressionPropertyKey_MaximizePowerEfficiency,
1606 compat_keys.kVTCompressionPropertyKey_ReferenceBufferCount,
1617 compat_keys.kVTCompressionPropertyKey_SpatialAdaptiveQPLevel,
1622 status = VTCompressionSessionPrepareToEncodeFrames(vtctx->
session);
1633 CFMutableDictionaryRef enc_info;
1634 CFMutableDictionaryRef pixel_buffer_info =
NULL;
1637 CFStringRef profile_level =
NULL;
1638 CFNumberRef gamma_level =
NULL;
1647#if defined(MAC_OS_X_VERSION_10_9) && !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9)
1649 if (__builtin_available(macOS 10.10, *)) {
1650 VTRegisterProfessionalVideoWorkflowVideoEncoders();
1662 av_log(avctx,
AV_LOG_WARNING,
"Cannot use B-frames with baseline profile. Output will not contain B-frames.\n");
1667 av_log(avctx,
AV_LOG_WARNING,
"CABAC entropy requires 'main' or 'high' profile, but baseline was requested. Encode will not use CABAC entropy.\n");
1682 enc_info = CFDictionaryCreateMutable(
1683 kCFAllocatorDefault,
1685 &kCFCopyStringDictionaryKeyCallBacks,
1686 &kCFTypeDictionaryValueCallBacks
1689 if (!enc_info)
return AVERROR(ENOMEM);
1691#if !TARGET_OS_IPHONE
1693 CFDictionarySetValue(enc_info,
1694 compat_keys.kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
1697 CFDictionarySetValue(enc_info,
1698 compat_keys.kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder,
1701 CFDictionarySetValue(enc_info,
1702 compat_keys.kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
1712 "please specify bitrate explicitly\n");
1716 CFDictionarySetValue(enc_info,
1717 compat_keys.kVTVideoEncoderSpecification_EnableLowLatencyRateControl,
1757 CFRelease(gamma_level);
1759 if (pixel_buffer_info)
1760 CFRelease(pixel_buffer_info);
1762 CFRelease(enc_info);
1770 CFBooleanRef has_b_frames_cfbool;
1782 if (status)
return status;
1784 status = VTSessionCopyProperty(vtctx->
session,
1785 kVTCompressionPropertyKey_AllowFrameReordering,
1786 kCFAllocatorDefault,
1787 &has_b_frames_cfbool);
1789 if (!status && has_b_frames_cfbool) {
1792 if (CFBooleanGetValue(has_b_frames_cfbool))
1796 CFRelease(has_b_frames_cfbool);
1805 CFArrayRef attachments;
1806 CFDictionaryRef attachment;
1807 CFBooleanRef not_sync;
1810 attachments = CMSampleBufferGetSampleAttachmentsArray(
buffer,
false);
1811 len = !attachments ? 0 : CFArrayGetCount(attachments);
1814 *is_key_frame =
true;
1818 attachment = CFArrayGetValueAtIndex(attachments, 0);
1820 if (CFDictionaryGetValueIfPresent(attachment,
1821 kCMSampleAttachmentKey_NotSync,
1822 (
const void **)¬_sync))
1824 *is_key_frame = !CFBooleanGetValue(not_sync);
1826 *is_key_frame =
true;
1847 size_t sei_payload_size = 0;
1848 uint8_t *nal_start = nal_data;
1854 nal_type = *nal_data & 0x1F;
1861 if (nal_data[nal_size - 1] == 0x80)
1864 while (nal_size > 0 && *nal_data > 0) {
1868 }
while (nal_size > 0 && *nal_data == 0xFF);
1876 sei_payload_size += *nal_data;
1879 }
while (nal_size > 0 && *nal_data == 0xFF);
1881 if (nal_size < sei_payload_size) {
1886 nal_data += sei_payload_size;
1887 nal_size -= sei_payload_size;
1890 *sei_end = nal_data;
1892 return nal_data - nal_start + 1;
1912 uint8_t* dst_end =
dst + dst_size;
1913 const uint8_t* src_end =
src + src_size;
1914 int start_at = dst_offset > 2 ? dst_offset - 2 : 0;
1916 for (
i = start_at;
i < dst_offset &&
i < dst_size;
i++) {
1927 int insert_ep3_byte = *
src <= 3;
1928 if (insert_ep3_byte) {
1946 wrote_bytes =
dst - dst_start;
1949 return -wrote_bytes;
1959 uint8_t *sei_start =
dst;
1960 size_t remaining_sei_size =
sei->size;
1961 size_t remaining_dst_size = dst_size;
1966 if (!remaining_dst_size)
1969 while (sei_type && remaining_dst_size != 0) {
1970 int sei_byte = sei_type > 255 ? 255 : sei_type;
1973 sei_type -= sei_byte;
1975 remaining_dst_size--;
1981 while (remaining_sei_size && remaining_dst_size != 0) {
1982 int size_byte = remaining_sei_size > 255 ? 255 : remaining_sei_size;
1985 remaining_sei_size -= size_byte;
1987 remaining_dst_size--;
1990 if (remaining_dst_size < sei->
size)
1993 header_bytes =
dst - sei_start;
2001 if (bytes_written < 0)
2004 bytes_written += header_bytes;
2005 return bytes_written;
2029 size_t length_code_size,
2030 CMSampleBufferRef sample_buffer,
2035 size_t src_size = CMSampleBufferGetTotalSampleSize(sample_buffer);
2036 size_t remaining_src_size = src_size;
2037 size_t remaining_dst_size = dst_size;
2038 size_t src_offset = 0;
2041 uint8_t size_buf[4];
2043 CMBlockBufferRef
block = CMSampleBufferGetDataBuffer(sample_buffer);
2045 if (length_code_size > 4) {
2049 while (remaining_src_size > 0) {
2050 size_t curr_src_len;
2051 size_t curr_dst_len;
2057 status = CMBlockBufferCopyDataBytes(
block,
2066 status = CMBlockBufferCopyDataBytes(
block,
2067 src_offset + length_code_size,
2078 for (
i = 0;
i < length_code_size;
i++) {
2080 box_len |= size_buf[
i];
2093 remaining_dst_size--;
2098 remaining_dst_size);
2100 if (wrote_bytes < 0)
2103 remaining_dst_size -= wrote_bytes;
2104 dst_data += wrote_bytes;
2106 if (remaining_dst_size <= 0)
2112 remaining_dst_size--;
2117 curr_src_len = box_len + length_code_size;
2120 if (remaining_src_size < curr_src_len) {
2124 if (remaining_dst_size < curr_dst_len) {
2131 status = CMBlockBufferCopyDataBytes(
block,
2132 src_offset + length_code_size,
2147 old_sei_length =
find_sei_end(avctx, dst_box, box_len, &new_sei);
2148 if (old_sei_length < 0)
2149 return old_sei_length;
2154 remaining_dst_size - old_sei_length);
2155 if (wrote_bytes < 0)
2158 if (new_sei + wrote_bytes >= dst_data + remaining_dst_size)
2161 new_sei[wrote_bytes++] = 0x80;
2162 extra_bytes = wrote_bytes - (dst_box + box_len - new_sei);
2164 dst_data += extra_bytes;
2165 remaining_dst_size -= extra_bytes;
2170 src_offset += curr_src_len;
2171 dst_data += curr_dst_len;
2173 remaining_src_size -= curr_src_len;
2174 remaining_dst_size -= curr_dst_len;
2195 if ((
sei->size % 255) == 0)
2198 return copied_size +
sei->size / 255 + 1 +
type / 255 + 1;
2203 CMSampleBufferRef sample_buffer,
2212 size_t length_code_size;
2213 size_t header_size = 0;
2215 size_t out_buf_size;
2216 size_t sei_nalu_size = 0;
2221 CMVideoFormatDescriptionRef vid_fmt;
2227 if (status)
return status;
2232 vid_fmt = CMSampleBufferGetFormatDescription(sample_buffer);
2239 if (status)
return status;
2242 status =
count_nalus(length_code_size, sample_buffer, &nalu_count);
2250 sei_nalu_size =
sizeof(
start_code) + 1 + msg_size + 1;
2253 in_buf_size = CMSampleBufferGetTotalSampleSize(sample_buffer);
2254 out_buf_size = header_size +
2257 nalu_count * ((int)
sizeof(
start_code) - (int)length_code_size);
2265 if(status)
return status;
2273 pkt->data + header_size,
2274 pkt->size - header_size
2283 CMBlockBufferRef buf = CMSampleBufferGetDataBuffer(sample_buffer);
2289 len = CMBlockBufferGetDataLength(buf);
2295 status = CMBlockBufferCopyDataBytes(buf, 0,
len,
pkt->data);
2306 pts = CMSampleBufferGetPresentationTimeStamp(sample_buffer);
2307 dts = CMSampleBufferGetDecodeTimeStamp (sample_buffer);
2309 if (CMTIME_IS_INVALID(
pts)) {
2314 if (CMTIME_IS_INVALID(dts)) {
2333 CVPixelBufferRef cv_img)
2338 size_t num_cv_plane = CVPixelBufferIsPlanar(cv_img) ?
2339 CVPixelBufferGetPlaneCount(cv_img) : 1;
2340 if (num_planes != num_cv_plane) {
2342 "Different number of planes in AVFrame and CVPixelBuffer.\n");
2346 status = CVPixelBufferLockBaseAddress(cv_img, 0);
2348 av_log(avctx,
AV_LOG_ERROR,
"Could not lock base address of CVPixelBuffer: %d.\n", status);
2352 int dst_stride[4] = {0};
2353 uint8_t *dst_addr[4] = {0};
2354 for (
int i = 0;
i < num_planes;
i++) {
2355 dst_addr[
i] = (uint8_t*)CVPixelBufferGetBaseAddressOfPlane(cv_img,
i);
2356 dst_stride[
i] = CVPixelBufferGetBytesPerRowOfPlane(cv_img,
i);
2361 status = CVPixelBufferUnlockBaseAddress(cv_img, 0);
2363 av_log(avctx,
AV_LOG_ERROR,
"Could not unlock CVPixelBuffer base address: %d.\n", status);
2372 CVPixelBufferRef *cv_img,
2376 CVPixelBufferPoolRef pix_buf_pool;
2382 *cv_img = (CVPixelBufferRef)
frame->data[3];
2386 if (
frame->buf[0]) {
2397 &(
int) {0}, &range_guessed);
2403 if (range_guessed) {
2411 pix_buf_pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2412 if (!pix_buf_pool) {
2419 vtstatus = VTCompressionSessionPrepareToEncodeFrames(vtctx->
session);
2420 if (vtstatus == kVTInvalidSessionErr) {
2425 pix_buf_pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2427 if (!pix_buf_pool) {
2433 "kVTInvalidSessionErr error.\n");
2436 status = CVPixelBufferPoolCreatePixelBuffer(
NULL,
2442 av_log(avctx,
AV_LOG_ERROR,
"Could not create pixel buffer from pool: %d.\n", status);
2457 CFDictionaryRef* dict_out)
2459 CFDictionaryRef dict =
NULL;
2461 const void *keys[] = { kVTEncodeFrameOptionKey_ForceKeyFrame };
2462 const void *vals[] = { kCFBooleanTrue };
2464 dict = CFDictionaryCreate(
NULL, keys, vals, 1,
NULL,
NULL);
2465 if(!dict)
return AVERROR(ENOMEM);
2477 CFDictionaryRef frame_dict =
NULL;
2478 CVPixelBufferRef cv_img =
NULL;
2496 if (vtctx->
a53_cc && side_data && side_data->
size) {
2505 status = VTCompressionSessionEncodeFrame(
2524 CFRelease(frame_dict);
2542 CMSampleBufferRef buf =
NULL;
2563 status = VTCompressionSessionCompleteFrames(vtctx->
session,
2581 if (status)
goto end_nopkt;
2582 if (!buf)
goto end_nopkt;
2587 if (status)
goto end_nopkt;
2599 CFStringRef profile_level,
2600 CFNumberRef gamma_level,
2601 CFDictionaryRef enc_info,
2602 CFDictionaryRef pixel_buffer_info)
2606 CVPixelBufferPoolRef pool =
NULL;
2607 CVPixelBufferRef pix_buf =
NULL;
2609 CMSampleBufferRef buf =
NULL;
2626 pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2633 status = CVPixelBufferPoolCreatePixelBuffer(
NULL,
2637 if(status != kCVReturnSuccess){
2644 status = VTCompressionSessionEncodeFrame(vtctx->
session,
2655 "Error sending frame for extradata: %d\n",
2663 status = VTCompressionSessionCompleteFrames(vtctx->
session,
2682 CVPixelBufferRelease(pix_buf);
2710 VTCompressionSessionCompleteFrames(vtctx->
session,
2742#ifdef kCFCoreFoundationVersionNumber10_7
2747#if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
2750#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8BIPLANARVIDEORANGE
2753#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR10BIPLANARVIDEORANGE
2756#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR16BIPLANARVIDEORANGE
2759#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR8BIPLANARVIDEORANGE
2762#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR10BIPLANARVIDEORANGE
2765#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
2772#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
2773#define COMMON_OPTIONS \
2774 { "allow_sw", "Allow software encoding", OFFSET(allow_sw), AV_OPT_TYPE_BOOL, \
2775 { .i64 = 0 }, 0, 1, VE }, \
2776 { "require_sw", "Require software encoding", OFFSET(require_sw), AV_OPT_TYPE_BOOL, \
2777 { .i64 = 0 }, 0, 1, VE }, \
2778 { "realtime", "Hint that encoding should happen in real-time if not faster (e.g. capturing from camera).", \
2779 OFFSET(realtime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, -1, 1, VE }, \
2780 { "frames_before", "Other frames will come before the frames in this session. This helps smooth concatenation issues.", \
2781 OFFSET(frames_before), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \
2782 { "frames_after", "Other frames will come after the frames in this session. This helps smooth concatenation issues.", \
2783 OFFSET(frames_after), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \
2784 { "prio_speed", "prioritize encoding speed", OFFSET(prio_speed), AV_OPT_TYPE_BOOL, \
2785 { .i64 = -1 }, -1, 1, VE }, \
2786 { "power_efficient", "Set to 1 to enable more power-efficient encoding if supported.", \
2787 OFFSET(power_efficient), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
2788 { "spatial_aq", "Set to 1 to enable spatial AQ if supported.", \
2789 OFFSET(spatialaq), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
2790 { "max_ref_frames", \
2791 "Sets the maximum number of reference frames. This only has an effect when the value is less than the maximum allowed by the profile/level.", \
2792 OFFSET(max_ref_frames), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
2799#define OFFSET(x) offsetof(VTEncContext, x)
2810 {
"1.3",
"Level 1.3, only available with Baseline Profile", 0,
AV_OPT_TYPE_CONST, { .i64 = 13 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2811 {
"3.0",
"Level 3.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 30 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2812 {
"3.1",
"Level 3.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 31 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2813 {
"3.2",
"Level 3.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 32 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2814 {
"4.0",
"Level 4.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 40 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2815 {
"4.1",
"Level 4.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 41 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2816 {
"4.2",
"Level 4.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 42 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2817 {
"5.0",
"Level 5.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 50 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2818 {
"5.1",
"Level 5.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 51 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2819 {
"5.2",
"Level 5.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 52 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2829 {
"constant_bit_rate",
"Require constant bit rate (macOS 13 or newer)",
OFFSET(constant_bit_rate),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
2830 {
"max_slice_bytes",
"Set the maximum number of bytes in an H.264 slice.",
OFFSET(max_slice_bytes),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX,
VE },
2843 .class_name =
"h264_videotoolbox",
2850 .p.name =
"h264_videotoolbox",
2864 .p.wrapper_name =
"videotoolbox",
2875 {
"alpha_quality",
"Compression quality for the alpha channel",
OFFSET(alpha_quality),
AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 0.0, 1.0,
VE },
2877 {
"constant_bit_rate",
"Require constant bit rate (macOS 13 or newer)",
OFFSET(constant_bit_rate),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
2884 .class_name =
"hevc_videotoolbox",
2891 .p.name =
"hevc_videotoolbox",
2906 .p.wrapper_name =
"videotoolbox",
2925 .class_name =
"prores_videotoolbox",
2932 .p.name =
"prores_videotoolbox",
2947 .p.wrapper_name =
"videotoolbox",
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
const FFCodec ff_h264_videotoolbox_encoder
const FFCodec ff_hevc_videotoolbox_encoder
const FFCodec ff_prores_videotoolbox_encoder
static AVFormatContext * ctx
int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len, void **data, size_t *sei_size)
Check AVFrame for A53 side data and allocate and fill SEI message with A53 info.
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static int FUNC sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)
#define CODEC_PIXFMTS_ARRAY(array)
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define AV_PROFILE_PRORES_STANDARD
#define AV_PROFILE_PRORES_4444
#define AV_PROFILE_H264_MAIN
#define AV_PROFILE_PRORES_LT
#define AV_PROFILE_H264_EXTENDED
#define AV_PROFILE_UNKNOWN
#define AV_PROFILE_PRORES_PROXY
#define AV_PROFILE_HEVC_REXT
#define AV_PROFILE_HEVC_MAIN
#define AV_PROFILE_HEVC_MAIN_10
#define AV_PROFILE_H264_HIGH
#define AV_PROFILE_H264_CONSTRAINED_BASELINE
#define AV_PROFILE_PRORES_XQ
#define AV_PROFILE_PRORES_HQ
#define AV_PROFILE_H264_BASELINE
float fminf(float, float)
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define AV_CODEC_FLAG_CLOSED_GOP
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_CODEC_CAP_HYBRID
Codec is potentially backed by a hardware implementation, but not necessarily.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
#define AVERROR_BUFFER_TOO_SMALL
Buffer too small.
#define AVERROR_EXTERNAL
Generic error in an external library.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
@ AV_FRAME_DATA_A53_CC
ATSC A53 Part 4 Closed Captions.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
static void av_image_copy2(uint8_t *const dst_data[4], const int dst_linesizes[4], uint8_t *const src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Wrapper around av_image_copy() to workaround the limitation that the conversion from uint8_t * const ...
@ AV_PICTURE_TYPE_I
Intra.
#define LIBAVUTIL_VERSION_INT
H.264 common definitions.
#define HW_CONFIG_ENCODER_FRAMES(format, device_type_)
CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space)
Convert an AVColorSpace to a VideoToolbox/CoreVideo color matrix string.
CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri)
Convert an AVColorPrimaries to a VideoToolbox/CoreVideo color primaries string.
uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range)
Same as av_map_videotoolbox_format_from_pixfmt function, but can map and return full range pixel form...
CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc)
Convert an AVColorTransferCharacteristic to a VideoToolbox/CoreVideo color transfer function string.
An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX.
static const AVOption h264_options[]
common internal api header.
static const int factor[16]
Macro definitions for various function/variable attributes.
#define MKBETAG(a, b, c, d)
Memory handling functions.
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
static av_always_inline int pthread_mutex_lock(pthread_mutex_t *mutex)
static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond)
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
#define PTHREAD_ONCE_INIT
static av_always_inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
static av_always_inline int pthread_once(pthread_once_t *once_control, void(*init_routine)(void))
static av_always_inline int pthread_mutex_unlock(pthread_mutex_t *mutex)
static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex)
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
const char * av_color_range_name(enum AVColorRange range)
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
AVColorRange
Visual content value range.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AVCOL_RANGE_JPEG
Full range content.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_P010LE
like NV12, with 10bpp per component, data in the high bits, zeros in the low bits,...
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_AYUV
packed AYUV 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), AYUVAYUV...
AVColorTransferCharacteristic
Color Transfer Characteristic.
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
#define AV_PIX_FMT_AYUV64
enum AVMediaType codec_type
@ SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35
A reference to a data buffer.
Describe the class of an AVClass context structure.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
int global_quality
Global quality for codecs which cannot change it per frame.
enum AVColorRange color_range
MPEG vs JPEG YUV range.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
int qmin
minimum quantizer
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
int has_b_frames
Size of the frame reordering buffer in the decoder.
int64_t bit_rate
the average bitrate
enum AVColorSpace colorspace
YUV colorspace type.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int64_t rc_max_rate
maximum bitrate
int qmax
maximum quantizer
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
int flags
AV_CODEC_FLAG_*.
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Structure to hold side data for an AVFrame.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
uint64_t flags
Combination of AV_PIX_FMT_FLAG_... flags.
Rational number (pair of numerator and denominator).
CMSampleBufferRef cm_buffer
pthread_cond_t cv_sample_sent
CFStringRef transfer_function
getParameterSetAtIndex get_param_set_func
CFDictionaryRef supported_props
VTCompressionSessionRef session
CFStringRef color_primaries
static int get_frame(AVFilterContext *ctx, int is_second)
static const uint8_t quality[]