From d2871e40e0401136718290714547f1bd8c483fc1 Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Mon, 2 May 2022 09:41:00 -0700 Subject: [PATCH] gallium radeon/r600/omx/va: Adds support for multiple reference encoding gallium: pipe_h264_enc_picture_desc: ref_idx_lx to ref_idx_lx_list[32], add num_ref_idx_lx_active_minus1 gallium radeon/r600: Change usage of ref_idx_lx to ref_idx_lx_list gallium omx: Fill out ref_idx_lx_list, num_ref_idx_lx_active_minus1 gallium va: Add support for multiple references encoding Reviewed-by: Jesse Natalie Reviewed-by: Boyuan Zhang Part-of: --- src/gallium/drivers/r600/radeon_vce.c | 4 ++-- src/gallium/drivers/radeonsi/radeon_vce.c | 4 ++-- src/gallium/drivers/radeonsi/radeon_vce_40_2_2.c | 2 +- src/gallium/drivers/radeonsi/radeon_vce_50.c | 2 +- src/gallium/drivers/radeonsi/radeon_vce_52.c | 4 ++-- src/gallium/drivers/radeonsi/radeon_vcn_enc.c | 4 ++-- src/gallium/frontends/omx/vid_enc_common.c | 6 ++++-- src/gallium/frontends/va/picture_h264_enc.c | 22 ++++++++++++++-------- src/gallium/include/pipe/p_video_state.h | 6 ++++-- 9 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/gallium/drivers/r600/radeon_vce.c b/src/gallium/drivers/r600/radeon_vce.c index 6a8d9d8..3742888 100644 --- a/src/gallium/drivers/r600/radeon_vce.c +++ b/src/gallium/drivers/r600/radeon_vce.c @@ -120,10 +120,10 @@ static void sort_cpb(struct rvce_encoder *enc) struct rvce_cpb_slot *i, *l0 = NULL, *l1 = NULL; LIST_FOR_EACH_ENTRY(i, &enc->cpb_slots, list) { - if (i->frame_num == enc->pic.ref_idx_l0) + if (i->frame_num == enc->pic.ref_idx_l0_list[0]) l0 = i; - if (i->frame_num == enc->pic.ref_idx_l1) + if (i->frame_num == enc->pic.ref_idx_l1_list[0]) l1 = i; if (enc->pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_P && l0) diff --git a/src/gallium/drivers/radeonsi/radeon_vce.c b/src/gallium/drivers/radeonsi/radeon_vce.c index 74fce82..5767d85 100644 --- a/src/gallium/drivers/radeonsi/radeon_vce.c +++ b/src/gallium/drivers/radeonsi/radeon_vce.c @@ -108,10 +108,10 @@ static void sort_cpb(struct rvce_encoder *enc) struct rvce_cpb_slot *i, *l0 = NULL, *l1 = NULL; LIST_FOR_EACH_ENTRY (i, &enc->cpb_slots, list) { - if (i->frame_num == enc->pic.ref_idx_l0) + if (i->frame_num == enc->pic.ref_idx_l0_list[0]) l0 = i; - if (i->frame_num == enc->pic.ref_idx_l1) + if (i->frame_num == enc->pic.ref_idx_l1_list[0]) l1 = i; if (enc->pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_P && l0) diff --git a/src/gallium/drivers/radeonsi/radeon_vce_40_2_2.c b/src/gallium/drivers/radeonsi/radeon_vce_40_2_2.c index 184df16..f96ff83 100644 --- a/src/gallium/drivers/radeonsi/radeon_vce_40_2_2.c +++ b/src/gallium/drivers/radeonsi/radeon_vce_40_2_2.c @@ -326,7 +326,7 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(0x00000000); // num_ref_idx_l0_active_minus1 RVCE_CS(0x00000000); // num_ref_idx_l1_active_minus1 - i = enc->pic.frame_num - enc->pic.ref_idx_l0; + i = enc->pic.frame_num - enc->pic.ref_idx_l0_list[0]; if (i > 1 && enc->pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_P) { RVCE_CS(0x00000001); // encRefListModificationOp RVCE_CS(i - 1); // encRefListModificationNum diff --git a/src/gallium/drivers/radeonsi/radeon_vce_50.c b/src/gallium/drivers/radeonsi/radeon_vce_50.c index 918804e..efa7b23 100644 --- a/src/gallium/drivers/radeonsi/radeon_vce_50.c +++ b/src/gallium/drivers/radeonsi/radeon_vce_50.c @@ -139,7 +139,7 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(0x00000000); // num_ref_idx_l0_active_minus1 RVCE_CS(0x00000000); // num_ref_idx_l1_active_minus1 - i = enc->pic.frame_num - enc->pic.ref_idx_l0; + i = enc->pic.frame_num - enc->pic.ref_idx_l0_list[0]; if (i > 1 && enc->pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_P) { RVCE_CS(0x00000001); // encRefListModificationOp RVCE_CS(i - 1); // encRefListModificationNum diff --git a/src/gallium/drivers/radeonsi/radeon_vce_52.c b/src/gallium/drivers/radeonsi/radeon_vce_52.c index b52e3ee..5f3c9a4 100644 --- a/src/gallium/drivers/radeonsi/radeon_vce_52.c +++ b/src/gallium/drivers/radeonsi/radeon_vce_52.c @@ -167,8 +167,8 @@ void si_vce_52_get_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_ enc->enc_pic.i_remain = pic->i_remain; enc->enc_pic.gop_cnt = pic->gop_cnt; enc->enc_pic.pic_order_cnt = pic->pic_order_cnt; - enc->enc_pic.ref_idx_l0 = pic->ref_idx_l0; - enc->enc_pic.ref_idx_l1 = pic->ref_idx_l1; + enc->enc_pic.ref_idx_l0 = pic->ref_idx_l0_list[0]; + enc->enc_pic.ref_idx_l1 = pic->ref_idx_l1_list[0]; enc->enc_pic.not_referenced = false; if (enc->dual_inst) enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants = 0x00000201; diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c index b02bda5..3d30f1d 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c @@ -46,8 +46,8 @@ static void radeon_vcn_enc_get_param(struct radeon_encoder *enc, struct pipe_pic enc->enc_pic.frame_num = pic->frame_num; enc->enc_pic.pic_order_cnt = pic->pic_order_cnt; enc->enc_pic.pic_order_cnt_type = pic->pic_order_cnt_type; - enc->enc_pic.ref_idx_l0 = pic->ref_idx_l0; - enc->enc_pic.ref_idx_l1 = pic->ref_idx_l1; + enc->enc_pic.ref_idx_l0 = pic->ref_idx_l0_list[0]; + enc->enc_pic.ref_idx_l1 = pic->ref_idx_l1_list[0]; enc->enc_pic.not_referenced = pic->not_referenced; enc->enc_pic.is_idr = (pic->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR); if (pic->pic_ctrl.enc_frame_cropping_flag) { diff --git a/src/gallium/frontends/omx/vid_enc_common.c b/src/gallium/frontends/omx/vid_enc_common.c index 9c26c33..3ea5e63 100644 --- a/src/gallium/frontends/omx/vid_enc_common.c +++ b/src/gallium/frontends/omx/vid_enc_common.c @@ -300,8 +300,10 @@ void enc_ControlPicture_common(vid_enc_PrivateType * priv, struct pipe_h264_enc_ picture->quant_b_frames = priv->quant.nQpB; picture->frame_num = priv->frame_num; - picture->ref_idx_l0 = priv->ref_idx_l0; - picture->ref_idx_l1 = priv->ref_idx_l1; + picture->num_ref_idx_l0_active_minus1 = 0; + picture->ref_idx_l0_list[0] = priv->ref_idx_l0; + picture->num_ref_idx_l1_active_minus1 = 0; + picture->ref_idx_l1_list[0] = priv->ref_idx_l1; picture->enable_vui = (picture->rate_ctrl[0].frame_rate_num != 0); enc_GetPictureParamPreset(picture); } diff --git a/src/gallium/frontends/va/picture_h264_enc.c b/src/gallium/frontends/va/picture_h264_enc.c index 80df29c..879d775 100644 --- a/src/gallium/frontends/va/picture_h264_enc.c +++ b/src/gallium/frontends/va/picture_h264_enc.c @@ -73,6 +73,9 @@ vlVaHandleVAEncPictureParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *cont if (context->desc.h264enc.gop_cnt == context->desc.h264enc.gop_size) context->desc.h264enc.gop_cnt = 0; + context->desc.h264enc.num_ref_idx_l0_active_minus1 = h264->num_ref_idx_l0_active_minus1; + context->desc.h264enc.num_ref_idx_l1_active_minus1 = h264->num_ref_idx_l1_active_minus1; + return VA_STATUS_SUCCESS; } @@ -82,19 +85,22 @@ vlVaHandleVAEncSliceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *contex VAEncSliceParameterBufferH264 *h264; h264 = buf->data; - context->desc.h264enc.ref_idx_l0 = VA_INVALID_ID; - context->desc.h264enc.ref_idx_l1 = VA_INVALID_ID; + memset(&context->desc.h264enc.ref_idx_l0_list, VA_INVALID_ID, sizeof(context->desc.h264enc.ref_idx_l0_list)); + memset(&context->desc.h264enc.ref_idx_l1_list, VA_INVALID_ID, sizeof(context->desc.h264enc.ref_idx_l1_list)); + + if(h264->num_ref_idx_active_override_flag) { + context->desc.h264enc.num_ref_idx_l0_active_minus1 = h264->num_ref_idx_l0_active_minus1; + context->desc.h264enc.num_ref_idx_l1_active_minus1 = h264->num_ref_idx_l1_active_minus1; + } for (int i = 0; i < 32; i++) { if (h264->RefPicList0[i].picture_id != VA_INVALID_ID) { - if (context->desc.h264enc.ref_idx_l0 == VA_INVALID_ID) - context->desc.h264enc.ref_idx_l0 = PTR_TO_UINT(util_hash_table_get(context->desc.h264enc.frame_idx, - UINT_TO_PTR(h264->RefPicList0[i].picture_id + 1))); + context->desc.h264enc.ref_idx_l0_list[i] = PTR_TO_UINT(util_hash_table_get(context->desc.h264enc.frame_idx, + UINT_TO_PTR(h264->RefPicList0[i].picture_id + 1))); } if (h264->RefPicList1[i].picture_id != VA_INVALID_ID && h264->slice_type == 1) { - if (context->desc.h264enc.ref_idx_l1 == VA_INVALID_ID) - context->desc.h264enc.ref_idx_l1 = PTR_TO_UINT(util_hash_table_get(context->desc.h264enc.frame_idx, - UINT_TO_PTR(h264->RefPicList1[i].picture_id + 1))); + context->desc.h264enc.ref_idx_l1_list[i] = PTR_TO_UINT(util_hash_table_get(context->desc.h264enc.frame_idx, + UINT_TO_PTR(h264->RefPicList1[i].picture_id + 1))); } } diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index 19ae274..b6f75d8 100755 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -428,8 +428,10 @@ struct pipe_h264_enc_picture_desc unsigned gop_cnt; unsigned pic_order_cnt; unsigned pic_order_cnt_type; - unsigned ref_idx_l0; - unsigned ref_idx_l1; + unsigned num_ref_idx_l0_active_minus1; + unsigned num_ref_idx_l1_active_minus1; + unsigned ref_idx_l0_list[32]; + unsigned ref_idx_l1_list[32]; unsigned gop_size; unsigned ref_pic_mode; unsigned num_temporal_layers; -- 2.7.4