diff --git a/inc/mpp_rc_api.h b/inc/mpp_rc_api.h index 838e0b82..7e167a9a 100644 --- a/inc/mpp_rc_api.h +++ b/inc/mpp_rc_api.h @@ -187,6 +187,8 @@ typedef struct RcCfg_s { RK_U32 refresh_len; RK_S32 scene_mode; RK_U32 fps_chg_prop; + + RK_S32 rc_container; } RcCfg; /* diff --git a/inc/rk_venc_cmd.h b/inc/rk_venc_cmd.h index 4bd7ab92..15eafbc5 100644 --- a/inc/rk_venc_cmd.h +++ b/inc/rk_venc_cmd.h @@ -1438,7 +1438,9 @@ typedef enum MppEncFineTuneCfgChange_e { MPP_ENC_TUNE_CFG_CHANGE_ATR_STR_P = (1 << 8), MPP_ENC_TUNE_CFG_CHANGE_ATL_STR = (1 << 9), MPP_ENC_TUNE_CFG_CHANGE_SAO_STR_I = (1 << 10), - MPP_ENC_TUNE_CFG_CHANGE_SAO_STR_P = (1 << 11) + MPP_ENC_TUNE_CFG_CHANGE_SAO_STR_P = (1 << 11), + MPP_ENC_TUNE_CFG_CHANGE_QPMAP_EN = (1 << 12), + MPP_ENC_TUNE_CFG_CHANGE_RC_CONTAINER = (1 << 13) } MppEncFineTuneCfgChange; typedef struct MppEncFineTuneCfg_t { @@ -1450,11 +1452,13 @@ typedef struct MppEncFineTuneCfg_t { RK_S32 anti_flicker_str; RK_S32 lambda_idx_i; RK_S32 lambda_idx_p; - RK_S32 atr_str_i;/* line_en */ - RK_S32 atr_str_p;/* line_en */ - RK_S32 atl_str;/* anti_stripe */ - RK_S32 sao_str_i;/* anti blur */ - RK_S32 sao_str_p;/* anti blur */ + RK_S32 atr_str_i; /* line_en */ + RK_S32 atr_str_p; /* line_en */ + RK_S32 atl_str; /* anti_stripe */ + RK_S32 sao_str_i; /* anti blur */ + RK_S32 sao_str_p; /* anti blur */ + RK_S32 qpmap_en; + RK_S32 rc_container; } MppEncFineTuneCfg; #endif /*__RK_VENC_CMD_H__*/ diff --git a/mpp/base/mpp_enc_cfg.cpp b/mpp/base/mpp_enc_cfg.cpp index 25d74a2e..8ace98b7 100644 --- a/mpp/base/mpp_enc_cfg.cpp +++ b/mpp/base/mpp_enc_cfg.cpp @@ -266,7 +266,9 @@ public: ENTRY(tune, atr_str_p, S32, RK_S32, MPP_ENC_TUNE_CFG_CHANGE_ATR_STR_P, tune, atr_str_p) \ ENTRY(tune, atl_str, S32, RK_S32, MPP_ENC_TUNE_CFG_CHANGE_ATL_STR, tune, atl_str) \ ENTRY(tune, sao_str_i, S32, RK_S32, MPP_ENC_TUNE_CFG_CHANGE_SAO_STR_I, tune, sao_str_i) \ - ENTRY(tune, sao_str_p, S32, RK_S32, MPP_ENC_TUNE_CFG_CHANGE_SAO_STR_P, tune, sao_str_p) + ENTRY(tune, sao_str_p, S32, RK_S32, MPP_ENC_TUNE_CFG_CHANGE_SAO_STR_P, tune, sao_str_p) \ + ENTRY(tune, qpmap_en, S32, RK_S32, MPP_ENC_TUNE_CFG_CHANGE_QPMAP_EN, tune, qpmap_en) \ + ENTRY(tune, rc_container, S32, RK_S32, MPP_ENC_TUNE_CFG_CHANGE_RC_CONTAINER, tune, rc_container) static void mpp_enc_cfg_fill(MppTrie trie, MppCfgApi **cfgs) { diff --git a/mpp/codec/enc/h264/h264e_api_v2.c b/mpp/codec/enc/h264/h264e_api_v2.c index 060e220b..2ece34e7 100644 --- a/mpp/codec/enc/h264/h264e_api_v2.c +++ b/mpp/codec/enc/h264/h264e_api_v2.c @@ -101,6 +101,8 @@ static void init_h264e_cfg_set(MppEncCfgSet *cfg, MppClientType type) memset(h264, 0, sizeof(*h264)); h264->profile = H264_PROFILE_BASELINE; h264->level = H264_LEVEL_3_1; + cfg->tune.scene_mode = MPP_ENC_SCENE_MODE_DEFAULT; + cfg->tune.qpmap_en = 0; switch (type) { case VPU_CLIENT_VEPU1 : diff --git a/mpp/codec/enc/h265/h265e_api.c b/mpp/codec/enc/h265/h265e_api.c index 042dcef4..8217312c 100644 --- a/mpp/codec/enc/h265/h265e_api.c +++ b/mpp/codec/enc/h265/h265e_api.c @@ -119,6 +119,8 @@ static MPP_RET h265e_init(void *ctx, EncImplCfg *ctrlCfg) p->cfg->tune.sao_str_i = 0; p->cfg->tune.sao_str_p = 1; p->cfg->tune.deblur_str = 3; + p->cfg->tune.qpmap_en = 0; + p->cfg->tune.rc_container = 0; /* * default prep: diff --git a/mpp/codec/mpp_enc_impl.cpp b/mpp/codec/mpp_enc_impl.cpp index 508861d0..ad3ff47d 100644 --- a/mpp/codec/mpp_enc_impl.cpp +++ b/mpp/codec/mpp_enc_impl.cpp @@ -942,6 +942,22 @@ MPP_RET mpp_enc_proc_tune_cfg(MppEncFineTuneCfg *dst, MppEncFineTuneCfg *src) ret = MPP_ERR_VALUE; } + if (change & MPP_ENC_TUNE_CFG_CHANGE_QPMAP_EN) + dst->qpmap_en = src->qpmap_en; + + if (dst->qpmap_en < 0 || dst->qpmap_en > 1) { + mpp_err("invalid qpmap_en %d not in range [0, 1]\n", dst->qpmap_en); + ret = MPP_ERR_VALUE; + } + + if (change & MPP_ENC_TUNE_CFG_CHANGE_RC_CONTAINER) + dst->rc_container = src->rc_container; + + if (dst->rc_container < 0 || dst->rc_container > 2) { + mpp_err("invalid rc_container %d not in range [0, 2]\n", dst->rc_container); + ret = MPP_ERR_VALUE; + } + dst->change |= change; if (ret) { @@ -1320,6 +1336,7 @@ static void set_rc_cfg(RcCfg *cfg, MppEncCfgSet *cfg_set) cfg->bps_max = rc->bps_max; cfg->bps_min = rc->bps_min; cfg->scene_mode = cfg_set->tune.scene_mode; + cfg->rc_container = cfg_set->tune.rc_container; cfg->hier_qp_cfg.hier_qp_en = rc->hier_qp_en; memcpy(cfg->hier_qp_cfg.hier_frame_num, rc->hier_frame_num, sizeof(rc->hier_frame_num)); diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index 78b50d2a..5973ab7b 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -416,9 +416,9 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncMultiCtxInfo *info) mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", cmd->qp_min_i ? cmd->qp_min_i : 10); mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 2); mpp_enc_cfg_set_s32(cfg, "rc:fqp_min_i", cmd->fqp_min_i ? cmd->fqp_min_i : 10); - mpp_enc_cfg_set_s32(cfg, "rc:fqp_max_i", cmd->fqp_max_i ? cmd->fqp_max_i : 51); + mpp_enc_cfg_set_s32(cfg, "rc:fqp_max_i", cmd->fqp_max_i ? cmd->fqp_max_i : 45); mpp_enc_cfg_set_s32(cfg, "rc:fqp_min_p", cmd->fqp_min_p ? cmd->fqp_min_p : 10); - mpp_enc_cfg_set_s32(cfg, "rc:fqp_max_p", cmd->fqp_max_p ? cmd->fqp_max_p : 51); + mpp_enc_cfg_set_s32(cfg, "rc:fqp_max_p", cmd->fqp_max_p ? cmd->fqp_max_p : 45); } break; default : { mpp_err_f("unsupport encoder rc mode %d\n", p->rc_mode); @@ -545,6 +545,26 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncMultiCtxInfo *info) if (ref) mpp_enc_ref_cfg_deinit(&ref); + { + RcApiBrief rcApiBrief; + ret = mpi->control(ctx, MPP_ENC_GET_RC_API_CURRENT, &rcApiBrief); + if (ret) { + mpp_err("mpi control enc get rc api failed ret %d\n", ret); + goto RET; + } + + if (MPP_ENC_RC_MODE_SMTRC == info->cmd->rc_mode) + rcApiBrief.name = "smart"; + else + rcApiBrief.name = "default"; + + ret = mpi->control(ctx, MPP_ENC_SET_RC_API_CURRENT, &rcApiBrief); + if (ret) { + mpp_err("mpi control enc set rc api failed ret %d\n", ret); + goto RET; + } + } + /* optional */ { RK_U32 sei_mode; diff --git a/utils/mpi_enc_utils.c b/utils/mpi_enc_utils.c index 64729e3b..550335c0 100644 --- a/utils/mpi_enc_utils.c +++ b/utils/mpi_enc_utils.c @@ -524,6 +524,7 @@ RK_S32 mpi_enc_opt_dbs(void *ctx, const char *next) } mpp_err("invalid deblur str\n"); + return 0; } @@ -612,6 +613,19 @@ RK_S32 mpi_enc_opt_sao_p(void *ctx, const char *next) return 0; } +RK_S32 mpi_enc_opt_bc(void *ctx, const char *next) +{ + MpiEncTestArgs *cmd = (MpiEncTestArgs *)ctx; + + if (next) { + cmd->rc_container = atoi(next); + return 1; + } + + mpp_err("invalid bitrate container\n"); + return 0; +} + static MppOptInfo enc_opts[] = { {"i", "input_file", "input frame file", mpi_enc_opt_i}, {"o", "output_file", "output encoded bitstream file", mpi_enc_opt_o}, @@ -644,6 +658,7 @@ static MppOptInfo enc_opts[] = { {"atr_p", "atr_str_p", "atr_str_p, 0:off 1 2 3", mpi_enc_opt_atr_p}, {"sao_i", "sao_str_i", "sao_str_i, 0:off 1 2 3", mpi_enc_opt_sao_i}, {"sao_p", "sao_str_p", "sao_str_p, 0:off 1 2 3", mpi_enc_opt_sao_p}, + {"bc", "bitrate container", "rc_container, 0:off 1:weak 2:strong", mpi_enc_opt_bc} }; static RK_U32 enc_opt_cnt = MPP_ARRAY_ELEMS(enc_opts); diff --git a/utils/mpi_enc_utils.h b/utils/mpi_enc_utils.h index 02504a1a..1e1bb451 100644 --- a/utils/mpi_enc_utils.h +++ b/utils/mpi_enc_utils.h @@ -76,6 +76,7 @@ typedef struct MpiEncTestArgs_t { /* -sm scene_mode */ RK_S32 scene_mode; + RK_S32 rc_container; /* -qpdd cu_qp_delta_depth */ RK_S32 cu_qp_delta_depth;