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,
 
  144                "type = %d.\n", 
header->nal_unit_type);
 
  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;
 
  289     VAEncSequenceParameterBufferH264 *vseq = 
ctx->codec_sequence_params;
 
  290     VAEncPictureParameterBufferH264  *vpic = 
ctx->codec_picture_params;
 
  292     memset(
sps, 0, 
sizeof(*
sps));
 
  293     memset(
pps, 0, 
sizeof(*
pps));
 
  295     sps->nal_unit_header.nal_ref_idc   = 3;
 
  302         sps->constraint_set1_flag = 1;
 
  305         sps->constraint_set3_flag = 
ctx->gop_size == 1;
 
  309         sps->constraint_set4_flag = 1;
 
  310         sps->constraint_set5_flag = 
ctx->b_per_p == 0;
 
  313     if (
ctx->gop_size == 1)
 
  337             if (
level->constraint_set3_flag)
 
  338                 sps->constraint_set3_flag = 1;
 
  342                    "to any level: using level 6.2.\n");
 
  347     sps->seq_parameter_set_id = 0;
 
  348     sps->chroma_format_idc    = 1;
 
  350     sps->log2_max_frame_num_minus4 = 4;
 
  351     sps->pic_order_cnt_type        = 0;
 
  352     sps->log2_max_pic_order_cnt_lsb_minus4 = 4;
 
  357     sps->pic_height_in_map_units_minus1 = priv->
mb_height - 1;
 
  359     sps->frame_mbs_only_flag = 1;
 
  360     sps->direct_8x8_inference_flag = 1;
 
  364         sps->frame_cropping_flag = 1;
 
  366         sps->frame_crop_left_offset   = 0;
 
  367         sps->frame_crop_right_offset  =
 
  369         sps->frame_crop_top_offset    = 0;
 
  370         sps->frame_crop_bottom_offset =
 
  373         sps->frame_cropping_flag = 0;
 
  376     sps->vui_parameters_present_flag = 1;
 
  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) {
 
  393                 sps->vui.aspect_ratio_idc = 
i;
 
  398             sps->vui.aspect_ratio_idc = 255;
 
  399             sps->vui.sar_width  = num;
 
  400             sps->vui.sar_height = den;
 
  402         sps->vui.aspect_ratio_info_present_flag = 1;
 
  406     sps->vui.video_format             = 5;
 
  407     sps->vui.video_full_range_flag    =
 
  415         sps->vui.colour_description_present_flag = 1;
 
  417         sps->vui.colour_description_present_flag)
 
  418         sps->vui.video_signal_type_present_flag = 1;
 
  421         sps->vui.chroma_loc_info_present_flag = 1;
 
  422         sps->vui.chroma_sample_loc_type_top_field    =
 
  423         sps->vui.chroma_sample_loc_type_bottom_field =
 
  427     sps->vui.timing_info_present_flag = 1;
 
  431         sps->vui.fixed_frame_rate_flag = 1;
 
  435         sps->vui.fixed_frame_rate_flag = 0;
 
  442         sps->vui.nal_hrd_parameters_present_flag = 1;
 
  471             (uint64_t)
ctx->hrd_params.initial_buffer_fullness /
 
  472             ctx->hrd_params.buffer_size;
 
  475         sps->vui.nal_hrd_parameters_present_flag = 0;
 
  476         sps->vui.low_delay_hrd_flag = 1 - 
sps->vui.fixed_frame_rate_flag;
 
  479     sps->vui.bitstream_restriction_flag    = 1;
 
  480     sps->vui.motion_vectors_over_pic_boundaries_flag = 1;
 
  481     sps->vui.log2_max_mv_length_horizontal = 15;
 
  482     sps->vui.log2_max_mv_length_vertical   = 15;
 
  483     sps->vui.max_num_reorder_frames        = 
ctx->max_b_depth;
 
  484     sps->vui.max_dec_frame_buffering       = 
