Module: Mesa Branch: main Commit: af2980e5b9d80c6ab8305cc04d6a1d3d44618a09 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=af2980e5b9d80c6ab8305cc04d6a1d3d44618a09
Author: David Rosca <now...@gmail.com> Date: Tue Oct 31 19:20:31 2023 +0100 radeonsi/uvd_enc: Add VUI parameters in output bitstream Reviewed-by: Ruijing Dong <ruijing.d...@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25991> --- src/gallium/drivers/radeonsi/radeon_uvd_enc.c | 32 ++++++++++++++++ src/gallium/drivers/radeonsi/radeon_uvd_enc.h | 26 +++++++++++++ src/gallium/drivers/radeonsi/radeon_uvd_enc_1_1.c | 45 ++++++++++++++++++++++- 3 files changed, 102 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/radeon_uvd_enc.c b/src/gallium/drivers/radeonsi/radeon_uvd_enc.c index 79105887eed..faf0643627d 100644 --- a/src/gallium/drivers/radeonsi/radeon_uvd_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_uvd_enc.c @@ -31,6 +31,37 @@ #define UVD_HEVC_LEVEL_6_1 183 #define UVD_HEVC_LEVEL_6_2 186 +static void radeon_uvd_enc_get_vui_param(struct radeon_uvd_encoder *enc, + struct pipe_h265_enc_picture_desc *pic) +{ + enc->enc_pic.vui_info.vui_parameters_present_flag = + pic->seq.vui_parameters_present_flag; + enc->enc_pic.vui_info.flags.aspect_ratio_info_present_flag = + pic->seq.vui_flags.aspect_ratio_info_present_flag; + enc->enc_pic.vui_info.flags.timing_info_present_flag = + pic->seq.vui_flags.timing_info_present_flag; + enc->enc_pic.vui_info.flags.video_signal_type_present_flag = + 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; + enc->enc_pic.vui_info.num_units_in_tick = pic->seq.num_units_in_tick; + enc->enc_pic.vui_info.time_scale = pic->seq.time_scale; + enc->enc_pic.vui_info.video_format = pic->seq.video_format; + enc->enc_pic.vui_info.video_full_range_flag = pic->seq.video_full_range_flag; + 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; +} + static void radeon_uvd_enc_get_param(struct radeon_uvd_encoder *enc, struct pipe_h265_enc_picture_desc *pic) { @@ -80,6 +111,7 @@ static void radeon_uvd_enc_get_param(struct radeon_uvd_encoder *enc, enc->enc_pic.sample_adaptive_offset_enabled_flag = pic->seq.sample_adaptive_offset_enabled_flag; enc->enc_pic.pcm_enabled_flag = 0; /*HW not support PCM */ enc->enc_pic.sps_temporal_mvp_enabled_flag = pic->seq.sps_temporal_mvp_enabled_flag; + radeon_uvd_enc_get_vui_param(enc, pic); } static void flush(struct radeon_uvd_encoder *enc) diff --git a/src/gallium/drivers/radeonsi/radeon_uvd_enc.h b/src/gallium/drivers/radeonsi/radeon_uvd_enc.h index d37f1fe28c6..2797dfa01bf 100644 --- a/src/gallium/drivers/radeonsi/radeon_uvd_enc.h +++ b/src/gallium/drivers/radeonsi/radeon_uvd_enc.h @@ -303,6 +303,31 @@ typedef struct ruvd_enc_feedback_buffer_s { uint32_t feedback_data_size; } ruvd_enc_feedback_buffer_t; +typedef struct ruvd_enc_vui_info_s +{ + uint32_t vui_parameters_present_flag; + struct { + uint32_t aspect_ratio_info_present_flag : 1; + 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; + uint32_t sar_height; + uint32_t num_units_in_tick; + uint32_t time_scale; + uint32_t video_format; + uint32_t video_full_range_flag; + 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; + uint32_t max_num_reorder_frames; +} ruvd_enc_vui_info; + typedef void (*radeon_uvd_enc_get_buffer)(struct pipe_resource *resource, struct pb_buffer **handle, struct radeon_surf **surface); @@ -339,6 +364,7 @@ struct radeon_uvd_enc_pic { unsigned bit_depth_chroma_minus8; unsigned nal_unit_type; unsigned max_num_merge_cand; + ruvd_enc_vui_info vui_info; bool not_referenced; bool is_iframe; diff --git a/src/gallium/drivers/radeonsi/radeon_uvd_enc_1_1.c b/src/gallium/drivers/radeonsi/radeon_uvd_enc_1_1.c index f8e59cecea2..d1068c1c2ad 100644 --- a/src/gallium/drivers/radeonsi/radeon_uvd_enc_1_1.c +++ b/src/gallium/drivers/radeonsi/radeon_uvd_enc_1_1.c @@ -451,7 +451,50 @@ static void radeon_uvd_enc_nalu_sps_hevc(struct radeon_uvd_encoder *enc) radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.hevc_spec_misc.strong_intra_smoothing_enabled, 1); - radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); + radeon_uvd_enc_code_fixed_bits(enc, (enc->enc_pic.vui_info.vui_parameters_present_flag), 1); + if (enc->enc_pic.vui_info.vui_parameters_present_flag) { + /* aspect ratio present flag */ + radeon_uvd_enc_code_fixed_bits(enc, (enc->enc_pic.vui_info.flags.aspect_ratio_info_present_flag), 1); + if (enc->enc_pic.vui_info.flags.aspect_ratio_info_present_flag) { + radeon_uvd_enc_code_fixed_bits(enc, (enc->enc_pic.vui_info.aspect_ratio_idc), 8); + if (enc->enc_pic.vui_info.aspect_ratio_idc == PIPE_H2645_EXTENDED_SAR) { + radeon_uvd_enc_code_fixed_bits(enc, (enc->enc_pic.vui_info.sar_width), 16); + radeon_uvd_enc_code_fixed_bits(enc, (enc->enc_pic.vui_info.sar_height), 16); + } + } + radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); /* overscan info present flag */ + /* video signal type present flag */ + radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.vui_info.flags.video_signal_type_present_flag, 1); + if (enc->enc_pic.vui_info.flags.video_signal_type_present_flag) { + radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.vui_info.video_format, 3); + radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.vui_info.video_full_range_flag, 1); + radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.vui_info.flags.colour_description_present_flag, 1); + if (enc->enc_pic.vui_info.flags.colour_description_present_flag) { + radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.vui_info.colour_primaries, 8); + radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.vui_info.transfer_characteristics, 8); + radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.vui_info.matrix_coefficients, 8); + } + } + /* chroma loc info present flag */ + radeon_uvd_enc_code_fixed_bits(enc, enc->enc_pic.vui_info.flags.chroma_loc_info_present_flag, 1); + if (enc->enc_pic.vui_info.flags.chroma_loc_info_present_flag) { + radeon_uvd_enc_code_ue(enc, enc->enc_pic.vui_info.chroma_sample_loc_type_top_field); + radeon_uvd_enc_code_ue(enc, enc->enc_pic.vui_info.chroma_sample_loc_type_bottom_field); + } + radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); /* neutral chroma indication flag */ + radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); /* field seq flag */ + radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); /* frame field info present flag */ + radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); /* default display windows flag */ + /* vui timing info present flag */ + radeon_uvd_enc_code_fixed_bits(enc, (enc->enc_pic.vui_info.flags.timing_info_present_flag), 1); + if (enc->enc_pic.vui_info.flags.timing_info_present_flag) { + radeon_uvd_enc_code_fixed_bits(enc, (enc->enc_pic.vui_info.num_units_in_tick), 32); + radeon_uvd_enc_code_fixed_bits(enc, (enc->enc_pic.vui_info.time_scale), 32); + radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); + radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); + } + radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1); /* bitstream restriction flag */ + } radeon_uvd_enc_code_fixed_bits(enc, 0x0, 1);