[Mesa-dev] [PATCH 4/4] radeon/vce: handle newly added parameters

Christian König deathsimple at vodafone.de
Fri Jun 24 12:39:09 UTC 2016


> +	if (pic->enable_low_level_control == true) {

Well using this enable_low_level_control switch to choose between two 
sets of hardcoded values is clearly a no go.

For the motion estimation and most of the other flags I would say just 
try to expose the parameters we have in the hardware structure in the 
pipe interface as well.

Only for the bit rate control I'm absolutely not sure what to do. Is 
that an AMD specific extension what you do there? Cause I can't really 
understand why you do it like this.

Ilia and/or maybe other nouveau developers: You guys don't have any 
plans to expose the NVidia encoding functionality through the 
OpenMAX/VA-API state trackers in the near future don't you?

Regards,
Christian.

Am 22.06.2016 um 23:44 schrieb Boyuan Zhang:
> Signed-off-by: Boyuan Zhang <boyuan.zhang at 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)



More information about the mesa-dev mailing list