ctx->max_b_depth + 1;
 
  486     pps->nal_unit_header.nal_ref_idc = 3;
 
  489     pps->pic_parameter_set_id = 0;
 
  490     pps->seq_parameter_set_id = 0;
 
  492     pps->entropy_coding_mode_flag =
 
  496     if (!priv->
coder && 
pps->entropy_coding_mode_flag)
 
  497         pps->entropy_coding_mode_flag = 0;
 
  499     pps->num_ref_idx_l0_default_active_minus1 = 0;
 
  500     pps->num_ref_idx_l1_default_active_minus1 = 0;
 
  507         pps->more_rbsp_data = 0;
 
  509         pps->more_rbsp_data = 1;
 
  511         pps->transform_8x8_mode_flag = 1;
 
  514     *vseq = (VAEncSequenceParameterBufferH264) {
 
  515         .seq_parameter_set_id = 
sps->seq_parameter_set_id,
 
  516         .level_idc        = 
sps->level_idc,
 
  517         .intra_period     = 
ctx->gop_size,
 
  518         .intra_idr_period = 
ctx->gop_size,
 
  519         .ip_period        = 
ctx->b_per_p + 1,
 
  521         .bits_per_second       = 
ctx->va_bit_rate,
 
  522         .max_num_ref_frames    = 
sps->max_num_ref_frames,
 
  523         .picture_width_in_mbs  = 
sps->pic_width_in_mbs_minus1 + 1,
 
  524         .picture_height_in_mbs = 
sps->pic_height_in_map_units_minus1 + 1,
 
  527             .chroma_format_idc                 = 
sps->chroma_format_idc,
 
  528             .frame_mbs_only_flag               = 
sps->frame_mbs_only_flag,
 
  529             .mb_adaptive_frame_field_flag      = 
sps->mb_adaptive_frame_field_flag,
 
  530             .seq_scaling_matrix_present_flag   = 
sps->seq_scaling_matrix_present_flag,
 
  531             .direct_8x8_inference_flag         = 
sps->direct_8x8_inference_flag,
 
  532             .log2_max_frame_num_minus4         = 
sps->log2_max_frame_num_minus4,
 
  533             .pic_order_cnt_type                = 
sps->pic_order_cnt_type,
 
  534             .log2_max_pic_order_cnt_lsb_minus4 = 
sps->log2_max_pic_order_cnt_lsb_minus4,
 
  535             .delta_pic_order_always_zero_flag  = 
sps->delta_pic_order_always_zero_flag,
 
  538         .bit_depth_luma_minus8   = 
sps->bit_depth_luma_minus8,
 
  539         .bit_depth_chroma_minus8 = 
sps->bit_depth_chroma_minus8,
 
  541         .frame_cropping_flag      = 
sps->frame_cropping_flag,
 
  542         .frame_crop_left_offset   = 
sps->frame_crop_left_offset,
 
  543         .frame_crop_right_offset  = 
sps->frame_crop_right_offset,
 
  544         .frame_crop_top_offset    = 
sps->frame_crop_top_offset,
 
  545         .frame_crop_bottom_offset = 
sps->frame_crop_bottom_offset,
 
  547         .vui_parameters_present_flag = 
sps->vui_parameters_present_flag,
 
  550             .aspect_ratio_info_present_flag = 
sps->vui.aspect_ratio_info_present_flag,
 
  551             .timing_info_present_flag       = 
sps->vui.timing_info_present_flag,
 
  552             .bitstream_restriction_flag     = 
sps->vui.bitstream_restriction_flag,
 
  553             .log2_max_mv_length_horizontal  = 
sps->vui.log2_max_mv_length_horizontal,
 
  554             .log2_max_mv_length_vertical    = 
sps->vui.log2_max_mv_length_vertical,
 
  557         .aspect_ratio_idc  = 
sps->vui.aspect_ratio_idc,
 
  558         .sar_width         = 
sps->vui.sar_width,
 
  559         .sar_height        = 
sps->vui.sar_height,
 
  560         .num_units_in_tick = 
sps->vui.num_units_in_tick,
 
  561         .time_scale        = 
sps->vui.time_scale,
 
  564     *vpic = (VAEncPictureParameterBufferH264) {
 
  566             .picture_id = VA_INVALID_ID,
 
  567             .flags      = VA_PICTURE_H264_INVALID,
 
  570         .coded_buf = VA_INVALID_ID,
 
  572         .pic_parameter_set_id = 
pps->pic_parameter_set_id,
 
  573         .seq_parameter_set_id = 
pps->seq_parameter_set_id,
 
  575         .pic_init_qp                  = 
pps->pic_init_qp_minus26 + 26,
 
  576         .num_ref_idx_l0_active_minus1 = 
pps->num_ref_idx_l0_default_active_minus1,
 
  577         .num_ref_idx_l1_active_minus1 = 
pps->num_ref_idx_l1_default_active_minus1,
 
  579         .chroma_qp_index_offset        = 
pps->chroma_qp_index_offset,
 
  580         .second_chroma_qp_index_offset = 
pps->second_chroma_qp_index_offset,
 
  583             .entropy_coding_mode_flag        = 
pps->entropy_coding_mode_flag,
 
  584             .weighted_pred_flag              = 
pps->weighted_pred_flag,
 
  585             .weighted_bipred_idc             = 
pps->weighted_bipred_idc,
 
  586             .constrained_intra_pred_flag     = 
pps->constrained_intra_pred_flag,
 
  587             .transform_8x8_mode_flag         = 
pps->transform_8x8_mode_flag,
 
  588             .deblocking_filter_control_present_flag =
 
  589                 pps->deblocking_filter_control_present_flag,
 
  590             .redundant_pic_cnt_present_flag  = 
pps->redundant_pic_cnt_present_flag,
 
  591             .pic_order_present_flag          =
 
  592                 pps->bottom_field_pic_order_in_frame_present_flag,
 
  593             .pic_scaling_matrix_present_flag = 
pps->pic_scaling_matrix_present_flag,
 
  660     if (
ctx->va_rc_mode == VA_RC_CBR)
 
  676             .exact_match_flag   = 1,
 
  677             .broken_link_flag   = 
ctx->b_per_p > 0,
 
  683     vpic->CurrPic = (VAPictureH264) {
 
  696         href = 
ref->priv_data;
 
  698         vpic->ReferenceFrames[
i] = (VAPictureH264) {
 
  699             .picture_id          = 
ref->recon_surface,
 
  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++) {
 
  802                    hn->frame_num, 
hn->pic_order_cnt);
 
  809         for (
i = 0; 
i < n; 
i++) {
 
  812                    hn->frame_num, 
hn->pic_order_cnt);
 
  848         ((1 << (4 + 
sps->log2_max_frame_num_minus4)) - 1);
 
  851         ((1 << (4 + 
sps->log2_max_pic_order_cnt_lsb_minus4)) - 1);
 
  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++) {
 
  911                 if (pic->
refs[
i] != def_l0[
i])
 
  936             int need_rplm_l0 = 0, need_rplm_l1 = 0;
 
  943                     if (pic->
refs[
i] != def_l0[n0])
 
  947                     if (pic->
refs[
i] != def_l1[n1])
 
 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];
 
 1054     if (
ctx->va_rc_mode == VA_RC_CQP) {
 
 1070                "%d / %d / %d for IDR- / P- / B-frames.\n",
 
 1080     if (!
ctx->rc_mode->hrd) {
 
 1087         const char *vaapi = VA_VERSION_S;
 
 1095         driver = vaQueryVendorString(
ctx->hwctx->display);
 
 1097             driver = 
"unknown driver";
 
 1106                      "%s / VAAPI %s / %s", lavc, vaapi, driver);
 
 1113     ctx->roi_quant_range = 51 + 6 * (
ctx->profile->depth - 8);
 
 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);
 
 1205     ctx->desired_packed_headers =
 
 1206         VA_ENC_PACKED_HEADER_SEQUENCE | 
 
 1207         VA_ENC_PACKED_HEADER_SLICE    | 
 
 1208         VA_ENC_PACKED_HEADER_MISC;      
 
 1213     ctx->slice_block_height = 
ctx->slice_block_width = 16;
 
 1216         ctx->explicit_qp = priv->
qp;
 
 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",
 
 1346     .wrapper_name   = 
"vaapi",