radeonsi/vcn: Implement per-layer rate control for HEVC

Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31148>
This commit is contained in:
David Rosca
2024-08-29 19:10:38 +02:00
committed by Marge Bot
parent 5b157d4ad0
commit d2ad188915

View File

@@ -567,26 +567,29 @@ static void radeon_vcn_enc_hevc_get_rc_param(struct radeon_encoder *enc,
{
uint32_t frame_rate_den, frame_rate_num, max_qp;
enc->enc_pic.rc_layer_init[0].target_bit_rate = pic->rc[0].target_bitrate;
enc->enc_pic.rc_layer_init[0].peak_bit_rate = pic->rc[0].peak_bitrate;
frame_rate_den = pic->rc[0].frame_rate_den;
frame_rate_num = pic->rc[0].frame_rate_num;
radeon_vcn_enc_invalid_frame_rate(&frame_rate_den, &frame_rate_num);
enc->enc_pic.rc_layer_init[0].frame_rate_den = frame_rate_den;
enc->enc_pic.rc_layer_init[0].frame_rate_num = frame_rate_num;
enc->enc_pic.rc_layer_init[0].vbv_buffer_size = pic->rc[0].vbv_buffer_size;
enc->enc_pic.rc_layer_init[0].avg_target_bits_per_picture =
radeon_vcn_per_frame_integer(pic->rc[0].target_bitrate,
frame_rate_den,
frame_rate_num);
enc->enc_pic.rc_layer_init[0].peak_bits_per_picture_integer =
radeon_vcn_per_frame_integer(pic->rc[0].peak_bitrate,
frame_rate_den,
frame_rate_num);
enc->enc_pic.rc_layer_init[0].peak_bits_per_picture_fractional =
radeon_vcn_per_frame_frac(pic->rc[0].peak_bitrate,
frame_rate_den,
frame_rate_num);
enc->enc_pic.num_temporal_layers = pic->seq.num_temporal_layers ? pic->seq.num_temporal_layers : 1;
for (int i = 0; i < enc->enc_pic.num_temporal_layers; i++) {
enc->enc_pic.rc_layer_init[i].target_bit_rate = pic->rc[i].target_bitrate;
enc->enc_pic.rc_layer_init[i].peak_bit_rate = pic->rc[i].peak_bitrate;
frame_rate_den = pic->rc[i].frame_rate_den;
frame_rate_num = pic->rc[i].frame_rate_num;
radeon_vcn_enc_invalid_frame_rate(&frame_rate_den, &frame_rate_num);
enc->enc_pic.rc_layer_init[i].frame_rate_den = frame_rate_den;
enc->enc_pic.rc_layer_init[i].frame_rate_num = frame_rate_num;
enc->enc_pic.rc_layer_init[i].vbv_buffer_size = pic->rc[i].vbv_buffer_size;
enc->enc_pic.rc_layer_init[i].avg_target_bits_per_picture =
radeon_vcn_per_frame_integer(pic->rc[i].target_bitrate,
frame_rate_den,
frame_rate_num);
enc->enc_pic.rc_layer_init[i].peak_bits_per_picture_integer =
radeon_vcn_per_frame_integer(pic->rc[i].peak_bitrate,
frame_rate_den,
frame_rate_num);
enc->enc_pic.rc_layer_init[i].peak_bits_per_picture_fractional =
radeon_vcn_per_frame_frac(pic->rc[i].peak_bitrate,
frame_rate_den,
frame_rate_num);
}
enc->enc_pic.rc_session_init.vbv_buffer_level = pic->rc[0].vbv_buf_lv;
enc->enc_pic.rc_per_pic.qp_obs = pic->rc[0].quant_i_frames;
enc->enc_pic.rc_per_pic.min_qp_app_obs = pic->rc[0].min_qp;
@@ -676,7 +679,6 @@ static void radeon_vcn_enc_hevc_get_param(struct radeon_encoder *enc,
enc->enc_pic.enc_params.reference_picture_index =
pic->ref_list0[0] == PIPE_H2645_LIST_REF_INVALID_ENTRY ? 0xffffffff : pic->ref_list0[0];
enc->enc_pic.enc_params.reconstructed_picture_index = pic->dpb_curr_pic;
enc->enc_pic.num_temporal_layers = 1;
enc->enc_pic.bit_depth_luma_minus8 = pic->seq.bit_depth_luma_minus8;
enc->enc_pic.bit_depth_chroma_minus8 = pic->seq.bit_depth_chroma_minus8;
enc->enc_pic.nal_unit_type = pic->pic.nal_unit_type;