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");
1270 CFRelease(bit_rate_num);
1274 status = VTSessionSetProperty(vtctx->
session,
1275 kVTCompressionPropertyKey_AverageBitRate,
1279 CFRelease(bit_rate_num);
1288 status = VTSessionSetProperty(vtctx->
session,
1289 compat_keys.kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality,
1290 vtctx->
prio_speed ? kCFBooleanTrue : kCFBooleanFalse);
1292 av_log(avctx,
AV_LOG_WARNING,
"PrioritizeEncodingSpeedOverQuality property is not supported on this device. Ignoring.\n");
1298 bytes_per_second_value = max_rate >> 3;
1299 bytes_per_second = CFNumberCreate(kCFAllocatorDefault,
1300 kCFNumberSInt64Type,
1301 &bytes_per_second_value);
1302 if (!bytes_per_second) {
1305 one_second_value = 1;
1306 one_second = CFNumberCreate(kCFAllocatorDefault,
1307 kCFNumberSInt64Type,
1310 CFRelease(bytes_per_second);
1313 nums[0] = (
void *)bytes_per_second;
1314 nums[1] = (
void *)one_second;
1315 data_rate_limits = CFArrayCreate(kCFAllocatorDefault,
1316 (
const void **)nums,
1318 &kCFTypeArrayCallBacks);
1320 if (!data_rate_limits) {
1321 CFRelease(bytes_per_second);
1322 CFRelease(one_second);
1325 status = VTSessionSetProperty(vtctx->
session,
1326 kVTCompressionPropertyKey_DataRateLimits,
1329 CFRelease(bytes_per_second);
1330 CFRelease(one_second);
1331 CFRelease(data_rate_limits);
1347 CFNumberRef alpha_quality_num = CFNumberCreate(kCFAllocatorDefault,
1348 kCFNumberDoubleType,
1350 if (!alpha_quality_num)
return AVERROR(ENOMEM);
1352 status = VTSessionSetProperty(vtctx->
session,
1353 compat_keys.kVTCompressionPropertyKey_TargetQualityForAlpha,
1355 CFRelease(alpha_quality_num);
1360 "Error setting alpha quality: %d\n",
1366 if (profile_level) {
1367 status = VTSessionSetProperty(vtctx->
session,
1368 kVTCompressionPropertyKey_ProfileLevel,
1371 av_log(avctx,
AV_LOG_ERROR,
"Error setting profile/level property: %d. Output will be encoded using a supported profile/level combination.\n", status);
1376 CFNumberRef interval = CFNumberCreate(kCFAllocatorDefault,
1383 status = VTSessionSetProperty(vtctx->
session,
1384 kVTCompressionPropertyKey_MaxKeyFrameInterval,
1386 CFRelease(interval);
1389 av_log(avctx,
AV_LOG_ERROR,
"Error setting 'max key-frame interval' property: %d\n", status);
1395 status = VTSessionSetProperty(vtctx->
session,
1396 kVTCompressionPropertyKey_MoreFramesBeforeStart,
1399 if (status == kVTPropertyNotSupportedErr) {
1400 av_log(avctx,
AV_LOG_WARNING,
"frames_before property is not supported on this device. Ignoring.\n");
1401 }
else if (status) {
1407 status = VTSessionSetProperty(vtctx->
session,
1408 kVTCompressionPropertyKey_MoreFramesAfterEnd,
1411 if (status == kVTPropertyNotSupportedErr) {
1412 av_log(avctx,
AV_LOG_WARNING,
"frames_after property is not supported on this device. Ignoring.\n");
1413 }
else if (status) {
1421 CFMutableDictionaryRef par;
1428 num = CFNumberCreate(kCFAllocatorDefault,
1432 den = CFNumberCreate(kCFAllocatorDefault,
1438 par = CFDictionaryCreateMutable(kCFAllocatorDefault,
1440 &kCFCopyStringDictionaryKeyCallBacks,
1441 &kCFTypeDictionaryValueCallBacks);
1443 if (!par || !
num || !den) {
1444 if (par) CFRelease(par);
1446 if (den) CFRelease(den);
1451 CFDictionarySetValue(
1453 kCMFormatDescriptionKey_PixelAspectRatioHorizontalSpacing,
1456 CFDictionarySetValue(
1458 kCMFormatDescriptionKey_PixelAspectRatioVerticalSpacing,
1461 status = VTSessionSetProperty(vtctx->
session,
1462 kVTCompressionPropertyKey_PixelAspectRatio,
1472 "Error setting pixel aspect ratio to %d:%d: %d.\n",
1483 status = VTSessionSetProperty(vtctx->
session,
1484 kVTCompressionPropertyKey_TransferFunction,
1494 status = VTSessionSetProperty(vtctx->
session,
1495 kVTCompressionPropertyKey_YCbCrMatrix,
1505 status = VTSessionSetProperty(vtctx->
session,
1506 kVTCompressionPropertyKey_ColorPrimaries,
1515 status = VTSessionSetProperty(vtctx->
session,
1516 kCVImageBufferGammaLevelKey,
1525 status = VTSessionSetProperty(vtctx->
session,
1526 kVTCompressionPropertyKey_AllowFrameReordering,
1530 av_log(avctx,
AV_LOG_ERROR,
"Error setting 'allow frame reordering' property: %d\n", status);
1540 status = VTSessionSetProperty(vtctx->
session,
1541 compat_keys.kVTCompressionPropertyKey_H264EntropyMode,
1550 status = VTSessionSetProperty(vtctx->
session,
1552 vtctx->
realtime ? kCFBooleanTrue : kCFBooleanFalse);
1561 compat_keys.kVTCompressionPropertyKey_AllowOpenGOP,
1566 if (avctx->
qmin >= 0) {
1568 compat_keys.kVTCompressionPropertyKey_MinAllowedFrameQP,
1577 if (avctx->
qmax >= 0) {
1579 compat_keys.kVTCompressionPropertyKey_MaxAllowedFrameQP,
1590 kVTCompressionPropertyKey_MaxH264SliceBytes,
1601 compat_keys.kVTCompressionPropertyKey_MaximizePowerEfficiency,
1608 compat_keys.kVTCompressionPropertyKey_ReferenceBufferCount,
1619 compat_keys.kVTCompressionPropertyKey_SpatialAdaptiveQPLevel,
1624 status = VTCompressionSessionPrepareToEncodeFrames(vtctx->
session);
1635 CFMutableDictionaryRef enc_info;
1636 CFMutableDictionaryRef pixel_buffer_info =
NULL;
1639 CFStringRef profile_level =
NULL;
1640 CFNumberRef gamma_level =
NULL;
1649#if defined(MAC_OS_X_VERSION_10_9) && !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9)
1651 if (__builtin_available(macOS 10.10, *)) {
1652 VTRegisterProfessionalVideoWorkflowVideoEncoders();
1664 av_log(avctx,
AV_LOG_WARNING,
"Cannot use B-frames with baseline profile. Output will not contain B-frames.\n");
1669 av_log(avctx,
AV_LOG_WARNING,
"CABAC entropy requires 'main' or 'high' profile, but baseline was requested. Encode will not use CABAC entropy.\n");
1684 enc_info = CFDictionaryCreateMutable(
1685 kCFAllocatorDefault,
1687 &kCFCopyStringDictionaryKeyCallBacks,
1688 &kCFTypeDictionaryValueCallBacks
1691 if (!enc_info)
return AVERROR(ENOMEM);
1693#if !TARGET_OS_IPHONE
1695 CFDictionarySetValue(enc_info,
1696 compat_keys.kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
1699 CFDictionarySetValue(enc_info,
1700 compat_keys.kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder,
1703 CFDictionarySetValue(enc_info,
1704 compat_keys.kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
1714 "please specify bitrate explicitly\n");
1718 CFDictionarySetValue(enc_info,
1719 compat_keys.kVTVideoEncoderSpecification_EnableLowLatencyRateControl,
1759 CFRelease(gamma_level);
1761 if (pixel_buffer_info)
1762 CFRelease(pixel_buffer_info);
1764 CFRelease(enc_info);
1772 CFBooleanRef has_b_frames_cfbool;
1784 if (status)
return status;
1786 status = VTSessionCopyProperty(vtctx->
session,
1787 kVTCompressionPropertyKey_AllowFrameReordering,
1788 kCFAllocatorDefault,
1789 &has_b_frames_cfbool);
1791 if (!status && has_b_frames_cfbool) {
1794 if (CFBooleanGetValue(has_b_frames_cfbool))
1798 CFRelease(has_b_frames_cfbool);
1807 CFArrayRef attachments;
1808 CFDictionaryRef attachment;
1809 CFBooleanRef not_sync;
1812 attachments = CMSampleBufferGetSampleAttachmentsArray(
buffer,
false);
1813 len = !attachments ? 0 : CFArrayGetCount(attachments);
1816 *is_key_frame =
true;
1820 attachment = CFArrayGetValueAtIndex(attachments, 0);
1822 if (CFDictionaryGetValueIfPresent(attachment,
1823 kCMSampleAttachmentKey_NotSync,
1824 (
const void **)¬_sync))
1826 *is_key_frame = !CFBooleanGetValue(not_sync);
1828 *is_key_frame =
true;
1849 size_t sei_payload_size = 0;
1850 uint8_t *nal_start = nal_data;
1856 nal_type = *nal_data & 0x1F;
1863 if (nal_data[nal_size - 1] == 0x80)
1866 while (nal_size > 0 && *nal_data > 0) {
1870 }
while (nal_size > 0 && *nal_data == 0xFF);
1878 sei_payload_size += *nal_data;
1881 }
while (nal_size > 0 && *nal_data == 0xFF);
1883 if (nal_size < sei_payload_size) {
1888 nal_data += sei_payload_size;
1889 nal_size -= sei_payload_size;
1892 *sei_end = nal_data;
1894 return nal_data - nal_start + 1;
1914 uint8_t* dst_end =
dst + dst_size;
1915 const uint8_t* src_end =
src + src_size;
1916 int start_at = dst_offset > 2 ? dst_offset - 2 : 0;
1918 for (
i = start_at;
i < dst_offset &&
i < dst_size;
i++) {
1929 int insert_ep3_byte = *
src <= 3;
1930 if (insert_ep3_byte) {
1948 wrote_bytes =
dst - dst_start;
1951 return -wrote_bytes;
1961 uint8_t *sei_start =
dst;
1962 size_t remaining_sei_size =
sei->size;
1963 size_t remaining_dst_size = dst_size;
1968 if (!remaining_dst_size)
1971 while (sei_type && remaining_dst_size != 0) {
1972 int sei_byte = sei_type > 255 ? 255 : sei_type;
1975 sei_type -= sei_byte;
1977 remaining_dst_size--;
1983 while (remaining_sei_size && remaining_dst_size != 0) {
1984 int size_byte = remaining_sei_size > 255 ? 255 : remaining_sei_size;
1987 remaining_sei_size -= size_byte;
1989 remaining_dst_size--;
1992 if (remaining_dst_size < sei->
size)
1995 header_bytes =
dst - sei_start;
2003 if (bytes_written < 0)
2006 bytes_written += header_bytes;
2007 return bytes_written;
2031 size_t length_code_size,
2032 CMSampleBufferRef sample_buffer,
2037 size_t src_size = CMSampleBufferGetTotalSampleSize(sample_buffer);
2038 size_t remaining_src_size = src_size;
2039 size_t remaining_dst_size = dst_size;
2040 size_t src_offset = 0;
2043 uint8_t size_buf[4];
2045 CMBlockBufferRef
block = CMSampleBufferGetDataBuffer(sample_buffer);
2047 if (length_code_size > 4) {
2051 while (remaining_src_size > 0) {
2052 size_t curr_src_len;
2053 size_t curr_dst_len;
2059 status = CMBlockBufferCopyDataBytes(
block,
2068 status = CMBlockBufferCopyDataBytes(
block,
2069 src_offset + length_code_size,
2080 for (
i = 0;
i < length_code_size;
i++) {
2082 box_len |= size_buf[
i];
2095 remaining_dst_size--;
2100 remaining_dst_size);
2102 if (wrote_bytes < 0)
2105 remaining_dst_size -= wrote_bytes;
2106 dst_data += wrote_bytes;
2108 if (remaining_dst_size <= 0)
2114 remaining_dst_size--;
2119 curr_src_len = box_len + length_code_size;
2122 if (remaining_src_size < curr_src_len) {
2126 if (remaining_dst_size < curr_dst_len) {
2133 status = CMBlockBufferCopyDataBytes(
block,
2134 src_offset + length_code_size,
2149 old_sei_length =
find_sei_end(avctx, dst_box, box_len, &new_sei);
2150 if (old_sei_length < 0)
2151 return old_sei_length;
2156 remaining_dst_size - old_sei_length);
2157 if (wrote_bytes < 0)
2160 if (new_sei + wrote_bytes >= dst_data + remaining_dst_size)
2163 new_sei[wrote_bytes++] = 0x80;
2164 extra_bytes = wrote_bytes - (dst_box + box_len - new_sei);
2166 dst_data += extra_bytes;
2167 remaining_dst_size -= extra_bytes;
2172 src_offset += curr_src_len;
2173 dst_data += curr_dst_len;
2175 remaining_src_size -= curr_src_len;
2176 remaining_dst_size -= curr_dst_len;
2197 if ((
sei->size % 255) == 0)
2200 return copied_size +
sei->size / 255 + 1 +
type / 255 + 1;
2205 CMSampleBufferRef sample_buffer,
2214 size_t length_code_size;
2215 size_t header_size = 0;
2217 size_t out_buf_size;
2218 size_t sei_nalu_size = 0;
2223 CMVideoFormatDescriptionRef vid_fmt;
2229 if (status)
return status;
2234 vid_fmt = CMSampleBufferGetFormatDescription(sample_buffer);
2241 if (status)
return status;
2244 status =
count_nalus(length_code_size, sample_buffer, &nalu_count);
2252 sei_nalu_size =
sizeof(
start_code) + 1 + msg_size + 1;
2255 in_buf_size = CMSampleBufferGetTotalSampleSize(sample_buffer);
2256 out_buf_size = header_size +
2259 nalu_count * ((int)
sizeof(
start_code) - (int)length_code_size);
2267 if(status)
return status;
2275 pkt->data + header_size,
2276 pkt->size - header_size
2285 CMBlockBufferRef buf = CMSampleBufferGetDataBuffer(sample_buffer);
2291 len = CMBlockBufferGetDataLength(buf);
2297 status = CMBlockBufferCopyDataBytes(buf, 0,
len,
pkt->data);
2308 pts = CMSampleBufferGetPresentationTimeStamp(sample_buffer);
2309 dts = CMSampleBufferGetDecodeTimeStamp (sample_buffer);
2311 if (CMTIME_IS_INVALID(
pts)) {
2316 if (CMTIME_IS_INVALID(dts)) {
2335 CVPixelBufferRef cv_img)
2340 size_t num_cv_plane = CVPixelBufferIsPlanar(cv_img) ?
2341 CVPixelBufferGetPlaneCount(cv_img) : 1;
2342 if (num_planes != num_cv_plane) {
2344 "Different number of planes in AVFrame and CVPixelBuffer.\n");
2348 status = CVPixelBufferLockBaseAddress(cv_img, 0);
2350 av_log(avctx,
AV_LOG_ERROR,
"Could not lock base address of CVPixelBuffer: %d.\n", status);
2354 int dst_stride[4] = {0};
2355 uint8_t *dst_addr[4] = {0};
2356 for (
int i = 0;
i < num_planes;
i++) {
2357 dst_addr[
i] = (uint8_t*)CVPixelBufferGetBaseAddressOfPlane(cv_img,
i);
2358 dst_stride[
i] = CVPixelBufferGetBytesPerRowOfPlane(cv_img,
i);
2363 status = CVPixelBufferUnlockBaseAddress(cv_img, 0);
2365 av_log(avctx,
AV_LOG_ERROR,
"Could not unlock CVPixelBuffer base address: %d.\n", status);
2374 CVPixelBufferRef *cv_img,
2378 CVPixelBufferPoolRef pix_buf_pool;
2384 *cv_img = (CVPixelBufferRef)
frame->data[3];
2388 if (
frame->buf[0]) {
2399 &(
int) {0}, &range_guessed);
2405 if (range_guessed) {
2413 pix_buf_pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2414 if (!pix_buf_pool) {
2421 vtstatus = VTCompressionSessionPrepareToEncodeFrames(vtctx->
session);
2422 if (vtstatus == kVTInvalidSessionErr) {
2427 pix_buf_pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2429 if (!pix_buf_pool) {
2435 "kVTInvalidSessionErr error.\n");
2438 status = CVPixelBufferPoolCreatePixelBuffer(
NULL,
2444 av_log(avctx,
AV_LOG_ERROR,
"Could not create pixel buffer from pool: %d.\n", status);
2459 CFDictionaryRef* dict_out)
2461 CFDictionaryRef dict =
NULL;
2463 const void *keys[] = { kVTEncodeFrameOptionKey_ForceKeyFrame };
2464 const void *vals[] = { kCFBooleanTrue };
2466 dict = CFDictionaryCreate(
NULL, keys, vals, 1,
NULL,
NULL);
2467 if(!dict)
return AVERROR(ENOMEM);
2479 CFDictionaryRef frame_dict =
NULL;
2480 CVPixelBufferRef cv_img =
NULL;
2498 if (vtctx->
a53_cc && side_data && side_data->
size) {
2507 status = VTCompressionSessionEncodeFrame(
2526 CFRelease(frame_dict);
2544 CMSampleBufferRef buf =
NULL;
2565 status = VTCompressionSessionCompleteFrames(vtctx->
session,
2583 if (status)
goto end_nopkt;
2584 if (!buf)
goto end_nopkt;
2589 if (status)
goto end_nopkt;
2601 CFStringRef profile_level,
2602 CFNumberRef gamma_level,
2603 CFDictionaryRef enc_info,
2604 CFDictionaryRef pixel_buffer_info)
2608 CVPixelBufferPoolRef pool =
NULL;
2609 CVPixelBufferRef pix_buf =
NULL;
2611 CMSampleBufferRef buf =
NULL;
2628 pool = VTCompressionSessionGetPixelBufferPool(vtctx->
session);
2635 status = CVPixelBufferPoolCreatePixelBuffer(
NULL,
2639 if(status != kCVReturnSuccess){
2646 status = VTCompressionSessionEncodeFrame(vtctx->
session,
2657 "Error sending frame for extradata: %d\n",
2665 status = VTCompressionSessionCompleteFrames(vtctx->
session,
2689 CVPixelBufferRelease(pix_buf);
2717 VTCompressionSessionCompleteFrames(vtctx->
session,
2749#ifdef kCFCoreFoundationVersionNumber10_7
2754#if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
2757#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8BIPLANARVIDEORANGE
2760#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR10BIPLANARVIDEORANGE
2763#if HAVE_KCVPIXELFORMATTYPE_422YPCBCR16BIPLANARVIDEORANGE
2766#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR8BIPLANARVIDEORANGE
2769#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR10BIPLANARVIDEORANGE
2772#if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
2779#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
2780#define COMMON_OPTIONS \
2781 { "allow_sw", "Allow software encoding", OFFSET(allow_sw), AV_OPT_TYPE_BOOL, \
2782 { .i64 = 0 }, 0, 1, VE }, \
2783 { "require_sw", "Require software encoding", OFFSET(require_sw), AV_OPT_TYPE_BOOL, \
2784 { .i64 = 0 }, 0, 1, VE }, \
2785 { "realtime", "Hint that encoding should happen in real-time if not faster (e.g. capturing from camera).", \
2786 OFFSET(realtime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, -1, 1, VE }, \
2787 { "frames_before", "Other frames will come before the frames in this session. This helps smooth concatenation issues.", \
2788 OFFSET(frames_before), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \
2789 { "frames_after", "Other frames will come after the frames in this session. This helps smooth concatenation issues.", \
2790 OFFSET(frames_after), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \
2791 { "prio_speed", "prioritize encoding speed", OFFSET(prio_speed), AV_OPT_TYPE_BOOL, \
2792 { .i64 = -1 }, -1, 1, VE }, \
2793 { "power_efficient", "Set to 1 to enable more power-efficient encoding if supported.", \
2794 OFFSET(power_efficient), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
2795 { "spatial_aq", "Set to 1 to enable spatial AQ if supported.", \
2796 OFFSET(spatialaq), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
2797 { "max_ref_frames", \
2798 "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.", \
2799 OFFSET(max_ref_frames), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
2806#define OFFSET(x) offsetof(VTEncContext, x)
2817 {
"1.3",
"Level 1.3, only available with Baseline Profile", 0,
AV_OPT_TYPE_CONST, { .i64 = 13 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2818 {
"3.0",
"Level 3.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 30 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2819 {
"3.1",
"Level 3.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 31 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2820 {
"3.2",
"Level 3.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 32 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2821 {
"4.0",
"Level 4.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 40 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2822 {
"4.1",
"Level 4.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 41 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2823 {
"4.2",
"Level 4.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 42 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2824 {
"5.0",
"Level 5.0", 0,
AV_OPT_TYPE_CONST, { .i64 = 50 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2825 {
"5.1",
"Level 5.1", 0,
AV_OPT_TYPE_CONST, { .i64 = 51 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2826 {
"5.2",
"Level 5.2", 0,
AV_OPT_TYPE_CONST, { .i64 = 52 }, INT_MIN, INT_MAX,
VE, .unit =
"level" },
2836 {
"constant_bit_rate",
"Require constant bit rate (macOS 13 or newer)",
OFFSET(constant_bit_rate),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
2837 {
"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 },
2850 .class_name =
"h264_videotoolbox",
2857 .p.name =
"h264_videotoolbox",
2871 .p.wrapper_name =
"videotoolbox",
2882 {
"alpha_quality",
"Compression quality for the alpha channel",
OFFSET(alpha_quality),
AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 0.0, 1.0,
VE },
2884 {
"constant_bit_rate",
"Require constant bit rate (macOS 13 or newer)",
OFFSET(constant_bit_rate),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
2891 .class_name =
"hevc_videotoolbox",
2898 .p.name =
"hevc_videotoolbox",
2913 .p.wrapper_name =
"videotoolbox",
2932 .class_name =
"prores_videotoolbox",
2939 .p.name =
"prores_videotoolbox",
2954 .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[]