FFmpeg
|
#include <VideoToolbox/VideoToolbox.h>
#include <CoreVideo/CoreVideo.h>
#include <CoreMedia/CoreMedia.h>
#include <TargetConditionals.h>
#include <Availability.h>
#include "avcodec.h"
#include "libavutil/opt.h"
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/pixdesc.h"
#include "libavutil/hwcontext_videotoolbox.h"
#include "codec_internal.h"
#include "internal.h"
#include <pthread.h>
#include "atsc_a53.h"
#include "encode.h"
#include "h264.h"
#include "h264_sei.h"
#include <dlfcn.h>
Go to the source code of this file.
Data Structures | |
struct | ExtraSEI |
struct | BufNode |
struct | VTEncContext |
Macros | |
#define | TARGET_CPU_ARM64 0 |
#define | GET_SYM(symbol, defaultVal) |
#define | VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM |
#define | COMMON_OPTIONS |
#define | OFFSET(x) offsetof(VTEncContext, x) |
Typedefs | |
typedef OSStatus(* | getParameterSetAtIndex) (CMFormatDescriptionRef videoDesc, size_t parameterSetIndex, const uint8_t **parameterSetPointerOut, size_t *parameterSetSizeOut, size_t *parameterSetCountOut, int *NALUnitHeaderLengthOut) |
Enumerations | |
enum | { kCMVideoCodecType_HEVC = 'hvc1' } |
enum | { kCMVideoCodecType_HEVCWithAlpha = 'muxa' } |
enum | { kCVPixelFormatType_420YpCbCr10BiPlanarFullRange = 'xf20' } |
enum | { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange = 'x420' } |
enum | VT_H264Profile { H264_PROF_AUTO, H264_PROF_BASELINE, H264_PROF_MAIN, H264_PROF_HIGH, H264_PROF_EXTENDED, H264_PROF_COUNT } |
enum | VTH264Entropy { VT_ENTROPY_NOT_SET, VT_CAVLC, VT_CABAC } |
enum | VT_HEVCProfile { HEVC_PROF_AUTO, HEVC_PROF_MAIN, HEVC_PROF_MAIN10, HEVC_PROF_COUNT } |
Functions | |
static void | loadVTEncSymbols () |
static int | vtenc_populate_extradata (AVCodecContext *avctx, CMVideoCodecType codec_type, CFStringRef profile_level, CFNumberRef gamma_level, CFDictionaryRef enc_info, CFDictionaryRef pixel_buffer_info) |
static void | vt_release_num (CFNumberRef *refPtr) |
NULL-safe release of *refPtr, and sets value to NULL. More... | |
static void | set_async_error (VTEncContext *vtctx, int err) |
static void | clear_frame_queue (VTEncContext *vtctx) |
static int | vtenc_q_pop (VTEncContext *vtctx, bool wait, CMSampleBufferRef *buf, ExtraSEI **sei) |
static void | vtenc_q_push (VTEncContext *vtctx, CMSampleBufferRef buffer, ExtraSEI *sei) |
static int | count_nalus (size_t length_code_size, CMSampleBufferRef sample_buffer, int *count) |
static CMVideoCodecType | get_cm_codec_type (AVCodecContext *avctx, int64_t profile, double alpha_quality) |
static int | get_params_size (AVCodecContext *avctx, CMVideoFormatDescriptionRef vid_fmt, size_t *size) |
Get the parameter sets from a CMSampleBufferRef. More... | |
static int | copy_param_sets (AVCodecContext *avctx, CMVideoFormatDescriptionRef vid_fmt, uint8_t *dst, size_t dst_size) |
static int | set_extradata (AVCodecContext *avctx, CMSampleBufferRef sample_buffer) |
static void | vtenc_output_callback (void *ctx, void *sourceFrameCtx, OSStatus status, VTEncodeInfoFlags flags, CMSampleBufferRef sample_buffer) |
static int | get_length_code_size (AVCodecContext *avctx, CMSampleBufferRef sample_buffer, size_t *size) |
static bool | get_vt_h264_profile_level (AVCodecContext *avctx, CFStringRef *profile_level_val) |
static bool | get_vt_hevc_profile_level (AVCodecContext *avctx, CFStringRef *profile_level_val) |
static int | get_cv_pixel_format (AVCodecContext *avctx, enum AVPixelFormat fmt, enum AVColorRange range, int *av_pixel_format, int *range_guessed) |
static void | add_color_attr (AVCodecContext *avctx, CFMutableDictionaryRef dict) |
static int | create_cv_pixel_buffer_info (AVCodecContext *avctx, CFMutableDictionaryRef *dict) |
static int | get_cv_color_primaries (AVCodecContext *avctx, CFStringRef *primaries) |
static int | get_cv_transfer_function (AVCodecContext *avctx, CFStringRef *transfer_fnc, CFNumberRef *gamma_level) |
static int | get_cv_ycbcr_matrix (AVCodecContext *avctx, CFStringRef *matrix) |
static bool | vtenc_qscale_enabled (void) |
static int | vtenc_create_encoder (AVCodecContext *avctx, CMVideoCodecType codec_type, CFStringRef profile_level, CFNumberRef gamma_level, CFDictionaryRef enc_info, CFDictionaryRef pixel_buffer_info, bool constant_bit_rate, VTCompressionSessionRef *session) |
static int | vtenc_configure_encoder (AVCodecContext *avctx) |
static av_cold int | vtenc_init (AVCodecContext *avctx) |
static void | vtenc_get_frame_info (CMSampleBufferRef buffer, bool *is_key_frame) |
static int | is_post_sei_nal_type (int nal_type) |
static int | find_sei_end (AVCodecContext *avctx, uint8_t *nal_data, size_t nal_size, uint8_t **sei_end) |
static int | copy_emulation_prev (const uint8_t *src, size_t src_size, uint8_t *dst, ssize_t dst_offset, size_t dst_size) |
Copies the data inserting emulation prevention bytes as needed. More... | |
static int | write_sei (const ExtraSEI *sei, int sei_type, uint8_t *dst, size_t dst_size) |
static int | copy_replace_length_codes (AVCodecContext *avctx, size_t length_code_size, CMSampleBufferRef sample_buffer, ExtraSEI *sei, uint8_t *dst_data, size_t dst_size) |
Copies NAL units and replaces length codes with H.264 Annex B start codes. More... | |
static int | get_sei_msg_bytes (const ExtraSEI *sei, int type) |
Returns a sufficient number of bytes to contain the sei data. More... | |
static int | vtenc_cm_to_avpacket (AVCodecContext *avctx, CMSampleBufferRef sample_buffer, AVPacket *pkt, ExtraSEI *sei) |
static int | get_cv_pixel_info (AVCodecContext *avctx, const AVFrame *frame, int *color, int *plane_count, size_t *widths, size_t *heights, size_t *strides, size_t *contiguous_buf_size) |
static int | copy_avframe_to_pixel_buffer (AVCodecContext *avctx, const AVFrame *frame, CVPixelBufferRef cv_img, const size_t *plane_strides, const size_t *plane_rows) |
static int | create_cv_pixel_buffer (AVCodecContext *avctx, const AVFrame *frame, CVPixelBufferRef *cv_img) |
static int | create_encoder_dict_h264 (const AVFrame *frame, CFDictionaryRef *dict_out) |
static int | vtenc_send_frame (AVCodecContext *avctx, VTEncContext *vtctx, const AVFrame *frame) |
static av_cold int | vtenc_frame (AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet) |
static av_cold int | vtenc_close (AVCodecContext *avctx) |
#define TARGET_CPU_ARM64 0 |
Definition at line 56 of file videotoolboxenc.c.
#define GET_SYM | ( | symbol, | |
defaultVal | |||
) |
Definition at line 112 of file videotoolboxenc.c.
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM |
Definition at line 2707 of file videotoolboxenc.c.
#define COMMON_OPTIONS |
Definition at line 2708 of file videotoolboxenc.c.
#define OFFSET | ( | x | ) | offsetof(VTEncContext, x) |
Definition at line 2722 of file videotoolboxenc.c.
typedef OSStatus(* getParameterSetAtIndex) (CMFormatDescriptionRef videoDesc, size_t parameterSetIndex, const uint8_t **parameterSetPointerOut, size_t *parameterSetSizeOut, size_t *parameterSetCountOut, int *NALUnitHeaderLengthOut) |
Definition at line 59 of file videotoolboxenc.c.
anonymous enum |
Enumerator | |
---|---|
kCMVideoCodecType_HEVC |
Definition at line 43 of file videotoolboxenc.c.
anonymous enum |
Enumerator | |
---|---|
kCMVideoCodecType_HEVCWithAlpha |
Definition at line 47 of file videotoolboxenc.c.
anonymous enum |
Enumerator | |
---|---|
kCVPixelFormatType_420YpCbCr10BiPlanarFullRange |
Definition at line 51 of file videotoolboxenc.c.
anonymous enum |
Enumerator | |
---|---|
kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange |
Definition at line 52 of file videotoolboxenc.c.
enum VT_H264Profile |
Enumerator | |
---|---|
H264_PROF_AUTO | |
H264_PROF_BASELINE | |
H264_PROF_MAIN | |
H264_PROF_HIGH | |
H264_PROF_EXTENDED | |
H264_PROF_COUNT |
Definition at line 176 of file videotoolboxenc.c.
enum VTH264Entropy |
Enumerator | |
---|---|
VT_ENTROPY_NOT_SET | |
VT_CAVLC | |
VT_CABAC |
Definition at line 185 of file videotoolboxenc.c.
enum VT_HEVCProfile |
Enumerator | |
---|---|
HEVC_PROF_AUTO | |
HEVC_PROF_MAIN | |
HEVC_PROF_MAIN10 | |
HEVC_PROF_COUNT |
Definition at line 191 of file videotoolboxenc.c.
|
static |
Definition at line 123 of file videotoolboxenc.c.
Referenced by vtenc_init().
|
static |
Definition at line 2530 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder().
|
static |
NULL-safe release of *refPtr, and sets value to NULL.
Definition at line 266 of file videotoolboxenc.c.
Referenced by create_cv_pixel_buffer_info().
|
static |
Definition at line 275 of file videotoolboxenc.c.
Referenced by clear_frame_queue(), vtenc_output_callback(), and vtenc_q_push().
|
static |
Definition at line 296 of file videotoolboxenc.c.
Referenced by vtenc_close().
|
static |
Definition at line 301 of file videotoolboxenc.c.
Referenced by vtenc_frame(), and vtenc_populate_extradata().
|
static |
Definition at line 351 of file videotoolboxenc.c.
Referenced by vtenc_output_callback().
|
static |
Definition at line 378 of file videotoolboxenc.c.
Referenced by vtenc_cm_to_avpacket().
|
static |
Definition at line 421 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder().
|
static |
Get the parameter sets from a CMSampleBufferRef.
dst | If *dst isn't NULL, the parameters are copied into existing memory. *dst_size must be set accordingly when *dst != NULL. If *dst is NULL, it will be allocated. In all cases, *dst_size is set to the number of bytes used starting at *dst. |
Definition at line 470 of file videotoolboxenc.c.
Referenced by set_extradata(), and vtenc_cm_to_avpacket().
|
static |
Definition at line 524 of file videotoolboxenc.c.
Referenced by set_extradata(), and vtenc_cm_to_avpacket().
|
static |
Definition at line 588 of file videotoolboxenc.c.
Referenced by vtenc_output_callback().
|
static |
Definition at line 637 of file videotoolboxenc.c.
Referenced by vtenc_create_encoder().
|
static |
Definition at line 673 of file videotoolboxenc.c.
Referenced by vtenc_cm_to_avpacket().
|
static |
Definition at line 710 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder().
|
static |
Definition at line 815 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder().
|
static |
Definition at line 844 of file videotoolboxenc.c.
Referenced by create_cv_pixel_buffer_info(), and get_cv_pixel_info().
|
static |
Definition at line 868 of file videotoolboxenc.c.
Referenced by create_cv_pixel_buffer_info().
|
static |
Definition at line 890 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder().
|
static |
Definition at line 957 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder().
|
static |
Definition at line 991 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder().
|
static |
Definition at line 1054 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder().
|
static |
Definition at line 1087 of file videotoolboxenc.c.
Referenced by vtenc_create_encoder().
|
static |
Definition at line 1092 of file videotoolboxenc.c.
Referenced by vtenc_configure_encoder(), and vtenc_populate_extradata().
|
static |
Definition at line 1453 of file videotoolboxenc.c.
Referenced by create_cv_pixel_buffer(), and vtenc_init().
|
static |
Definition at line 1574 of file videotoolboxenc.c.
|
static |
Definition at line 1608 of file videotoolboxenc.c.
Referenced by vtenc_cm_to_avpacket().
Definition at line 1635 of file videotoolboxenc.c.
Referenced by copy_replace_length_codes().
|
static |
Definition at line 1646 of file videotoolboxenc.c.
Referenced by copy_replace_length_codes().
|
static |
Copies the data inserting emulation prevention bytes as needed.
Existing data in the destination can be taken into account by providing dst with a dst_offset > 0.
Definition at line 1708 of file videotoolboxenc.c.
Referenced by get_sei_msg_bytes(), and write_sei().
Definition at line 1759 of file videotoolboxenc.c.
Referenced by copy_replace_length_codes().
|
static |
Copies NAL units and replaces length codes with H.264 Annex B start codes.
On failure, the contents of dst_data may have been modified.
length_code_size | Byte length of each length code |
sample_buffer | NAL units prefixed with length codes. |
sei | Optional A53 closed captions SEI data. |
dst_data | Must be zeroed before calling this function. Contains the copied NAL units prefixed with start codes when the function returns successfully. |
dst_size | Length of dst_data |
Definition at line 1832 of file videotoolboxenc.c.
Referenced by vtenc_cm_to_avpacket().
Returns a sufficient number of bytes to contain the sei data.
It may be greater than the minimum required.
Definition at line 1989 of file videotoolboxenc.c.
Referenced by vtenc_cm_to_avpacket().
|
static |
Definition at line 2006 of file videotoolboxenc.c.
Referenced by vtenc_frame().
|
static |
Definition at line 2136 of file videotoolboxenc.c.
Referenced by create_cv_pixel_buffer().
|
static |
Definition at line 2200 of file videotoolboxenc.c.
Referenced by create_cv_pixel_buffer().
|
static |
Definition at line 2292 of file videotoolboxenc.c.
Referenced by vtenc_send_frame().
Definition at line 2389 of file videotoolboxenc.c.
Referenced by vtenc_send_frame().
|
static |
Definition at line 2405 of file videotoolboxenc.c.
Referenced by vtenc_frame().
|
static |
Definition at line 2463 of file videotoolboxenc.c.
|
static |
Definition at line 2622 of file videotoolboxenc.c.
CFStringRef kCVImageBufferColorPrimaries_ITU_R_2020 |
Definition at line 68 of file videotoolboxenc.c.
Referenced by av_map_videotoolbox_color_primaries_from_av(), and loadVTEncSymbols().
CFStringRef kCVImageBufferTransferFunction_ITU_R_2020 |
Definition at line 69 of file videotoolboxenc.c.
Referenced by av_map_videotoolbox_color_trc_from_av(), and loadVTEncSymbols().
CFStringRef kCVImageBufferYCbCrMatrix_ITU_R_2020 |
Definition at line 70 of file videotoolboxenc.c.
Referenced by av_map_videotoolbox_color_matrix_from_av(), and loadVTEncSymbols().
CFStringRef kVTCompressionPropertyKey_H264EntropyMode |
Definition at line 72 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTH264EntropyMode_CAVLC |
Definition at line 73 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTH264EntropyMode_CABAC |
Definition at line 74 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Baseline_4_0 |
Definition at line 76 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Baseline_4_2 |
Definition at line 77 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Baseline_5_0 |
Definition at line 78 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Baseline_5_1 |
Definition at line 79 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Baseline_5_2 |
Definition at line 80 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Baseline_AutoLevel |
Definition at line 81 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Main_4_2 |
Definition at line 82 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Main_5_1 |
Definition at line 83 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Main_5_2 |
Definition at line 84 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Main_AutoLevel |
Definition at line 85 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_3_0 |
Definition at line 86 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_3_1 |
Definition at line 87 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_3_2 |
Definition at line 88 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_4_0 |
Definition at line 89 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_4_1 |
Definition at line 90 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_4_2 |
Definition at line 91 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_5_1 |
Definition at line 92 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_5_2 |
Definition at line 93 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_High_AutoLevel |
Definition at line 94 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Extended_5_0 |
Definition at line 95 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_H264_Extended_AutoLevel |
Definition at line 96 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_HEVC_Main_AutoLevel |
Definition at line 98 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTProfileLevel_HEVC_Main10_AutoLevel |
Definition at line 99 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTCompressionPropertyKey_RealTime |
Definition at line 101 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTCompressionPropertyKey_TargetQualityForAlpha |
Definition at line 102 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality |
Definition at line 103 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTCompressionPropertyKey_ConstantBitRate |
Definition at line 104 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder |
Definition at line 106 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
CFStringRef kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder |
Definition at line 107 of file videotoolboxenc.c.
Referenced by loadVTEncSymbols().
getParameterSetAtIndex CMVideoFormatDescriptionGetHEVCParameterSetAtIndex |
Definition at line 109 of file videotoolboxenc.c.
struct { ... } compat_keys |
|
static |
Definition at line 121 of file videotoolboxenc.c.
Referenced by vtenc_init().
|
static |
Definition at line 198 of file videotoolboxenc.c.
Referenced by cbs_mpeg2_split_fragment(), commit_bitstream_and_slice_buffer(), copy_param_sets(), copy_replace_length_codes(), decode_chunks(), ff_mjpeg_decode_frame_from_buf(), ff_mjpeg_find_marker(), ff_msmpeg4_decode_picture_header(), ff_rtp_send_mpegvideo(), get_params_size(), mpeg_decode_slice(), mpegvideo_extract_headers(), mxpeg_decode_frame(), slice_decode_thread(), and vtenc_cm_to_avpacket().
|
static |
Definition at line 2658 of file videotoolboxenc.c.
|
static |
Definition at line 2665 of file videotoolboxenc.c.
|
static |
Definition at line 2674 of file videotoolboxenc.c.
|
static |
Definition at line 2723 of file videotoolboxenc.c.
|
static |
Definition at line 2756 of file videotoolboxenc.c.
const FFCodec ff_h264_videotoolbox_encoder |
Definition at line 2763 of file videotoolboxenc.c.
|
static |
Definition at line 2778 of file videotoolboxenc.c.
|
static |
Definition at line 2791 of file videotoolboxenc.c.
const FFCodec ff_hevc_videotoolbox_encoder |
Definition at line 2798 of file videotoolboxenc.c.
|
static |
Definition at line 2815 of file videotoolboxenc.c.
|
static |
Definition at line 2829 of file videotoolboxenc.c.
const FFCodec ff_prores_videotoolbox_encoder |
Definition at line 2836 of file videotoolboxenc.c.