[h265e]: Add fixqp flow

Move fixqp mode from VBR+CQP to rc_mode FIXQP.

Change-Id: Ia29471ecd81bb1a4759f6e6f1d7e37515341eb8c
Signed-off-by: sayon.chen <sayon.chen@rock-chips.com>
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
sayon.chen
2020-01-19 14:39:05 +08:00
committed by Herman Chen
parent 9b1242436c
commit caee16c968
15 changed files with 92 additions and 90 deletions

View File

@@ -210,8 +210,7 @@ static MPP_RET h264e_config(void *ctx, MpiCmd cmd, void *param)
rc->quality);
ret = MPP_ERR_VALUE;
}
if (rc->rc_mode != MPP_ENC_RC_MODE_VBR ||
rc->quality != MPP_ENC_RC_QUALITY_CQP) {
if (rc->rc_mode != MPP_ENC_RC_MODE_FIXQP) {
if ((rc->bps_target >= 100 * SZ_1M || rc->bps_target <= 1 * SZ_1K) ||
(rc->bps_max >= 100 * SZ_1M || rc->bps_max <= 1 * SZ_1K) ||
(rc->bps_min >= 100 * SZ_1M || rc->bps_min <= 1 * SZ_1K)) {

View File

@@ -309,8 +309,7 @@ static MPP_RET h264e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
dst->quality);
ret = MPP_ERR_VALUE;
}
if (dst->rc_mode != MPP_ENC_RC_MODE_VBR ||
dst->quality != MPP_ENC_RC_QUALITY_CQP) {
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)) {

View File

@@ -168,7 +168,8 @@ static MPP_RET h265e_deinit(void *ctx)
return MPP_ERR_NULL_PTR;
}
rc_deinit(p->rc_ctx);
if (p->rc_ctx)
rc_deinit(p->rc_ctx);
h265e_deinit_extra_info(p->extra_info);
@@ -207,6 +208,9 @@ static void h265_set_rc_cfg(RcCfg *cfg, MppEncRcCfg *rc, MppEncGopRef *ref)
case MPP_ENC_RC_MODE_VBR : {
cfg->mode = RC_VBR;
} break;
case MPP_ENC_RC_MODE_FIXQP: {
cfg->mode = RC_FIXQP;
} break;
default : {
cfg->mode = RC_AVBR;
} break;
@@ -369,7 +373,7 @@ static MPP_RET h265e_proc_rc(void *ctx, HalEncTask *task)
MppEncRcCfg *rc = &p->cfg->rc;
h265e_dbg_func("enter\n");
if (!p->rc_ready) {
if (!p->rc_ready && rc->rc_mode != MPP_ENC_RC_MODE_FIXQP) {
mpp_err_f("not initialize encoding\n");
return MPP_NOK;
}
@@ -593,8 +597,7 @@ static MPP_RET h265e_proc_cfg(void *ctx, MpiCmd cmd, void *param)
dst->quality);
ret = MPP_ERR_VALUE;
}
if (dst->rc_mode != MPP_ENC_RC_MODE_VBR ||
dst->quality != MPP_ENC_RC_QUALITY_CQP) {
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)) {

View File

@@ -49,6 +49,7 @@ typedef enum RcMode_e {
RC_AVBR,
RC_CVBR,
RC_QVBR,
RC_FIXQP,
RC_LEARNING,
RC_MODE_BUTT,
} RcMode;

View File

@@ -604,12 +604,17 @@ MPP_RET mpp_enc_control(MppEnc ctx, MpiCmd cmd, void *param)
switch (cmd) {
case MPP_ENC_SET_ALL_CFG : {
MppEncRcCfg *rc = &enc->set.rc;
enc_dbg_ctrl("set all config\n");
memcpy(&enc->set, param, sizeof(enc->set));
ret = enc_impl_proc_cfg(enc->impl, MPP_ENC_SET_RC_CFG, param);
if (rc->rc_mode == MPP_ENC_RC_MODE_VBR && rc->quality == MPP_ENC_RC_QUALITY_CQP)
rc->rc_mode = MPP_ENC_RC_MODE_FIXQP;
ret = enc_impl_proc_cfg(enc->impl, MPP_ENC_SET_RC_CFG, rc);
if (!ret)
ret = mpp_hal_control(enc->hal, MPP_ENC_SET_RC_CFG, &enc->set.rc);
ret = mpp_hal_control(enc->hal, MPP_ENC_SET_RC_CFG, rc);
if (!ret)
mpp_enc_update_rc_cfg(&enc->cfg.rc, &enc->set.rc);
@@ -641,12 +646,17 @@ MPP_RET mpp_enc_control(MppEnc ctx, MpiCmd cmd, void *param)
memcpy(p, &enc->cfg.prep, sizeof(*p));
} break;
case MPP_ENC_SET_RC_CFG : {
enc_dbg_ctrl("set rc config\n");
memcpy(&enc->set.rc, param, sizeof(enc->set.rc));
MppEncRcCfg *rc = &enc->set.rc;
ret = enc_impl_proc_cfg(enc->impl, cmd, param);
enc_dbg_ctrl("set rc config\n");
memcpy(rc, param, sizeof(*rc));
if (rc->rc_mode == MPP_ENC_RC_MODE_VBR && rc->quality == MPP_ENC_RC_QUALITY_CQP)
rc->rc_mode = MPP_ENC_RC_MODE_FIXQP;
ret = enc_impl_proc_cfg(enc->impl, cmd, rc);
if (!ret)
ret = mpp_hal_control(enc->hal, cmd, param);
ret = mpp_hal_control(enc->hal, cmd, rc);
if (!ret)
mpp_enc_update_rc_cfg(&enc->cfg.rc, &enc->set.rc);

View File

@@ -686,7 +686,7 @@ MPP_RET rc_model_v2_start(void *ctx, RcHalCfg *cfg, EncFrmStatus *frm)
cfg->need_reenc = 0;
if (frm->reencode) {
if (frm->reencode || p->usr_cfg.mode == RC_FIXQP) {
return MPP_OK;
}
if (frm->is_intra) {
@@ -722,6 +722,9 @@ MPP_RET rc_model_v2_end(void *ctx, RcHalCfg *cfg)
RcModelV2Ctx *p = (RcModelV2Ctx *)ctx;
rc_dbg_func("enter ctx %p cfg %p\n", ctx, cfg);
if (p->usr_cfg.mode == RC_FIXQP) {
return MPP_OK;
}
if (check_re_enc(p, cfg)) {
if (p->usr_cfg.mode == RC_CBR) {

View File

@@ -500,7 +500,7 @@ static void h264e_rkv_set_mb_rc(H264eHalContext *ctx)
q = rc->quality;
if (q == MPP_ENC_RC_QUALITY_AQ_ONLY) {
m = RKVE_MB_RC_ONLY_AQ;
} else if (q != MPP_ENC_RC_QUALITY_CQP) {
} else {
/* better quality for intra frame */
if (hw->frame_type == H264E_RKV_FRAME_I)
q++;
@@ -543,7 +543,10 @@ static MPP_RET h264e_rkv_set_rc_regs(H264eHalContext *ctx, H264eRkvRegSet *regs,
}
/* (VBR) if focus on quality, qp range is limited more precisely */
if (rc->rc_mode == MPP_ENC_RC_MODE_VBR) {
if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
syn->qp_min = syn->qp;
syn->qp_max = syn->qp;
} else if (rc->rc_mode == MPP_ENC_RC_MODE_VBR) {
if (rc->quality == MPP_ENC_RC_QUALITY_AQ_ONLY) {
m_cfg = mb_rc_m_cfg[mb_rc->mode];
syn->qp = ctx->hw_cfg.qp_prev;
@@ -554,9 +557,6 @@ static MPP_RET h264e_rkv_set_rc_regs(H264eHalContext *ctx, H264eRkvRegSet *regs,
syn->qp_min = 24;
}
}
} else if (rc->quality == MPP_ENC_RC_QUALITY_CQP) {
syn->qp_min = syn->qp;
syn->qp_max = syn->qp;
} else {
H264eRkvMbRcQcfg q_cfg = mb_rc_q_cfg[mb_rc->quality];
syn->qp_min = q_cfg.qp_min;
@@ -941,8 +941,7 @@ h264e_rkv_update_hw_cfg(H264eHalContext *ctx, HalEncTask *task,
/* frame type and rate control setup */
{
RK_S32 prev_frame_type = hw_cfg->frame_type;
RK_S32 is_cqp = rc->rc_mode == MPP_ENC_RC_MODE_VBR &&
rc->quality == MPP_ENC_RC_QUALITY_CQP;
RK_S32 is_cqp = rc->rc_mode == MPP_ENC_RC_MODE_FIXQP;
if (rc_syn->type == INTRA_FRAME && rc_syn->gop_mode != MPP_GOP_ALL_INTRA) {
hw_cfg->frame_type = H264E_RKV_FRAME_I;

View File

@@ -384,8 +384,7 @@ MPP_RET h264e_vpu_update_hw_cfg(H264eHalContext *ctx, HalEncTask *task,
hw_cfg->qp_min = codec->qp_min;
hw_cfg->qp_max = codec->qp_max;
if (rc->rc_mode == MPP_ENC_RC_MODE_VBR &&
rc->quality == MPP_ENC_RC_QUALITY_CQP) {
if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
hw_cfg->qp = codec->qp_init;
} else {
/* enable mb rate control*/

View File

@@ -548,8 +548,7 @@ MPP_RET h264e_vepu_mbrc_setup(HalH264eVepuMbRcCtx ctx, MppEncCfgSet*cfg)
p->fps_count = p->fps_threshold;
// if not constant
p->mb_bit_rc_enable = !(rc->rc_mode == MPP_ENC_RC_MODE_VBR &&
rc->quality == MPP_ENC_RC_QUALITY_CQP);
p->mb_bit_rc_enable = rc->rc_mode != MPP_ENC_RC_MODE_FIXQP;
// init first frame QP
if (p->bits_per_pic > 1000000)

View File

@@ -1302,18 +1302,17 @@ static MPP_RET vepu22_set_rc_cfg(HalH265eCtx* ctx)
hal_h265e_dbg_input("rc change = 0x%x\n", change);
cfg->rc_enable = 0;
switch (rc->rc_mode) {
case MPP_ENC_RC_MODE_FIXQP:
cfg->rc_enable = 0;
cfg->bit_rate = 0;
cfg->trans_rate = 0;
break;
case MPP_ENC_RC_MODE_VBR:
// if rc_mode is VBR and quality == MPP_ENC_RC_QUALITY_CQP, this mode is const QP
if (rc->quality == MPP_ENC_RC_QUALITY_CQP) {
cfg->rc_enable = 0; // fix qp
cfg->bit_rate = 0;
cfg->trans_rate = 0;
} else {
cfg->rc_enable = 1;
cfg->bit_rate = rc->bps_target;
// set trans_rate larger than bit_rate
cfg->trans_rate = cfg->bit_rate + 10000;
}
cfg->rc_enable = 1;
cfg->bit_rate = rc->bps_target;
// set trans_rate larger than bit_rate
cfg->trans_rate = cfg->bit_rate + 10000;
break;
case MPP_ENC_RC_MODE_CBR:
cfg->rc_enable = 1;

View File

@@ -141,8 +141,8 @@ static MPP_RET vpu_api_set_enc_cfg(MppCtx mpp_ctx, MppApi *mpi,
rc_cfg->change = MPP_ENC_RC_CFG_CHANGE_ALL;
if (rc_mode == 0) {
/* 0 - constant qp mode: fixed qp */
rc_cfg->rc_mode = MPP_ENC_RC_MODE_VBR;
rc_cfg->quality = MPP_ENC_RC_QUALITY_CQP;
rc_cfg->rc_mode = MPP_ENC_RC_MODE_FIXQP;
rc_cfg->quality = MPP_ENC_RC_QUALITY_MEDIUM;
rc_cfg->bps_target = -1;
rc_cfg->bps_max = -1;
rc_cfg->bps_min = -1;

View File

@@ -411,23 +411,21 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
rc_cfg->rc_mode = MPP_ENC_RC_MODE_CBR;
rc_cfg->quality = MPP_ENC_RC_QUALITY_MEDIUM;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
/* constant QP does not have bps */
rc_cfg->bps_target = -1;
rc_cfg->bps_max = -1;
rc_cfg->bps_min = -1;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
/* constant bitrate has very small bps range of 1/16 bps */
rc_cfg->bps_target = p->bps;
rc_cfg->bps_max = p->bps * 17 / 16;
rc_cfg->bps_min = p->bps * 15 / 16;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
if (rc_cfg->quality == MPP_ENC_RC_QUALITY_CQP) {
/* constant QP does not have bps */
rc_cfg->bps_target = -1;
rc_cfg->bps_max = -1;
rc_cfg->bps_min = -1;
} else {
/* variable bitrate has large bps range */
rc_cfg->bps_target = p->bps;
rc_cfg->bps_max = p->bps * 17 / 16;
rc_cfg->bps_min = p->bps * 1 / 16;
}
/* variable bitrate has large bps range */
rc_cfg->bps_target = p->bps;
rc_cfg->bps_max = p->bps * 17 / 16;
rc_cfg->bps_min = p->bps * 1 / 16;
}
/* fix input / output frame rate */
@@ -476,25 +474,23 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
codec_cfg->h264.cabac_init_idc = 0;
codec_cfg->h264.transform8x8_mode = 1;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
/* constant QP mode qp is fixed */
p->qp_max = p->qp_init;
p->qp_min = p->qp_init;
p->qp_step = 0;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
/* constant bitrate do not limit qp range */
p->qp_max = 48;
p->qp_min = 4;
p->qp_step = 16;
p->qp_init = 0;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
if (rc_cfg->quality == MPP_ENC_RC_QUALITY_CQP) {
/* constant QP mode qp is fixed */
p->qp_max = p->qp_init;
p->qp_min = p->qp_init;
p->qp_step = 0;
} else {
/* variable bitrate has qp min limit */
p->qp_max = 40;
p->qp_min = 12;
p->qp_step = 8;
p->qp_init = 0;
}
/* variable bitrate has qp min limit */
p->qp_max = 40;
p->qp_min = 12;
p->qp_step = 8;
p->qp_init = 0;
}
codec_cfg->h264.qp_max = p->qp_max;

View File

@@ -228,23 +228,21 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
rc_cfg->rc_mode = MPP_ENC_RC_MODE_CBR;
rc_cfg->quality = MPP_ENC_RC_QUALITY_MEDIUM;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
/* constant QP does not have bps */
rc_cfg->bps_target = -1;
rc_cfg->bps_max = -1;
rc_cfg->bps_min = -1;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
/* constant bitrate has very small bps range of 1/16 bps */
rc_cfg->bps_target = p->bps;
rc_cfg->bps_max = p->bps * 17 / 16;
rc_cfg->bps_min = p->bps * 15 / 16;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
if (rc_cfg->quality == MPP_ENC_RC_QUALITY_CQP) {
/* constant QP does not have bps */
rc_cfg->bps_target = -1;
rc_cfg->bps_max = -1;
rc_cfg->bps_min = -1;
} else {
/* variable bitrate has large bps range */
rc_cfg->bps_target = p->bps;
rc_cfg->bps_max = p->bps * 17 / 16;
rc_cfg->bps_min = p->bps * 1 / 16;
}
/* variable bitrate has large bps range */
rc_cfg->bps_target = p->bps;
rc_cfg->bps_max = p->bps * 17 / 16;
rc_cfg->bps_min = p->bps * 1 / 16;
}
/* fix input / output frame rate */

View File

@@ -587,8 +587,7 @@ static MPP_RET mpi_rc_enc_init(MpiRc2TestCtx *ctx)
codec_cfg->h264.entropy_coding_mode = 1;
codec_cfg->h264.cabac_init_idc = 0;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR &&
rc_cfg->quality == MPP_ENC_RC_QUALITY_CQP) {
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;

View File

@@ -640,24 +640,22 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
codec_cfg->h264.cabac_init_idc = 0;
codec_cfg->h264.qp_init = 0;
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
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;
codec_cfg->h264.qp_max_step = 0;
} 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;
codec_cfg->h264.qp_max_step = 16;
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
if (rc_cfg->quality == MPP_ENC_RC_QUALITY_CQP) {
/* constant QP mode qp is fixed */
codec_cfg->h264.qp_init = 26;
codec_cfg->h264.qp_max = 26;
codec_cfg->h264.qp_min = 26;
codec_cfg->h264.qp_max_step = 0;
} else {
/* variable bitrate has qp min limit */
codec_cfg->h264.qp_max = 40;
codec_cfg->h264.qp_min = 12;
codec_cfg->h264.qp_max_step = 8;
}
/* variable bitrate has qp min limit */
codec_cfg->h264.qp_max = 40;
codec_cfg->h264.qp_min = 12;
codec_cfg->h264.qp_max_step = 8;
}
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_CODEC_CFG, codec_cfg);
if (ret) {