From d5b4dec033d7ee2c3d8f89871facafc0a5f1787d Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Wed, 28 Sep 2022 09:45:15 -0400 Subject: [PATCH] frontends/va: Add more params from VADecPictureParameterBufferAV1 and VASliceParameterBufferAV1 to pipe_av1_picture_desc Reviewed-by: Ruijing Dong Part-of: --- src/gallium/frontends/va/picture_av1.c | 26 ++++++++++++++++++++++++ src/gallium/include/pipe/p_video_state.h | 15 ++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/gallium/frontends/va/picture_av1.c b/src/gallium/frontends/va/picture_av1.c index 3d1ee6287e6..c373a4f234a 100644 --- a/src/gallium/frontends/va/picture_av1.c +++ b/src/gallium/frontends/va/picture_av1.c @@ -66,6 +66,7 @@ static void tile_info(vlVaContext *context, VADecPictureParameterBufferAV1 *av1) i = 0; for (startSb = 0; startSb < sbCols; startSb += tileWidthSb) { context->desc.av1.picture_parameter.tile_col_start_sb[i] = startSb; + context->desc.av1.picture_parameter.width_in_sbs[i] = tileWidthSb; i++; } context->desc.av1.picture_parameter.tile_col_start_sb[i] = sbCols; @@ -74,6 +75,7 @@ static void tile_info(vlVaContext *context, VADecPictureParameterBufferAV1 *av1) i = 0; for (startSb = 0; startSb < sbRows; startSb += tileHeightSb) { context->desc.av1.picture_parameter.tile_row_start_sb[i] = startSb; + context->desc.av1.picture_parameter.height_in_sbs[i] = tileHeightSb; i++; } context->desc.av1.picture_parameter.tile_row_start_sb[i] = sbRows; @@ -86,6 +88,7 @@ static void tile_info(vlVaContext *context, VADecPictureParameterBufferAV1 *av1) context->desc.av1.picture_parameter.tile_col_start_sb[i] = startSb; sizeSb = (av1->width_in_sbs_minus_1)[i] + 1; + context->desc.av1.picture_parameter.width_in_sbs[i] = sizeSb; widestTileSb = MAX2(sizeSb, widestTileSb); startSb += sizeSb; width_sb -= sizeSb; @@ -95,6 +98,7 @@ static void tile_info(vlVaContext *context, VADecPictureParameterBufferAV1 *av1) startSb = 0; for (i = 0; startSb < sbRows; ++i) { unsigned height_in_sbs_minus_1 = (av1->height_in_sbs_minus_1)[i]; + context->desc.av1.picture_parameter.height_in_sbs[i] = height_in_sbs_minus_1 + 1; context->desc.av1.picture_parameter.tile_row_start_sb[i] = startSb; startSb += height_in_sbs_minus_1 + 1; @@ -116,6 +120,10 @@ void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, av1->seq_info_fields.fields.use_128x128_superblock; context->desc.av1.picture_parameter.seq_info_fields.enable_filter_intra = av1->seq_info_fields.fields.enable_filter_intra; + context->desc.av1.picture_parameter.seq_info_fields.enable_cdef = + av1->seq_info_fields.fields.enable_cdef; + context->desc.av1.picture_parameter.seq_info_fields.film_grain_params_present = + av1->seq_info_fields.fields.film_grain_params_present; context->desc.av1.picture_parameter.seq_info_fields.enable_intra_edge_filter = av1->seq_info_fields.fields.enable_intra_edge_filter; context->desc.av1.picture_parameter.order_hint_bits_minus_1 = av1->order_hint_bits_minus_1; @@ -139,6 +147,8 @@ void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, context->desc.av1.picture_parameter.seq_info_fields.mono_chrome = av1->seq_info_fields.fields.mono_chrome; + context->desc.av1.picture_parameter.pic_info_fields.showable_frame = + av1->pic_info_fields.bits.showable_frame; context->desc.av1.picture_parameter.pic_info_fields.frame_type = av1->pic_info_fields.bits.frame_type; context->desc.av1.picture_parameter.pic_info_fields.show_frame = @@ -165,7 +175,11 @@ void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, av1->pic_info_fields.bits.disable_frame_end_update_cdf; context->desc.av1.picture_parameter.pic_info_fields.allow_warped_motion = av1->pic_info_fields.bits.allow_warped_motion; + context->desc.av1.picture_parameter.pic_info_fields.uniform_tile_spacing_flag = + av1->pic_info_fields.bits.uniform_tile_spacing_flag; + context->desc.av1.picture_parameter.matrix_coefficients = + av1->matrix_coefficients; context->desc.av1.picture_parameter.current_frame_id = av1->current_frame; context->desc.av1.picture_parameter.order_hint = av1->order_hint; context->desc.av1.picture_parameter.primary_ref_frame = av1->primary_ref_frame; @@ -192,6 +206,8 @@ void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, context->desc.av1.picture_parameter.u_ac_delta_q = av1->u_ac_delta_q; context->desc.av1.picture_parameter.v_dc_delta_q = av1->v_dc_delta_q; context->desc.av1.picture_parameter.v_ac_delta_q = av1->v_ac_delta_q; + context->desc.av1.picture_parameter.qmatrix_fields.using_qmatrix = + av1->qmatrix_fields.bits.using_qmatrix; context->desc.av1.picture_parameter.qmatrix_fields.qm_y = av1->qmatrix_fields.bits.qm_y | 0xf; context->desc.av1.picture_parameter.qmatrix_fields.qm_u = av1->qmatrix_fields.bits.qm_u | 0xf; context->desc.av1.picture_parameter.qmatrix_fields.qm_v = av1->qmatrix_fields.bits.qm_v | 0xf; @@ -201,6 +217,8 @@ void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, av1->seg_info.segment_info_fields.bits.enabled; context->desc.av1.picture_parameter.seg_info.segment_info_fields.update_map = av1->seg_info.segment_info_fields.bits.update_map; + context->desc.av1.picture_parameter.seg_info.segment_info_fields.update_data = + av1->seg_info.segment_info_fields.bits.update_data; context->desc.av1.picture_parameter.seg_info.segment_info_fields.temporal_update = av1->seg_info.segment_info_fields.bits.temporal_update; for (i = 0; i < AV1_MAX_SEGMENTS; ++i) { @@ -265,6 +283,10 @@ void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, av1->loop_restoration_fields.bits.cbframe_restoration_type; context->desc.av1.picture_parameter.loop_restoration_fields.crframe_restoration_type = av1->loop_restoration_fields.bits.crframe_restoration_type; + context->desc.av1.picture_parameter.loop_restoration_fields.lr_unit_shift = + av1->loop_restoration_fields.bits.lr_unit_shift; + context->desc.av1.picture_parameter.loop_restoration_fields.lr_uv_shift = + av1->loop_restoration_fields.bits.lr_uv_shift; if (!av1->loop_restoration_fields.bits.lr_unit_shift) { context->desc.av1.picture_parameter.lr_unit_size[0] = 256 >> (2 - av1->loop_restoration_fields.bits.lr_unit_shift); @@ -280,6 +302,7 @@ void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, /* Global Motion Params */ for (i = 0; i < ARRAY_SIZE(av1->wm); ++i) { context->desc.av1.picture_parameter.wm[i].wmtype = av1->wm[i].wmtype; + context->desc.av1.picture_parameter.wm[i].invalid = av1->wm[i].invalid; for (j = 0; j < ARRAY_SIZE(av1->wm[0].wmmat); ++j) context->desc.av1.picture_parameter.wm[i].wmmat[j] = av1->wm[i].wmmat[j]; } @@ -353,4 +376,7 @@ void vlVaHandleSliceParameterBufferAV1(vlVaContext *context, vlVaBuffer *buf, un context->desc.av1.slice_parameter.slice_data_size[num] = av1->slice_data_size; context->desc.av1.slice_parameter.slice_data_offset[num] = av1->slice_data_offset; + context->desc.av1.slice_parameter.slice_data_row[num] = av1->tile_row; + context->desc.av1.slice_parameter.slice_data_col[num] = av1->tile_column; + context->desc.av1.slice_parameter.slice_data_anchor_frame_idx[num] = av1->anchor_frame_idx; } diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index f9d184c7c59..d29f238b264 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -903,8 +903,10 @@ struct pipe_av1_picture_desc uint32_t enable_dual_filter:1; uint32_t enable_order_hint:1; uint32_t enable_jnt_comp:1; + uint32_t enable_cdef:1; uint32_t mono_chrome:1; uint32_t ref_frame_mvs:1; + uint32_t film_grain_params_present:1; } seq_info_fields; uint32_t current_frame_id; @@ -922,6 +924,7 @@ struct pipe_av1_picture_desc struct { uint32_t enabled:1; uint32_t update_map:1; + uint32_t update_data:1; uint32_t temporal_update:1; } segment_info_fields; @@ -966,11 +969,14 @@ struct pipe_av1_picture_desc uint8_t tile_rows; uint32_t tile_col_start_sb[65]; uint32_t tile_row_start_sb[65]; + uint16_t width_in_sbs[64]; + uint16_t height_in_sbs[64]; uint16_t context_update_tile_id; struct { uint32_t frame_type:2; uint32_t show_frame:1; + uint32_t showable_frame:1; uint32_t error_resilient_mode:1; uint32_t disable_cdf_update:1; uint32_t allow_screen_content_tools:1; @@ -981,6 +987,7 @@ struct pipe_av1_picture_desc uint32_t is_motion_mode_switchable:1; uint32_t use_ref_frame_mvs:1; uint32_t disable_frame_end_update_cdf:1; + uint32_t uniform_tile_spacing_flag:1; uint32_t allow_warped_motion:1; } pic_info_fields; @@ -1007,6 +1014,7 @@ struct pipe_av1_picture_desc int8_t v_ac_delta_q; struct { + uint16_t using_qmatrix:1; uint16_t qm_y:4; uint16_t qm_u:4; uint16_t qm_v:4; @@ -1033,21 +1041,28 @@ struct pipe_av1_picture_desc uint16_t yframe_restoration_type:2; uint16_t cbframe_restoration_type:2; uint16_t crframe_restoration_type:2; + uint16_t lr_unit_shift:2; + uint16_t lr_uv_shift:1; } loop_restoration_fields; uint16_t lr_unit_size[3]; struct { uint32_t wmtype; + uint8_t invalid; int32_t wmmat[8]; } wm[7]; uint32_t refresh_frame_flags; + uint8_t matrix_coefficients; } picture_parameter; struct { uint32_t slice_data_size[256]; uint32_t slice_data_offset[256]; + uint16_t slice_data_row[256]; + uint16_t slice_data_col[256]; + uint8_t slice_data_anchor_frame_idx[256]; } slice_parameter; };