[mpp_enc]: Use qp config in rc to setup encoder

1. Unify H.264/H.265/vp8 qp config
2. H.264/H.265 encoder setup default rc qp config.
3. Move rc_cfg process all to mpp_enc module.
4. Fix some encoder config in encoder test.

Change-Id: I2a31c6abf904f1c16c2acd937c8d467d48db531d
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Signed-off-by: sayon.chen <sayon.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2021-01-06 08:56:49 +08:00
parent f04fabc136
commit 17e3a2fefd
10 changed files with 341 additions and 608 deletions

View File

@@ -177,13 +177,13 @@ RK_U32 mpp_enc_cfg_debug = 0;
ENTRY(h264, dblk_disable, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_DEBLOCKING, codec.h264, deblock_disable) \ ENTRY(h264, dblk_disable, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_DEBLOCKING, codec.h264, deblock_disable) \
ENTRY(h264, dblk_alpha, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_DEBLOCKING, codec.h264, deblock_offset_alpha) \ ENTRY(h264, dblk_alpha, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_DEBLOCKING, codec.h264, deblock_offset_alpha) \
ENTRY(h264, dblk_beta, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_DEBLOCKING, codec.h264, deblock_offset_beta) \ ENTRY(h264, dblk_beta, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_DEBLOCKING, codec.h264, deblock_offset_beta) \
ENTRY(h264, qp_init, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_init) \ ENTRY(h264, qp_init, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_INIT, rc, qp_init) \
ENTRY(h264, qp_max, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_max) \ ENTRY(h264, qp_min, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE, rc, qp_min) \
ENTRY(h264, qp_min, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_min) \ ENTRY(h264, qp_max, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE, rc, qp_max) \
ENTRY(h264, qp_max_i, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I, codec.h264, qp_max_i) \ ENTRY(h264, qp_min_i, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I, rc, qp_min_i) \
ENTRY(h264, qp_min_i, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I, codec.h264, qp_min_i) \ ENTRY(h264, qp_max_i, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I, rc, qp_max_i) \
ENTRY(h264, qp_step, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_MAX_QP_STEP, codec.h264, qp_max_step) \ ENTRY(h264, qp_step, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_MAX_STEP, rc, qp_max_step) \
ENTRY(h264, qp_delta_ip, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_DELTA, codec.h264, qp_delta_ip) \ ENTRY(h264, qp_delta_ip, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_IP, rc, qp_delta_ip) \
ENTRY(h264, max_tid, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_MAX_TID, codec.h264, max_tid) \ ENTRY(h264, max_tid, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_MAX_TID, codec.h264, max_tid) \
ENTRY(h264, max_ltr, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_MAX_LTR, codec.h264, max_ltr_frames) \ ENTRY(h264, max_ltr, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_MAX_LTR, codec.h264, max_ltr_frames) \
ENTRY(h264, prefix_mode, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_ADD_PREFIX, codec.h264, prefix_mode) \ ENTRY(h264, prefix_mode, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_ADD_PREFIX, codec.h264, prefix_mode) \
@@ -197,20 +197,21 @@ RK_U32 mpp_enc_cfg_debug = 0;
ENTRY(h265, dblk_disable, U32, RK_U32, MPP_ENC_H265_CFG_DBLK_CHANGE, codec.h265, dblk_cfg.slice_deblocking_filter_disabled_flag) \ ENTRY(h265, dblk_disable, U32, RK_U32, MPP_ENC_H265_CFG_DBLK_CHANGE, codec.h265, dblk_cfg.slice_deblocking_filter_disabled_flag) \
ENTRY(h265, dblk_alpha, S32, RK_S32, MPP_ENC_H265_CFG_DBLK_CHANGE, codec.h265, dblk_cfg.slice_beta_offset_div2) \ ENTRY(h265, dblk_alpha, S32, RK_S32, MPP_ENC_H265_CFG_DBLK_CHANGE, codec.h265, dblk_cfg.slice_beta_offset_div2) \
ENTRY(h265, dblk_beta, S32, RK_S32, MPP_ENC_H265_CFG_DBLK_CHANGE, codec.h265, dblk_cfg.slice_tc_offset_div2) \ ENTRY(h265, dblk_beta, S32, RK_S32, MPP_ENC_H265_CFG_DBLK_CHANGE, codec.h265, dblk_cfg.slice_tc_offset_div2) \
ENTRY(h265, qp_init, S32, RK_S32, MPP_ENC_H265_CFG_RC_QP_CHANGE, codec.h265, qp_init) \ ENTRY(h265, qp_init, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_INIT, rc, qp_init) \
ENTRY(h265, qp_max, S32, RK_S32, MPP_ENC_H265_CFG_RC_QP_CHANGE, codec.h265, max_qp) \ ENTRY(h265, qp_min, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE, rc, qp_min) \
ENTRY(h265, qp_min, S32, RK_S32, MPP_ENC_H265_CFG_RC_QP_CHANGE, codec.h265, min_qp) \ ENTRY(h265, qp_max, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE, rc, qp_max) \
ENTRY(h265, qp_max_i, S32, RK_S32, MPP_ENC_H265_CFG_RC_I_QP_CHANGE, codec.h265, max_i_qp) \ ENTRY(h265, qp_min_i, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I, rc, qp_min_i) \
ENTRY(h265, qp_min_i, S32, RK_S32, MPP_ENC_H265_CFG_RC_I_QP_CHANGE, codec.h265, min_i_qp) \ ENTRY(h265, qp_max_i, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I, rc, qp_max_i) \
ENTRY(h265, qp_step, S32, RK_S32, MPP_ENC_H265_CFG_RC_MAX_QP_STEP_CHANGE, codec.h265, qp_max_step) \ ENTRY(h265, qp_step, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_MAX_STEP, rc, qp_max_step) \
ENTRY(h265, qp_delta_ip, S32, RK_S32, MPP_ENC_H265_CFG_RC_IP_DELTA_QP_CHANGE, codec.h265, ip_qp_delta) \ ENTRY(h265, qp_delta_ip, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_IP, rc, qp_delta_ip) \
/* vp8 config */ \ /* vp8 config */ \
ENTRY(vp8, qp_init, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_init) \ ENTRY(vp8, qp_init, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_INIT, rc, qp_init) \
ENTRY(vp8, qp_max, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_max) \ ENTRY(vp8, qp_min, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE, rc, qp_min) \
ENTRY(vp8, qp_min, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_min) \ ENTRY(vp8, qp_max, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE, rc, qp_max) \
ENTRY(vp8, qp_max_i, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_max_i) \ ENTRY(vp8, qp_min_i, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I, rc, qp_min_i) \
ENTRY(vp8, qp_min_i, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_min_i) \ ENTRY(vp8, qp_max_i, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I, rc, qp_max_i) \
ENTRY(vp8, qp_step, S32, RK_S32, 0, codec.vp8, qp_max_step) \ ENTRY(vp8, qp_step, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_MAX_STEP, rc, qp_max_step) \
ENTRY(vp8, qp_delta_ip, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_QP_IP, rc, qp_delta_ip) \
ENTRY(vp8, disable_ivf, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_DIS_IVF, codec.vp8, disable_ivf) \ ENTRY(vp8, disable_ivf, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_DIS_IVF, codec.vp8, disable_ivf) \
/* jpeg config */ \ /* jpeg config */ \
ENTRY(jpeg, quant, S32, RK_S32, MPP_ENC_JPEG_CFG_CHANGE_QP, codec.jpeg, quant) \ ENTRY(jpeg, quant, S32, RK_S32, MPP_ENC_JPEG_CFG_CHANGE_QP, codec.jpeg, quant) \

View File

