22 #include <va/va_enc_h264.h>
51 0x59, 0x94, 0x8b, 0x28, 0x11, 0xec, 0x45, 0xaf,
52 0x96, 0x75, 0x19, 0xd4, 0x1f, 0xea, 0xa9, 0x4d,
115 char *
data,
size_t *data_len,
129 "%zu < %zu.\n", *data_len,
151 "type = %d.\n",
header->nal_unit_type);
159 char *
data,
size_t *data_len)
189 char *
data,
size_t *data_len)
215 char *
data,
size_t *data_len)
273 *
type = VAEncPackedHeaderRawData;
283 *
type = VAEncPackedHeaderH264_SEI;
303 VAEncSequenceParameterBufferH264 *vseq =
ctx->codec_sequence_params;
304 VAEncPictureParameterBufferH264 *vpic =
ctx->codec_picture_params;
308 memset(
sps, 0,
sizeof(*
sps));
309 memset(
pps, 0,
sizeof(*
pps));
313 if (
desc->nb_components == 1 ||
desc->log2_chroma_w != 1 ||
desc->log2_chroma_h != 1) {
315 "%s is not supported.\n",
desc->name);
320 sps->nal_unit_header.nal_ref_idc = 3;
327 sps->constraint_set1_flag = 1;
330 sps->constraint_set3_flag =
ctx->gop_size == 1;
334 sps->constraint_set4_flag = 1;
335 sps->constraint_set5_flag =
ctx->b_per_p == 0;
338 if (
ctx->gop_size == 1)
362 if (
level->constraint_set3_flag)
363 sps->constraint_set3_flag = 1;
367 "to any level: using level 6.2.\n");
372 sps->seq_parameter_set_id = 0;
373 sps->chroma_format_idc = 1;
377 sps->log2_max_frame_num_minus4 = 4;
378 sps->pic_order_cnt_type =
ctx->max_b_depth ? 0 : 2;
379 if (
sps->pic_order_cnt_type == 0) {
380 sps->log2_max_pic_order_cnt_lsb_minus4 = 4;
386 sps->pic_height_in_map_units_minus1 = priv->
mb_height - 1;
388 sps->frame_mbs_only_flag = 1;
389 sps->direct_8x8_inference_flag = 1;
393 sps->frame_cropping_flag = 1;
395 sps->frame_crop_left_offset = 0;
396 sps->frame_crop_right_offset =
398 sps->frame_crop_top_offset = 0;
399 sps->frame_crop_bottom_offset =
402 sps->frame_cropping_flag = 0;
405 sps->vui_parameters_present_flag = 1;
415 sps->vui.aspect_ratio_idc =
i;
420 sps->vui.aspect_ratio_idc = 255;
421 sps->vui.sar_width = num;
422 sps->vui.sar_height = den;
424 sps->vui.aspect_ratio_info_present_flag = 1;
428 sps->vui.video_format = 5;
429 sps->vui.video_full_range_flag =
437 sps->vui.colour_description_present_flag = 1;
439 sps->vui.colour_description_present_flag)
440 sps->vui.video_signal_type_present_flag = 1;
443 sps->vui.chroma_loc_info_present_flag = 1;
444 sps->vui.chroma_sample_loc_type_top_field =
445 sps->vui.chroma_sample_loc_type_bottom_field =
449 sps->vui.timing_info_present_flag = 1;
453 sps->vui.fixed_frame_rate_flag = 1;
457 sps->vui.fixed_frame_rate_flag = 0;
464 sps->vui.nal_hrd_parameters_present_flag = 1;
493 (uint64_t)
ctx->hrd_params.initial_buffer_fullness /
494 ctx->hrd_params.buffer_size;
497 sps->vui.nal_hrd_parameters_present_flag = 0;
498 sps->vui.low_delay_hrd_flag = 1 -
sps->vui.fixed_frame_rate_flag;
501 sps->vui.bitstream_restriction_flag = 1;
502 sps->vui.motion_vectors_over_pic_boundaries_flag = 1;
503 sps->vui.log2_max_mv_length_horizontal = 15;
504 sps->vui.log2_max_mv_length_vertical = 15;
505 sps->vui.max_num_reorder_frames =
ctx->max_b_depth;
506 sps->vui.max_dec_frame_buffering =
ctx->max_b_depth + 1;
508 pps->nal_unit_header.nal_ref_idc = 3;
511 pps->pic_parameter_set_id = 0;
512 pps->seq_parameter_set_id = 0;
514 pps->entropy_coding_mode_flag =
518 if (!priv->
coder &&
pps->entropy_coding_mode_flag)
519 pps->entropy_coding_mode_flag = 0;
521 pps->num_ref_idx_l0_default_active_minus1 = 0;
522 pps->num_ref_idx_l1_default_active_minus1 = 0;
529 pps->more_rbsp_data = 0;
531 pps->more_rbsp_data = 1;
533 pps->transform_8x8_mode_flag = 1;
536 *vseq = (VAEncSequenceParameterBufferH264) {
537 .seq_parameter_set_id =
sps->seq_parameter_set_id,
538 .level_idc =
sps->level_idc,
539 .intra_period =
ctx->gop_size,
540 .intra_idr_period =
ctx->gop_size,
541 .ip_period =
ctx->b_per_p + 1,
543 .bits_per_second =
ctx->va_bit_rate,
544 .max_num_ref_frames =
sps->max_num_ref_frames,
545 .picture_width_in_mbs =
sps->pic_width_in_mbs_minus1 + 1,
546 .picture_height_in_mbs =
sps->pic_height_in_map_units_minus1 + 1,
549 .chroma_format_idc =
sps->chroma_format_idc,
550 .frame_mbs_only_flag =
sps->frame_mbs_only_flag,
551 .mb_adaptive_frame_field_flag =
sps->mb_adaptive_frame_field_flag,
552 .seq_scaling_matrix_present_flag =
sps->seq_scaling_matrix_present_flag,
553 .direct_8x8_inference_flag =
sps->direct_8x8_inference_flag,
554 .log2_max_frame_num_minus4 =
sps->log2_max_frame_num_minus4,
555 .pic_order_cnt_type =
sps->pic_order_cnt_type,
556 .log2_max_pic_order_cnt_lsb_minus4 =
sps->log2_max_pic_order_cnt_lsb_minus4,
557 .delta_pic_order_always_zero_flag =
sps->delta_pic_order_always_zero_flag,
560 .bit_depth_luma_minus8 =
sps->bit_depth_luma_minus8,
561 .bit_depth_chroma_minus8 =
sps->bit_depth_chroma_minus8,
563 .frame_cropping_flag =
sps->frame_cropping_flag,
564 .frame_crop_left_offset =
sps->frame_crop_left_offset,
565 .frame_crop_right_offset =
sps->frame_crop_right_offset,
566 .frame_crop_top_offset =
sps->frame_crop_top_offset,
567 .frame_crop_bottom_offset =
sps->frame_crop_bottom_offset,
569 .vui_parameters_present_flag =
sps->vui_parameters_present_flag,
572 .aspect_ratio_info_present_flag =
sps->vui.aspect_ratio_info_present_flag,
573 .timing_info_present_flag =
sps->vui.timing_info_present_flag,
574 .bitstream_restriction_flag =
sps->vui.bitstream_restriction_flag,
575 .log2_max_mv_length_horizontal =
sps->vui.log2_max_mv_length_horizontal,
576 .log2_max_mv_length_vertical =
sps->vui.log2_max_mv_length_vertical,
579 .aspect_ratio_idc =
sps->vui.aspect_ratio_idc,
580 .sar_width =
sps->vui.sar_width,
581 .sar_height =
sps->vui.sar_height,
582 .num_units_in_tick =
sps->vui.num_units_in_tick,
583 .time_scale =
sps->vui.time_scale,
586 *vpic = (VAEncPictureParameterBufferH264) {
588 .picture_id = VA_INVALID_ID,
589 .flags = VA_PICTURE_H264_INVALID,
592 .coded_buf = VA_INVALID_ID,
594 .pic_parameter_set_id =
pps->pic_parameter_set_id,
595 .seq_parameter_set_id =
pps->seq_parameter_set_id,
597 .pic_init_qp =
pps->pic_init_qp_minus26 + 26,
598 .num_ref_idx_l0_active_minus1 =
pps->num_ref_idx_l0_default_active_minus1,
599 .num_ref_idx_l1_active_minus1 =
pps->num_ref_idx_l1_default_active_minus1,
601 .chroma_qp_index_offset =
pps->chroma_qp_index_offset,
602 .second_chroma_qp_index_offset =
pps->second_chroma_qp_index_offset,
605 .entropy_coding_mode_flag =
pps->entropy_coding_mode_flag,
606 .weighted_pred_flag =
pps->weighted_pred_flag,
607 .weighted_bipred_idc =
pps->weighted_bipred_idc,
608 .constrained_intra_pred_flag =
pps->constrained_intra_pred_flag,
609 .transform_8x8_mode_flag =
pps->transform_8x8_mode_flag,
610 .deblocking_filter_control_present_flag =
611 pps->deblocking_filter_control_present_flag,
612 .redundant_pic_cnt_present_flag =
pps->redundant_pic_cnt_present_flag,
613 .pic_order_present_flag =
614 pps->bottom_field_pic_order_in_frame_present_flag,
615 .pic_scaling_matrix_present_flag =
pps->pic_scaling_matrix_present_flag,
686 if (
ctx->va_rc_mode == VA_RC_CBR)
702 .exact_match_flag = 1,
703 .broken_link_flag =
ctx->b_per_p > 0,
711 size_t sei_a53cc_len;
725 vpic->CurrPic = (VAPictureH264) {
738 href =
ref->priv_data;
740 vpic->ReferenceFrames[j++] = (VAPictureH264) {
741 .picture_id =
ref->recon_surface,
743 .flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE,
751 vpic->ReferenceFrames[j] = (VAPictureH264) {
752 .picture_id = VA_INVALID_ID,
753 .flags = VA_PICTURE_H264_INVALID,
786 for (j = n; j > 0; j--) {
791 rpl0[j] = rpl0[j - 1];
793 rpl0[j] = prev->
dpb[
i];
796 for (j = n; j > 0; j--) {
807 rpl0[j] = rpl0[j - 1];
809 rpl0[j] = prev->
dpb[
i];
811 for (j = n; j > 0; j--) {
822 rpl1[j] = rpl1[j - 1];
824 rpl1[j] = prev->
dpb[
i];
831 for (
i = 0;
i < n;
i++) {
832 if (rpl0[
i] != rpl1[
i])
843 for (
i = 0;
i < n;
i++) {
846 hn->frame_num,
hn->pic_order_cnt);
853 for (
i = 0;
i < n;
i++) {
856 hn->frame_num,
hn->pic_order_cnt);
892 ((1 << (4 +
sps->log2_max_frame_num_minus4)) - 1);
895 ((1 << (4 +
sps->log2_max_pic_order_cnt_lsb_minus4)) - 1);
908 int discard = 0, keep = 0;
914 if (prev->
dpb[
i] == pic->
dpb[j])
918 discard_list[discard] = prev->
dpb[
i];
930 for (
i = 0;
i < discard;
i++) {
955 if (pic->
refs[0][
i] != def_l0[
i])
980 int need_rplm_l0 = 0, need_rplm_l1 = 0;
986 if (pic->
refs[0][
i] != def_l0[n0])
995 if (pic->
refs[1][
i] != def_l1[n1])
1049 vslice->macroblock_info = VA_INVALID_ID;
1060 vslice->RefPicList0[
i].picture_id = VA_INVALID_ID;
1061 vslice->RefPicList0[
i].flags = VA_PICTURE_H264_INVALID;
1062 vslice->RefPicList1[
i].picture_id = VA_INVALID_ID;
1063 vslice->RefPicList1[
i].flags = VA_PICTURE_H264_INVALID;
1070 vslice->RefPicList0[0] = vpic->ReferenceFrames[0];
1075 vslice->RefPicList1[0] = vpic->ReferenceFrames[1];
1096 if (
ctx->va_rc_mode == VA_RC_CQP) {
1112 "%d / %d / %d for IDR- / P- / B-frames.\n",
1122 if (!
ctx->rc_mode->hrd) {
1129 const char *vaapi = VA_VERSION_S;
1137 driver = vaQueryVendorString(
ctx->hwctx->display);
1139 driver =
"unknown driver";
1148 "%s / VAAPI %s / %s", lavc, vaapi, driver);
1155 ctx->roi_quant_range = 51 + 6 * (
ctx->profile->depth - 8);
1161 #if VA_CHECK_VERSION(1, 18, 0)
1167 8, 3, 1, 1, VAProfileH264ConstrainedBaseline },
1179 .default_quality = 20,
1185 .sequence_params_size =
sizeof(VAEncSequenceParameterBufferH264),
1188 .picture_params_size =
sizeof(VAEncPictureParameterBufferH264),
1191 .slice_params_size =
sizeof(VAEncSliceParameterBufferH264),
1194 .sequence_header_type = VAEncPackedHeaderSequence,
1197 .slice_header_type = VAEncPackedHeaderH264_Slice,
1221 "supported, using constrained baseline profile instead.\n");
1226 "is not supported.\n");
1230 "is not supported.\n");
1239 "are not supported.\n");
1245 "in 8-bit unsigned integer.\n", avctx->
level);
1249 ctx->desired_packed_headers =
1250 VA_ENC_PACKED_HEADER_SEQUENCE |
1251 VA_ENC_PACKED_HEADER_SLICE |
1252 VA_ENC_PACKED_HEADER_MISC;
1257 ctx->slice_block_height =
ctx->slice_block_width = 16;
1260 ctx->explicit_qp = priv->
qp;
1277 #define OFFSET(x) offsetof(VAAPIEncodeH264Context, x)
1278 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1283 {
"qp",
"Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
1285 {
"quality",
"Set encode quality (trades off against speed, higher is faster)",
1287 {
"coder",
"Entropy coder type",
1294 {
"aud",
"Include AUD",
1297 {
"sei",
"Set SEI to include",
1300 0, INT_MAX,
FLAGS, .unit =
"sei" },
1301 {
"identifier",
"Include encoder version identifier",
1303 INT_MIN, INT_MAX,
FLAGS, .unit =
"sei" },
1304 {
"timing",
"Include timing parameters (buffering_period and pic_timing)",
1306 INT_MIN, INT_MAX,
FLAGS, .unit =
"sei" },
1307 {
"recovery_point",
"Include recovery points where appropriate",
1309 INT_MIN, INT_MAX,
FLAGS, .unit =
"sei" },
1310 {
"a53_cc",
"Include A/53 caption data",
1312 INT_MIN, INT_MAX,
FLAGS, .unit =
"sei" },
1314 {
"profile",
"Set profile (profile_idc and constraint_set*_flag)",
1318 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1319 { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1326 {
"level",
"Set level (level_idc)",
1330 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1331 { .i64 = value }, 0, 0, FLAGS, .unit = "level"
1333 {
LEVEL(
"1.1", 11) },
1334 {
LEVEL(
"1.2", 12) },
1335 {
LEVEL(
"1.3", 13) },
1337 {
LEVEL(
"2.1", 21) },
1338 {
LEVEL(
"2.2", 22) },
1340 {
LEVEL(
"3.1", 31) },
1341 {
LEVEL(
"3.2", 32) },
1343 {
LEVEL(
"4.1", 41) },
1344 {
LEVEL(
"4.2", 42) },
1346 {
LEVEL(
"5.1", 51) },
1347 {
LEVEL(
"5.2", 52) },
1349 {
LEVEL(
"6.1", 61) },
1350 {
LEVEL(
"6.2", 62) },
1360 {
"i_qfactor",
"1" },
1361 {
"i_qoffset",
"0" },
1362 {
"b_qfactor",
"6/5" },
1363 {
"b_qoffset",
"0" },
1377 .
p.
name =
"h264_vaapi",
1396 .p.wrapper_name =
"vaapi",