[mpp_enc]: Restore max_qp_step

1. Restore max_qp_step which limit the qp change between two frames.
2. Set default H.265 ip_qp_delta to 5.

Change-Id: Iacd795da7f2df46e60ab3f5c45bc8b0f30aff5a5
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2020-12-31 18:01:35 +08:00
parent fb13523e51
commit 4aa5b4a046
6 changed files with 40 additions and 11 deletions

View File

@@ -512,8 +512,10 @@ typedef enum MppEncH264CfgChange_e {
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT = (1 << 16),
/* change on max_qp_i / min_qp_i */
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I = (1 << 17),
/* change on max_qp_step */
MPP_ENC_H264_CFG_CHANGE_MAX_QP_STEP = (1 << 18),
/* change on qp_delta_ip */
MPP_ENC_H264_CFG_CHANGE_QP_DELTA = (1 << 18),
MPP_ENC_H264_CFG_CHANGE_QP_DELTA = (1 << 19),
/* change on intra_refresh_mode / intra_refresh_arg */
MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH = (1 << 20),
/* change on max long-term reference frame count */
@@ -773,6 +775,9 @@ typedef enum MppEncH265CfgChange_e {
MPP_ENC_H265_CFG_ENTROPY_CHANGE = (1 << 16),
MPP_ENC_H265_CFG_MERGE_CHANGE = (1 << 17),
MPP_ENC_H265_CFG_CHANGE_VUI = (1 << 18),
MPP_ENC_H265_CFG_RC_I_QP_CHANGE = (1 << 19),
MPP_ENC_H265_CFG_RC_MAX_QP_STEP_CHANGE = (1 << 21),
MPP_ENC_H265_CFG_RC_IP_DELTA_QP_CHANGE = (1 << 20),
MPP_ENC_H265_CFG_CHANGE_ALL = (0xFFFFFFFF),
} MppEncH265CfgChange;

View File

@@ -211,7 +211,7 @@ static const char *cfg_func_names[] = {
ENTRY(h264, qp_min, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_min) \
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_H264_CFG_CHANGE_QP_LIMIT_I, codec.h264, qp_min_i) \
ENTRY(h264, qp_step, S32, RK_S32, 0, codec.h264, qp_max_step) \
ENTRY(h264, qp_step, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_MAX_QP_STEP, codec.h264, 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, 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) \
@@ -229,10 +229,10 @@ static const char *cfg_func_names[] = {
ENTRY(h265, qp_init, S32, RK_S32, MPP_ENC_H265_CFG_RC_QP_CHANGE, codec.h265, 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_H265_CFG_RC_QP_CHANGE, codec.h265, min_qp) \
ENTRY(h265, qp_max_i, S32, RK_S32, MPP_ENC_H265_CFG_RC_QP_CHANGE, codec.h265, max_i_qp) \
ENTRY(h265, qp_min_i, S32, RK_S32, MPP_ENC_H265_CFG_RC_QP_CHANGE, codec.h265, min_i_qp) \
ENTRY(h265, qp_step, S32, RK_S32, 0, codec.h265, qp_max_step) \
ENTRY(h265, qp_delta_ip, S32, RK_S32, MPP_ENC_H265_CFG_RC_QP_CHANGE, codec.h265, ip_qp_delta) \
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_H265_CFG_RC_I_QP_CHANGE, codec.h265, min_i_qp) \
ENTRY(h265, qp_step, S32, RK_S32, MPP_ENC_H265_CFG_RC_MAX_QP_STEP_CHANGE, codec.h265, 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) \
/* vp8 config */ \
ENTRY(vp8, qp_init, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_init) \
ENTRY(vp8, qp_max, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_max) \

View File

@@ -524,6 +524,11 @@ static MPP_RET h264e_proc_h264_cfg(MppEncH264Cfg *dst, MppEncH264Cfg *src)
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;

View File

@@ -71,7 +71,7 @@ static MPP_RET h265e_init(void *ctx, EncImplCfg *ctrlCfg)
h265->max_i_qp = 51;
h265->min_i_qp = 10;
h265->qpmap_mode = 1;
h265->ip_qp_delta = 3;
h265->ip_qp_delta = 5;
h265->raw_dealt_qp = 4;
h265->max_delta_qp = 10;
h265->const_intra_pred = 0;
@@ -543,11 +543,19 @@ static MPP_RET h265e_proc_h265_cfg(MppEncH265Cfg *dst, MppEncH265Cfg *src)
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;
dst->ip_qp_delta = src->ip_qp_delta;
}
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
* When next encoding is trigger the change flag will be clear

View File

@@ -369,12 +369,19 @@ static RK_S32 check_codec_to_rc_cfg_update(MppEncCodecCfg *codec)
switch (coding) {
case MPP_VIDEO_CodingAVC : {
MppEncH264Cfg *h264 = &codec->h264;
if (h264->change | MPP_ENC_H264_CFG_CHANGE_QP_LIMIT)
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)
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 : {

View File

@@ -1310,21 +1310,25 @@ MPP_RET rc_model_v2_hal_start(void *ctx, EncRcTask *task)
index = mpp_clip(index, 0, 7);
dealt_qp = max_ip_qp_dealt[index];
rc_dbg_rc("madi %d delta qp %d\n", index, dealt_qp);
if (dealt_qp > usr_cfg->i_quality_delta ) {
dealt_qp = usr_cfg->i_quality_delta;
}
}
rc_dbg_rc("qp %d - %d -> %d reenc %d\n", p->start_qp, dealt_qp,
p->start_qp - dealt_qp, p->reenc_cnt);
p->start_qp -= dealt_qp;
} else {
qp_scale = mpp_clip(qp_scale, (info->quality_min << 6), (info->quality_max << 6));
p->cur_scale_qp = qp_scale;
rc_dbg_rc("qp %d -> %d\n", p->start_qp, qp_scale >> 6);
p->start_qp = qp_scale >> 6;
if (frm->ref_mode == REF_TO_PREV_INTRA && usr_cfg->vi_quality_delta) {
rc_dbg_rc("qp %d -> %d (vi)\n", p->start_qp, p->start_qp - usr_cfg->vi_quality_delta);
p->start_qp -= usr_cfg->vi_quality_delta;
}
}
rc_dbg_rc("i_quality_delta %d, vi_quality_delta %d", dealt_qp, usr_cfg->vi_quality_delta);
}
p->start_qp = mpp_clip(p->start_qp, info->quality_min, info->quality_max);