From c2d9a16c24271034df445d117fdd403fc93e2290 Mon Sep 17 00:00:00 2001 From: Xinhuang Li Date: Wed, 15 Apr 2020 15:55:54 +0800 Subject: [PATCH] [test]: modify the frame rate to support decimals use "-r numerator:denominator:flex" for set the input to the same fps as the output, such as 50:1:1 or "-r numerator:denominator/flex-numerator:denominator:flex" for set input and output separately, such as 40:1:1/30:1:0. the default parameter is 30:1:0. Signed-off-by: Xinhuang Li Change-Id: Ief2935354b82aba9c192b4af92636519d3e75423 --- test/mpi_enc_test.c | 39 +++++++++++++++++++++++++++++---------- utils/mpi_enc_utils.c | 40 ++++++++++++++++++++++++++++++++++++++-- utils/mpi_enc_utils.h | 8 ++++++-- 3 files changed, 73 insertions(+), 14 deletions(-) diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index de7a388c..928d7d51 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -88,7 +88,12 @@ typedef struct { // rate control runtime parameter RK_S32 gop; - RK_S32 fps; + RK_S32 fps_in_flex; + RK_S32 fps_in_den; + RK_S32 fps_in_num; + RK_S32 fps_out_flex; + RK_S32 fps_out_den; + RK_S32 fps_out_num; RK_S32 bps; RK_S32 gop_mode; MppEncGopRef ref; @@ -125,6 +130,12 @@ MPP_RET test_ctx_init(MpiEncTestData **data, MpiEncTestArgs *cmd) cmd->num_frames = 1; p->num_frames = cmd->num_frames; p->gop_mode = cmd->gop_mode; + p->fps_in_flex = cmd->fps_in_flex; + p->fps_in_den = cmd->fps_in_den; + p->fps_in_num = cmd->fps_in_num; + p->fps_out_flex = cmd->fps_out_flex; + p->fps_out_den = cmd->fps_out_den; + p->fps_out_num = cmd->fps_out_num; if (cmd->file_input) { p->fp_input = fopen(cmd->file_input, "rb"); @@ -236,11 +247,18 @@ MPP_RET test_mpp_setup(MpiEncTestData *p) split_cfg = &p->split_cfg; /* setup default parameter */ - p->fps = 30; + if (p->fps_in_den == 0) + p->fps_in_den = 1; + if (p->fps_in_num == 0) + p->fps_in_num = 30; + if (p->fps_out_den == 0) + p->fps_out_den = 1; + if (p->fps_out_num == 0) + p->fps_out_num = 30; p->gop = 60; if (!p->bps) - p->bps = p->width * p->height / 8 * p->fps; + p->bps = p->width * p->height / 8 * (p->fps_out_num / p->fps_out_den); prep_cfg->change = MPP_ENC_PREP_CFG_CHANGE_INPUT | MPP_ENC_PREP_CFG_CHANGE_ROTATION | @@ -279,12 +297,12 @@ MPP_RET test_mpp_setup(MpiEncTestData *p) } /* fix input / output frame rate */ - rc_cfg->fps_in_flex = 0; - rc_cfg->fps_in_num = p->fps; - rc_cfg->fps_in_denorm = 1; - rc_cfg->fps_out_flex = 0; - rc_cfg->fps_out_num = p->fps; - rc_cfg->fps_out_denorm = 1; + rc_cfg->fps_in_flex = p->fps_in_flex; + rc_cfg->fps_in_num = p->fps_in_num; + rc_cfg->fps_in_denorm = p->fps_in_den; + rc_cfg->fps_out_flex = p->fps_out_flex; + rc_cfg->fps_out_num = p->fps_out_num; + rc_cfg->fps_out_denorm = p->fps_out_den; rc_cfg->gop = p->gop; rc_cfg->skip_cnt = 0; @@ -683,7 +701,8 @@ MPP_TEST_OUT: if (MPP_OK == ret) mpp_log("mpi_enc_test success total frame %d bps %lld\n", - p->frame_count, (RK_U64)((p->stream_size * 8 * p->fps) / p->frame_count)); + p->frame_count, + (RK_U64)((p->stream_size * 8 * (p->fps_out_num / p->fps_out_den)) / p->frame_count)); else mpp_err("mpi_enc_test failed ret %d\n", ret); diff --git a/utils/mpi_enc_utils.c b/utils/mpi_enc_utils.c index 1c210783..f8cbd755 100644 --- a/utils/mpi_enc_utils.c +++ b/utils/mpi_enc_utils.c @@ -176,7 +176,43 @@ MPP_RET mpi_enc_test_cmd_update_by_args(MpiEncTestArgs* cmd, int argc, char **ar break; case 'r': if (next) { - cmd->fps_out = atoi(next); + RK_S32 num = sscanf(next, "%d:%d:%d/%d:%d:%d", + &cmd->fps_in_num, &cmd->fps_in_den, &cmd->fps_in_flex, + &cmd->fps_out_num, &cmd->fps_out_den, &cmd->fps_out_flex); + switch(num) { + case 1: + cmd->fps_out_num = cmd->fps_in_num; + cmd->fps_out_den = cmd->fps_in_den = 1; + cmd->fps_out_flex = cmd->fps_in_flex = 0; + break; + case 2: + cmd->fps_out_num = cmd->fps_in_num; + cmd->fps_out_den = cmd->fps_in_den; + cmd->fps_out_flex = cmd->fps_in_flex = 0; + break; + case 3: + cmd->fps_out_num = cmd->fps_in_num; + cmd->fps_out_den = cmd->fps_in_den; + cmd->fps_out_flex = cmd->fps_in_flex; + break; + case 4: + cmd->fps_out_den = 1; + cmd->fps_out_flex = 0; + break; + case 5: + cmd->fps_out_flex = 0; + break; + case 6: + break; + default: + mpp_err("invalid in/out frame rate," + " use \"-r numerator:denominator:flex\"" + " for set the input to the same fps as the output, such as 50:1:1\n" + " or \"-r numerator:denominator/flex-numerator:denominator:flex\"" + " for set input and output separately, such as 40:1:1/30:1:0\n"); + goto PARSE_OPINIONS_OUT; + break; + } } else { mpp_err("invalid output frame rate\n"); goto PARSE_OPINIONS_OUT; @@ -454,7 +490,7 @@ static OptionInfo mpi_enc_cmd[] = { {"g", "gop_mode", "gop reference mode"}, {"d", "debug", "debug flag"}, {"b", "target bps", "set tareget bps"}, - {"r", "output frame rate", "set output frame rate"}, + {"r", "in/output fps", "set input and output frame rate"}, {"l", "loop count", "loop encoding times for each frame"}, }; diff --git a/utils/mpi_enc_utils.h b/utils/mpi_enc_utils.h index 7f745eb3..f811e131 100644 --- a/utils/mpi_enc_utils.h +++ b/utils/mpi_enc_utils.h @@ -35,8 +35,12 @@ typedef struct MpiEncTestArgs_t { RK_S32 ver_stride; RK_S32 bps_target; - RK_S32 fps_in; - RK_S32 fps_out; + RK_S32 fps_in_flex; + RK_S32 fps_in_num; + RK_S32 fps_in_den; + RK_S32 fps_out_flex; + RK_S32 fps_out_num; + RK_S32 fps_out_den; RK_S32 gop_mode;