From 407fce12722cd3cda3f78df228bf63af872a5cc9 Mon Sep 17 00:00:00 2001 From: "toby.zhang" Date: Mon, 14 Feb 2022 14:53:15 +0800 Subject: [PATCH] [mpi_enc_test]: Add fix qp encoder mode Change-Id: Ia749c9eb5d2a25b87e64215aa184301baf9fa6b5 Signed-off-by: toby.zhang Signed-off-by: Herman Chen --- test/mpi_enc_test.c | 14 ++++++------ utils/mpi_enc_utils.c | 50 ++++++++++++++++++++++++++++++++++++++----- utils/mpi_enc_utils.h | 11 +++++++++- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index 2492b656..72579f4a 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -342,12 +342,14 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncMultiCtxInfo *info) case MPP_VIDEO_CodingHEVC : { switch (p->rc_mode) { case MPP_ENC_RC_MODE_FIXQP : { - mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 20); - mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 20); - mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 20); - mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 20); - mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 20); - mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 2); + RK_S32 fix_qp = cmd->qp_init; + + mpp_enc_cfg_set_s32(cfg, "rc:qp_init", fix_qp); + mpp_enc_cfg_set_s32(cfg, "rc:qp_max", fix_qp); + mpp_enc_cfg_set_s32(cfg, "rc:qp_min", fix_qp); + mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", fix_qp); + mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", fix_qp); + mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 0); } break; case MPP_ENC_RC_MODE_CBR : case MPP_ENC_RC_MODE_VBR : diff --git a/utils/mpi_enc_utils.c b/utils/mpi_enc_utils.c index e1d2b4dd..fe120341 100644 --- a/utils/mpi_enc_utils.c +++ b/utils/mpi_enc_utils.c @@ -287,21 +287,35 @@ RK_S32 mpi_enc_opt_g(void *ctx, const char *next) return 0; } +RK_S32 mpi_enc_opt_rc(void *ctx, const char *next) +{ + MpiEncTestArgs *cmd = (MpiEncTestArgs *)ctx; + RK_S32 cnt = 0; + + if (next) { + cnt = sscanf(next, "%d", &cmd->rc_mode); + if (cnt) + return 1; + } + + mpp_err("invalid rate control usage -rc rc_mode\n"); + mpp_err("rc_mode 0:vbr 1:cbr 2:avbr 3:cvbr 4:fixqp\n"); + return 0; +} + RK_S32 mpi_enc_opt_bps(void *ctx, const char *next) { MpiEncTestArgs *cmd = (MpiEncTestArgs *)ctx; RK_S32 cnt = 0; if (next) { - cnt = sscanf(next, "%d:%d:%d:%d", - &cmd->bps_target, &cmd->bps_min, &cmd->bps_max, - &cmd->rc_mode); + cnt = sscanf(next, "%d:%d:%d", + &cmd->bps_target, &cmd->bps_min, &cmd->bps_max); if (cnt) return 1; } - mpp_err("invalid bit rate usage -b bps_target:bps_min:bps_max:rc_mode\n"); - mpp_err("rc_mode 0:vbr 1:cbr 2:avbr 3:cvbr 4:fixqp\n"); + mpp_err("invalid bit rate usage -bps bps_target:bps_min:bps_max\n"); return 0; } @@ -354,6 +368,22 @@ RK_S32 mpi_enc_opt_fps(void *ctx, const char *next) return 0; } +RK_S32 mpi_enc_opt_qc(void *ctx, const char *next) +{ + MpiEncTestArgs *cmd = (MpiEncTestArgs *)ctx; + RK_S32 cnt = 0; + + if (next) { + cnt = sscanf(next, "%d:%d:%d:%d:%d", &cmd->qp_init, + &cmd->qp_min, &cmd->qp_max, &cmd->qp_min_i, &cmd->qp_max_i); + if (cnt) + return 1; + } + + mpp_err("invalid quality control usage -qc qp_init/min/max/min_i/max_i\n"); + return 0; +} + RK_S32 mpi_enc_opt_s(void *ctx, const char *next) { MpiEncTestArgs *cmd = (MpiEncTestArgs *)ctx; @@ -455,8 +485,10 @@ static MppOptInfo enc_opts[] = { {"tsrc", "source type", "input file source coding type", mpi_enc_opt_tsrc}, {"n", "max frame number", "max encoding frame number", mpi_enc_opt_n}, {"g", "gop reference mode", "gop_mode:gop_len:vi_len", mpi_enc_opt_g}, + {"rc", "rate control mode", "set rc_mode", mpi_enc_opt_rc}, {"bps", "bps target:min:max", "set tareget/min/max bps and rc_mode", mpi_enc_opt_bps}, {"fps", "in/output fps", "set input and output frame rate", mpi_enc_opt_fps}, + {"qc", "quality control", "set qp_init/min/max/min_i/max_i", mpi_enc_opt_qc}, {"s", "instance_nb", "number of instances", mpi_enc_opt_s}, {"v", "trace option", "q - quiet f - show fps", mpi_enc_opt_v}, {"l", "loop count", "loop encoding times for each frame", mpi_enc_opt_l}, @@ -562,6 +594,14 @@ MPP_RET mpi_enc_test_cmd_update_by_args(MpiEncTestArgs* cmd, int argc, char **ar } } + if (cmd->rc_mode == MPP_ENC_RC_MODE_FIXQP) { + if (!cmd->qp_init) { + if (cmd->type == MPP_VIDEO_CodingAVC || + cmd->type == MPP_VIDEO_CodingHEVC) + cmd->qp_init = 26; + } + } + if (cmd->trace_fps) { fps_calc_init(&cmd->fps); mpp_assert(cmd->fps); diff --git a/utils/mpi_enc_utils.h b/utils/mpi_enc_utils.h index d0986fe8..50c59208 100644 --- a/utils/mpi_enc_utils.h +++ b/utils/mpi_enc_utils.h @@ -40,11 +40,13 @@ typedef struct MpiEncTestArgs_t { RK_S32 hor_stride; RK_S32 ver_stride; + /* -rc */ + RK_S32 rc_mode; + /* -bps */ RK_S32 bps_target; RK_S32 bps_max; RK_S32 bps_min; - RK_S32 rc_mode; /* -fps */ RK_S32 fps_in_flex; @@ -54,6 +56,13 @@ typedef struct MpiEncTestArgs_t { RK_S32 fps_out_num; RK_S32 fps_out_den; + /* -qc */ + RK_S32 qp_init; + RK_S32 qp_min; + RK_S32 qp_max; + RK_S32 qp_min_i; + RK_S32 qp_max_i; + /* -g gop mode */ RK_S32 gop_mode; RK_S32 gop_len;