mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-05 17:16:50 +08:00
[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:
@@ -512,8 +512,10 @@ typedef enum MppEncH264CfgChange_e {
|
|||||||
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT = (1 << 16),
|
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT = (1 << 16),
|
||||||
/* change on max_qp_i / min_qp_i */
|
/* change on max_qp_i / min_qp_i */
|
||||||
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I = (1 << 17),
|
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 */
|
/* 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 */
|
/* change on intra_refresh_mode / intra_refresh_arg */
|
||||||
MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH = (1 << 20),
|
MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH = (1 << 20),
|
||||||
/* change on max long-term reference frame count */
|
/* 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_ENTROPY_CHANGE = (1 << 16),
|
||||||
MPP_ENC_H265_CFG_MERGE_CHANGE = (1 << 17),
|
MPP_ENC_H265_CFG_MERGE_CHANGE = (1 << 17),
|
||||||
MPP_ENC_H265_CFG_CHANGE_VUI = (1 << 18),
|
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),
|
MPP_ENC_H265_CFG_CHANGE_ALL = (0xFFFFFFFF),
|
||||||
} MppEncH265CfgChange;
|
} MppEncH265CfgChange;
|
||||||
|
|
||||||
|
@@ -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_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_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_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, 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_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) \
|
||||||
@@ -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_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_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_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_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_QP_CHANGE, codec.h265, min_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, 0, codec.h265, qp_max_step) \
|
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_QP_CHANGE, codec.h265, ip_qp_delta) \
|
ENTRY(h265, qp_delta_ip, S32, RK_S32, MPP_ENC_H265_CFG_RC_IP_DELTA_QP_CHANGE, codec.h265, ip_qp_delta) \
|
||||||
/* 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_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) \
|
ENTRY(vp8, qp_max, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_max) \
|
||||||
|
@@ -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->qp_min_i = src->qp_min_i ? src->qp_min_i : src->qp_min;
|
||||||
dst->change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I;
|
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) &&
|
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->qp_delta_ip = src->qp_delta_ip;
|
dst->qp_delta_ip = src->qp_delta_ip;
|
||||||
|
@@ -71,7 +71,7 @@ static MPP_RET h265e_init(void *ctx, EncImplCfg *ctrlCfg)
|
|||||||
h265->max_i_qp = 51;
|
h265->max_i_qp = 51;
|
||||||
h265->min_i_qp = 10;
|
h265->min_i_qp = 10;
|
||||||
h265->qpmap_mode = 1;
|
h265->qpmap_mode = 1;
|
||||||
h265->ip_qp_delta = 3;
|
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->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->qp_init = src->qp_init;
|
||||||
dst->max_qp = src->max_qp;
|
dst->max_qp = src->max_qp;
|
||||||
dst->min_qp = src->min_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->max_i_qp = src->max_i_qp;
|
||||||
dst->min_i_qp = src->min_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
|
* 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
|
||||||
|
@@ -369,12 +369,19 @@ static RK_S32 check_codec_to_rc_cfg_update(MppEncCodecCfg *codec)
|
|||||||
switch (coding) {
|
switch (coding) {
|
||||||
case MPP_VIDEO_CodingAVC : {
|
case MPP_VIDEO_CodingAVC : {
|
||||||
MppEncH264Cfg *h264 = &codec->h264;
|
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;
|
return 1;
|
||||||
} break;
|
} break;
|
||||||
case MPP_VIDEO_CodingHEVC : {
|
case MPP_VIDEO_CodingHEVC : {
|
||||||
MppEncH265Cfg *h265 = &codec->h265;
|
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;
|
return 1;
|
||||||
} break;
|
} break;
|
||||||
case MPP_VIDEO_CodingVP8 : {
|
case MPP_VIDEO_CodingVP8 : {
|
||||||
|
@@ -1310,21 +1310,25 @@ MPP_RET rc_model_v2_hal_start(void *ctx, EncRcTask *task)
|
|||||||
|
|
||||||
index = mpp_clip(index, 0, 7);
|
index = mpp_clip(index, 0, 7);
|
||||||
dealt_qp = max_ip_qp_dealt[index];
|
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 ) {
|
if (dealt_qp > usr_cfg->i_quality_delta ) {
|
||||||
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;
|
p->start_qp -= dealt_qp;
|
||||||
} else {
|
} else {
|
||||||
qp_scale = mpp_clip(qp_scale, (info->quality_min << 6), (info->quality_max << 6));
|
qp_scale = mpp_clip(qp_scale, (info->quality_min << 6), (info->quality_max << 6));
|
||||||
p->cur_scale_qp = qp_scale;
|
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;
|
p->start_qp = qp_scale >> 6;
|
||||||
if (frm->ref_mode == REF_TO_PREV_INTRA && usr_cfg->vi_quality_delta) {
|
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;
|
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);
|
p->start_qp = mpp_clip(p->start_qp, info->quality_min, info->quality_max);
|
||||||
|
Reference in New Issue
Block a user