@@ -98,13 +98,6 @@ static void init_h264e_cfg_set(MppEncCfgSet *cfg, MppClientType type)
memset(h264, 0, sizeof(*h264)); memset(h264, 0, sizeof(*h264));
h264->profile = H264_PROFILE_BASELINE; h264->profile = H264_PROFILE_BASELINE;
h264->level = H264_LEVEL_3_1; h264->level = H264_LEVEL_3_1;
h264->qp_init = 26;
h264->qp_max = 48;
h264->qp_min = 8;
/* default max/min intra qp is not set */
h264->qp_max_i = 0;
h264->qp_min_i = 0;
h264->qp_delta_ip = 4;
switch (type) { switch (type) {
case VPU_CLIENT_VEPU1 : case VPU_CLIENT_VEPU1 :
@@ -167,6 +160,13 @@ static void init_h264e_cfg_set(MppEncCfgSet *cfg, MppClientType type)
rc_cfg->max_i_prop = 30; rc_cfg->max_i_prop = 30;
rc_cfg->min_i_prop = 10; rc_cfg->min_i_prop = 10;
rc_cfg->init_ip_ratio = 480; rc_cfg->init_ip_ratio = 480;
rc_cfg->qp_init = 26;
rc_cfg->qp_max = 48;
rc_cfg->qp_min = 8;
/* default max/min intra qp is not set */
rc_cfg->qp_max_i = 0;
rc_cfg->qp_min_i = 0;
rc_cfg->qp_delta_ip = 4;
} }
static void h264e_add_syntax(H264eCtx *ctx, H264eSyntaxType type, void *p) static void h264e_add_syntax(H264eCtx *ctx, H264eSyntaxType type, void *p)
@@ -320,123 +320,6 @@ static MPP_RET h264e_proc_prep_cfg(MppEncPrepCfg *dst, MppEncPrepCfg *src)
return ret; return ret;
} }
static MPP_RET h264e_proc_rc_cfg(MppEncRcCfg *dst, MppEncRcCfg *src, MppEncH264Cfg *h264)
{
MPP_RET ret = MPP_OK;
RK_U32 change = src->change;
if (change) {
MppEncRcCfg bak = *dst;
if (change & MPP_ENC_RC_CFG_CHANGE_RC_MODE)
dst->rc_mode = src->rc_mode;
if (change & MPP_ENC_RC_CFG_CHANGE_QUALITY)
dst->quality = src->quality;
if (change & MPP_ENC_RC_CFG_CHANGE_BPS) {
dst->bps_target = src->bps_target;
dst->bps_max = src->bps_max;
dst->bps_min = src->bps_min;
}
if (change & MPP_ENC_RC_CFG_CHANGE_FPS_IN) {
dst->fps_in_flex = src->fps_in_flex;
dst->fps_in_num = src->fps_in_num;
dst->fps_in_denorm = src->fps_in_denorm;
}
if (change & MPP_ENC_RC_CFG_CHANGE_FPS_OUT) {
dst->fps_out_flex = src->fps_out_flex;
dst->fps_out_num = src->fps_out_num;
dst->fps_out_denorm = src->fps_out_denorm;
}
if (change & MPP_ENC_RC_CFG_CHANGE_GOP)
dst->gop = src->gop;
if (change & MPP_ENC_RC_CFG_CHANGE_MAX_REENC)
dst->max_reenc_times = src->max_reenc_times;
if (change & MPP_ENC_RC_CFG_CHANGE_DROP_FRM) {
dst->drop_mode = src->drop_mode;
dst->drop_threshold = src->drop_threshold;
dst->drop_gap = src->drop_gap;
}
if (change & MPP_ENC_RC_CFG_CHANGE_PRIORITY) {
if (src->rc_priority >= MPP_ENC_RC_PRIORITY_BUTT) {
mpp_err("invalid rc_priority %d should be[%d, %d] \n",
src->rc_priority, MPP_ENC_RC_BY_BITRATE_FIRST, MPP_ENC_RC_PRIORITY_BUTT);
ret = MPP_ERR_VALUE;
}
dst->rc_priority = src->rc_priority;
}
if (change & MPP_ENC_RC_CFG_CHANGE_SUPER_FRM) {
if (src->super_mode >= MPP_ENC_RC_SUPER_FRM_BUTT) {
mpp_err("invalid super_mode %d should be[%d, %d] \n",
src->super_mode, MPP_ENC_RC_SUPER_FRM_NONE, MPP_ENC_RC_SUPER_FRM_BUTT);
ret = MPP_ERR_VALUE;
}
dst->super_mode = src->super_mode;
dst->super_i_thd = src->super_i_thd;
dst->super_p_thd = src->super_p_thd;
}
if (change & MPP_ENC_RC_CFG_CHANGE_MAX_I_PROP)
dst->max_i_prop = src->max_i_prop;
if (change & MPP_ENC_RC_CFG_CHANGE_MIN_I_PROP)
dst->min_i_prop = src->min_i_prop;
if (change & MPP_ENC_RC_CFG_CHANGE_INIT_IP_RATIO)
dst->init_ip_ratio = src->init_ip_ratio;
// parameter checking
if (dst->rc_mode >= MPP_ENC_RC_MODE_BUTT) {
mpp_err("invalid rc mode %d should be RC_MODE_VBR or RC_MODE_CBR\n",
src->rc_mode);
ret = MPP_ERR_VALUE;
}
if (dst->quality >= MPP_ENC_RC_QUALITY_BUTT) {
mpp_err("invalid quality %d should be from QUALITY_WORST to QUALITY_BEST\n",
dst->quality);
ret = MPP_ERR_VALUE;
}
if (dst->rc_mode != MPP_ENC_RC_MODE_FIXQP) {
if ((dst->bps_target >= 100 * SZ_1M || dst->bps_target <= 1 * SZ_1K) ||
(dst->bps_max >= 100 * SZ_1M || dst->bps_max <= 1 * SZ_1K) ||
(dst->bps_min >= 100 * SZ_1M || dst->bps_min <= 1 * SZ_1K)) {
mpp_err("invalid bit per second %d [%d:%d] out of range 1K~100M\n",
dst->bps_target, dst->bps_min, dst->bps_max);
ret = MPP_ERR_VALUE;
}
}
if (dst->drop_mode == MPP_ENC_RC_DROP_FRM_PSKIP &&
dst->drop_gap == 0 &&
h264->poc_type == 2) {
mpp_err("poc type 2 is ocnflict with successive non-reference pskip mode\n");
mpp_err("set drop gap to 1\n");
dst->drop_gap = 1;
}
dst->change |= change;
if (ret) {
mpp_err_f("failed to accept new rc config\n");
*dst = bak;
} else {
mpp_log("MPP_ENC_SET_RC_CFG bps %d [%d : %d] fps [%d:%d] gop %d\n",
dst->bps_target, dst->bps_min, dst->bps_max,
dst->fps_in_num, dst->fps_out_num, dst->gop);
}
}
src->change = 0;
return ret;
}
static MPP_RET h264e_proc_h264_cfg(MppEncH264Cfg *dst, MppEncH264Cfg *src) static MPP_RET h264e_proc_h264_cfg(MppEncH264Cfg *dst, MppEncH264Cfg *src)
{ {
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
@@ -508,32 +391,6 @@ static MPP_RET h264e_proc_h264_cfg(MppEncH264Cfg *dst, MppEncH264Cfg *src)
dst->change |= MPP_ENC_H264_CFG_CHANGE_SCALING_LIST; dst->change |= MPP_ENC_H264_CFG_CHANGE_SCALING_LIST;
} }
if ((change & MPP_ENC_H264_CFG_CHANGE_QP_LIMIT) &&
((dst->qp_init != src->qp_init) ||
(dst->qp_max != src->qp_max) ||
(dst->qp_min != src->qp_min))) {
dst->qp_init = src->qp_init;
dst->qp_max = src->qp_max;
dst->qp_min = src->qp_min;
dst->change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT;
}
if ((change & MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I) &&
((dst->qp_max_i != src->qp_max_i) ||
(dst->qp_min_i != src->qp_min_i))) {
dst->qp_max_i = src->qp_max_i ? src->qp_max_i : src->qp_max;
dst->qp_min_i = src->qp_min_i ? src->qp_min_i : src->qp_min;
dst->change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I;
}
if ((change & MPP_ENC_H264_CFG_CHANGE_MAX_QP_STEP) &&
(dst->qp_max_step != src->qp_max_step)) {
dst->qp_max_step = src->qp_max_step;
dst->change |= MPP_ENC_H264_CFG_CHANGE_MAX_QP_STEP;
}
if ((change & MPP_ENC_H264_CFG_CHANGE_QP_DELTA) &&
(dst->qp_delta_ip != src->qp_delta_ip)) {
dst->qp_delta_ip = src->qp_delta_ip;
dst->change |= MPP_ENC_H264_CFG_CHANGE_QP_DELTA;
}
if ((change & MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH) && if ((change & MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH) &&
((dst->intra_refresh_mode != src->intra_refresh_mode) || ((dst->intra_refresh_mode != src->intra_refresh_mode) ||
(dst->intra_refresh_arg != src->intra_refresh_arg))) { (dst->intra_refresh_arg != src->intra_refresh_arg))) {
@@ -589,6 +446,20 @@ static MPP_RET h264e_proc_split_cfg(MppEncSliceSplit *dst, MppEncSliceSplit *src
return ret; return ret;
} }
static void h264e_check_cfg(MppEncCfgSet *cfg)
{
MppEncRcCfg *rc = &cfg->rc;
MppEncH264Cfg *h264 = &cfg->codec.h264;
if (rc->drop_mode == MPP_ENC_RC_DROP_FRM_PSKIP &&
rc->drop_gap == 0 &&
h264->poc_type == 2) {
mpp_err("poc type 2 is ocnflict with successive non-reference pskip mode\n");
mpp_err("set drop gap to 1\n");
rc->drop_gap = 1;
}
}
static MPP_RET h264e_proc_cfg(void *ctx, MpiCmd cmd, void *param) static MPP_RET h264e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
{ {
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
@@ -608,18 +479,12 @@ static MPP_RET h264e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
if (src->codec.h264.change) if (src->codec.h264.change)
ret |= h264e_proc_h264_cfg(&cfg->codec.h264, &src->codec.h264); ret |= h264e_proc_h264_cfg(&cfg->codec.h264, &src->codec.h264);
if (src->rc.change)
ret |= h264e_proc_rc_cfg(&cfg->rc, &src->rc, &cfg->codec.h264);
if (src->split.change) if (src->split.change)
ret |= h264e_proc_split_cfg(&cfg->split, &src->split); ret |= h264e_proc_split_cfg(&cfg->split, &src->split);
} break; } break;
case MPP_ENC_SET_PREP_CFG : { case MPP_ENC_SET_PREP_CFG : {
ret = h264e_proc_prep_cfg(&cfg->prep, param); ret = h264e_proc_prep_cfg(&cfg->prep, param);
} break; } break;
case MPP_ENC_SET_RC_CFG : {
ret = h264e_proc_rc_cfg(&cfg->rc, param, &cfg->codec.h264);
} break;
case MPP_ENC_SET_CODEC_CFG : { case MPP_ENC_SET_CODEC_CFG : {
MppEncCodecCfg *codec = (MppEncCodecCfg *)param; MppEncCodecCfg *codec = (MppEncCodecCfg *)param;
ret = h264e_proc_h264_cfg(&cfg->codec.h264, &codec->h264); ret = h264e_proc_h264_cfg(&cfg->codec.h264, &codec->h264);
@@ -635,6 +500,8 @@ static MPP_RET h264e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
break; break;
} }
h264e_check_cfg(cfg);
h264e_dbg_func("leave ret %d\n", ret); h264e_dbg_func("leave ret %d\n", ret);
return ret; return ret;

View File

@@ -74,7 +74,6 @@ static MPP_RET h265e_init(void *ctx, EncImplCfg *ctrlCfg)
h265->ip_qp_delta = 5; h265->ip_qp_delta = 5;
h265->raw_dealt_qp = 4; h265->raw_dealt_qp = 4;
h265->max_delta_qp = 10; h265->max_delta_qp = 10;
h265->const_intra_pred = 0;
h265->gop_delta_qp = 0; h265->gop_delta_qp = 0;
h265->intra_refresh_mode = 0; h265->intra_refresh_mode = 0;
h265->intra_refresh_arg = 0; h265->intra_refresh_arg = 0;
@@ -146,6 +145,13 @@ static MPP_RET h265e_init(void *ctx, EncImplCfg *ctrlCfg)
rc_cfg->max_i_prop = 30; rc_cfg->max_i_prop = 30;
rc_cfg->min_i_prop = 10; rc_cfg->min_i_prop = 10;
rc_cfg->init_ip_ratio = 480; rc_cfg->init_ip_ratio = 480;
rc_cfg->qp_init = 26;
rc_cfg->qp_max = 51;
rc_cfg->qp_min = 10;
rc_cfg->qp_max_i = 51;
rc_cfg->qp_min_i = 15;
rc_cfg->qp_delta_ip = 4;
rc_cfg->qp_delta_vi = 2;
INIT_LIST_HEAD(&p->rc_list); INIT_LIST_HEAD(&p->rc_list);
@@ -388,121 +394,6 @@ static MPP_RET h265e_proc_prep_cfg(MppEncPrepCfg *dst, MppEncPrepCfg *src)
return MPP_OK; return MPP_OK;
} }
static MPP_RET h265e_proc_rc_cfg(MppEncRcCfg *dst, MppEncRcCfg *src)
{
MPP_RET ret = MPP_OK;
RK_U32 change = src->change;
if (change) {
MppEncRcCfg bak = *dst;
if (change & MPP_ENC_RC_CFG_CHANGE_RC_MODE)
dst->rc_mode = src->rc_mode;
if (change & MPP_ENC_RC_CFG_CHANGE_QUALITY)
dst->quality = src->quality;
if (change & MPP_ENC_RC_CFG_CHANGE_BPS) {
dst->bps_target = src->bps_target;
dst->bps_max = src->bps_max;
dst->bps_min = src->bps_min;
}
if (change & MPP_ENC_RC_CFG_CHANGE_FPS_IN) {
dst->fps_in_flex = src->fps_in_flex;
dst->fps_in_num = src->fps_in_num;
dst->fps_in_denorm = src->fps_in_denorm;
}
if (change & MPP_ENC_RC_CFG_CHANGE_FPS_OUT) {
dst->fps_out_flex = src->fps_out_flex;
dst->fps_out_num = src->fps_out_num;
dst->fps_out_denorm = src->fps_out_denorm;
}
if (change & MPP_ENC_RC_CFG_CHANGE_GOP)
dst->gop = src->gop;
if (change & MPP_ENC_RC_CFG_CHANGE_MAX_REENC)
dst->max_reenc_times = src->max_reenc_times;
if (change & MPP_ENC_RC_CFG_CHANGE_DROP_FRM) {
dst->drop_mode = src->drop_mode;
dst->drop_threshold = src->drop_threshold;
dst->drop_gap = src->drop_gap;
}
if (change & MPP_ENC_RC_CFG_CHANGE_PRIORITY) {
if (src->rc_priority >= MPP_ENC_RC_PRIORITY_BUTT) {
mpp_err("invalid rc_priority %d should be[%d, %d] \n",
src->rc_priority, MPP_ENC_RC_BY_BITRATE_FIRST, MPP_ENC_RC_PRIORITY_BUTT);
ret = MPP_ERR_VALUE;
}
dst->rc_priority = src->rc_priority;
}
if (change & MPP_ENC_RC_CFG_CHANGE_SUPER_FRM) {
if (src->super_mode >= MPP_ENC_RC_SUPER_FRM_BUTT) {
mpp_err("invalid super_mode %d should be[%d, %d] \n",
src->super_mode, MPP_ENC_RC_SUPER_FRM_NONE, MPP_ENC_RC_SUPER_FRM_BUTT);
ret = MPP_ERR_VALUE;
}
dst->super_mode = src->super_mode;
dst->super_i_thd = src->super_i_thd;
dst->super_p_thd = src->super_p_thd;
}
if (change & MPP_ENC_RC_CFG_CHANGE_MAX_I_PROP)
dst->max_i_prop = src->max_i_prop;
if (change & MPP_ENC_RC_CFG_CHANGE_MIN_I_PROP)
dst->min_i_prop = src->min_i_prop;
if (change & MPP_ENC_RC_CFG_CHANGE_INIT_IP_RATIO)
dst->init_ip_ratio = src->init_ip_ratio;
// parameter checking
if (dst->rc_mode >= MPP_ENC_RC_MODE_BUTT) {
mpp_err("invalid rc mode %d should be RC_MODE_VBR or RC_MODE_CBR\n",
src->rc_mode);
ret = MPP_ERR_VALUE;
}
if (dst->quality >= MPP_ENC_RC_QUALITY_BUTT) {
mpp_err("invalid quality %d should be from QUALITY_WORST to QUALITY_BEST\n",
dst->quality);
ret = MPP_ERR_VALUE;
}
if (dst->rc_mode != MPP_ENC_RC_MODE_FIXQP) {
if ((dst->bps_target >= 100 * SZ_1M || dst->bps_target <= 1 * SZ_1K) ||
(dst->bps_max >= 100 * SZ_1M || dst->bps_max <= 1 * SZ_1K) ||
(dst->bps_min >= 100 * SZ_1M || dst->bps_min <= 1 * SZ_1K)) {
mpp_err("invalid bit per second %d [%d:%d] out of range 1K~100M\n",
dst->bps_target, dst->bps_min, dst->bps_max);
ret = MPP_ERR_VALUE;
}
if ((dst->bps_target > dst->bps_max || dst->bps_target < dst->bps_min) ||
(dst->bps_max < dst->bps_min)) {
mpp_err("invalid bit rate config %d [%d:%d] for size relationship\n",
dst->bps_target, dst->bps_min, dst->bps_max);
ret = MPP_ERR_VALUE;
}
}
dst->change |= change;
if (ret) {
mpp_err_f("failed to accept new rc config\n");
*dst = bak;
} else {
mpp_log_f("MPP_ENC_SET_RC_CFG bps %d [%d : %d] fps [%d:%d] gop %d\n",
dst->bps_target, dst->bps_min, dst->bps_max,
dst->fps_in_num, dst->fps_out_num, dst->gop);
}
}
return ret;
}
static MPP_RET h265e_proc_h265_cfg(MppEncH265Cfg *dst, MppEncH265Cfg *src) static MPP_RET h265e_proc_h265_cfg(MppEncH265Cfg *dst, MppEncH265Cfg *src)
{ {
@@ -543,23 +434,6 @@ static MPP_RET h265e_proc_h265_cfg(MppEncH265Cfg *dst, MppEncH265Cfg *src)
memcpy(&dst->vui, &src->vui, sizeof(src->vui)); memcpy(&dst->vui, &src->vui, sizeof(src->vui));
} }
if (change & MPP_ENC_H265_CFG_RC_QP_CHANGE) {
dst->qp_init = src->qp_init;
dst->max_qp = src->max_qp;
dst->min_qp = src->min_qp;
}
if (change & MPP_ENC_H265_CFG_RC_I_QP_CHANGE) {
dst->max_i_qp = src->max_i_qp;
dst->min_i_qp = src->min_i_qp;
}
if (change & MPP_ENC_H265_CFG_RC_MAX_QP_STEP_CHANGE)
dst->max_delta_qp = src->max_delta_qp;
if (change & MPP_ENC_H265_CFG_RC_IP_DELTA_QP_CHANGE)
dst->ip_qp_delta = src->ip_qp_delta;
/* /*
* NOTE: use OR here for avoiding overwrite on multiple config * NOTE: use OR here for avoiding overwrite on multiple config
* When next encoding is trigger the change flag will be clear * When next encoding is trigger the change flag will be clear
@@ -601,10 +475,7 @@ static MPP_RET h265e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
ret |= h265e_proc_prep_cfg(&cfg->prep, &src->prep); ret |= h265e_proc_prep_cfg(&cfg->prep, &src->prep);
src->prep.change = 0; src->prep.change = 0;
} }
if (src->rc.change) {
ret |= h265e_proc_rc_cfg(&cfg->rc, &src->rc);
src->rc.change = 0;
}
if (src->codec.h265.change) { if (src->codec.h265.change) {
ret |= h265e_proc_h265_cfg(&cfg->codec.h265, &src->codec.h265); ret |= h265e_proc_h265_cfg(&cfg->codec.h265, &src->codec.h265);
src->codec.h265.change = 0; src->codec.h265.change = 0;
@@ -624,12 +495,9 @@ static MPP_RET h265e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
} break; } break;
case MPP_ENC_SET_CODEC_CFG: { case MPP_ENC_SET_CODEC_CFG: {
MppEncCodecCfg *codec = (MppEncCodecCfg *)param; MppEncCodecCfg *codec = (MppEncCodecCfg *)param;
ret = h265e_proc_h265_cfg(&cfg->codec.h265, &codec->h265); ret = h265e_proc_h265_cfg(&cfg->codec.h265, &codec->h265);
} break; } break;
case MPP_ENC_SET_RC_CFG : {
ret = h265e_proc_rc_cfg(&cfg->rc, param);
} break;
case MPP_ENC_SET_SEI_CFG: { case MPP_ENC_SET_SEI_CFG: {
} break; } break;
case MPP_ENC_SET_SPLIT : { case MPP_ENC_SET_SPLIT : {

View File

@@ -208,80 +208,6 @@ static MPP_RET vp8e_proc_split_cfg(MppEncSliceSplit *dst, MppEncSliceSplit *src)
return ret; return ret;
} }
static MPP_RET vp8e_proc_rc_cfg(MppEncRcCfg *dst, MppEncRcCfg *src)
{
MPP_RET ret = MPP_OK;
RK_U32 change = src->change;
vp8e_dbg_cfg("set rc cfg change %d\n", change);
if (change) {
MppEncRcCfg bak = *dst;
if (change & MPP_ENC_RC_CFG_CHANGE_RC_MODE)
dst->rc_mode = src->rc_mode;
if (change & MPP_ENC_RC_CFG_CHANGE_QUALITY)
dst->quality = src->quality;
if (change & MPP_ENC_RC_CFG_CHANGE_BPS) {
dst->bps_target = src->bps_target;
dst->bps_max = src->bps_max;
dst->bps_min = src->bps_min;
}
if (change & MPP_ENC_RC_CFG_CHANGE_FPS_IN) {
dst->fps_in_flex = src->fps_in_flex;
dst->fps_in_num = src->fps_in_num;
dst->fps_in_denorm = src->fps_in_denorm;
}
if (change & MPP_ENC_RC_CFG_CHANGE_FPS_OUT) {
dst->fps_out_flex = src->fps_out_flex;
dst->fps_out_num = src->fps_out_num;
dst->fps_out_denorm = src->fps_out_denorm;
}
if (change & MPP_ENC_RC_CFG_CHANGE_GOP)
dst->gop = src->gop;
if (change & MPP_ENC_RC_CFG_CHANGE_MAX_REENC)
dst->max_reenc_times = src->max_reenc_times;
// parameter checking
if (dst->rc_mode >= MPP_ENC_RC_MODE_BUTT) {
mpp_err("invalid rc mode %d should be RC_MODE_VBR or RC_MODE_CBR\n",
src->rc_mode);
ret = MPP_ERR_VALUE;
}
if (dst->quality >= MPP_ENC_RC_QUALITY_BUTT) {
mpp_err("invalid quality %d should be from QUALITY_WORST to QUALITY_BEST\n",
dst->quality);
ret = MPP_ERR_VALUE;
}
if (dst->rc_mode != MPP_ENC_RC_MODE_FIXQP) {
if ((dst->bps_target >= 100 * SZ_1M || dst->bps_target <= 1 * SZ_1K) ||
(dst->bps_max >= 100 * SZ_1M || dst->bps_max <= 1 * SZ_1K) ||
(dst->bps_min >= 100 * SZ_1M || dst->bps_min <= 1 * SZ_1K)) {
mpp_err("invalid bit per second %d [%d:%d] out of range 1K~100M\n",
dst->bps_target, dst->bps_min, dst->bps_max);
ret = MPP_ERR_VALUE;
}
}
dst->change |= change;
if (ret) {
mpp_err_f("failed to accept new rc config\n");
*dst = bak;
} else {
vp8e_dbg_cfg("MPP_ENC_SET_RC_CFG bps %d [%d : %d] fps [%d:%d] gop %d\n",
dst->bps_target, dst->bps_min, dst->bps_max,
dst->fps_in_num, dst->fps_out_num, dst->gop);
}
}
return ret;
}
static MPP_RET vp8e_proc_vp8_cfg(MppEncVp8Cfg *dst, MppEncVp8Cfg *src) static MPP_RET vp8e_proc_vp8_cfg(MppEncVp8Cfg *dst, MppEncVp8Cfg *src)
{ {
RK_U32 change = src->change; RK_U32 change = src->change;
@@ -317,10 +243,6 @@ static MPP_RET vp8e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
ret |= vp8e_proc_prep_cfg(&cfg->prep, &src->prep); ret |= vp8e_proc_prep_cfg(&cfg->prep, &src->prep);
src->prep.change = 0; src->prep.change = 0;
} }
if (src->rc.change) {
ret |= vp8e_proc_rc_cfg(&cfg->rc, &src->rc);
src->rc.change = 0;
}
if (src->codec.vp8.change) { if (src->codec.vp8.change) {
ret |= vp8e_proc_vp8_cfg(&cfg->codec.vp8, &src->codec.vp8); ret |= vp8e_proc_vp8_cfg(&cfg->codec.vp8, &src->codec.vp8);
src->codec.vp8.change = 0; src->codec.vp8.change = 0;
@@ -330,10 +252,6 @@ static MPP_RET vp8e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
src->split.change = 0; src->split.change = 0;
} }
} break; } break;
case MPP_ENC_SET_RC_CFG : {
vp8e_dbg_cfg("update vp8e rc config");
ret |= vp8e_proc_rc_cfg(&cfg->rc, &src->rc);
} break;
default: { default: {
mpp_err("No correspond cmd found, and can not config!"); mpp_err("No correspond cmd found, and can not config!");
ret = MPP_NOK; ret = MPP_NOK;

View File

@@ -264,28 +264,17 @@ static MPP_RET check_enc_task_wait(MppEncImpl *enc, EncTask *task)
static RK_S32 check_codec_to_resend_hdr(MppEncCodecCfg *codec) static RK_S32 check_codec_to_resend_hdr(MppEncCodecCfg *codec)
{ {
MppCodingType coding = codec->coding; switch (codec->coding) {
RK_U32 skip_flag = 0;
switch (coding) {
case MPP_VIDEO_CodingAVC : { case MPP_VIDEO_CodingAVC : {
MppEncH264Cfg *h264 = &codec->h264; if (codec->h264.change)
skip_flag = MPP_ENC_H264_CFG_CHANGE_QP_LIMIT | MPP_ENC_H264_CFG_CHANGE_MAX_TID;
if (h264->change & (~skip_flag))
return 1; return 1;
} break; } break;
case MPP_VIDEO_CodingHEVC : { case MPP_VIDEO_CodingHEVC : {
MppEncH265Cfg *h265 = &codec->h265; if (codec->h265.change)
if (h265->change & (~MPP_ENC_H265_CFG_RC_QP_CHANGE))
return 1; return 1;
}
break;
case MPP_VIDEO_CodingVP8 : {
} break;
case MPP_VIDEO_CodingMJPEG : {
} break; } break;
case MPP_VIDEO_CodingVP8 :
case MPP_VIDEO_CodingMJPEG :
default : { default : {
} break; } break;
} }
@@ -362,39 +351,6 @@ static RK_S32 check_resend_hdr(MpiCmd cmd, void *param, MppEncCfgSet *cfg)
return resend; return resend;
} }
static RK_S32 check_codec_to_rc_cfg_update(MppEncCodecCfg *codec)
{
MppCodingType coding = codec->coding;
switch (coding) {
case MPP_VIDEO_CodingAVC : {
MppEncH264Cfg *h264 = &codec->h264;
if (h264->change &
(MPP_ENC_H264_CFG_CHANGE_QP_LIMIT |
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I |
MPP_ENC_H264_CFG_CHANGE_QP_DELTA))
return 1;
} break;
case MPP_VIDEO_CodingHEVC : {
MppEncH265Cfg *h265 = &codec->h265;
if (h265->change &
(MPP_ENC_H265_CFG_RC_QP_CHANGE |
MPP_ENC_H265_CFG_RC_I_QP_CHANGE |
MPP_ENC_H265_CFG_RC_MAX_QP_STEP_CHANGE |
MPP_ENC_H265_CFG_RC_IP_DELTA_QP_CHANGE))
return 1;
} break;
case MPP_VIDEO_CodingVP8 : {
} break;
case MPP_VIDEO_CodingMJPEG : {
} break;
default : {
} break;
}
return 0;
}
static RK_S32 check_rc_cfg_update(MpiCmd cmd, MppEncCfgSet *cfg) static RK_S32 check_rc_cfg_update(MpiCmd cmd, MppEncCfgSet *cfg)
{ {
if (cmd == MPP_ENC_SET_RC_CFG || if (cmd == MPP_ENC_SET_RC_CFG ||
@@ -403,11 +359,6 @@ static RK_S32 check_rc_cfg_update(MpiCmd cmd, MppEncCfgSet *cfg)
return 1; return 1;
} }
if (cmd == MPP_ENC_SET_CODEC_CFG) {
if (check_codec_to_rc_cfg_update(&cfg->codec))
return 1;
}
if (cmd == MPP_ENC_SET_CFG) { if (cmd == MPP_ENC_SET_CFG) {
RK_U32 change = cfg->prep.change; RK_U32 change = cfg->prep.change;
RK_U32 check_flag = MPP_ENC_PREP_CFG_CHANGE_INPUT | RK_U32 check_flag = MPP_ENC_PREP_CFG_CHANGE_INPUT |
@@ -417,17 +368,13 @@ static RK_S32 check_rc_cfg_update(MpiCmd cmd, MppEncCfgSet *cfg)
return 1; return 1;
change = cfg->rc.change; change = cfg->rc.change;
check_flag = MPP_ENC_RC_CFG_CHANGE_RC_MODE | check_flag = MPP_ENC_RC_CFG_CHANGE_ALL &
MPP_ENC_RC_CFG_CHANGE_BPS | (~MPP_ENC_RC_CFG_CHANGE_QUALITY |
MPP_ENC_RC_CFG_CHANGE_FPS_IN | MPP_ENC_RC_CFG_CHANGE_AQ_THRD_I |
MPP_ENC_RC_CFG_CHANGE_FPS_OUT | MPP_ENC_RC_CFG_CHANGE_AQ_THRD_P);
MPP_ENC_RC_CFG_CHANGE_GOP;
if (change & check_flag) if (change & check_flag)
return 1; return 1;
if (check_codec_to_rc_cfg_update(&cfg->codec))
return 1;
} }
return 0; return 0;
@@ -471,6 +418,137 @@ static RK_S32 check_low_delay_part_mode(MppEncImpl *enc)
return 1; return 1;
} }
MPP_RET mpp_enc_proc_rc_cfg(MppEncRcCfg *dst, MppEncRcCfg *src)
{
MPP_RET ret = MPP_OK;
RK_U32 change = src->change;
if (change) {
MppEncRcCfg bak = *dst;
if (change & MPP_ENC_RC_CFG_CHANGE_RC_MODE)
dst->rc_mode = src->rc_mode;
if (change & MPP_ENC_RC_CFG_CHANGE_QUALITY)
dst->quality = src->quality;
if (change & MPP_ENC_RC_CFG_CHANGE_BPS) {
dst->bps_target = src->bps_target;
dst->bps_max = src->bps_max;
dst->bps_min = src->bps_min;
}
if (change & MPP_ENC_RC_CFG_CHANGE_FPS_IN) {
dst->fps_in_flex = src->fps_in_flex;
dst->fps_in_num = src->fps_in_num;
dst->fps_in_denorm = src->fps_in_denorm;
}
if (change & MPP_ENC_RC_CFG_CHANGE_FPS_OUT) {
dst->fps_out_flex = src->fps_out_flex;
dst->fps_out_num = src->fps_out_num;
dst->fps_out_denorm = src->fps_out_denorm;
}
if (change & MPP_ENC_RC_CFG_CHANGE_GOP)
dst->gop = src->gop;
if (change & MPP_ENC_RC_CFG_CHANGE_MAX_REENC)
dst->max_reenc_times = src->max_reenc_times;
if (change & MPP_ENC_RC_CFG_CHANGE_DROP_FRM) {
dst->drop_mode = src->drop_mode;
dst->drop_threshold = src->drop_threshold;
dst->drop_gap = src->drop_gap;
}
if (change & MPP_ENC_RC_CFG_CHANGE_PRIORITY) {
if (src->rc_priority >= MPP_ENC_RC_PRIORITY_BUTT) {
mpp_err("invalid rc_priority %d should be[%d, %d] \n",
src->rc_priority, MPP_ENC_RC_BY_BITRATE_FIRST, MPP_ENC_RC_PRIORITY_BUTT);
ret = MPP_ERR_VALUE;
}
dst->rc_priority = src->rc_priority;
}
if (change & MPP_ENC_RC_CFG_CHANGE_SUPER_FRM) {
if (src->super_mode >= MPP_ENC_RC_SUPER_FRM_BUTT) {
mpp_err("invalid super_mode %d should be[%d, %d] \n",
src->super_mode, MPP_ENC_RC_SUPER_FRM_NONE, MPP_ENC_RC_SUPER_FRM_BUTT);
ret = MPP_ERR_VALUE;
}
dst->super_mode = src->super_mode;
dst->super_i_thd = src->super_i_thd;
dst->super_p_thd = src->super_p_thd;
}
if (change & MPP_ENC_RC_CFG_CHANGE_MAX_I_PROP)
dst->max_i_prop = src->max_i_prop;
if (change & MPP_ENC_RC_CFG_CHANGE_MIN_I_PROP)
dst->min_i_prop = src->min_i_prop;
if (change & MPP_ENC_RC_CFG_CHANGE_INIT_IP_RATIO)
dst->init_ip_ratio = src->init_ip_ratio;
if (change & MPP_ENC_RC_CFG_CHANGE_QP_INIT)
dst->qp_init = src->qp_init;
if (change & MPP_ENC_RC_CFG_CHANGE_QP_RANGE) {
dst->qp_min = src->qp_min;
dst->qp_max = src->qp_max;
}
if (change & MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I) {
dst->qp_min_i = src->qp_min_i;
dst->qp_max_i = src->qp_max_i;
}
if (change & MPP_ENC_RC_CFG_CHANGE_QP_MAX_STEP)
dst->qp_max_step = src->qp_max_step;
if (change & MPP_ENC_RC_CFG_CHANGE_QP_IP)
dst->qp_delta_ip = src->qp_delta_ip;
if (change & MPP_ENC_RC_CFG_CHANGE_QP_VI)
dst->qp_delta_vi = src->qp_delta_vi;
// parameter checking
if (dst->rc_mode >= MPP_ENC_RC_MODE_BUTT) {
mpp_err("invalid rc mode %d should be RC_MODE_VBR or RC_MODE_CBR\n",
src->rc_mode);
ret = MPP_ERR_VALUE;
}
if (dst->quality >= MPP_ENC_RC_QUALITY_BUTT) {
mpp_err("invalid quality %d should be from QUALITY_WORST to QUALITY_BEST\n",
dst->quality);
ret = MPP_ERR_VALUE;
}
if (dst->rc_mode != MPP_ENC_RC_MODE_FIXQP) {
if ((dst->bps_target >= 100 * SZ_1M || dst->bps_target <= 1 * SZ_1K) ||
(dst->bps_max >= 100 * SZ_1M || dst->bps_max <= 1 * SZ_1K) ||
(dst->bps_min >= 100 * SZ_1M || dst->bps_min <= 1 * SZ_1K)) {
mpp_err("invalid bit per second %d [%d:%d] out of range 1K~100M\n",
dst->bps_target, dst->bps_min, dst->bps_max);
ret = MPP_ERR_VALUE;
}
}
dst->change |= change;
if (ret) {
mpp_err_f("failed to accept new rc config\n");
*dst = bak;
} else {
mpp_log("MPP_ENC_SET_RC_CFG bps %d [%d : %d] fps [%d:%d] gop %d\n",
dst->bps_target, dst->bps_min, dst->bps_max,
dst->fps_in_num, dst->fps_out_num, dst->gop);
}
}
return ret;
}
MPP_RET mpp_enc_proc_hw_cfg(MppEncHwCfg *dst, MppEncHwCfg *src) MPP_RET mpp_enc_proc_hw_cfg(MppEncHwCfg *dst, MppEncHwCfg *src)
{ {
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
@@ -521,14 +599,26 @@ MPP_RET mpp_enc_proc_cfg(MppEncImpl *enc, MpiCmd cmd, void *param)
src->base.change = 0; src->base.change = 0;
} }
/* process rc cfg at mpp_enc module */
if (src->rc.change) {
ret = mpp_enc_proc_rc_cfg(&enc->cfg.rc, &src->rc);
src->rc.change = 0;
}
/* process hardware cfg at mpp_enc module */ /* process hardware cfg at mpp_enc module */
if (src->hw.change) { if (src->hw.change) {
ret = mpp_enc_proc_hw_cfg(&enc->cfg.hw, &src->hw); ret = mpp_enc_proc_hw_cfg(&enc->cfg.hw, &src->hw);
src->hw.change = 0; src->hw.change = 0;
} }
/* Then process the rest config */
ret = enc_impl_proc_cfg(enc->impl, cmd, param); ret = enc_impl_proc_cfg(enc->impl, cmd, param);
} break; } break;
case MPP_ENC_SET_RC_CFG : {
MppEncRcCfg *src = (MppEncRcCfg *)param;
if (src)
ret = mpp_enc_proc_rc_cfg(&enc->cfg.rc, src);
} break;
case MPP_ENC_GET_HDR_SYNC : case MPP_ENC_GET_HDR_SYNC :
case MPP_ENC_GET_EXTRA_INFO : { case MPP_ENC_GET_EXTRA_INFO : {
/* /*
@@ -814,34 +904,16 @@ static void set_rc_cfg(RcCfg *cfg, MppEncCfgSet *cfg_set)
/* quality configure */ /* quality configure */
switch (codec->coding) { switch (codec->coding) {
case MPP_VIDEO_CodingAVC : { case MPP_VIDEO_CodingAVC :
MppEncH264Cfg *h264 = &codec->h264; case MPP_VIDEO_CodingHEVC :
cfg->init_quality = h264->qp_init;
cfg->max_quality = h264->qp_max;
cfg->min_quality = h264->qp_min;
cfg->max_i_quality = h264->qp_max_i ? h264->qp_max_i : h264->qp_max;
cfg->min_i_quality = h264->qp_min_i ? h264->qp_min_i : h264->qp_min;
cfg->i_quality_delta = h264->qp_delta_ip;
} break;
case MPP_VIDEO_CodingHEVC : {
MppEncH265Cfg *h265 = &codec->h265;
cfg->init_quality = h265->qp_init;
cfg->max_quality = h265->max_qp;
cfg->min_quality = h265->min_qp;
cfg->max_i_quality = h265->max_i_qp;
cfg->min_i_quality = h265->min_i_qp;
cfg->i_quality_delta = h265->ip_qp_delta;
} break;
case MPP_VIDEO_CodingVP8 : { case MPP_VIDEO_CodingVP8 : {
MppEncVp8Cfg *vp8 = &codec->vp8; cfg->init_quality = rc->qp_init;
cfg->max_quality = rc->qp_max;
cfg->init_quality = vp8->qp_init; cfg->min_quality = rc->qp_min;
cfg->max_quality = vp8->qp_max; cfg->max_i_quality = rc->qp_max_i ? rc->qp_max_i : rc->qp_max;
cfg->min_quality = vp8->qp_min; cfg->min_i_quality = rc->qp_min_i ? rc->qp_min_i : rc->qp_min;
cfg->max_i_quality = vp8->qp_max_i ? vp8->qp_max_i : vp8->qp_max; cfg->i_quality_delta = rc->qp_delta_ip;
cfg->min_i_quality = vp8->qp_min_i ? vp8->qp_min_i : vp8->qp_min; cfg->vi_quality_delta = rc->qp_delta_vi;
} break; } break;
case MPP_VIDEO_CodingMJPEG : { case MPP_VIDEO_CodingMJPEG : {
MppEncJpegCfg *jpeg = &codec->jpeg; MppEncJpegCfg *jpeg = &codec->jpeg;

View File

@@ -1368,12 +1368,6 @@ static MPP_RET vepu22_check_code_cfg_change(HalH265eCtx* ctx, MppEncH265Cfg* set
cfg->intra_qp = set->intra_qp; cfg->intra_qp = set->intra_qp;
} }
if (set->change & MPP_ENC_H265_CFG_RC_QP_CHANGE) {
cfg->max_qp = set->max_qp;
cfg->min_qp = set->min_qp;
cfg->max_delta_qp = set->max_delta_qp;
}
if (set->change & MPP_ENC_H265_CFG_INTRA_REFRESH_CHANGE) { if (set->change & MPP_ENC_H265_CFG_INTRA_REFRESH_CHANGE) {
cfg->intra_refresh_mode = set->intra_refresh_mode; cfg->intra_refresh_mode = set->intra_refresh_mode;
cfg->intra_refresh_arg = set->intra_refresh_arg; cfg->intra_refresh_arg = set->intra_refresh_arg;

View File

@@ -403,41 +403,6 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
rc_cfg->gop = p->gop; rc_cfg->gop = p->gop;
rc_cfg->max_reenc_times = 1; rc_cfg->max_reenc_times = 1;
mpp_log("mpi_enc_test bps %d fps %d gop %d\n",
rc_cfg->bps_target, rc_cfg->fps_out_num, rc_cfg->gop);
ret = mpi->control(ctx, MPP_ENC_SET_RC_CFG, rc_cfg);
if (ret) {
mpp_err("mpi control enc set rc cfg failed ret %d\n", ret);
goto RET;
}
codec_cfg->coding = p->type;
switch (codec_cfg->coding) {
case MPP_VIDEO_CodingAVC : {
codec_cfg->h264.change = MPP_ENC_H264_CFG_CHANGE_PROFILE |
MPP_ENC_H264_CFG_CHANGE_ENTROPY |
MPP_ENC_H264_CFG_CHANGE_TRANS_8x8 |
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT;
/*
* H.264 profile_idc parameter
* 66 - Baseline profile
* 77 - Main profile
* 100 - High profile
*/
codec_cfg->h264.profile = 100;
/*
* H.264 level_idc parameter
* 10 / 11 / 12 / 13 - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps
* 20 / 21 / 22 - cif@30fps / half-D1@@25fps / D1@12.5fps
* 30 / 31 / 32 - D1@25fps / 720p@30fps / 720p@60fps
* 40 / 41 / 42 - 1080p@30fps / 1080p@30fps / 1080p@60fps
* 50 / 51 / 52 - 4K@30fps
*/
codec_cfg->h264.level = 40;
codec_cfg->h264.entropy_coding_mode = 1;
codec_cfg->h264.cabac_init_idc = 0;
codec_cfg->h264.transform8x8_mode = 1;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) { if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
/* constant QP mode qp is fixed */ /* constant QP mode qp is fixed */
p->qp_max = p->qp_init; p->qp_max = p->qp_init;
@@ -457,9 +422,48 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
p->qp_init = 0; p->qp_init = 0;
} }
codec_cfg->h264.qp_max = p->qp_max; rc_cfg->qp_max = p->qp_max;
codec_cfg->h264.qp_min = p->qp_min; rc_cfg->qp_min = p->qp_min;
codec_cfg->h264.qp_init = p->qp_init; rc_cfg->qp_max_i = p->qp_max;
rc_cfg->qp_min_i = p->qp_min;
rc_cfg->qp_init = p->qp_init;
rc_cfg->qp_max_step = p->qp_step;
rc_cfg->qp_delta_ip = 4;
rc_cfg->qp_delta_vi = 2;
mpp_log("mpi_enc_test bps %d fps %d gop %d\n",
rc_cfg->bps_target, rc_cfg->fps_out_num, rc_cfg->gop);
ret = mpi->control(ctx, MPP_ENC_SET_RC_CFG, rc_cfg);
if (ret) {
mpp_err("mpi control enc set rc cfg failed ret %d\n", ret);
goto RET;
}
codec_cfg->coding = p->type;
switch (codec_cfg->coding) {
case MPP_VIDEO_CodingAVC : {
codec_cfg->h264.change = MPP_ENC_H264_CFG_CHANGE_PROFILE |
MPP_ENC_H264_CFG_CHANGE_ENTROPY |
MPP_ENC_H264_CFG_CHANGE_TRANS_8x8;
/*
* H.264 profile_idc parameter
* 66 - Baseline profile
* 77 - Main profile
* 100 - High profile
*/
codec_cfg->h264.profile = 100;
/*
* H.264 level_idc parameter
* 10 / 11 / 12 / 13 - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps
* 20 / 21 / 22 - cif@30fps / half-D1@@25fps / D1@12.5fps
* 30 / 31 / 32 - D1@25fps / 720p@30fps / 720p@60fps
* 40 / 41 / 42 - 1080p@30fps / 1080p@30fps / 1080p@60fps
* 50 / 51 / 52 - 4K@30fps
*/
codec_cfg->h264.level = 40;
codec_cfg->h264.entropy_coding_mode = 1;
codec_cfg->h264.cabac_init_idc = 0;
codec_cfg->h264.transform8x8_mode = 1;
} break; } break;
case MPP_VIDEO_CodingMJPEG : { case MPP_VIDEO_CodingMJPEG : {
codec_cfg->jpeg.change = MPP_ENC_JPEG_CFG_CHANGE_QFACTOR; codec_cfg->jpeg.change = MPP_ENC_JPEG_CFG_CHANGE_QFACTOR;
@@ -467,14 +471,7 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
codec_cfg->jpeg.qf_min = 1; codec_cfg->jpeg.qf_min = 1;
codec_cfg->jpeg.qf_max = 99; codec_cfg->jpeg.qf_max = 99;
} break; } break;
case MPP_VIDEO_CodingHEVC : { case MPP_VIDEO_CodingHEVC :
codec_cfg->h265.change = MPP_ENC_H265_CFG_INTRA_QP_CHANGE | MPP_ENC_H265_CFG_RC_QP_CHANGE;
codec_cfg->h265.qp_init = -1;
codec_cfg->h265.max_i_qp = 46;
codec_cfg->h265.min_i_qp = 24;
codec_cfg->h265.max_qp = 51;
codec_cfg->h265.min_qp = 10;
} break;
case MPP_VIDEO_CodingVP8 : case MPP_VIDEO_CodingVP8 :
default : { default : {
mpp_err_f("support encoder coding type %d\n", codec_cfg->coding); mpp_err_f("support encoder coding type %d\n", codec_cfg->coding);

View File

@@ -270,7 +270,6 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
if (!p->bps) if (!p->bps)
p->bps = p->width * p->height / 8 * (p->fps_out_num / p->fps_out_den); p->bps = p->width * p->height / 8 * (p->fps_out_num / p->fps_out_den);
mpp_enc_cfg_set_s32(cfg, "prep:width", p->width); mpp_enc_cfg_set_s32(cfg, "prep:width", p->width);
mpp_enc_cfg_set_s32(cfg, "prep:height", p->height); mpp_enc_cfg_set_s32(cfg, "prep:height", p->height);
mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", p->hor_stride); mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", p->hor_stride);
@@ -279,27 +278,6 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
mpp_enc_cfg_set_s32(cfg, "rc:mode", p->rc_mode); mpp_enc_cfg_set_s32(cfg, "rc:mode", p->rc_mode);
switch (p->rc_mode) {
case MPP_ENC_RC_MODE_FIXQP : {
/* do not set bps on fix qp mode */
} break;
case MPP_ENC_RC_MODE_CBR : {
/* CBR mode has narrow bound */
mpp_enc_cfg_set_s32(cfg, "rc:bps_target", p->bps);
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16);
} break;
case MPP_ENC_RC_MODE_VBR : {
/* CBR mode has wide bound */
mpp_enc_cfg_set_s32(cfg, "rc:bps_target", p->bps);
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 1 / 16);
} break;
default : {
mpp_err_f("unsupport encoder rc mode %d\n", p->rc_mode);
} break;
}
/* fix input / output frame rate */ /* fix input / output frame rate */
mpp_enc_cfg_set_s32(cfg, "rc:fps_in_flex", p->fps_in_flex); mpp_enc_cfg_set_s32(cfg, "rc:fps_in_flex", p->fps_in_flex);
mpp_enc_cfg_set_s32(cfg, "rc:fps_in_num", p->fps_in_num); mpp_enc_cfg_set_s32(cfg, "rc:fps_in_num", p->fps_in_num);
@@ -314,6 +292,77 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
mpp_enc_cfg_set_u32(cfg, "rc:drop_thd", 20); /* 20% of max bps */ mpp_enc_cfg_set_u32(cfg, "rc:drop_thd", 20); /* 20% of max bps */
mpp_enc_cfg_set_u32(cfg, "rc:drop_gap", 1); /* Do not continuous drop frame */ mpp_enc_cfg_set_u32(cfg, "rc:drop_gap", 1); /* Do not continuous drop frame */
/* setup bitrate for different rc_mode */
mpp_enc_cfg_set_s32(cfg, "rc:bps_target", p->bps);
switch (p->rc_mode) {
case MPP_ENC_RC_MODE_FIXQP : {
/* do not setup bitrate on FIXQP mode */
} break;
case MPP_ENC_RC_MODE_CBR : {
/* CBR mode has narrow bound */
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16);
} break;
case MPP_ENC_RC_MODE_VBR :
case MPP_ENC_RC_MODE_AVBR : {
/* VBR mode has wide bound */
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 1 / 16);
} break;
default : {
/* default use CBR mode */
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16);
} break;
}
/* setup qp for different codec and rc_mode */
switch (p->type) {
case MPP_VIDEO_CodingAVC :
case MPP_VIDEO_CodingHEVC : {
switch (p->rc_mode) {
case MPP_ENC_RC_MODE_FIXQP : {
mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 20);
mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 20);
mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 20);
mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 20);
mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 20);
mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 4);
} break;
case MPP_ENC_RC_MODE_CBR :
case MPP_ENC_RC_MODE_VBR :
case MPP_ENC_RC_MODE_AVBR : {
mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 26);
mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 51);
mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 10);
mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 51);
mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 10);
mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 4);
} break;
default : {
mpp_err_f("unsupport encoder rc mode %d\n", p->rc_mode);
} break;
}
} break;
case MPP_VIDEO_CodingVP8 : {
/* vp8 only setup base qp range */
mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 40);
mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 127);
mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 0);
mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 127);
mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 0);
mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 6);
} break;
case MPP_VIDEO_CodingMJPEG : {
/* jpeg use special codec config to control qtable */
mpp_enc_cfg_set_s32(cfg, "jpeg:q_factor", 80);
mpp_enc_cfg_set_s32(cfg, "jpeg:qf_max", 99);
mpp_enc_cfg_set_s32(cfg, "jpeg:qf_min", 1);
} break;
default : {
} break;
}
/* setup codec */ /* setup codec */
mpp_enc_cfg_set_s32(cfg, "codec:type", p->type); mpp_enc_cfg_set_s32(cfg, "codec:type", p->type);
switch (p->type) { switch (p->type) {
@@ -337,40 +386,10 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
mpp_enc_cfg_set_s32(cfg, "h264:cabac_en", 1); mpp_enc_cfg_set_s32(cfg, "h264:cabac_en", 1);
mpp_enc_cfg_set_s32(cfg, "h264:cabac_idc", 0); mpp_enc_cfg_set_s32(cfg, "h264:cabac_idc", 0);
mpp_enc_cfg_set_s32(cfg, "h264:trans8x8", 1); mpp_enc_cfg_set_s32(cfg, "h264:trans8x8", 1);
if (p->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
mpp_enc_cfg_set_s32(cfg, "h264:qp_init", 20);
mpp_enc_cfg_set_s32(cfg, "h264:qp_max", 16);
mpp_enc_cfg_set_s32(cfg, "h264:qp_min", 16);
mpp_enc_cfg_set_s32(cfg, "h264:qp_max_i", 20);
mpp_enc_cfg_set_s32(cfg, "h264:qp_min_i", 20);
} else {
mpp_enc_cfg_set_s32(cfg, "h264:qp_init", 26);
mpp_enc_cfg_set_s32(cfg, "h264:qp_max", 51);
mpp_enc_cfg_set_s32(cfg, "h264:qp_min", 10);
mpp_enc_cfg_set_s32(cfg, "h264:qp_max_i", 51);
mpp_enc_cfg_set_s32(cfg, "h264:qp_min_i", 10);
}
mpp_enc_cfg_set_s32(cfg, "h264:qp_delta_ip", 4);
} break;
case MPP_VIDEO_CodingMJPEG : {
mpp_enc_cfg_set_s32(cfg, "jpeg:q_factor", 80);
mpp_enc_cfg_set_s32(cfg, "jpeg:qf_max", 99);
mpp_enc_cfg_set_s32(cfg, "jpeg:qf_min", 1);
} break; } break;
case MPP_VIDEO_CodingHEVC :
case MPP_VIDEO_CodingMJPEG :
case MPP_VIDEO_CodingVP8 : { case MPP_VIDEO_CodingVP8 : {
mpp_enc_cfg_set_s32(cfg, "vp8:qp_init", 40);
mpp_enc_cfg_set_s32(cfg, "vp8:qp_max", 127);
mpp_enc_cfg_set_s32(cfg, "vp8:qp_min", 0);
mpp_enc_cfg_set_s32(cfg, "vp8:qp_max_i", 127);
mpp_enc_cfg_set_s32(cfg, "vp8:qp_min_i", 0);
} break;
case MPP_VIDEO_CodingHEVC : {
mpp_enc_cfg_set_s32(cfg, "h265:qp_init", p->rc_mode == MPP_ENC_RC_MODE_FIXQP ? -1 : 26);
mpp_enc_cfg_set_s32(cfg, "h265:qp_max", 51);
mpp_enc_cfg_set_s32(cfg, "h265:qp_min", 10);
mpp_enc_cfg_set_s32(cfg, "h265:qp_max_i", 46);
mpp_enc_cfg_set_s32(cfg, "h265:qp_min_i", 24);
} break; } break;
default : { default : {
mpp_err_f("unsupport encoder coding type %d\n", p->type); mpp_err_f("unsupport encoder coding type %d\n", p->type);
@@ -689,7 +708,7 @@ MPP_RET test_mpp_run(MpiEncTestData *p)
} }
log_len += snprintf(log_buf + log_len, log_size - log_len, log_len += snprintf(log_buf + log_len, log_size - log_len,
" size %-7d", len); " size %-7u", len);
if (mpp_packet_has_meta(packet)) { if (mpp_packet_has_meta(packet)) {
meta = mpp_packet_get_meta(packet); meta = mpp_packet_get_meta(packet);

View File

@@ -558,6 +558,12 @@ static MPP_RET mpi_rc_enc_init(MpiRc2TestCtx *ctx)
rc_cfg->fps_out_flex = 0; rc_cfg->fps_out_flex = 0;
rc_cfg->gop = 60; rc_cfg->gop = 60;
rc_cfg->max_reenc_times = 1; rc_cfg->max_reenc_times = 1;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
/* constant QP mode qp is fixed */
rc_cfg->qp_max = 26;
rc_cfg->qp_min = 26;
rc_cfg->qp_init = 26;
}
ret = enc_mpi->control(*enc_ctx, MPP_ENC_SET_RC_CFG, rc_cfg); ret = enc_mpi->control(*enc_ctx, MPP_ENC_SET_RC_CFG, rc_cfg);
if (ret) { if (ret) {
@@ -587,14 +593,6 @@ static MPP_RET mpi_rc_enc_init(MpiRc2TestCtx *ctx)
codec_cfg->h264.entropy_coding_mode = 1; codec_cfg->h264.entropy_coding_mode = 1;
codec_cfg->h264.cabac_init_idc = 0; codec_cfg->h264.cabac_init_idc = 0;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
/* constant QP mode qp is fixed */
codec_cfg->h264.qp_max = 26;
codec_cfg->h264.qp_min = 26;
codec_cfg->h264.qp_init = 26;
codec_cfg->h264.change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT;
}
ret = enc_mpi->control(*enc_ctx, MPP_ENC_SET_CODEC_CFG, codec_cfg); ret = enc_mpi->control(*enc_ctx, MPP_ENC_SET_CODEC_CFG, codec_cfg);
if (ret) { if (ret) {
mpp_err("mpi control enc set codec cfg failed ret %d\n", ret); mpp_err("mpi control enc set codec cfg failed ret %d\n", ret);

View File

@@ -595,6 +595,21 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
rc_cfg->fps_out_flex = 0; rc_cfg->fps_out_flex = 0;
rc_cfg->gop = fps; rc_cfg->gop = fps;
rc_cfg->max_reenc_times = 1; rc_cfg->max_reenc_times = 1;
rc_cfg->qp_init = -1;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
/* constant QP mode qp is fixed */
rc_cfg->qp_init = 26;
rc_cfg->qp_max = 26;
rc_cfg->qp_min = 26;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
/* constant bitrate do not limit qp range */
rc_cfg->qp_max = 48;
rc_cfg->qp_min = 4;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
/* variable bitrate has qp min limit */
rc_cfg->qp_max = 40;
rc_cfg->qp_min = 12;
}
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_RC_CFG, rc_cfg); ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_RC_CFG, rc_cfg);
if (ret) { if (ret) {
@@ -618,8 +633,7 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
codec_cfg->coding = type; codec_cfg->coding = type;
codec_cfg->h264.change = MPP_ENC_H264_CFG_CHANGE_PROFILE | codec_cfg->h264.change = MPP_ENC_H264_CFG_CHANGE_PROFILE |
MPP_ENC_H264_CFG_CHANGE_ENTROPY | MPP_ENC_H264_CFG_CHANGE_ENTROPY;
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT;
/* /*
* H.264 profile_idc parameter * H.264 profile_idc parameter
* 66 - Baseline profile * 66 - Baseline profile
@@ -639,21 +653,6 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
codec_cfg->h264.entropy_coding_mode = 1; codec_cfg->h264.entropy_coding_mode = 1;
codec_cfg->h264.cabac_init_idc = 0; codec_cfg->h264.cabac_init_idc = 0;
codec_cfg->h264.qp_init = 0;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
/* constant QP mode qp is fixed */
codec_cfg->h264.qp_init = 26;
codec_cfg->h264.qp_max = 26;
codec_cfg->h264.qp_min = 26;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
/* constant bitrate do not limit qp range */
codec_cfg->h264.qp_max = 48;
codec_cfg->h264.qp_min = 4;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
/* variable bitrate has qp min limit */
codec_cfg->h264.qp_max = 40;
codec_cfg->h264.qp_min = 12;
}
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_CODEC_CFG, codec_cfg); ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_CODEC_CFG, codec_cfg);
if (ret) { if (ret) {
mpp_err("mpi control enc set codec cfg failed ret %d\n", ret); mpp_err("mpi control enc set codec cfg failed ret %d\n", ret);