diff --git a/inc/rk_venc_cmd.h b/inc/rk_venc_cmd.h index 2d102433..64f1bd4a 100644 --- a/inc/rk_venc_cmd.h +++ b/inc/rk_venc_cmd.h @@ -508,18 +508,22 @@ typedef enum MppEncH264CfgChange_e { /* change on log2 max frame number minus 4 */ MPP_ENC_H264_CFG_CHANGE_MAX_FRM_NUM = (1 << 12), - /* change on max_qp / min_qp / max_qp_step */ + /* change on max_qp / min_qp */ 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 qp_delta_ip */ + MPP_ENC_H264_CFG_CHANGE_QP_DELTA = (1 << 18), /* change on intra_refresh_mode / intra_refresh_arg */ - MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH = (1 << 17), + MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH = (1 << 20), /* change on max long-term reference frame count */ - MPP_ENC_H264_CFG_CHANGE_MAX_LTR = (1 << 18), + MPP_ENC_H264_CFG_CHANGE_MAX_LTR = (1 << 21), /* change on max temporal id */ - MPP_ENC_H264_CFG_CHANGE_MAX_TID = (1 << 19), + MPP_ENC_H264_CFG_CHANGE_MAX_TID = (1 << 22), /* change on adding prefix nal */ - MPP_ENC_H264_CFG_CHANGE_ADD_PREFIX = (1 << 20), + MPP_ENC_H264_CFG_CHANGE_ADD_PREFIX = (1 << 23), /* change on base layer priority id */ - MPP_ENC_H264_CFG_CHANGE_BASE_LAYER_PID = (1 << 21), + MPP_ENC_H264_CFG_CHANGE_BASE_LAYER_PID = (1 << 24), /* change on vui */ MPP_ENC_H264_CFG_CHANGE_VUI = (1 << 28), diff --git a/mpp/base/mpp_enc_cfg.cpp b/mpp/base/mpp_enc_cfg.cpp index a048ab65..107dd271 100644 --- a/mpp/base/mpp_enc_cfg.cpp +++ b/mpp/base/mpp_enc_cfg.cpp @@ -209,10 +209,10 @@ static const char *cfg_func_names[] = { ENTRY(h264, qp_init, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_init) \ ENTRY(h264, qp_max, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_max) \ 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, codec.h264, qp_max_i) \ - ENTRY(h264, qp_min_i, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_min_i) \ - ENTRY(h264, qp_step, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_max_step) \ - ENTRY(h264, qp_delta_ip, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_QP_LIMIT, codec.h264, qp_delta_ip) \ + 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_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) \ ENTRY(h264, prefix_mode, S32, RK_S32, MPP_ENC_H264_CFG_CHANGE_ADD_PREFIX, codec.h264, prefix_mode) \ @@ -231,7 +231,7 @@ static const char *cfg_func_names[] = { 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, MPP_ENC_H265_CFG_RC_QP_CHANGE, codec.h265, qp_max_step) \ + 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) \ /* vp8 config */ \ ENTRY(vp8, qp_init, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_init) \ @@ -239,7 +239,7 @@ static const char *cfg_func_names[] = { ENTRY(vp8, qp_min, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_min) \ ENTRY(vp8, qp_max_i, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_max_i) \ ENTRY(vp8, qp_min_i, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_min_i) \ - ENTRY(vp8, qp_step, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_max_step) \ + ENTRY(vp8, qp_step, S32, RK_S32, 0, codec.vp8, qp_max_step) \ ENTRY(vp8, disable_ivf, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_DIS_IVF, codec.vp8, disable_ivf) \ /* jpeg config */ \ ENTRY(jpeg, quant, S32, RK_S32, MPP_ENC_JPEG_CFG_CHANGE_QP, codec.jpeg, quant) \ diff --git a/mpp/codec/enc/h264/h264e_api_v2.c b/mpp/codec/enc/h264/h264e_api_v2.c index 9540ad1a..0c60dd2b 100644 --- a/mpp/codec/enc/h264/h264e_api_v2.c +++ b/mpp/codec/enc/h264/h264e_api_v2.c @@ -104,8 +104,7 @@ static void init_h264e_cfg_set(MppEncCfgSet *cfg, MppClientType type) /* default max/min intra qp is not set */ h264->qp_max_i = 0; h264->qp_min_i = 0; - h264->qp_max_step = 8; - h264->qp_delta_ip = 8; + h264->qp_delta_ip = 4; switch (type) { case VPU_CLIENT_VEPU1 : @@ -512,19 +511,23 @@ static MPP_RET h264e_proc_h264_cfg(MppEncH264Cfg *dst, MppEncH264Cfg *src) if ((change & MPP_ENC_H264_CFG_CHANGE_QP_LIMIT) && ((dst->qp_init != src->qp_init) || (dst->qp_max != src->qp_max) || - (dst->qp_min != src->qp_min) || - (dst->qp_max_i != src->qp_max_i) || - (dst->qp_min_i != src->qp_min_i) || - (dst->qp_max_step != src->qp_max_step) || - (dst->qp_delta_ip != src->qp_delta_ip))) { + (dst->qp_min != src->qp_min))) { dst->qp_init = src->qp_init; dst->qp_max = src->qp_max; dst->qp_min = src->qp_min; + dst->change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT; + } + if ((change & MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I) && + ((dst->qp_max_i != src->qp_max_i) || + (dst->qp_min_i != src->qp_min_i))) { dst->qp_max_i = src->qp_max_i ? src->qp_max_i : src->qp_max; dst->qp_min_i = src->qp_min_i ? src->qp_min_i : src->qp_min; - dst->qp_max_step = src->qp_max_step; + dst->change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I; + } + 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->change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT; + dst->change |= MPP_ENC_H264_CFG_CHANGE_QP_DELTA; } if ((change & MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH) && ((dst->intra_refresh_mode != src->intra_refresh_mode) || diff --git a/test/mpi_enc_multi_test.c b/test/mpi_enc_multi_test.c index 954a0c37..ec6699a7 100644 --- a/test/mpi_enc_multi_test.c +++ b/test/mpi_enc_multi_test.c @@ -459,7 +459,6 @@ MPP_RET test_mpp_setup(MpiEncTestData *p) codec_cfg->h264.qp_max = p->qp_max; codec_cfg->h264.qp_min = p->qp_min; - codec_cfg->h264.qp_max_step = p->qp_step; codec_cfg->h264.qp_init = p->qp_init; } break; case MPP_VIDEO_CodingMJPEG : { diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index 17b4aa43..dfdf5fc0 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -348,9 +348,10 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p) mpp_enc_cfg_set_s32(cfg, "h264:qp_init", 26); mpp_enc_cfg_set_s32(cfg, "h264:qp_max", 51); mpp_enc_cfg_set_s32(cfg, "h264:qp_min", 10); - mpp_enc_cfg_set_s32(cfg, "h264:qp_max_i", 46); - mpp_enc_cfg_set_s32(cfg, "h264:qp_min_i", 24); + mpp_enc_cfg_set_s32(cfg, "h264:qp_max_i", 51); + mpp_enc_cfg_set_s32(cfg, "h264:qp_min_i", 10); } + mpp_enc_cfg_set_s32(cfg, "h264:qp_delta_ip", 4); } break; case MPP_VIDEO_CodingMJPEG : { mpp_enc_cfg_set_s32(cfg, "jpeg:q_factor", 80); diff --git a/test/mpi_rc2_test.c b/test/mpi_rc2_test.c index 30a082c3..6de4e630 100644 --- a/test/mpi_rc2_test.c +++ b/test/mpi_rc2_test.c @@ -591,8 +591,7 @@ static MPP_RET mpi_rc_enc_init(MpiRc2TestCtx *ctx) /* constant QP mode qp is fixed */ codec_cfg->h264.qp_max = 26; codec_cfg->h264.qp_min = 26; - codec_cfg->h264.qp_max_step = 0; - codec_cfg->h264.qp_init = 26; + codec_cfg->h264.qp_init = 26; codec_cfg->h264.change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT; } diff --git a/test/mpi_rc_test.c b/test/mpi_rc_test.c index 2a8084a3..7a706f55 100644 --- a/test/mpi_rc_test.c +++ b/test/mpi_rc_test.c @@ -645,17 +645,14 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx) 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) { /* 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) {