From 05f7589fec4fe0044c643ccd9176505c4e4ca3c4 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Fri, 4 Oct 2024 18:43:17 +0200 Subject: [PATCH] radeonsi/vcn: Fix coded size in sequence header on VCN5 Introduce coded_width/coded_height for values used in headers and change it to aligned size on VCN4 to reflect the actual coded size. VCN5 doesn't have this limitation and can code any size. Reviewed-by: Ruijing Dong Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_enc.h | 2 ++ .../drivers/radeonsi/radeon_vcn_enc_4_0.c | 19 +++++++++++-------- .../drivers/radeonsi/radeon_vcn_enc_5_0.c | 3 +++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.h b/src/gallium/drivers/radeonsi/radeon_vcn_enc.h index a9c4fbe5414..62645be81e6 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.h +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.h @@ -72,6 +72,8 @@ struct radeon_enc_pic { } hevc; struct { struct pipe_av1_enc_picture_desc *desc; + uint32_t coded_width; + uint32_t coded_height; } av1; }; diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c index 6a527f4f547..d3e7ee8ab9d 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c @@ -91,6 +91,9 @@ static void radeon_enc_session_init(struct radeon_encoder *enc) if (!(av1_height % 8) && (av1_height % 16) && !(enc->enc_pic.enable_render_size)) enc->enc_pic.session_init.aligned_picture_height = av1_height + 2; + enc->enc_pic.av1.coded_width = enc->enc_pic.session_init.aligned_picture_width; + enc->enc_pic.av1.coded_height = enc->enc_pic.session_init.aligned_picture_height; + enc->enc_pic.session_init.padding_width = enc->enc_pic.session_init.aligned_picture_width - enc->enc_pic.pic_width_in_luma_samples; @@ -315,16 +318,16 @@ unsigned int radeon_enc_write_sequence_header(struct radeon_encoder *enc, uint8_ } /* frame_width_bits_minus_1 */ - width_bits = radeon_enc_value_bits(enc->enc_pic.session_init.aligned_picture_width - 1); + width_bits = radeon_enc_value_bits(enc->enc_pic.av1.coded_width); radeon_enc_code_fixed_bits(enc, width_bits - 1, 4); /* frame_height_bits_minus_1 */ - height_bits = radeon_enc_value_bits(enc->enc_pic.session_init.aligned_picture_height - 1); + height_bits = radeon_enc_value_bits(enc->enc_pic.av1.coded_height); radeon_enc_code_fixed_bits(enc, height_bits - 1, 4); /* max_frame_width_minus_1 */ - radeon_enc_code_fixed_bits(enc, enc->enc_pic.session_init.aligned_picture_width - 1, + radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.coded_width - 1, width_bits); /* max_frame_height_minus_1 */ - radeon_enc_code_fixed_bits(enc, enc->enc_pic.session_init.aligned_picture_height - 1, + radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.coded_height - 1, height_bits); /* frame_id_numbers_present_flag */ @@ -533,12 +536,12 @@ void radeon_enc_av1_frame_header_common(struct radeon_encoder *enc, bool frame_h if(frame_size_override) { /* frame_width_minus_1 */ uint32_t used_bits = - radeon_enc_value_bits(enc->enc_pic.session_init.aligned_picture_width - 1); - radeon_enc_code_fixed_bits(enc, enc->enc_pic.session_init.aligned_picture_width - 1, + radeon_enc_value_bits(enc->enc_pic.av1.coded_width - 1); + radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.coded_width - 1, used_bits); /* frame_height_minus_1 */ - used_bits = radeon_enc_value_bits(enc->enc_pic.session_init.aligned_picture_height - 1); - radeon_enc_code_fixed_bits(enc, enc->enc_pic.session_init.aligned_picture_height - 1, + used_bits = radeon_enc_value_bits(enc->enc_pic.av1.coded_height - 1); + radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.coded_height - 1, used_bits); } /* render_and_frame_size_different */ diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c index 81ae2fa5975..c7de9a135bb 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c @@ -817,6 +817,9 @@ static void radeon_enc_session_init(struct radeon_encoder *enc) enc->enc_pic.session_init.aligned_picture_height = align(enc->enc_pic.pic_height_in_luma_samples, 2); + enc->enc_pic.av1.coded_width = enc->enc_pic.pic_width_in_luma_samples; + enc->enc_pic.av1.coded_height = enc->enc_pic.pic_height_in_luma_samples; + enc->enc_pic.session_init.padding_width = enc->enc_pic.session_init.aligned_picture_width - enc->enc_pic.pic_width_in_luma_samples;