diff --git a/mpp/codec/rc/rc_model_v2.c b/mpp/codec/rc/rc_model_v2.c index ebf6c5ec..84bc8587 100644 --- a/mpp/codec/rc/rc_model_v2.c +++ b/mpp/codec/rc/rc_model_v2.c @@ -890,6 +890,7 @@ MPP_RET rc_model_v2_hal_start(void *ctx, EncRcTask *task) RcModelV2Ctx *p = (RcModelV2Ctx *)ctx; EncFrmStatus *frm = &task->frm; EncRcTaskInfo *info = &task->info; + EncRcForceCfg *force = &task->force; RK_S32 mb_w = MPP_ALIGN(p->usr_cfg.width, 16) / 16; RK_S32 mb_h = MPP_ALIGN(p->usr_cfg.height, 16) / 16; RK_S32 bit_min = info->bit_min; @@ -899,13 +900,21 @@ MPP_RET rc_model_v2_hal_start(void *ctx, EncRcTask *task) RK_S32 quality_max = info->quality_max; RK_S32 quality_target = info->quality_target; - if (p->usr_cfg.mode == RC_FIXQP) { - return MPP_OK; - } rc_dbg_func("enter p %p task %p\n", p, task); rc_dbg_rc("seq_idx %d intra %d\n", frm->seq_idx, frm->is_intra); + if (force->force_flag & ENC_RC_FORCE_QP) { + RK_S32 qp = force->force_qp; + info->quality_target = qp; + info->quality_max = qp; + info->quality_min = qp; + return MPP_OK; + } + + if (p->usr_cfg.mode == RC_FIXQP) + return MPP_OK; + /* setup quality parameters */ if (p->first_frm_flg && frm->is_intra) { RK_S32 dealt_qp = p->usr_cfg.i_quality_delta; @@ -974,7 +983,8 @@ MPP_RET rc_model_v2_hal_start(void *ctx, EncRcTask *task) } rc_dbg_rc("i_quality_delta %d, vi_quality_delta %d", dealt_qp, p->usr_cfg.vi_quality_delta); } - p->start_qp = mpp_clip( p->start_qp, info->quality_min, info->quality_max); + + p->start_qp = mpp_clip(p->start_qp, info->quality_min, info->quality_max); info->quality_target = p->start_qp; rc_dbg_rc("bitrate [%d : %d : %d] -> [%d : %d : %d]\n",