22 #include <va/va_enc_h264.h>
50 0x59, 0x94, 0x8b, 0x28, 0x11, 0xec, 0x45, 0xaf,
51 0x96, 0x75, 0x19, 0xd4, 0x1f, 0xea, 0xa9, 0x4d,
114 char *
data,
size_t *data_len,
128 "%zu < %zu.\n", *data_len,
150 "type = %d.\n",
header->nal_unit_type);
158 char *
data,
size_t *data_len)
188 char *
data,
size_t *data_len)
214 char *
data,
size_t *data_len)
272 *
type = VAEncPackedHeaderRawData;
282 *
type = VAEncPackedHeaderH264_SEI;
302 VAEncSequenceParameterBufferH264 *vseq =
ctx->codec_sequence_params;
303 VAEncPictureParameterBufferH264 *vpic =
ctx->codec_picture_params;
307 memset(
sps, 0,
sizeof(*
sps));
308 memset(
pps, 0,
sizeof(*
pps));
312 if (
desc->nb_components == 1 ||
desc->log2_chroma_w != 1 ||
desc->log2_chroma_h != 1) {
314 "%s is not supported.\n",
desc->name);
319 sps->nal_unit_header.nal_ref_idc = 3;
326 sps->constraint_set1_flag = 1;
329 sps->constraint_set3_flag =
ctx->gop_size == 1;
333 sps->constraint_set4_flag = 1;
334 sps->constraint_set5_flag =
ctx->b_per_p == 0;
337 if (
ctx->gop_size == 1)
361 if (
level->constraint_set3_flag)
362 sps->constraint_set3_flag = 1;
366 "to any level: using level 6.2.\n");
371 sps->seq_parameter_set_id = 0;
372 sps->chroma_format_idc = 1;
376 sps->log2_max_frame_num_minus4 = 4;
377 sps->pic_order_cnt_type =
ctx->max_b_depth ? 0 : 2;
378 if (
sps->pic_order_cnt_type == 0) {
379 sps->log2_max_pic_order_cnt_lsb_minus4 = 4;
385 sps->pic_height_in_map_units_minus1 = priv->
mb_height - 1;
387 sps->frame_mbs_only_flag = 1;
388 sps->direct_8x8_inference_flag = 1;
392 sps->frame_cropping_flag = 1;
394 sps->frame_crop_left_offset = 0;
395 sps->frame_crop_right_offset =
397 sps->frame_crop_top_offset = 0;
398 sps->frame_crop_bottom_offset =
401 sps->frame_cropping_flag = 0;
404 sps->vui_parameters_present_flag = 1;
414 sps->vui.aspect_ratio_idc =
i;
419 sps->vui.aspect_ratio_idc = 255;
420 sps->vui.sar_width = num;
421 sps->vui.sar_height = den;
423 sps->vui.aspect_ratio_info_present_flag = 1;
427 sps->vui.video_format = 5;
428 sps->vui.video_full_range_flag =
436 sps->vui.colour_description_present_flag = 1;
438 sps->vui.colour_description_present_flag)
439 sps->vui.video_signal_type_present_flag = 1;
442 sps->vui.chroma_loc_info_present_flag = 1;
443 sps->vui.chroma_sample_loc_type_top_field =
444 sps->vui.chroma_sample_loc_type_bottom_field =
448 sps->vui.timing_info_present_flag = 1;
452 sps->vui.fixed_frame_rate_flag = 1;
456 sps->vui.fixed_frame_rate_flag = 0;
463 sps->vui.nal_hrd_parameters_present_flag = 1;
492 (uint64_t)
ctx->hrd_params.initial_buffer_fullness /
493 ctx->hrd_params.buffer_size;
496 sps->vui.nal_hrd_parameters_present_flag = 0;
497 sps->vui.low_delay_hrd_flag = 1 -
sps->vui.fixed_frame_rate_flag;
500 sps->vui.bitstream_restriction_flag = 1;
501 sps->vui.motion_vectors_over_pic_boundaries_flag = 1;
502 sps->vui.log2_max_mv_length_horizontal = 15;
503 sps->vui.log2_max_mv_length_vertical = 15;
504 sps->vui.max_num_reorder_frames =
ctx->max_b_depth;
505 sps->vui.max_dec_frame_buffering =
ctx->max_b_depth + 1;
507 pps->nal_unit_header.nal_ref_idc = 3;
510 pps->pic_parameter_set_id = 0;
511 pps->seq_parameter_set_id = 0;
513 pps->entropy_coding_mode_flag =
517 if (!priv->
coder &&
pps->entropy_coding_mode_flag)
518 pps->entropy_coding_mode_flag = 0;
520 pps->num_ref_idx_l0_default_active_minus1 = 0;
521 pps->num_ref_idx_l1_default_active_minus1 = 0;
528 pps->more_rbsp_data = 0;
530 pps->more_rbsp_data = 1;
532 pps->transform_8x8_mode_flag = 1;
535 *vseq = (VAEncSequenceParameterBufferH264) {
536 .seq_parameter_set_id =
sps->seq_parameter_set_id,
537 .level_idc =
sps->level_idc,
538 .intra_period =
ctx->gop_size,
539 .intra_idr_period =
ctx->gop_size,
540 .ip_period =
ctx->b_per_p + 1,
542 .bits_per_second =
ctx->va_bit_rate,
543 .max_num_ref_frames =
sps->max_num_ref_frames,
544 .picture_width_in_mbs =
sps->pic_width_in_mbs_minus1 + 1,
545 .picture_height_in_mbs =
sps->pic_height_in_map_units_minus1 + 1,
548 .chroma_format_idc =
sps->chroma_format_idc,
549 .frame_mbs_only_flag =
sps->frame_mbs_only_flag,
550 .mb_adaptive_frame_field_flag =
sps->mb_adaptive_frame_field_flag,
551 .seq_scaling_matrix_present_flag =
sps->seq_scaling_matrix_present_flag,
552 .direct_8x8_inference_flag =
sps->direct_8x8_inference_flag,
553 .log2_max_frame_num_minus4 =
sps->log2_max_frame_num_minus4,
554 .pic_order_cnt_type =
sps->pic_order_cnt_type,
555 .log2_max_pic_order_cnt_lsb_minus4 =
sps->log2_max_pic_order_cnt_lsb_minus4,
556 .delta_pic_order_always_zero_flag =
sps->delta_pic_order_always_zero_flag,
559 .bit_depth_luma_minus8 =
sps->bit_depth_luma_minus8,
560 .bit_depth_chroma_minus8 =
sps->bit_depth_chroma_minus8,
562 .frame_cropping_flag =
sps->frame_cropping_flag,
563 .frame_crop_left_offset =
sps->frame_crop_left_offset,
564 .frame_crop_right_offset =
sps->frame_crop_right_offset,
565 .frame_crop_top_offset =
sps->frame_crop_top_offset,
566 .frame_crop_bottom_offset =
sps->frame_crop_bottom_offset,
568 .vui_parameters_present_flag =
sps->vui_parameters_present_flag,
571 .aspect_ratio_info_present_flag =
sps->vui.aspect_ratio_info_present_flag,
572 .timing_info_present_flag =
sps->vui.timing_info_present_flag,
573 .bitstream_restriction_flag =
sps->vui.bitstream_restriction_flag,
574 .log2_max_mv_length_horizontal =
sps->vui.log2_max_mv_length_horizontal,
575 .log2_max_mv_length_vertical =
sps->vui.log2_max_mv_length_vertical,
578 .aspect_ratio_idc =
sps->vui.aspect_ratio_idc,
579 .sar_width =
sps->vui.sar_width,
580 .sar_height =
sps->vui.sar_height,
581 .num_units_in_tick =
sps->vui.num_units_in_tick,
582 .time_scale =
sps->vui.time_scale,
585 *vpic = (VAEncPictureParameterBufferH264) {
587 .picture_id = VA_INVALID_ID,
588 .flags = VA_PICTURE_H264_INVALID,
591 .coded_buf = VA_INVALID_ID,
593 .pic_parameter_set_id =
pps->pic_parameter_set_id,
594 .seq_parameter_set_id =
pps->seq_parameter_set_id,
596 .pic_init_qp =
pps->pic_init_qp_minus26 + 26,
597 .num_ref_idx_l0_active_minus1 =
pps->num_ref_idx_l0_default_active_minus1,
598 .num_ref_idx_l1_active_minus1 =
pps->num_ref_idx_l1_default_active_minus1,
600 .chroma_qp_index_offset =
pps->chroma_qp_index_offset,
601 .second_chroma_qp_index_offset =
pps->second_chroma_qp_index_offset,
604 .entropy_coding_mode_flag =
pps->entropy_coding_mode_flag,
605 .weighted_pred_flag =
pps->weighted_pred_flag,
606 .weighted_bipred_idc =
pps->weighted_bipred_idc,
607 .constrained_intra_pred_flag =
pps->constrained_intra_pred_flag,
608 .transform_8x8_mode_flag =
pps->transform_8x8_mode_flag,
609 .deblocking_filter_control_present_flag =
610 pps->deblocking_filter_control_present_flag,
611 .redundant_pic_cnt_present_flag =
pps->redundant_pic_cnt_present_flag,
612 .pic_order_present_flag =
613 pps->bottom_field_pic_order_in_frame_present_flag,
614 .pic_scaling_matrix_present_flag =
pps->pic_scaling_matrix_present_flag,
685 if (
ctx->va_rc_mode == VA_RC_CBR)
701 .exact_match_flag = 1,
702 .broken_link_flag =
ctx->b_per_p > 0,
710 size_t sei_a53cc_len;
724 vpic->CurrPic = (VAPictureH264) {
737 href =
ref->priv_data;
739 vpic->ReferenceFrames[j++] = (VAPictureH264) {
740 .picture_id =
ref->recon_surface,
742 .flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE,
750 vpic->ReferenceFrames[j] = (VAPictureH264) {
751 .picture_id = VA_INVALID_ID,
752 .flags = VA_PICTURE_H264_INVALID,
761 vpic->pic_fields.bits.reference_pic_flag = pic->
is_reference;
785 for (j = n; j > 0; j--) {
790 rpl0[j] = rpl0[j - 1];
792 rpl0[j] = prev->
dpb[
i];
795 for (j = n; j > 0; j--) {
806 rpl0[j] = rpl0[j - 1];
808 rpl0[j] = prev->
dpb[
i];
810 for (j = n; j > 0; j--) {
821 rpl1[j] = rpl1[j - 1];
823 rpl1[j] = prev->
dpb[
i];
830 for (
i = 0;
i < n;
i++) {
831 if (rpl0[
i] != rpl1[
i])
842 for (
i = 0;
i < n;
i++) {
845 hn->frame_num,
hn->pic_order_cnt);
852 for (
i = 0;
i < n;
i++) {
855 hn->frame_num,
hn->pic_order_cnt);
891 ((1 << (4 +
sps->log2_max_frame_num_minus4)) - 1);
894 ((1 << (4 +
sps->log2_max_pic_order_cnt_lsb_minus4)) - 1);
907 int discard = 0, keep = 0;
913 if (prev->
dpb[
i] == pic->
dpb[j])
917 discard_list[discard] = prev->
dpb[
i];
929 for (
i = 0;
i < discard;
i++) {
954 if (pic->
refs[0][
i] != def_l0[
i])
979 int need_rplm_l0 = 0, need_rplm_l1 = 0;
985 if (pic->
refs[0][
i] != def_l0[n0])
994 if (pic->
refs[1][
i] != def_l1[n1])
1048 vslice->macroblock_info = VA_INVALID_ID;
1059 vslice->RefPicList0[
i].picture_id = VA_INVALID_ID;
1060 vslice->RefPicList0[
i].flags = VA_PICTURE_H264_INVALID;
1061 vslice->RefPicList1[
i].picture_id = VA_INVALID_ID;
1062 vslice->RefPicList1[
i].flags = VA_PICTURE_H264_INVALID;
1069 vslice->RefPicList0[0] = vpic->ReferenceFrames[0];
1074 vslice->RefPicList1[0] = vpic->ReferenceFrames[1];
1095 if (
ctx->va_rc_mode == VA_RC_CQP) {
1111 "%d / %d / %d for IDR- / P- / B-frames.\n",
1121 if (!
ctx->rc_mode->hrd) {
1128 const char *vaapi = VA_VERSION_S;
1136 driver = vaQueryVendorString(
ctx->hwctx->display);
1138 driver =
"unknown driver";
1147 "%s / VAAPI %s / %s", lavc, vaapi, driver);
1154 ctx->roi_quant_range = 51 + 6 * (
ctx->profile->depth - 8);
1160 #if VA_CHECK_VERSION(1, 18, 0)
1166 8, 3, 1, 1, VAProfileH264ConstrainedBaseline },
1178 .default_quality = 20,
1184 .sequence_params_size =
sizeof(VAEncSequenceParameterBufferH264),
1187 .picture_params_size =
sizeof(VAEncPictureParameterBufferH264),
1190 .slice_params_size =
sizeof(VAEncSliceParameterBufferH264),
1193 .sequence_header_type = VAEncPackedHeaderSequence,
1196 .slice_header_type = VAEncPackedHeaderH264_Slice,
1220 "supported, using constrained baseline profile instead.\n");
1225 "is not supported.\n");
1229 "is not supported.\n");
1238 "are not supported.\n");
1244 "in 8-bit unsigned integer.\n", avctx->
level);
1248 ctx->desired_packed_headers =
1249 VA_ENC_PACKED_HEADER_SEQUENCE |
1250 VA_ENC_PACKED_HEADER_SLICE |
1251 VA_ENC_PACKED_HEADER_MISC;
1256 ctx->slice_block_height =
ctx->slice_block_width = 16;
1259 ctx->explicit_qp = priv->
qp;
1276 #define OFFSET(x) offsetof(VAAPIEncodeH264Context, x)
1277 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1282 {
"qp",
"Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
1284 {
"quality",
"Set encode quality (trades off against speed, higher is faster)",
1286 {
"coder",
"Entropy coder type",
1293 {
"aud",
"Include AUD",
1296 {
"sei",
"Set SEI to include",
1299 0, INT_MAX,
FLAGS, .unit =
"sei" },
1300 {
"identifier",
"Include encoder version identifier",
1302 INT_MIN, INT_MAX,
FLAGS, .unit =
"sei" },
1303 {
"timing",
"Include timing parameters (buffering_period and pic_timing)",
1305 INT_MIN, INT_MAX,
FLAGS, .unit =
"sei" },
1306 {
"recovery_point",
"Include recovery points where appropriate",
1308 INT_MIN, INT_MAX,
FLAGS, .unit =
"sei" },
1309 {
"a53_cc",
"Include A/53 caption data",
1311 INT_MIN, INT_MAX,
FLAGS, .unit =
"sei" },
1313 {
"profile",
"Set profile (profile_idc and constraint_set*_flag)",
1317 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1318 { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1325 {
"level",
"Set level (level_idc)",
1329 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1330 { .i64 = value }, 0, 0, FLAGS, .unit = "level"
1332 {
LEVEL(
"1.1", 11) },
1333 {
LEVEL(
"1.2", 12) },
1334 {
LEVEL(
"1.3", 13) },
1336 {
LEVEL(
"2.1", 21) },
1337 {
LEVEL(
"2.2", 22) },
1339 {
LEVEL(
"3.1", 31) },
1340 {
LEVEL(
"3.2", 32) },
1342 {
LEVEL(
"4.1", 41) },
1343 {
LEVEL(
"4.2", 42) },
1345 {
LEVEL(
"5.1", 51) },
1346 {
LEVEL(
"5.2", 52) },
1348 {
LEVEL(
"6.1", 61) },
1349 {
LEVEL(
"6.2", 62) },
1359 {
"i_qfactor",
"1" },
1360 {
"i_qoffset",
"0" },
1361 {
"b_qfactor",
"6/5" },
1362 {
"b_qoffset",
"0" },
1376 .
p.
name =
"h264_vaapi",
1395 .p.wrapper_name =
"vaapi",