Module: Mesa Branch: main Commit: 6c758000fb90cf6713fdfb39dd35ab9cc61a6368 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6c758000fb90cf6713fdfb39dd35ab9cc61a6368
Author: Ruijing Dong <ruijing.d...@amd.com> Date: Tue Dec 19 17:50:03 2023 -0500 frontends/va: remove some TODOs in hevc encoding Remove some TODOs in va hevc encoding sps parsing. Reviewed-by: Leo Liu <leo....@amd.com> Signed-off-by: Ruijing Dong <ruijing.d...@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26770> --- src/gallium/frontends/va/picture_hevc_enc.c | 85 +++++++++++++++++++++++++++-- src/gallium/include/pipe/p_video_state.h | 6 ++ 2 files changed, 85 insertions(+), 6 deletions(-) diff --git a/src/gallium/frontends/va/picture_hevc_enc.c b/src/gallium/frontends/va/picture_hevc_enc.c index ac8dcada969..871832eb7fe 100644 --- a/src/gallium/frontends/va/picture_hevc_enc.c +++ b/src/gallium/frontends/va/picture_hevc_enc.c @@ -438,11 +438,69 @@ static void parse_enc_hrd_params_hevc(struct vl_rbsp *rbsp, &hrdParams->vlc_hrd_parameters[i]); } } +/* dummy function for consuming the scaling list data if it is available */ +static void scaling_list_data(struct vl_rbsp *rbsp) +{ + unsigned size_id, matrix_id, coef_num; + unsigned pre_mode_flag; + for (size_id = 0; size_id < 4; size_id++) { + for (matrix_id = 0; matrix_id < 6; matrix_id += (size_id == 3) ? 3 : 1) { + pre_mode_flag = vl_rbsp_u(rbsp, 1); + if (pre_mode_flag == 0) + vl_rbsp_ue(rbsp); + else { + coef_num = MIN2(64, (1 << (4 + (size_id << 1)))); + if (size_id > 1) + vl_rbsp_se(rbsp); + for (unsigned i = 0; i < coef_num; i++) + vl_rbsp_se(rbsp); + } + } + } +} + +/* i is the working rps, st_rps is the start */ +static void st_ref_pic_set(unsigned index, + unsigned num_short_term_ref_pic_sets, + struct pipe_h265_st_ref_pic_set *st_rps, + struct vl_rbsp *rbsp) +{ + unsigned inter_ref_pic_set_pred_flag = (index) ? vl_rbsp_u(rbsp, 1) : 0; + struct pipe_h265_st_ref_pic_set *ref_rps = NULL; + unsigned delta_idx_minus1 = 0; + unsigned i; + + if (inter_ref_pic_set_pred_flag) { + if (index == num_short_term_ref_pic_sets) + delta_idx_minus1 = vl_rbsp_ue(rbsp); + vl_rbsp_u(rbsp, 1); /* delta_rps_sign */ + vl_rbsp_ue(rbsp); /* abs_delta_rps_minus1 */ + ref_rps = st_rps + index - (delta_idx_minus1 + 1); + for (i = 0; i <= (ref_rps->num_neg_pics + ref_rps->num_pos_pics); i++) { + if (!vl_rbsp_u(rbsp, 1)) /* used_by_curr_pic_flag */ + vl_rbsp_u(rbsp, 1); /* use_delta_flag */ + } + } else { + st_rps->num_neg_pics = vl_rbsp_ue(rbsp); + st_rps->num_pos_pics = vl_rbsp_ue(rbsp); + for (i = 0; i < st_rps->num_neg_pics; i++) { + vl_rbsp_ue(rbsp); /* delta_poc_s0_minus1 */ + vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_s0_flag */ + } + for (i = 0; i < st_rps->num_pos_pics; i++) { + vl_rbsp_ue(rbsp); /* delta_poc_s1_minus1 */ + vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_s1_flag */ + } + } +} static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp) { int sps_max_sub_layers_minus1; unsigned i, sps_sub_layer_ordering_info_present_flag; + unsigned num_st_ref_pic_sets, num_long_term_ref_pics_sps; + unsigned log2_max_pic_order_cnt_lsb_minus4; + struct pipe_h265_st_ref_pic_set *st_rps = NULL; vl_rbsp_u(rbsp, 4); /* sps_video_parameter_set_id */ sps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3); @@ -470,7 +528,7 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp) vl_rbsp_ue(rbsp); /* bit_depth_luma_minus8 */ vl_rbsp_ue(rbsp); /* bit_depth_chroma_minus8 */ - vl_rbsp_ue(rbsp); /* log2_max_pic_order_cnt_lsb_minus4 */ + log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp); sps_sub_layer_ordering_info_present_flag = vl_rbsp_u(rbsp, 1); i = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1; @@ -488,7 +546,8 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp) vl_rbsp_ue(rbsp); /* max_transform_hierarchy_depth_intra */ if (vl_rbsp_u(rbsp, 1)) /* scaling_list_enabled_flag */ - return; /* TODO */ + if (vl_rbsp_u(rbsp, 1)) /* sps_scaling_list_data_present_flag */ + scaling_list_data(rbsp); vl_rbsp_u(rbsp, 1); /* amp_enabled_flag */ vl_rbsp_u(rbsp, 1); /* sample_adaptive_offset_enabled_flag */ @@ -500,11 +559,23 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp) vl_rbsp_u(rbsp, 1); /* pcm_loop_filter_disabled_flag */ } - if (vl_rbsp_ue(rbsp)) /* num_short_term_ref_pic_sets */ - return; /* TODO */ + num_st_ref_pic_sets = vl_rbsp_ue(rbsp); /* num_short_term_ref_pic_sets */ + for (i = 0; i < num_st_ref_pic_sets; i++) { + if (i == 0) /* allocating st_ref_pic_sets */ + st_rps = (struct pipe_h265_st_ref_pic_set *) + CALLOC(num_st_ref_pic_sets + 1, sizeof(struct pipe_h265_st_ref_pic_set)); - if (vl_rbsp_u(rbsp, 1)) /* long_term_ref_pics_present_flag */ - return; /* TODO */ + st_ref_pic_set(i, num_st_ref_pic_sets, st_rps, rbsp); + } + + if (vl_rbsp_u(rbsp, 1)) {/* long_term_ref_pics_present_flag */ + num_long_term_ref_pics_sps = vl_rbsp_ue(rbsp); + for (i = 0; i < num_long_term_ref_pics_sps; i++) { + /* lt_ref_pic_poc_lsb_sps */ + vl_rbsp_u(rbsp, log2_max_pic_order_cnt_lsb_minus4 + 4); + vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_lt_sps_flag */ + } + } vl_rbsp_u(rbsp, 1); /* sps_temporal_mvp_enabled_flag */ vl_rbsp_u(rbsp, 1); /* strong_intra_smoothing_enabled_flag */ @@ -589,6 +660,8 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp) context->desc.h265enc.seq.log2_max_mv_length_vertical = vl_rbsp_ue(rbsp); } } + + if (st_rps) FREE(st_rps); } VAStatus diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index 0945db18e8f..1afa57dadf4 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -674,6 +674,12 @@ struct pipe_h264_enc_picture_desc bool renew_headers_on_idr; }; +struct pipe_h265_st_ref_pic_set +{ + uint32_t num_neg_pics; + uint32_t num_pos_pics; +}; + struct pipe_h265_enc_sublayer_hrd_params { uint32_t bit_rate_value_minus1[32];