22 #include <va/va_enc_h264.h> 46 0x59, 0x94, 0x8b, 0x28, 0x11, 0xec, 0x45, 0xaf,
47 0x96, 0x75, 0x19, 0xd4, 0x1f, 0xea, 0xa9, 0x4d,
108 char *
data,
size_t *data_len,
122 "%zu < %zu.\n", *data_len,
152 char *
data,
size_t *data_len)
182 char *
data,
size_t *data_len)
208 char *
data,
size_t *data_len)
259 *type = VAEncPackedHeaderRawData;
269 *type = VAEncPackedHeaderH264_SEI;
292 memset(sps, 0,
sizeof(*sps));
293 memset(pps, 0,
sizeof(*pps));
342 "to any level: using level 6.2.\n");
382 { 1, 1 }, { 12, 11 }, { 10, 11 }, { 16, 11 },
383 { 40, 33 }, { 24, 11 }, { 20, 11 }, { 32, 11 },
384 { 80, 33 }, { 18, 11 }, { 15, 11 }, { 64, 33 },
385 { 160, 99 }, { 4, 3 }, { 3, 2 }, { 2, 1 },
391 if (num == sar_idc[i].num &&
392 den == sar_idc[i].den) {
471 (uint64_t)ctx->
hrd_params.initial_buffer_fullness /
514 *vseq = (VAEncSequenceParameterBufferH264) {
564 *vpic = (VAEncPictureParameterBufferH264) {
566 .picture_id = VA_INVALID_ID,
567 .flags = VA_PICTURE_H264_INVALID,
570 .coded_buf = VA_INVALID_ID,
588 .deblocking_filter_control_present_flag =
591 .pic_order_present_flag =
676 .exact_match_flag = 1,
677 .broken_link_flag = ctx->
b_per_p > 0,
683 vpic->CurrPic = (VAPictureH264) {
691 for (i = 0; i < pic->
nb_refs; i++) {
698 vpic->ReferenceFrames[
i] = (VAPictureH264) {
701 .flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE,
707 vpic->ReferenceFrames[
i] = (VAPictureH264) {
708 .picture_id = VA_INVALID_ID,
709 .flags = VA_PICTURE_H264_INVALID,
742 for (j = n; j > 0; j--) {
747 rpl0[j] = rpl0[j - 1];
749 rpl0[j] = prev->
dpb[
i];
752 for (j = n; j > 0; j--) {
763 rpl0[j] = rpl0[j - 1];
765 rpl0[j] = prev->
dpb[
i];
767 for (j = n; j > 0; j--) {
778 rpl1[j] = rpl1[j - 1];
780 rpl1[j] = prev->
dpb[
i];
787 for (i = 0; i < n; i++) {
788 if (rpl0[i] != rpl1[i])
799 for (i = 0; i < n; i++) {
809 for (i = 0; i < n; i++) {
864 int discard = 0, keep = 0;
870 if (prev->
dpb[i] == pic->
dpb[j])
874 discard_list[discard] = prev->
dpb[
i];
886 for (i = 0; i < discard; i++) {
909 for (i = 0; i < pic->
nb_refs; i++) {
911 if (pic->
refs[i] != def_l0[i])
918 for (i = 0; i < pic->
nb_refs; i++) {
936 int need_rplm_l0 = 0, need_rplm_l1 = 0;
938 for (i = 0; i < pic->
nb_refs; i++) {
943 if (pic->
refs[i] != def_l0[n0])
947 if (pic->
refs[i] != def_l1[n1])
956 for (i = j = 0; i < pic->
nb_refs; i++) {
980 for (i = j = 0; i < pic->
nb_refs; i++) {
1006 vslice->macroblock_info = VA_INVALID_ID;
1017 vslice->RefPicList0[
i].picture_id = VA_INVALID_ID;
1018 vslice->RefPicList0[
i].flags = VA_PICTURE_H264_INVALID;
1019 vslice->RefPicList1[
i].picture_id = VA_INVALID_ID;
1020 vslice->RefPicList1[
i].flags = VA_PICTURE_H264_INVALID;
1028 vslice->RefPicList0[0] = vpic->ReferenceFrames[0];
1033 vslice->RefPicList1[0] = vpic->ReferenceFrames[1];
1070 "%d / %d / %d for IDR- / P- / B-frames.\n",
1087 const char *vaapi = VA_VERSION_S;
1097 driver =
"unknown driver";
1099 len =
snprintf(
NULL, 0,
"%s / VAAPI %s / %s", lavc, vaapi, driver);
1106 "%s / VAAPI %s / %s", lavc, vaapi, driver);
1122 8, 3, 1, 1, VAProfileH264ConstrainedBaseline },
1134 .default_quality = 20,
1140 .sequence_params_size =
sizeof(VAEncSequenceParameterBufferH264),
1143 .picture_params_size =
sizeof(VAEncPictureParameterBufferH264),
1146 .slice_params_size =
sizeof(VAEncSliceParameterBufferH264),
1149 .sequence_header_type = VAEncPackedHeaderSequence,
1152 .slice_header_type = VAEncPackedHeaderH264_Slice,
1176 "supported, using constrained baseline profile instead.\n");
1181 "is not supported.\n");
1186 "are not supported.\n");
1195 "are not supported.\n");
1201 "in 8-bit unsigned integer.\n", avctx->
level);
1206 VA_ENC_PACKED_HEADER_SEQUENCE |
1207 VA_ENC_PACKED_HEADER_SLICE |
1208 VA_ENC_PACKED_HEADER_MISC;
1232 #define OFFSET(x) offsetof(VAAPIEncodeH264Context, x) 1233 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM) 1238 {
"qp",
"Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
1240 {
"quality",
"Set encode quality (trades off against speed, higher is faster)",
1242 {
"coder",
"Entropy coder type",
1249 {
"aud",
"Include AUD",
1252 {
"sei",
"Set SEI to include",
1255 0, INT_MAX,
FLAGS,
"sei" },
1256 {
"identifier",
"Include encoder version identifier",
1258 INT_MIN, INT_MAX,
FLAGS,
"sei" },
1259 {
"timing",
"Include timing parameters (buffering_period and pic_timing)",
1261 INT_MIN, INT_MAX,
FLAGS,
"sei" },
1262 {
"recovery_point",
"Include recovery points where appropriate",
1264 INT_MIN, INT_MAX,
FLAGS,
"sei" },
1266 {
"profile",
"Set profile (profile_idc and constraint_set*_flag)",
1270 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \ 1271 { .i64 = value }, 0, 0, FLAGS, "profile" 1277 {
"level",
"Set level (level_idc)",
1281 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \ 1282 { .i64 = value }, 0, 0, FLAGS, "level" 1284 {
LEVEL(
"1.1", 11) },
1285 {
LEVEL(
"1.2", 12) },
1286 {
LEVEL(
"1.3", 13) },
1288 {
LEVEL(
"2.1", 21) },
1289 {
LEVEL(
"2.2", 22) },
1291 {
LEVEL(
"3.1", 31) },
1292 {
LEVEL(
"3.2", 32) },
1294 {
LEVEL(
"4.1", 41) },
1295 {
LEVEL(
"4.2", 42) },
1297 {
LEVEL(
"5.1", 51) },
1298 {
LEVEL(
"5.2", 52) },
1300 {
LEVEL(
"6.1", 61) },
1301 {
LEVEL(
"6.2", 62) },
1311 {
"i_qfactor",
"1" },
1312 {
"i_qoffset",
"0" },
1313 {
"b_qfactor",
"6/5" },
1314 {
"b_qoffset",
"0" },
1328 .
name =
"h264_vaapi",
1336 .priv_class = &vaapi_encode_h264_class,
1340 .
defaults = vaapi_encode_h264_defaults,
1346 .wrapper_name =
"vaapi",
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define FF_PROFILE_H264_MAIN
H264RawNALUnitHeader nal_unit_header
uint8_t frame_cropping_flag
uint8_t deblocking_filter_control_present_flag
static const VAAPIEncodeType vaapi_encode_type_h264
#define FF_PROFILE_H264_CAVLC_444
uint8_t bit_depth_chroma_minus8
#define FF_COMPRESSION_DEFAULT
static av_cold int vaapi_encode_h264_configure(AVCodecContext *avctx)
char * sei_identifier_string
ptrdiff_t const GLvoid * data
static void vaapi_encode_h264_default_ref_pic_list(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodePicture **rpl0, VAAPIEncodePicture **rpl1, int *rpl_size)
uint16_t recovery_frame_cnt
uint8_t dpb_output_delay_length_minus1
uint8_t initial_cpb_removal_delay_length_minus1
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
#define LIBAVUTIL_VERSION_INT
uint8_t chroma_sample_loc_type_bottom_field
static av_cold int init(AVCodecContext *avctx)
uint8_t constraint_set3_flag
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
int ff_cbs_init(CodedBitstreamContext **ctx_ptr, enum AVCodecID codec_id, void *log_ctx)
Create and initialise a new context for the given codec.
enum AVColorRange color_range
MPEG vs JPEG YUV range.
uint8_t log2_max_frame_num_minus4
const char * av_default_item_name(void *ptr)
Return the context name.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
uint8_t time_offset_length
uint8_t low_delay_hrd_flag
#define FF_ARRAY_ELEMS(a)
uint8_t seq_parameter_set_id
void * codec_sequence_params
uint8_t max_dec_frame_buffering
uint8_t fixed_frame_rate_flag
float i_quant_offset
qscale offset between P and I-frames
int ff_cbs_sei_add_message(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, int prefix, uint32_t payload_type, void *payload_data, AVBufferRef *payload_buf)
Add an SEI message to an access unit.
static const AVClass vaapi_encode_h264_class
#define FF_PROFILE_H264_HIGH_444_PREDICTIVE
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
uint8_t uuid_iso_iec_11578[16]
uint8_t weighted_pred_flag
uint8_t constraint_set4_flag
H264RawHRD nal_hrd_parameters
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static const AVOption vaapi_encode_h264_options[]
H264RawSEIRecoveryPoint sei_recovery_point
#define FF_PROFILE_H264_BASELINE
uint16_t frame_crop_top_offset
uint16_t pic_width_in_mbs_minus1
static const AVCodecDefault vaapi_encode_h264_defaults[]
const VAAPIEncodeRCMode * rc_mode
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
static const uint8_t vaapi_encode_h264_sei_identifier_uuid[16]
uint32_t num_units_in_tick
uint8_t mb_adaptive_frame_field_flag
uint8_t transform_8x8_mode_flag
uint8_t constrained_intra_pred_flag
uint32_t cpb_size_value_minus1[H264_MAX_CPB_CNT]
uint16_t frame_crop_left_offset
static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, VAAPIEncodePicture *pic)
static float hn(int n, EqParameter *param, float fs)
static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
struct VAAPIEncodePicture * prev
#define AVERROR_EOF
End of file.
#define FF_PROFILE_H264_EXTENDED
#define AV_LOG_VERBOSE
Detailed information.
VASurfaceID recon_surface
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
static const uint8_t header[24]
H264RawNALUnitHeader nal_unit_header
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
int8_t second_chroma_qp_index_offset
void ff_cbs_fragment_reset(CodedBitstreamFragment *frag)
Free the units contained in a fragment as well as the fragment's own data buffer, but not the units a...
uint8_t nal_hrd_parameters_present_flag
uint8_t bit_depth_luma_minus8
size_t data_size
The number of bytes in the bitstream.
H.264 common definitions.
uint8_t pic_scaling_matrix_present_flag
uint8_t chroma_sample_loc_type_top_field
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
uint8_t aspect_ratio_info_present_flag
uint8_t max_num_ref_frames
uint8_t weighted_bipred_idc
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
uint8_t transfer_characteristics
static int vaapi_encode_h264_write_access_unit(AVCodecContext *avctx, char *data, size_t *data_len, CodedBitstreamFragment *au)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
CodedBitstreamContext * cbc
#define FF_PROFILE_H264_HIGH_422
#define FF_PROFILE_H264_HIGH
uint32_t initial_cpb_removal_delay_offset[H264_MAX_CPB_CNT]
uint8_t num_ref_idx_l1_default_active_minus1
simple assert() macros that are a bit more flexible than ISO C assert().
const char * name
Name of the codec implementation.
uint8_t frame_mbs_only_flag
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
static const AVCodecDefault defaults[]
uint8_t seq_parameter_set_id
uint8_t seq_scaling_matrix_present_flag
static int vaapi_encode_h264_init_sequence_params(AVCodecContext *avctx)
void * codec_picture_params
size_t data_bit_padding
The number of bits which should be ignored in the final byte.
uint8_t timing_info_present_flag
H264RawSEIPicTiming sei_pic_timing
uint8_t video_full_range_flag
uint8_t seq_parameter_set_id
#define LEVEL(name, value)
common internal API header
AVCodec ff_h264_vaapi_encoder
static int vaapi_encode_h264_write_sequence_header(AVCodecContext *avctx, char *data, size_t *data_len)
uint16_t frame_crop_bottom_offset
int width
picture width / height.
uint8_t vui_parameters_present_flag
const VAAPIEncodeProfile * profile
#define FF_PROFILE_UNKNOWN
const VAAPIEncodeProfile * profiles
av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
uint32_t cpb_removal_delay
uint8_t colour_description_present_flag
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
static const VAAPIEncodeProfile vaapi_encode_h264_profiles[]
uint8_t video_signal_type_present_flag
void * codec_picture_params
static int vaapi_encode_h264_write_slice_header(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice, char *data, size_t *data_len)
static int vaapi_encode_h264_add_nal(AVCodecContext *avctx, CodedBitstreamFragment *au, void *nal_unit)
int8_t chroma_qp_index_offset
int ff_vaapi_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
uint8_t constraint_set5_flag
uint8_t chroma_format_idc
uint8_t * data
Pointer to the bitstream form of this fragment.
int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
Write the content of the fragment to its own internal buffer.
VADisplay display
The VADisplay handle, to be filled by the user.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
struct VAAPIEncodePicture * refs[MAX_PICTURE_REFERENCES]
uint32_t bit_rate_value_minus1[H264_MAX_CPB_CNT]
H264RawNALUnitHeader nal_unit_header
uint8_t chroma_loc_info_present_flag
uint8_t cbr_flag[H264_MAX_CPB_CNT]
const struct VAAPIEncodeType * codec
Libavcodec external API header.
#define VAAPI_ENCODE_RC_OPTIONS
#define FF_PROFILE_H264_HIGH_422_INTRA
uint8_t bottom_field_pic_order_in_frame_present_flag
uint8_t entropy_coding_mode_flag
Coded bitstream fragment structure, combining one or more units.
VAAPIEncodeContext common
main external API structure.
#define FF_PROFILE_H264_HIGH_10_INTRA
static int FUNC() aud(CodedBitstreamContext *ctx, RWContext *rw, H264RawAUD *current)
uint8_t pic_order_cnt_type
Describe the class of an AVClass context structure.
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Context structure for coded bitstream operations.
uint8_t matrix_coefficients
uint8_t num_ref_idx_l0_default_active_minus1
enum AVColorSpace colorspace
YUV colorspace type.
Rational number (pair of numerator and denominator).
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
int ff_cbs_insert_unit_content(CodedBitstreamFragment *frag, int position, CodedBitstreamUnitType type, void *content, AVBufferRef *content_buf)
Insert a new unit into a fragment with the given content.
SEIRawUserDataUnregistered sei_identifier
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
#define FF_PROFILE_H264_HIGH_444
uint8_t log2_max_mv_length_horizontal
void ff_cbs_close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
float b_quant_offset
qscale offset between IP and B-frames
static enum AVPixelFormat pix_fmts[]
CodedBitstreamFragment current_access_unit
#define VAAPI_ENCODE_COMMON_OPTIONS
uint8_t direct_8x8_inference_flag
int sei_cbr_workaround_needed
static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice)
uint32_t initial_cpb_removal_delay[H264_MAX_CPB_CNT]
VAEncMiscParameterHRD hrd_params
common internal api header.
common internal and external API header
static int ref[MAX_W *MAX_W]
uint8_t redundant_pic_cnt_present_flag
uint8_t cpb_removal_delay_length_minus1
uint8_t motion_vectors_over_pic_boundaries_flag
static int FUNC() sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)
uint8_t bitstream_restriction_flag
uint16_t frame_crop_right_offset
uint8_t pic_parameter_set_id
uint8_t max_num_reorder_frames
#define PROFILE(name, value)
uint8_t log2_max_mv_length_vertical
H264RawSliceHeader header
uint8_t log2_max_pic_order_cnt_lsb_minus4
struct H264RawSEIBufferingPeriod::@27 nal
static av_cold int vaapi_encode_h264_close(AVCodecContext *avctx)
void * codec_slice_params
uint8_t delta_pic_order_always_zero_flag
H264RawSEIBufferingPeriod sei_buffering_period
#define FF_PROFILE_H264_HIGH_444_INTRA
void ff_cbs_fragment_free(CodedBitstreamFragment *frag)
Free the units array of a fragment in addition to what ff_cbs_fragment_reset does.
int8_t pic_init_qp_minus26
unsigned int desired_packed_headers
#define FFSWAP(type, a, b)
uint8_t constraint_set1_flag
uint16_t pic_height_in_map_units_minus1
#define FF_PROFILE_H264_CONSTRAINED_BASELINE
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
#define FF_PROFILE_H264_HIGH_10
AVPixelFormat
Pixel format.
struct VAAPIEncodePicture * dpb[MAX_DPB_SIZE]
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators...
av_cold int ff_vaapi_encode_close(AVCodecContext *avctx)
const AVCodecHWConfigInternal *const ff_vaapi_encode_hw_configs[]
const H264LevelDescriptor * ff_h264_guess_level(int profile_idc, int64_t bitrate, int framerate, int width, int height, int max_dec_frame_buffering)
Guess the level of a stream from some parameters.
AVVAAPIDeviceContext * hwctx
uint8_t constraint_set3_flag