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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user