static HD_RESULT set_enc_param(HD_PATH_ID video_enc_path, HD_DIM *p_dim, HD_VIDEO_PXLFMT pxlfmt, UINT32 enc_type, UINT32 bitrate)
{
HD_RESULT ret = HD_OK;
HD_VIDEOENC_IN video_in_param = {0};
HD_VIDEOENC_OUT video_out_param = {0};
HD_H26XENC_RATE_CONTROL rc_param = {0};
HD_H26XENC_ROW_RC rowrc_param = {0};
HD_H26XENC_VUI vui = {0};
if (p_dim != NULL) {
//--- HD_VIDEOENC_PARAM_IN ---
video_in_param.dir = HD_VIDEO_DIR_NONE;
video_in_param.pxl_fmt = pxlfmt ? pxlfmt : HD_VIDEO_PXLFMT_YUV420;
video_in_param.dim.w = p_dim->w;
video_in_param.dim.h = p_dim->h;
video_in_param.frc = HD_VIDEO_FRC_RATIO(1,1);
ret = hd_videoenc_set(video_enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param);
if (ret != HD_OK) {
printf("set_enc_param_in = %d\r\n", ret);
return ret;
}
//--- HD_VIDEOENC_PARAM_OUT_RATE_CONTROL ---
#if 1
rc_param.rc_mode = HD_RC_MODE_CBR;
rc_param.cbr.bitrate = bitrate;
rc_param.cbr.frame_rate_base = g_fps;
rc_param.cbr.frame_rate_incr = 1;
rc_param.cbr.init_i_qp = 26;
rc_param.cbr.min_i_qp = 10;
rc_param.cbr.max_i_qp = 51;
rc_param.cbr.init_p_qp = 26;
rc_param.cbr.min_p_qp = 10;
rc_param.cbr.max_p_qp = 51;
rc_param.cbr.static_time = 4;
#else
rc_param.rc_mode = HD_RC_MODE_FIX_QP;
rc_param.fixqp.frame_rate_base = g_fps;
rc_param.fixqp.frame_rate_incr = 1;
rc_param.fixqp.fix_i_qp = 28;
rc_param.fixqp.fix_p_qp = 30;
#endif
ret = hd_videoenc_set(video_enc_path, HD_VIDEOENC_PARAM_OUT_RATE_CONTROL, &rc_param);
if (ret != HD_OK) {
printf("set_enc_rate_control = %d \n", ret);
return ret;
}
rowrc_param.enable = TRUE;
rowrc_param.i_qp_range = 1;
rowrc_param.i_qp_step = 1;
rowrc_param.p_qp_range = 1;
rowrc_param.p_qp_step = 1;
rowrc_param.min_i_qp = 10;
rowrc_param.max_i_qp = 51;
rowrc_param.min_p_qp = 10;
rowrc_param.max_p_qp = 51;
ret = hd_videoenc_set(video_enc_path, HD_VIDEOENC_PARAM_OUT_ROW_RC, &rowrc_param);
if (ret != HD_OK) {
printf("set_row_rc = %d \n", ret);
return ret;
}
//--- HD_VIDEOENC_PARAM_OUT_VUI ---
vui.vui_en = TRUE;
vui.color_range = 1; // 0: Not full range, 1: Full range
ret = hd_videoenc_set(video_enc_path, HD_VIDEOENC_PARAM_OUT_VUI , &vui);
if (ret != HD_OK) {
printf("set_enc_out_ui = %d \n", ret);
return ret;
}
//--- HD_VIDEOENC_PARAM_OUT_AQ ---
HD_H26XENC_AQ aq_param = {
.enable = TRUE,
.i_str = 4,
.p_str = 4,
.min_delta_qp = -4,
.max_delta_qp = 4,
.depth = 2,
.thd_table = {-120,-112,-104, -96, -88, -80, -72, -64, -56, -48, -40, -32, -24, -16, -8, 7, 15, 23, 31, 39,47, 55, 63, 71, 79, 87, 95, 103, 111, 119}
};
ret = hd_videoenc_set(video_enc_path, HD_VIDEOENC_PARAM_OUT_AQ, &aq_param);
if (ret != HD_OK) {
printf("set_enc_aq = %d \n", ret);
return ret;
}
//--- VENDOR_VIDEOENC_PARAM_OUT_H26X_MAQ_DIFF ---
VENDOR_VIDEOENC_H26X_MAQ_DIFF maq_diff;
maq_diff.b_enable = 1;
maq_diff.str = -4;
maq_diff.start_idx = 1;
maq_diff.end_idx = 8;
printf("set HD_VIDEOENC_PARAM_OUT MAQ_DIFF ! \n");
ret = vendor_videoenc_set(video_enc_path, VENDOR_VIDEOENC_PARAM_OUT_H26X_MAQ_DIFF , &maq_diff);
if (ret != HD_OK) {
printf("set_enc_maq_diff = %d \n", ret);
return ret;
}
//--- VENDOR_VIDEOENC_PARAM_OUT_BG_RDO ---
VENDOR_VIDEOENC_BG_RDO_CFG bg_rdo = {0};
bg_rdo.b_enable = TRUE;
bg_rdo.avc_bg_skip_bias = 0;
bg_rdo.hevc_bg_skip_bias = -16;
bg_rdo.hevc_bg_merge_bias = 0;
bg_rdo.bg_bias_shift = 0;
bg_rdo.mode = 0;
printf("set HD_VIDEOENC_PARAM_OUT BG ! \n");
ret = vendor_videoenc_set(video_enc_path, VENDOR_VIDEOENC_PARAM_OUT_BG_RDO, &bg_rdo);
if (ret != HD_OK) {
printf("set_enc_bg_rdo = %d \n", ret);
return ret;
}
printf("enc_type=%d\r\n", enc_type);
if (enc_type == 0) {
//--- HD_VIDEOENC_PARAM_OUT_ENC_PARAM ---
video_out_param.codec_type = HD_CODEC_TYPE_H265;
video_out_param.h26x.profile = HD_H265E_MAIN_PROFILE;
video_out_param.h26x.level_idc = HD_H265E_LEVEL_5;
video_out_param.h26x.gop_num = (g_fps > 20) ? FRAME_RATE * 2 : FRAME_RATE * 3;
video_out_param.h26x.ltr_interval = 0;
video_out_param.h26x.ltr_pre_ref = 0;
video_out_param.h26x.gray_en = 0;
video_out_param.h26x.source_output = 0;
video_out_param.h26x.svc_layer = HD_SVC_DISABLE;
video_out_param.h26x.entropy_mode = HD_H265E_CABAC_CODING;
ret = hd_videoenc_set(video_enc_path, HD_VIDEOENC_PARAM_OUT_ENC_PARAM, &video_out_param);
if (ret != HD_OK) {
printf("set_enc_param_out = %d\r\n", ret);
return ret;
}
} else if (enc_type == 1) {
//--- HD_VIDEOENC_PARAM_OUT_ENC_PARAM ---
video_out_param.codec_type = HD_CODEC_TYPE_H264;
video_out_param.h26x.profile = HD_H264E_HIGH_PROFILE;
video_out_param.h26x.level_idc = HD_H264E_LEVEL_5_1;
video_out_param.h26x.gop_num = (g_fps > 20) ? FRAME_RATE * 2 : FRAME_RATE * 3;
video_out_param.h26x.ltr_interval = 0;
video_out_param.h26x.ltr_pre_ref = 0;
video_out_param.h26x.gray_en = 0;
video_out_param.h26x.source_output = 0;
video_out_param.h26x.svc_layer = HD_SVC_DISABLE;
video_out_param.h26x.entropy_mode = HD_H264E_CABAC_CODING;
ret = hd_videoenc_set(video_enc_path, HD_VIDEOENC_PARAM_OUT_ENC_PARAM, &video_out_param);
if (ret != HD_OK) {
printf("set_enc_param_out = %d\r\n", ret);
return ret;
}
} else if (enc_type == 2) {
//--- HD_VIDEOENC_PARAM_OUT_ENC_PARAM ---
video_out_param.codec_type = HD_CODEC_TYPE_JPEG;
video_out_param.jpeg.retstart_interval = 0;
video_out_param.jpeg.image_quality = 50;
ret = hd_videoenc_set(video_enc_path, HD_VIDEOENC_PARAM_OUT_ENC_PARAM, &video_out_param);
if (ret != HD_OK) {
printf("set_enc_param_out = %d\r\n", ret);
return ret;
}
} else {
printf("not support enc_type\r\n");
return HD_ERR_NG;
}
}
return ret;
}