Module: Mesa Branch: main Commit: d57241d290c6e1f99ac789d0c15aa61b18c22273 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d57241d290c6e1f99ac789d0c15aa61b18c22273
Author: David Rosca <[email protected]> Date: Wed Sep 6 12:17:53 2023 +0200 radeonsi/vcn: Set H264/HEVC chroma sample location in bitstream Reviewed-by: Boyuan Zhang <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25078> --- src/amd/common/ac_vcn_enc.h | 3 +++ src/gallium/drivers/radeonsi/radeon_vcn_enc.c | 12 ++++++++++++ src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c | 14 ++++++++++++-- src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c | 7 ++++++- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/amd/common/ac_vcn_enc.h b/src/amd/common/ac_vcn_enc.h index 3580dbc2013..382143cb992 100644 --- a/src/amd/common/ac_vcn_enc.h +++ b/src/amd/common/ac_vcn_enc.h @@ -546,6 +546,7 @@ typedef struct rvcn_enc_vui_info_s uint32_t timing_info_present_flag : 1; uint32_t video_signal_type_present_flag : 1; uint32_t colour_description_present_flag : 1; + uint32_t chroma_loc_info_present_flag : 1; } flags; uint32_t aspect_ratio_idc; uint32_t sar_width; @@ -557,6 +558,8 @@ typedef struct rvcn_enc_vui_info_s uint32_t colour_primaries; uint32_t transfer_characteristics; uint32_t matrix_coefficients; + uint32_t chroma_sample_loc_type_top_field; + uint32_t chroma_sample_loc_type_bottom_field; }rvcn_enc_vui_info; typedef struct rvcn_enc_input_format_s diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c index 1e70cae8d5d..17cfcdc5365 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c @@ -173,6 +173,8 @@ static void radeon_vcn_enc_h264_get_vui_param(struct radeon_encoder *enc, pic->seq.vui_flags.video_signal_type_present_flag; enc->enc_pic.vui_info.flags.colour_description_present_flag = pic->seq.vui_flags.colour_description_present_flag; + enc->enc_pic.vui_info.flags.chroma_loc_info_present_flag = + pic->seq.vui_flags.chroma_loc_info_present_flag; enc->enc_pic.vui_info.aspect_ratio_idc = pic->seq.aspect_ratio_idc; enc->enc_pic.vui_info.sar_width = pic->seq.sar_width; enc->enc_pic.vui_info.sar_height = pic->seq.sar_height; @@ -183,6 +185,10 @@ static void radeon_vcn_enc_h264_get_vui_param(struct radeon_encoder *enc, enc->enc_pic.vui_info.colour_primaries = pic->seq.colour_primaries; enc->enc_pic.vui_info.transfer_characteristics = pic->seq.transfer_characteristics; enc->enc_pic.vui_info.matrix_coefficients = pic->seq.matrix_coefficients; + enc->enc_pic.vui_info.chroma_sample_loc_type_top_field = + pic->seq.chroma_sample_loc_type_top_field; + enc->enc_pic.vui_info.chroma_sample_loc_type_bottom_field = + pic->seq.chroma_sample_loc_type_bottom_field; } /* only checking the first slice to get num of mbs in slice to @@ -401,6 +407,8 @@ static void radeon_vcn_enc_hevc_get_vui_param(struct radeon_encoder *enc, pic->seq.vui_flags.video_signal_type_present_flag; enc->enc_pic.vui_info.flags.colour_description_present_flag = pic->seq.vui_flags.colour_description_present_flag; + enc->enc_pic.vui_info.flags.chroma_loc_info_present_flag = + pic->seq.vui_flags.chroma_loc_info_present_flag; enc->enc_pic.vui_info.aspect_ratio_idc = pic->seq.aspect_ratio_idc; enc->enc_pic.vui_info.sar_width = pic->seq.sar_width; enc->enc_pic.vui_info.sar_height = pic->seq.sar_height; @@ -411,6 +419,10 @@ static void radeon_vcn_enc_hevc_get_vui_param(struct radeon_encoder *enc, enc->enc_pic.vui_info.colour_primaries = pic->seq.colour_primaries; enc->enc_pic.vui_info.transfer_characteristics = pic->seq.transfer_characteristics; enc->enc_pic.vui_info.matrix_coefficients = pic->seq.matrix_coefficients; + enc->enc_pic.vui_info.chroma_sample_loc_type_top_field = + pic->seq.chroma_sample_loc_type_top_field; + enc->enc_pic.vui_info.chroma_sample_loc_type_bottom_field = + pic->seq.chroma_sample_loc_type_bottom_field; } /* only checking the first slice to get num of ctbs in slice to diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c index 09d0e3f7ff2..9aff8fbe545 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c @@ -316,7 +316,12 @@ static void radeon_enc_nalu_sps(struct radeon_encoder *enc) radeon_enc_code_fixed_bits(enc, pic->vui_info.matrix_coefficients, 8); } } - radeon_enc_code_fixed_bits(enc, 0x0, 1); /* chroma loc info present flag */ + /* chroma loc info present flag */ + radeon_enc_code_fixed_bits(enc, pic->vui_info.flags.chroma_loc_info_present_flag, 1); + if (pic->vui_info.flags.chroma_loc_info_present_flag) { + radeon_enc_code_ue(enc, pic->vui_info.chroma_sample_loc_type_top_field); + radeon_enc_code_ue(enc, pic->vui_info.chroma_sample_loc_type_bottom_field); + } /* timing info present flag */ radeon_enc_code_fixed_bits(enc, (pic->vui_info.flags.timing_info_present_flag), 1); if (pic->vui_info.flags.timing_info_present_flag) { @@ -456,7 +461,12 @@ static void radeon_enc_nalu_sps_hevc(struct radeon_encoder *enc) radeon_enc_code_fixed_bits(enc, pic->vui_info.matrix_coefficients, 8); } } - radeon_enc_code_fixed_bits(enc, 0x0, 1); /* chroma loc info present flag */ + /* chroma loc info present flag */ + radeon_enc_code_fixed_bits(enc, pic->vui_info.flags.chroma_loc_info_present_flag, 1); + if (pic->vui_info.flags.chroma_loc_info_present_flag) { + radeon_enc_code_ue(enc, pic->vui_info.chroma_sample_loc_type_top_field); + radeon_enc_code_ue(enc, pic->vui_info.chroma_sample_loc_type_bottom_field); + } radeon_enc_code_fixed_bits(enc, 0x0, 1); /* neutral chroma indication flag */ radeon_enc_code_fixed_bits(enc, 0x0, 1); /* field seq flag */ radeon_enc_code_fixed_bits(enc, 0x0, 1); /* frame field info present flag */ diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c index dff1825fb5a..7682af34f70 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c @@ -348,7 +348,12 @@ static void radeon_enc_nalu_sps_hevc(struct radeon_encoder *enc) radeon_enc_code_fixed_bits(enc, pic->vui_info.matrix_coefficients, 8); } } - radeon_enc_code_fixed_bits(enc, 0x0, 1); /* chroma loc info present flag */ + /* chroma loc info present flag */ + radeon_enc_code_fixed_bits(enc, pic->vui_info.flags.chroma_loc_info_present_flag, 1); + if (pic->vui_info.flags.chroma_loc_info_present_flag) { + radeon_enc_code_ue(enc, pic->vui_info.chroma_sample_loc_type_top_field); + radeon_enc_code_ue(enc, pic->vui_info.chroma_sample_loc_type_bottom_field); + } radeon_enc_code_fixed_bits(enc, 0x0, 1); /* neutral chroma indication flag */ radeon_enc_code_fixed_bits(enc, 0x0, 1); /* field seq flag */ radeon_enc_code_fixed_bits(enc, 0x0, 1); /* frame field info present flag */
