diff --git a/inc/rk_venc_cmd.h b/inc/rk_venc_cmd.h index 1bbc05c9..8be26db4 100644 --- a/inc/rk_venc_cmd.h +++ b/inc/rk_venc_cmd.h @@ -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; diff --git a/mpp/base/mpp_enc_cfg.cpp b/mpp/base/mpp_enc_cfg.cpp index 107dd271..71c3e042 100644 --- a/mpp/base/mpp_enc_cfg.cpp +++ b/mpp/base/mpp_enc_cfg.cpp @@ -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) \ diff --git a/mpp/codec/enc/h264/h264e_api_v2.c b/mpp/codec/enc/h264/h264e_api_v2.c index 0c60dd2b..27e68cdf 100644 --- a/mpp/codec/enc/h264/h264e_api_v2.c +++ b/mpp/codec/enc/h264/h264e_api_v2.c @@ -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; diff --git a/mpp/codec/enc/h265/h265e_api.c b/mpp/codec/enc/h265/h265e_api.c index 8a4f50b1..e3bb24de 100644 --- a/mpp/codec/enc/h265/h265e_api.c +++ b/mpp/codec/enc/h265/h265e_api.c @@ -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 diff --git a/mpp/codec/mpp_enc_impl.cpp b/mpp/codec/mpp_enc_impl.cpp index 434a30e7..1b67bbd8 100644 --- a/mpp/codec/mpp_enc_impl.cpp +++ b/mpp/codec/mpp_enc_impl.cpp @@ -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 : { diff --git a/mpp/codec/rc/rc_model_v2.c b/mpp/codec/rc/rc_model_v2.c index 43b36a69..f361eb33 100644 --- a/mpp/codec/rc/rc_model_v2.c +++ b/mpp/codec/rc/rc_model_v2.c @@ -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);