mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-18 21:00:33 +01:00
radeon/vcn: process invalid frame rate in encoding
Just in case app sending zeros in frame rate, which could cause zero division, it will be treated as fixed value, 30fps. Signed-off-by: Ruijing Dong <ruijing.dong@amd.com> Reviewed-by: Boyuan Zhang <boyuan.zhang@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18737>
This commit is contained in:
parent
4fdf10fdaf
commit
7bf8af2c8d
1 changed files with 33 additions and 16 deletions
|
|
@ -52,6 +52,15 @@ static void radeon_vcn_enc_quality_modes(struct radeon_encoder *enc,
|
|||
p->vbaq_mode = in->vbaq_mode ? RENCODE_VBAQ_AUTO : RENCODE_VBAQ_NONE;
|
||||
}
|
||||
|
||||
/* to process invalid frame rate */
|
||||
static void radeon_vcn_enc_invalid_frame_rate(uint32_t *den, uint32_t *num)
|
||||
{
|
||||
if (*den == 0 || *num == 0) {
|
||||
*den = 1;
|
||||
*num = 30;
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t radeon_vcn_per_frame_integer(uint32_t bitrate, uint32_t den, uint32_t num)
|
||||
{
|
||||
uint64_t rate_den = (uint64_t)bitrate * (uint64_t)den;
|
||||
|
|
@ -68,6 +77,8 @@ static uint32_t radeon_vcn_per_frame_frac(uint32_t bitrate, uint32_t den, uint32
|
|||
}
|
||||
static void radeon_vcn_enc_get_param(struct radeon_encoder *enc, struct pipe_picture_desc *picture)
|
||||
{
|
||||
uint32_t frame_rate_den, frame_rate_num;
|
||||
|
||||
if (u_reduce_video_profile(picture->profile) == PIPE_VIDEO_FORMAT_MPEG4_AVC) {
|
||||
struct pipe_h264_enc_picture_desc *pic = (struct pipe_h264_enc_picture_desc *)picture;
|
||||
enc->enc_pic.picture_type = pic->picture_type;
|
||||
|
|
@ -101,21 +112,24 @@ static void radeon_vcn_enc_get_param(struct radeon_encoder *enc, struct pipe_pic
|
|||
for (int i = 0; i < enc->enc_pic.num_temporal_layers; i++) {
|
||||
enc->enc_pic.rc_layer_init[i].target_bit_rate = pic->rate_ctrl[i].target_bitrate;
|
||||
enc->enc_pic.rc_layer_init[i].peak_bit_rate = pic->rate_ctrl[i].peak_bitrate;
|
||||
enc->enc_pic.rc_layer_init[i].frame_rate_num = pic->rate_ctrl[i].frame_rate_num;
|
||||
enc->enc_pic.rc_layer_init[i].frame_rate_den = pic->rate_ctrl[i].frame_rate_den;
|
||||
frame_rate_den = pic->rate_ctrl[i].frame_rate_den;
|
||||
frame_rate_num = pic->rate_ctrl[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->rate_ctrl[i].vbv_buffer_size;
|
||||
enc->enc_pic.rc_layer_init[i].avg_target_bits_per_picture =
|
||||
radeon_vcn_per_frame_integer(pic->rate_ctrl[i].target_bitrate,
|
||||
pic->rate_ctrl[i].frame_rate_den,
|
||||
pic->rate_ctrl[i].frame_rate_num);
|
||||
frame_rate_den,
|
||||
frame_rate_num);
|
||||
enc->enc_pic.rc_layer_init[i].peak_bits_per_picture_integer =
|
||||
radeon_vcn_per_frame_integer(pic->rate_ctrl[i].peak_bitrate,
|
||||
pic->rate_ctrl[i].frame_rate_den,
|
||||
pic->rate_ctrl[i].frame_rate_num);
|
||||
frame_rate_den,
|
||||
frame_rate_num);
|
||||
enc->enc_pic.rc_layer_init[i].peak_bits_per_picture_fractional =
|
||||
radeon_vcn_per_frame_frac(pic->rate_ctrl[i].peak_bitrate,
|
||||
pic->rate_ctrl[i].frame_rate_den,
|
||||
pic->rate_ctrl[i].frame_rate_num);
|
||||
frame_rate_den,
|
||||
frame_rate_num);
|
||||
}
|
||||
enc->enc_pic.rc_session_init.vbv_buffer_level = pic->rate_ctrl[0].vbv_buf_lv;
|
||||
enc->enc_pic.rc_per_pic.qp = pic->quant_i_frames;
|
||||
|
|
@ -234,21 +248,24 @@ static void radeon_vcn_enc_get_param(struct radeon_encoder *enc, struct pipe_pic
|
|||
enc->enc_pic.hevc_spec_misc.quarter_pel_enabled = 1;
|
||||
enc->enc_pic.rc_layer_init[0].target_bit_rate = pic->rc.target_bitrate;
|
||||
enc->enc_pic.rc_layer_init[0].peak_bit_rate = pic->rc.peak_bitrate;
|
||||
enc->enc_pic.rc_layer_init[0].frame_rate_num = pic->rc.frame_rate_num;
|
||||
enc->enc_pic.rc_layer_init[0].frame_rate_den = pic->rc.frame_rate_den;
|
||||
frame_rate_den = pic->rc.frame_rate_den;
|
||||
frame_rate_num = pic->rc.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.vbv_buffer_size;
|
||||
enc->enc_pic.rc_layer_init[0].avg_target_bits_per_picture =
|
||||
radeon_vcn_per_frame_integer(pic->rc.target_bitrate,
|
||||
pic->rc.frame_rate_den,
|
||||
pic->rc.frame_rate_num);
|
||||
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.peak_bitrate,
|
||||
pic->rc.frame_rate_den,
|
||||
pic->rc.frame_rate_num);
|
||||
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.peak_bitrate,
|
||||
pic->rc.frame_rate_den,
|
||||
pic->rc.frame_rate_num);
|
||||
frame_rate_den,
|
||||
frame_rate_num);
|
||||
enc->enc_pic.rc_session_init.vbv_buffer_level = pic->rc.vbv_buf_lv;
|
||||
enc->enc_pic.rc_per_pic.qp = pic->rc.quant_i_frames;
|
||||
enc->enc_pic.rc_per_pic.min_qp_app = pic->rc.min_qp;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue