diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c index 50f7efc5609..0b1f975b54e 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c @@ -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;