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) {
763 CFRetain(sample_buffer);
780 CMSampleBufferRef sample_buffer,
784 CMVideoFormatDescriptionRef vid_fmt;
788 vid_fmt = CMSampleBufferGetFormatDescription(sample_buffer);
816 CFStringRef *profile_level_val)
826 *profile_level_val =
NULL;
833 switch (vtctx->
level) {
834 case 0: *profile_level_val =
835 compat_keys.kVTProfileLevel_H264_Baseline_AutoLevel;
break;
836 case 13: *profile_level_val = kVTProfileLevel_H264_Baseline_1_3;
break;
837 case 30: *profile_level_val = kVTProfileLevel_H264_Baseline_3_0;
break;
838 case 31: *profile_level_val = kVTProfileLevel_H264_Baseline_3_1;
break;
839 case 32: *profile_level_val = kVTProfileLevel_H264_Baseline_3_2;
break;
840 case 40: *profile_level_val =
841 compat_keys.kVTProfileLevel_H264_Baseline_4_0;
break;
842 case 41: *profile_level_val = kVTProfileLevel_H264_Baseline_4_1;
break;
843 case 42: *profile_level_val =
844 compat_keys.kVTProfileLevel_H264_Baseline_4_2;
break;
845 case 50: *profile_level_val =
846 compat_keys.kVTProfileLevel_H264_Baseline_5_0;
break;
847 case 51: *profile_level_val =
848 compat_keys.kVTProfileLevel_H264_Baseline_5_1;
break;
849 case 52: *profile_level_val =
850 compat_keys.kVTProfileLevel_H264_Baseline_5_2;
break;
855 *profile_level_val =
compat_keys.kVTProfileLevel_H264_ConstrainedBaseline_AutoLevel;
857 if (vtctx->
level != 0) {
860 "Level is auto-selected when constrained-baseline "
861 "profile is used. The output may be encoded with a "
862 "different level.\n");
867 switch (vtctx->
level) {
868 case 0: *profile_level_val =
869 compat_keys.kVTProfileLevel_H264_Main_AutoLevel;
break;
870 case 30: *profile_level_val = kVTProfileLevel_H264_Main_3_0;
break;
871 case 31: *profile_level_val = kVTProfileLevel_H264_Main_3_1;
break;
872 case 32: *profile_level_val = kVTProfileLevel_H264_Main_3_2;
break;
873 case 40: *profile_level_val = kVTProfileLevel_H264_Main_4_0;
break;
874 case 41: *profile_level_val = kVTProfileLevel_H264_Main_4_1;
break;
875 case 42: *profile_level_val =
877 case 50: *profile_level_val = kVTProfileLevel_H264_Main_5_0;
break;
878 case 51: *profile_level_val =
880 case 52: *profile_level_val =
886 *profile_level_val =
compat_keys.kVTProfileLevel_H264_ConstrainedHigh_AutoLevel;
888 if (vtctx->
level != 0) {
891 "Level is auto-selected when constrained-high profile "
892 "is used. The output may be encoded with a different "
898 switch (vtctx->
level) {
899 case 0: *profile_level_val =
900 compat_keys.kVTProfileLevel_H264_High_AutoLevel;
break;
901 case 30: *profile_level_val =
903 case 31: *profile_level_val =
905 case 32: *profile_level_val =
907 case 40: *profile_level_val =
909 case 41: *profile_level_val =
911 case 42: *profile_level_val =
913 case 50: *profile_level_val = kVTProfileLevel_H264_High_5_0;
break;
914 case 51: *profile_level_val =
916 case 52: *profile_level_val =
921 switch (vtctx->
level) {
922 case 0: *profile_level_val =
923 compat_keys.kVTProfileLevel_H264_Extended_AutoLevel;
break;
924 case 50: *profile_level_val =
925 compat_keys.kVTProfileLevel_H264_Extended_5_0;
break;
930 if (!*profile_level_val) {
945 CFStringRef *profile_level_val)
954 *profile_level_val =
NULL;
968 "main profile with %d bit input\n",
bit_depth);
975 "Invalid main10 profile with %d bit input\n",
bit_depth);
984 compat_keys.kVTProfileLevel_HEVC_Main42210_AutoLevel;
988 if (!*profile_level_val) {
999 int* av_pixel_format,
1002 const char *range_name;
1008 if (*av_pixel_format)
1013 "Could not get pixel format for color format '%s' range '%s'.\n",
1015 range_name ? range_name :
"Unknown");
1024 CFDictionarySetValue(dict,
1025 kCVImageBufferColorPrimariesKey,
1030 CFDictionarySetValue(dict,
1031 kCVImageBufferTransferFunctionKey,
1036 CFDictionarySetValue(dict,
1037 kCVImageBufferYCbCrMatrixKey,
1043 CFMutableDictionaryRef* dict)
1045 CFNumberRef cv_color_format_num =
NULL;
1046 CFNumberRef width_num =
NULL;
1047 CFNumberRef height_num =
NULL;
1048 CFMutableDictionaryRef pixel_buffer_info =
NULL;
1049 int cv_color_format;
1055 if (status)
return status;
1057 pixel_buffer_info = CFDictionaryCreateMutable(
1058 kCFAllocatorDefault,
1060 &kCFCopyStringDictionaryKeyCallBacks,
1061 &kCFTypeDictionaryValueCallBacks);
1063 if (!pixel_buffer_info)
goto pbinfo_nomem;
1065 cv_color_format_num = CFNumberCreate(kCFAllocatorDefault,
1066 kCFNumberSInt32Type,
1068 if (!cv_color_format_num)
goto pbinfo_nomem;
1070 CFDictionarySetValue(pixel_buffer_info,
1071 kCVPixelBufferPixelFormatTypeKey,
1072 cv_color_format_num);
1075 width_num = CFNumberCreate(kCFAllocatorDefault,
1076 kCFNumberSInt32Type,
1078 if (!width_num)
goto pbinfo_nomem;
1080 CFDictionarySetValue(pixel_buffer_info,
1081 kCVPixelBufferWidthKey,
1085 height_num = CFNumberCreate(kCFAllocatorDefault,
1086 kCFNumberSInt32Type,
1088 if (!height_num)
goto pbinfo_nomem;
1090 CFDictionarySetValue(pixel_buffer_info,
1091 kCVPixelBufferHeightKey,
1097 *dict = pixel_buffer_info;
1104 if (pixel_buffer_info) CFRelease(pixel_buffer_info);
1110 CFNumberRef *gamma_level)
1114 *gamma_level =
NULL;
1122 *gamma_level = CFNumberCreate(
NULL, kCFNumberFloat32Type, &gamma);
1134 const char *print_option_name,
1140 if (status == kVTPropertyNotSupportedErr) {
1143 "This device does not support the %s option. Value ignored.\n",
1145 }
else if (status != 0) {
1148 "Error setting %s: Error %d\n",
1156 const char* print_option_name,
1158 CFNumberRef value_cfnum = CFNumberCreate(kCFAllocatorDefault,
1162 if (value_cfnum ==
NULL) {
1168 CFRelease(value_cfnum);
1175 CFStringRef profile_level,
1176 CFNumberRef gamma_level,
1177 CFDictionaryRef enc_info,
1178 CFDictionaryRef pixel_buffer_info,
1179 bool constant_bit_rate,
1180 VTCompressionSessionRef *session)
1185 CFNumberRef bit_rate_num;
1186 CFNumberRef bytes_per_second;
1187 CFNumberRef one_second;
1188 CFArrayRef data_rate_limits;
1189 int64_t bytes_per_second_value = 0;
1193 int status = VTCompressionSessionCreate(kCFAllocatorDefault,
1199 kCFAllocatorDefault,
1204 if (status || !vtctx->
session) {
1207#if !TARGET_OS_IPHONE
1209 av_log(avctx,
AV_LOG_ERROR,
"Try -allow_sw 1. The hardware encoder may be busy, or not supported.\n");
1216#if defined (MAC_OS_X_VERSION_10_13) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13)
1217 if (__builtin_available(macOS 10.13, iOS 11.0, *)) {
1222 status = VTCopySupportedPropertyDictionaryForEncoder(avctx->
width,
1229 if (status != noErr) {
1241 av_log(avctx,
AV_LOG_ERROR,
"-q:v qscale not available for encoder. Use -b:v bitrate instead.\n");
1249 CFNumberRef quality_num = CFNumberCreate(kCFAllocatorDefault,
1250 kCFNumberFloat32Type,
1252 if (!quality_num)
return AVERROR(ENOMEM);
1254 status = VTSessionSetProperty(vtctx->
session,
1255 kVTCompressionPropertyKey_Quality,
1257 CFRelease(quality_num);
1259 bit_rate_num = CFNumberCreate(kCFAllocatorDefault,
1260 kCFNumberSInt32Type,
1262 if (!bit_rate_num)
return AVERROR(ENOMEM);
1264 if (constant_bit_rate) {
1265 status = VTSessionSetProperty(vtctx->
session,
1266 compat_keys.kVTCompressionPropertyKey_ConstantBitRate,
1268 if (status == kVTPropertyNotSupportedErr) {
1269 av_log(avctx,
AV_LOG_ERROR,
"-constant_bit_rate true is not supported by the encoder.\n");
1273 status = VTSessionSetProperty(vtctx->
session,
1274 kVTCompressionPropertyKey_AverageBitRate,
1278 CFRelease(bit_rate_num);
1287 status = VTSessionSetProperty(vtctx->
session,
1288 compat_keys.kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality,
1289 vtctx->
prio_speed ? kCFBooleanTrue : kCFBooleanFalse);
1291 av_log(avctx,
AV_LOG_WARNING,
"PrioritizeEncodingSpeedOverQuality property is not supported on this device. Ignoring.\n");
1297 bytes_per_second_value = max_rate >> 3;
1298 bytes_per_second = CFNumberCreate(kCFAllocatorDefault,
1299 kCFNumberSInt64Type,
1300 &bytes_per_second_value);
1301 if (!bytes_per_second) {
1304 one_second_value = 1;
1305 one_second = CFNumberCreate(kCFAllocatorDefault,
1306 kCFNumberSInt64Type,
1309 CFRelease(bytes_per_second);
1312 nums[0] = (
void *)bytes_per_second;
1313 nums[1] = (
void *)one_second;
1314 data_rate_limits = CFArrayCreate(kCFAllocatorDefault,
1315 (
const void **)nums,
1317 &kCFTypeArrayCallBacks);
1319 if (!data_rate_limits) {
1320 CFRelease(bytes_per_second);
1321 CFRelease(one_second);
1324 status = VTSessionSetProperty(vtctx->
session,
1325 kVTCompressionPropertyKey_DataRateLimits,
1328 CFRelease(bytes_per_second);
1329 CFRelease(one_second);
1330 CFRelease(data_rate_limits);
1346 CFNumberRef alpha_quality_num = CFNumberCreate(kCFAllocatorDefault,
1347 kCFNumberDoubleType,
1349 if (!alpha_quality_num)
return AVERROR(ENOMEM);
1351 status = VTSessionSetProperty(vtctx->
session,
1352 compat_keys.kVTCompressionPropertyKey_TargetQualityForAlpha,
1354 CFRelease(alpha_quality_num);
1359 "Error setting alpha quality: %d\n",
1365 if (profile_level) {
1366 status = VTSessionSetProperty(vtctx->
session,
1367 kVTCompressionPropertyKey_ProfileLevel,
1370 av_log(avctx,
AV_LOG_ERROR,
"Error setting profile/level property: %d. Output will be encoded using a supported profile/level combination.\n", status);
1375 CFNumberRef interval = CFNumberCreate(kCFAllocatorDefault,
1382 status = VTSessionSetProperty(vtctx->
session,
1383 kVTCompressionPropertyKey_MaxKeyFrameInterval,
1385 CFRelease(interval);
1388 av_log(avctx,
AV_LOG_ERROR,
"Error setting 'max key-frame interval' property: %d\n", status);
1394 status = VTSessionSetProperty(vtctx->
session,
1395 kVTCompressionPropertyKey_MoreFramesBeforeStart,
1398 if (status == kVTPropertyNotSupportedErr) {
1399 av_log(avctx,
AV_LOG_WARNING,
"frames_before property is not supported on this device. Ignoring.\n");
1400 }
else if (status) {
1406 status = VTSessionSetProperty(vtctx->
session,
1407 kVTCompressionPropertyKey_MoreFramesAfterEnd,
1410 if (status == kVTPropertyNotSupportedErr) {
1411 av_log(avctx,
AV_LOG_WARNING,
"frames_after property is not supported on this device. Ignoring.\n");
1412 }
else if (status) {
1420 CFMutableDictionaryRef par;
1427 num = CFNumberCreate(kCFAllocatorDefault,
1431 den = CFNumberCreate(kCFAllocatorDefault,
1437 par = CFDictionaryCreateMutable(kCFAllocatorDefault,
1439 &kCFCopyStringDictionaryKeyCallBacks,
1440 &kCFTypeDictionaryValueCallBacks);
1442 if (!par || !num || !den) {
1443 if (par) CFRelease(par);
1444 if (num) CFRelease(num);
1445 if (den) CFRelease(den);
1450 CFDictionarySetValue(
1452 kCMFormatDescriptionKey_PixelAspectRatioHorizontalSpacing,
1455 CFDictionarySetValue(
1457 kCMFormatDescriptionKey_PixelAspectRatioVerticalSpacing,
1460 status = VTSessionSetProperty(vtctx->
session,
1461 kVTCompressionPropertyKey_PixelAspectRatio,
1471 "Error setting pixel aspect ratio to %d:%d: %d.\n",
1482 status = VTSessionSetProperty(vtctx->
session,
1483 kVTCompressionPropertyKey_TransferFunction,
1493 status = VTSessionSetProperty(vtctx->
session,
1494 kVTCompressionPropertyKey_YCbCrMatrix,
1504 status = VTSessionSetProperty(vtctx->
session,
1505 kVTCompressionPropertyKey_ColorPrimaries,
1514 status = VTSessionSetProperty(vtctx->
session,
1515 kCVImageBufferGammaLevelKey,
1524 status = VTSessionSetProperty(vtctx->
session,
1525 kVTCompressionPropertyKey_AllowFrameReordering,
1529 av_log(avctx,
AV_LOG_ERROR,
"Error setting 'allow frame reordering' property: %d\n", status);
1539 status = VTSessionSetProperty(vtctx->
session,
1540 compat_keys.kVTCompressionPropertyKey_H264EntropyMode,
1549 status = VTSessionSetProperty(vtctx->
session,
1551 vtctx->
realtime ? kCFBooleanTrue : kCFBooleanFalse);
1560 compat_keys.kVTCompressionPropertyKey_AllowOpenGOP,
1565 if (avctx->
qmin >= 0) {
1567 compat_keys.kVTCompressionPropertyKey_MinAllowedFrameQP,
1576 if (avctx->
qmax >= 0) {
1578 compat_keys.kVTCompressionPropertyKey_MaxAllowedFrameQP,
1589 kVTCompressionPropertyKey_MaxH264SliceBytes,
1600 compat_keys.kVTCompressionPropertyKey_MaximizePowerEfficiency,
1607 compat_keys.kVTCompressionPropertyKey_ReferenceBufferCount,
1618 compat_keys.kVTCompressionPropertyKey_SpatialAdaptiveQPLevel,
1623 status = VTCompressionSessionPrepareToEncodeFrames(vtctx->
session);
1634 CFMutableDictionaryRef enc_info;
1635 CFMutableDictionaryRef pixel_buffer_info =
NULL;
1638 CFStringRef profile_level =
NULL;
1639 CFNumberRef gamma_level =
NULL;
1648#if defined(MAC_OS_X_VERSION_10_9) && !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9)
1650 if (__builtin_available(macOS 10.10, *)) {
1651 VTRegisterProfessionalVideoWorkflowVideoEncoders();
1663 av_log(avctx,
AV_LOG_WARNING,
"Cannot use B-frames with baseline profile. Output will not contain B-frames.\n");
1668 av_log(avctx,
AV_LOG_WARNING,
"CABAC entropy requires 'main' or 'high' profile, but baseline was requested. Encode will not use CABAC entropy.\n");
1683 enc_info = CFDictionaryCreateMutable(
1684 kCFAllocatorDefault,
1686 &kCFCopyStringDictionaryKeyCallBacks,
1687 &kCFTypeDictionaryValueCallBacks
1690 if (!enc_info)
return AVERROR(ENOMEM);
1692#if !TARGET_OS_IPHONE
1694 CFDictionarySetValue(enc_info,
1695 compat_keys.kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
1698 CFDictionarySetValue(enc_info,
1699 compat_keys.kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder,
1702 CFDictionarySetValue(enc_info,
1703 compat_keys.kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
1713 "please specify bitrate explicitly\n");
1717 CFDictionarySetValue(enc_info,
1718 compat_keys.kVTVideoEncoderSpecification_EnableLowLatencyRateControl,
1758 CFRelease(gamma_level);
1760 if (pixel_buffer_info)
1761 CFRelease(pixel_buffer_info);
1763 CFRelease(enc_info);
1771 CFBooleanRef has_b_frames_cfbool;
1783 if (status)
return status;
1785 status = VTSessionCopyProperty(vtctx->
session,
1786 kVTCompressionPropertyKey_AllowFrameReordering,
1787 kCFAllocatorDefault,
1788 &has_b_frames_cfbool);
1790 if (!status && has_b_frames_cfbool) {
1793 if (CFBooleanGetValue(has_b_frames_cfbool))
1797 CFRelease(has_b_frames_cfbool);
1806 CFArrayRef attachments;
1807 CFDictionaryRef attachment;
1808 CFBooleanRef not_sync;
1811 attachments = CMSampleBufferGetSampleAttachmentsArray(
buffer,
false);
1812 len = !attachments ? 0 : CFArrayGetCount(attachments);
1815 *is_key_frame =
true;
1819 attachment = CFArrayGetValueAtIndex(attachments, 0);
1821 if (CFDictionaryGetValueIfPresent(attachment,
1822 kCMSampleAttachmentKey_NotSync,
1823 (
const void **)¬_sync))
1825 *is_key_frame = !CFBooleanGetValue(not_sync);
1827 *is_key_frame =
true;
1848 size_t sei_payload_size = 0;
1849 uint8_t *nal_start = nal_data;
1855 nal_type = *nal_data & 0x1F;
1862 if (nal_data[nal_size - 1] == 0x80)
1865 while (nal_size > 0 && *nal_data > 0) {
1869 }
while (nal_size > 0 && *nal_data == 0xFF);
1877 sei_payload_size += *nal_data;
1880 }
while (nal_size > 0 && *nal_data == 0xFF);
1882 if (nal_size < sei_payload_size) {
1887 nal_data += sei_payload_size;
1888 nal_size -= sei_payload_size;
1891 *sei_end = nal_data;
1893 return nal_data - nal_start + 1;
1913 uint8_t* dst_end =
dst + dst_size;
1914 const uint8_t* src_end =
src + src_size;
1915 int start_at = dst_offset > 2 ? dst_offset - 2 : 0;
1917 for (
i = start_at;
i < dst_offset &&
i < dst_size;
i++) {
1928 int insert_ep3_byte = *
src <= 3;
1929 if (insert_ep3_byte) {
1947 wrote_bytes =
dst - dst_start;
1950 return -wrote_bytes;
1960 uint8_t *sei_start =
dst;
1961 size_t remaining_sei_size =
sei->size;
1962 size_t remaining_dst_size = dst_size;
1967 if (!remaining_dst_size)
1970 while (sei_type && remaining_dst_size != 0) {
1971 int sei_byte = sei_type > 255 ? 255 : sei_type;
1974 sei_type -= sei_byte;
1976 remaining_dst_size--;
1982 while (remaining_sei_size && remaining_dst_size != 0) {
1983 int size_byte = remaining_sei_size > 255 ? 255 : remaining_sei_size;
1986 remaining_sei_size -= size_byte;
1988 remaining_dst_size--;
1991 if (remaining_dst_size < sei->
size)
1994 header_bytes =
dst - sei_start;
2002 if (bytes_written < 0)
2005 bytes_written += header_bytes;
2006 return bytes_written;
2030 size_t length_code_size,
2031 CMSampleBufferRef sample_buffer,
2036 size_t src_size = CMSampleBufferGetTotalSampleSize(sample_buffer);
2037 size_t remaining_src_size = src_size;
2038 size_t remaining_dst_size = dst_size;
2039 size_t src_offset = 0;
2042 uint8_t size_buf[4];
2044 CMBlockBufferRef
block = CMSampleBufferGetDataBuffer(sample_buffer);
2046 if (length_code_size > 4) {
2050 while (remaining_src_size > 0) {
2051 size_t curr_src_len;
2052 size_t curr_dst_len;
2058 status = CMBlockBufferCopyDataBytes(
block,
2067 status = CMBlockBufferCopyDataBytes(
block,
2068 src_offset + length_code_size,
2079 for (
i = 0;
i < length_code_size;
i++) {
2081 box_len |= size_buf[
i];
2094 remaining_dst_size--;
2099 remaining_dst_size);
2101 if (wrote_bytes < 0)
2104 remaining_dst_size -= wrote_bytes;
2105 dst_data += wrote_bytes;
2107 if (remaining_dst_size <= 0)
2113 remaining_dst_size--;
2118 curr_src_len = box_len + length_code_size;
2121 if (remaining_src_size < curr_src_len) {
2125 if (remaining_dst_size < curr_dst_len) {
2132 status = CMBlockBufferCopyDataBytes(
block,
2133 src_offset + length_code_size,
2148 old_sei_length =
find_sei_end(avctx, dst_box, box_len, &new_sei);
2149 if (old_sei_length < 0)
2150 return old_sei_length;
2155 remaining_dst_size - old_sei_length);
2156 if (wrote_bytes < 0)
2159 if (new_sei + wrote_bytes >= dst_data + remaining_dst_size)
2162 new_sei[wrote_bytes++] = 0x80;
2163 extra_bytes = wrote_bytes - (dst_box + box_len - new_sei);
2165 dst_data += extra_bytes;
2166 remaining_dst_size -= extra_bytes;
2171 src_offset += curr_src_len;
2172 dst_data += curr_dst_len;
2174 remaining_src_size -= curr_src_len;
2175 remaining_dst_size -= curr_dst_len;
2196 if ((
sei->size % 255) == 0)
2199 return copied_size +
sei->size / 255 + 1 +
type / 255 + 1;
2204 CMSampleBufferRef sample_buffer,
2213 size_t length_code_size;
2214 size_t header_size = 0;
2216 size_t out_buf_size;
2217 size_t sei_nalu_size = 0;
2222 CMVideoFormatDescriptionRef vid_fmt;
2228 if (status)
return status;
2233 vid_fmt = CMSampleBufferGetFormatDescription(sample_buffer);
2240 if (status)
return status;
2243 status =
count_nalus(length_code_size, sample_buffer, &nalu_count);
2251 sei_nalu_size =
sizeof(
start_code) + 1 + msg_size + 1;
2254 in_buf_size = CMSampleBufferGetTotalSampleSize(sample_buffer);
2255 out_buf_size = header_size +
2258 nalu_count * ((int)
sizeof(
start_code) - (int)length_code_size);
2266 if(status)
return status;
2274 pkt->data + header_size,
2275 pkt->size - header_size
2284 CMBlockBufferRef buf = CMSampleBufferGetDataBuffer(sample_buffer);
2290 len = CMBlockBufferGetDataLength(buf);
2296 status = CMBlockBufferCopyDataBytes(buf, 0,
len,
pkt->data);
2307 pts = CMSampleBufferGetPresentationTimeStamp(sample_buffer);
2308 dts = CMSampleBufferGetDecodeTimeStamp (sample_buffer);
2310 if (CMTIME_IS_INVALID(
pts)) {
2315 if (CMTIME_IS_INVALID(dts)) {
2334 CVPixelBufferRef cv_img)
2339 size_t num_cv_plane = CVPixelBufferIsPlanar(cv_img) ?
2340 CVPixelBufferGetPlaneCount(cv_img) : 1;
2341 if (num_planes != num_cv_plane) {
2343 "Different number of planes in AVFrame and CVPixelBuffer.\n");
2347 status = CVPixelBufferLockBaseAddress(cv_img, 0);
2349 av_log(avctx,
AV_LOG_ERROR,
"Could not lock base address of CVPixelBuffer: %d.\n", status);
2353 int dst_stride[4] = {0};
2354 uint8_t *dst_addr[4] = {0};
2355 for (
int i = 0;
i < num_planes;
i++) {
2356 dst_addr[
i] = (uint8_t*)CVPixelBufferGetBaseAddressOfPlane(cv_img,
i);
2357 dst_stride[
i] = CVPixelBufferGetBytesPerRowOfPlane(cv_img,
i);
2362 status = CVPixelBufferUnlockBaseAddress(cv_img, 0);
2364 av_log(avctx,
AV_LOG_ERROR,
"Could not unlock CVPixelBuffer base address: %d.\n", status);
2373 CVPixelBufferRef *cv_img,
2377 CVPixelBufferPoolRef pix_buf_pool;
2383 *cv_img = (CVPixelBufferRef)
frame->data[3];
2387 if (
frame->buf[0]) {
2398 &(
int) {0}, &range_guessed);
2404 if (range_guessed) {
2412 pix_buf_pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2413 if (!pix_buf_pool) {
2420 vtstatus = VTCompressionSessionPrepareToEncodeFrames(vtctx->
session);
2421 if (vtstatus == kVTInvalidSessionErr) {
2426 pix_buf_pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2428 if (!pix_buf_pool) {
2434 "kVTInvalidSessionErr error.\n");
2437 status = CVPixelBufferPoolCreatePixelBuffer(
NULL,
2443 av_log(avctx,
AV_LOG_ERROR,
"Could not create pixel buffer from pool: %d.\n", status);
2458 CFDictionaryRef* dict_out)
2460 CFDictionaryRef dict =
NULL;
2462 const void *keys[] = { kVTEncodeFrameOptionKey_ForceKeyFrame };
2463 const void *vals[] = { kCFBooleanTrue };
2465 dict = CFDictionaryCreate(
NULL, keys, vals, 1,
NULL,
NULL);
2466 if(!dict)
return AVERROR(ENOMEM);
2478 CFDictionaryRef frame_dict =
NULL;
2479 CVPixelBufferRef cv_img =
NULL;
2497 if (vtctx->
a53_cc && side_data && side_data->
size) {
2506 status = VTCompressionSessionEncodeFrame(
2525 CFRelease(frame_dict);
2543 CMSampleBufferRef buf =
NULL;
2564 status = VTCompressionSessionCompleteFrames(vtctx->
session,
2582 if (status)
goto end_nopkt;
2583 if (!buf)
goto end_nopkt;
2588 if (status)
goto end_nopkt;
2600 CFStringRef profile_level,
2601 CFNumberRef gamma_level,
2602 CFDictionaryRef enc_info,
2603 CFDictionaryRef pixel_buffer_info)
2607 CVPixelBufferPoolRef pool =
NULL;
2608 CVPixelBufferRef pix_buf =
NULL;
2610 CMSampleBufferRef buf =
NULL;
2627 pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2634 status = CVPixelBufferPoolCreatePixelBuffer(
NULL,
2638 if(status != kCVReturnSuccess){
2645 status = VTCompressionSessionEncodeFrame(vtctx->
session,
2656 "Error sending frame for extradata: %d\n",
2664 status = VTCompressionSessionCompleteFrames(vtctx->
session,
2688 CVPixelBufferRelease(pix_buf);
2716 VTCompressionSessionCompleteFrames(vtctx->
session,
2748#ifdef kCFCoreFoundationVersionNumber10_7
2753#if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
2756#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8BIPLANARVIDEORANGE
2759#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR10BIPLANARVIDEORANGE
2762#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR16BIPLANARVIDEORANGE
2765#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR8BIPLANARVIDEORANGE
2768#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR10BIPLANARVIDEORANGE
2771#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
2778#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
2779#define COMMON_OPTIONS \
2780 { "allow_sw", "Allow software encoding", OFFSET(allow_sw), AV_OPT_TYPE_BOOL, \
2781 { .i64 = 0 }, 0, 1, VE }, \
2782 { "require_sw", "Require software encoding", OFFSET(require_sw), AV_OPT_TYPE_BOOL, \
2783 { .i64 = 0 }, 0, 1, VE }, \
2784 { "realtime", "Hint that encoding should happen in real-time if not faster (e.g. capturing from camera).", \
2785 OFFSET(realtime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, -1, 1, VE }, \
2786 { "frames_before", "Other frames will come before the frames in this session. This helps smooth concatenation issues.", \
2787 OFFSET(frames_before), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \
2788 { "frames_after", "Other frames will come after the frames in this session. This helps smooth concatenation issues.", \
2789 OFFSET(frames_after), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \
2790 { "prio_speed", "prioritize encoding speed", OFFSET(prio_speed), AV_OPT_TYPE_BOOL, \
2791 { .i64 = -1 }, -1, 1, VE }, \
2792 { "power_efficient", "Set to 1 to enable more power-efficient encoding if supported.", \
2793 OFFSET(power_efficient), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
2794 { "spatial_aq", "Set to 1 to enable spatial AQ if supported.", \
2795 OFFSET(spatialaq), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
2796 { "max_ref_frames", \
2797 "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.", \
2798 OFFSET(max_ref_frames), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
2805#define OFFSET(x) offsetof(VTEncContext, x)
2816 {
"1.3",
"Level 1.3, only available with Baseline Profile", 0,
AV_OPT_TYPE_CONST, { .i64 = 13 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2817 {
"3.0",
"Level 3.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 30 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2818 {
"3.1",
"Level 3.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 31 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2819 {
"3.2",
"Level 3.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 32 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2820 {
"4.0",
"Level 4.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 40 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2821 {
"4.1",
"Level 4.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 41 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2822 {
"4.2",
"Level 4.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 42 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2823 {
"5.0",
"Level 5.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 50 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2824 {
"5.1",
"Level 5.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 51 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2825 {
"5.2",
"Level 5.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 52 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2835 {
"constant_bit_rate",
"Require constant bit rate (macOS 13 or newer)",
OFFSET(constant_bit_rate),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
2836 {
"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 },
2849 .class_name =
"h264_videotoolbox",
2856 .p.name =
"h264_videotoolbox",
2870 .p.wrapper_name =
"videotoolbox",
2881 {
"alpha_quality",
"Compression quality for the alpha channel",
OFFSET(alpha_quality),
AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 0.0, 1.0,
VE },
2883 {
"constant_bit_rate",
"Require constant bit rate (macOS 13 or newer)",
OFFSET(constant_bit_rate),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
2890 .class_name =
"hevc_videotoolbox",
2897 .p.name =
"hevc_videotoolbox",
2912 .p.wrapper_name =
"videotoolbox",
2931 .class_name =
"prores_videotoolbox",
2938 .p.name =
"prores_videotoolbox",
2953 .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[]