Signed-off-by: Boyuan Zhang <boyuan.zh...@amd.com> --- src/gallium/drivers/radeon/radeon_vce_52.c | 107 +++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 28 deletions(-)
diff --git a/src/gallium/drivers/radeon/radeon_vce_52.c b/src/gallium/drivers/radeon/radeon_vce_52.c index 56b6dd8..ac577e3 100644 --- a/src/gallium/drivers/radeon/radeon_vce_52.c +++ b/src/gallium/drivers/radeon/radeon_vce_52.c @@ -48,36 +48,65 @@ static void get_rate_control_param(struct rvce_encoder *enc, struct pipe_h264_en enc->enc_pic.rc.quant_i_frames = pic->quant_i_frames; enc->enc_pic.rc.quant_p_frames = pic->quant_p_frames; enc->enc_pic.rc.quant_b_frames = pic->quant_b_frames; + enc->enc_pic.rc.gop_size = pic->gop_size; enc->enc_pic.rc.frame_rate_num = pic->rate_ctrl.frame_rate_num; enc->enc_pic.rc.frame_rate_den = pic->rate_ctrl.frame_rate_den; enc->enc_pic.rc.max_qp = 51; - enc->enc_pic.rc.vbv_buffer_size = pic->rate_ctrl.vbv_buffer_size; - enc->enc_pic.rc.vbv_buf_lv = 0; - enc->enc_pic.rc.fill_data_enable = 0; - enc->enc_pic.rc.enforce_hrd = 0; - enc->enc_pic.rc.target_bits_picture = pic->rate_ctrl.target_bits_picture; - enc->enc_pic.rc.peak_bits_picture_integer = pic->rate_ctrl.peak_bits_picture_integer; - enc->enc_pic.rc.peak_bits_picture_fraction = pic->rate_ctrl.peak_bits_picture_fraction; + if (pic->enable_low_level_control == true) { + enc->enc_pic.rc.vbv_buffer_size = 20000000; + if (pic->rate_ctrl.frame_rate_num == 0) + enc->enc_pic.rc.frame_rate_num = 30; + if (pic->rate_ctrl.frame_rate_den == 0) + enc->enc_pic.rc.frame_rate_den = 1; + enc->enc_pic.rc.vbv_buf_lv = 48; + enc->enc_pic.rc.fill_data_enable = 1; + enc->enc_pic.rc.enforce_hrd = 1; + enc->enc_pic.rc.target_bits_picture = enc->enc_pic.rc.target_bitrate / enc->enc_pic.rc.frame_rate_num; + enc->enc_pic.rc.peak_bits_picture_integer = enc->enc_pic.rc.peak_bitrate / enc->enc_pic.rc.frame_rate_num; + enc->enc_pic.rc.peak_bits_picture_fraction = 0; + } else { + enc->enc_pic.rc.vbv_buffer_size = pic->rate_ctrl.vbv_buffer_size; + enc->enc_pic.rc.vbv_buf_lv = 0; + enc->enc_pic.rc.fill_data_enable = 0; + enc->enc_pic.rc.enforce_hrd = 0; + enc->enc_pic.rc.target_bits_picture = pic->rate_ctrl.target_bits_picture; + enc->enc_pic.rc.peak_bits_picture_integer = pic->rate_ctrl.peak_bits_picture_integer; + enc->enc_pic.rc.peak_bits_picture_fraction = pic->rate_ctrl.peak_bits_picture_fraction; + } } static void get_motion_estimation_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) { - - enc->enc_pic.me.motion_est_quarter_pixel = 0x00000000; - enc->enc_pic.me.enc_disable_sub_mode = 0x000000fe; - enc->enc_pic.me.lsmvert = 0x00000000; - enc->enc_pic.me.enc_en_ime_overw_dis_subm = 0x00000000; - enc->enc_pic.me.enc_ime_overw_dis_subm_no = 0x00000000; - enc->enc_pic.me.enc_ime2_search_range_x = 0x00000001; - enc->enc_pic.me.enc_ime2_search_range_y = 0x00000001; - enc->enc_pic.me.enc_ime_decimation_search = 0x00000001; - enc->enc_pic.me.motion_est_half_pixel = 0x00000001; - enc->enc_pic.me.enc_search_range_x = 0x00000010; - enc->enc_pic.me.enc_search_range_y = 0x00000010; - enc->enc_pic.me.enc_search1_range_x = 0x00000010; - enc->enc_pic.me.enc_search1_range_y = 0x00000010; - + if (pic->enable_low_level_control == true) { + enc->enc_pic.me.motion_est_quarter_pixel = 0x00000001; + enc->enc_pic.me.enc_disable_sub_mode = 0x00000078; + enc->enc_pic.me.lsmvert = 0x00000002; + enc->enc_pic.me.enc_en_ime_overw_dis_subm = 0x00000001; + enc->enc_pic.me.enc_ime_overw_dis_subm_no = 0x00000001; + enc->enc_pic.me.enc_ime2_search_range_x = 0x00000004; + enc->enc_pic.me.enc_ime2_search_range_y = 0x00000004; + enc->enc_pic.me.enc_ime_decimation_search = 0x00000001; + enc->enc_pic.me.motion_est_half_pixel = 0x00000001; + enc->enc_pic.me.enc_search_range_x = 0x00000010; + enc->enc_pic.me.enc_search_range_y = 0x00000010; + enc->enc_pic.me.enc_search1_range_x = 0x00000010; + enc->enc_pic.me.enc_search1_range_y = 0x00000010; + } else { + enc->enc_pic.me.motion_est_quarter_pixel = 0x00000000; + enc->enc_pic.me.enc_disable_sub_mode = 0x000000fe; + enc->enc_pic.me.lsmvert = 0x00000000; + enc->enc_pic.me.enc_en_ime_overw_dis_subm = 0x00000000; + enc->enc_pic.me.enc_ime_overw_dis_subm_no = 0x00000000; + enc->enc_pic.me.enc_ime2_search_range_x = 0x00000001; + enc->enc_pic.me.enc_ime2_search_range_y = 0x00000001; + enc->enc_pic.me.enc_ime_decimation_search = 0x00000001; + enc->enc_pic.me.motion_est_half_pixel = 0x00000001; + enc->enc_pic.me.enc_search_range_x = 0x00000010; + enc->enc_pic.me.enc_search_range_y = 0x00000010; + enc->enc_pic.me.enc_search1_range_x = 0x00000010; + enc->enc_pic.me.enc_search1_range_y = 0x00000010; + } } static void get_pic_control_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) @@ -93,11 +122,17 @@ static void get_pic_control_param(struct rvce_encoder *enc, struct pipe_h264_enc enc->enc_pic.pc.enc_max_num_ref_frames = enc->base.max_references + 1; enc->enc_pic.pc.enc_num_default_active_ref_l0 = 0x00000001; enc->enc_pic.pc.enc_num_default_active_ref_l1 = 0x00000001; - enc->enc_pic.pc.enc_cabac_enable = 0x00000000; - enc->enc_pic.pc.enc_constraint_set_flags = 0x00000040; - enc->enc_pic.pc.enc_num_default_active_ref_l0 = 0x00000001; - enc->enc_pic.pc.enc_num_default_active_ref_l1 = 0x00000001; - + if (pic->enable_low_level_control == true) { + enc->enc_pic.pc.enc_cabac_enable = 0x00000001; + enc->enc_pic.pc.enc_constraint_set_flags = 0x00000040; + enc->enc_pic.pc.enc_num_default_active_ref_l0 = 0x00000001; + enc->enc_pic.pc.enc_num_default_active_ref_l1 = 0x00000001; + } else { + enc->enc_pic.pc.enc_cabac_enable = 0x00000000; + enc->enc_pic.pc.enc_constraint_set_flags = 0x00000040; + enc->enc_pic.pc.enc_num_default_active_ref_l0 = 0x00000001; + enc->enc_pic.pc.enc_num_default_active_ref_l1 = 0x00000001; + } } static void get_task_info_param(struct rvce_encoder *enc) @@ -117,7 +152,10 @@ static void get_config_ext_param(struct rvce_encoder *enc) static void get_vui_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) { - enc->enc_pic.enable_vui = (pic->rate_ctrl.frame_rate_num != 0); + if (pic->enable_low_level_control == true) + enc->enc_pic.enable_vui = 0; + else + enc->enc_pic.enable_vui = (pic->rate_ctrl.frame_rate_num != 0); enc->enc_pic.vui.video_format = 0x00000005; enc->enc_pic.vui.color_prim = 0x00000002; enc->enc_pic.vui.transfer_char = 0x00000002; @@ -143,6 +181,8 @@ static void get_vui_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture void radeon_vce_52_get_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) { + if (pic->enable_low_level_control == true) + enc->enc_pic.ref_pic_mode = 0x01000201; get_rate_control_param(enc, pic); get_motion_estimation_param(enc, pic); get_pic_control_param(enc, pic); @@ -153,10 +193,21 @@ void radeon_vce_52_get_param(struct rvce_encoder *enc, struct pipe_h264_enc_pict enc->enc_pic.picture_type = pic->picture_type; enc->enc_pic.frame_num = pic->frame_num; + enc->enc_pic.frame_num_cnt = pic->frame_num_cnt; + enc->enc_pic.p_remain = pic->p_remain; + enc->enc_pic.i_remain = pic->i_remain; + enc->enc_pic.gop_cnt = pic->gop_cnt; enc->enc_pic.pic_order_cnt = pic->pic_order_cnt; enc->enc_pic.ref_idx_l0 = pic->ref_idx_l0; enc->enc_pic.ref_idx_l1 = pic->ref_idx_l1; enc->enc_pic.not_referenced = pic->not_referenced; + enc->enc_pic.is_idr = pic->is_idr; + enc->enc_pic.has_ref_pic_list = pic->has_ref_pic_list; + for (int i = 0; i < 32 ; i++) { + enc->enc_pic.ref_pic_list_0[i] = pic->ref_pic_list_0[i]; + enc->enc_pic.ref_pic_list_1[i] = pic->ref_pic_list_1[i]; + enc->enc_pic.frame_idx[i] = pic->frame_idx[i]; + } } static void create(struct rvce_encoder *enc) -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev