mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-12-26 11:17:44 +01:00
[mpp_enc]: Use qp config in rc to setup encoder
1. Unify H.264/H.265/vp8 qp config 2. H.264/H.265 encoder setup default rc qp config. 3. Move rc_cfg process all to mpp_enc module. 4. Fix some encoder config in encoder test. Change-Id: I2a31c6abf904f1c16c2acd937c8d467d48db531d Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Signed-off-by: sayon.chen <sayon.chen@rock-chips.com>
This commit is contained in:
parent
f04fabc136
commit
17e3a2fefd
10 changed files with 341 additions and 608 deletions
|
|
@ -403,6 +403,34 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
|
|||
rc_cfg->gop = p->gop;
|
||||
rc_cfg->max_reenc_times = 1;
|
||||
|
||||
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
|
||||
/* constant QP mode qp is fixed */
|
||||
p->qp_max = p->qp_init;
|
||||
p->qp_min = p->qp_init;
|
||||
p->qp_step = 0;
|
||||
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
|
||||
/* constant bitrate do not limit qp range */
|
||||
p->qp_max = 48;
|
||||
p->qp_min = 4;
|
||||
p->qp_step = 16;
|
||||
p->qp_init = 0;
|
||||
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
|
||||
/* variable bitrate has qp min limit */
|
||||
p->qp_max = 40;
|
||||
p->qp_min = 12;
|
||||
p->qp_step = 8;
|
||||
p->qp_init = 0;
|
||||
}
|
||||
|
||||
rc_cfg->qp_max = p->qp_max;
|
||||
rc_cfg->qp_min = p->qp_min;
|
||||
rc_cfg->qp_max_i = p->qp_max;
|
||||
rc_cfg->qp_min_i = p->qp_min;
|
||||
rc_cfg->qp_init = p->qp_init;
|
||||
rc_cfg->qp_max_step = p->qp_step;
|
||||
rc_cfg->qp_delta_ip = 4;
|
||||
rc_cfg->qp_delta_vi = 2;
|
||||
|
||||
mpp_log("mpi_enc_test bps %d fps %d gop %d\n",
|
||||
rc_cfg->bps_target, rc_cfg->fps_out_num, rc_cfg->gop);
|
||||
ret = mpi->control(ctx, MPP_ENC_SET_RC_CFG, rc_cfg);
|
||||
|
|
@ -416,8 +444,7 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
|
|||
case MPP_VIDEO_CodingAVC : {
|
||||
codec_cfg->h264.change = MPP_ENC_H264_CFG_CHANGE_PROFILE |
|
||||
MPP_ENC_H264_CFG_CHANGE_ENTROPY |
|
||||
MPP_ENC_H264_CFG_CHANGE_TRANS_8x8 |
|
||||
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT;
|
||||
MPP_ENC_H264_CFG_CHANGE_TRANS_8x8;
|
||||
/*
|
||||
* H.264 profile_idc parameter
|
||||
* 66 - Baseline profile
|
||||
|
|
@ -437,29 +464,6 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
|
|||
codec_cfg->h264.entropy_coding_mode = 1;
|
||||
codec_cfg->h264.cabac_init_idc = 0;
|
||||
codec_cfg->h264.transform8x8_mode = 1;
|
||||
|
||||
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
|
||||
/* constant QP mode qp is fixed */
|
||||
p->qp_max = p->qp_init;
|
||||
p->qp_min = p->qp_init;
|
||||
p->qp_step = 0;
|
||||
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
|
||||
/* constant bitrate do not limit qp range */
|
||||
p->qp_max = 48;
|
||||
p->qp_min = 4;
|
||||
p->qp_step = 16;
|
||||
p->qp_init = 0;
|
||||
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
|
||||
/* variable bitrate has qp min limit */
|
||||
p->qp_max = 40;
|
||||
p->qp_min = 12;
|
||||
p->qp_step = 8;
|
||||
p->qp_init = 0;
|
||||
}
|
||||
|
||||
codec_cfg->h264.qp_max = p->qp_max;
|
||||
codec_cfg->h264.qp_min = p->qp_min;
|
||||
codec_cfg->h264.qp_init = p->qp_init;
|
||||
} break;
|
||||
case MPP_VIDEO_CodingMJPEG : {
|
||||
codec_cfg->jpeg.change = MPP_ENC_JPEG_CFG_CHANGE_QFACTOR;
|
||||
|
|
@ -467,14 +471,7 @@ MPP_RET test_mpp_setup(MpiEncTestData *p)
|
|||
codec_cfg->jpeg.qf_min = 1;
|
||||
codec_cfg->jpeg.qf_max = 99;
|
||||
} break;
|
||||
case MPP_VIDEO_CodingHEVC : {
|
||||
codec_cfg->h265.change = MPP_ENC_H265_CFG_INTRA_QP_CHANGE | MPP_ENC_H265_CFG_RC_QP_CHANGE;
|
||||
codec_cfg->h265.qp_init = -1;
|
||||
codec_cfg->h265.max_i_qp = 46;
|
||||
codec_cfg->h265.min_i_qp = 24;
|
||||
codec_cfg->h265.max_qp = 51;
|
||||
codec_cfg->h265.min_qp = 10;
|
||||
} break;
|
||||
case MPP_VIDEO_CodingHEVC :
|
||||
case MPP_VIDEO_CodingVP8 :
|
||||
default : {
|
||||
mpp_err_f("support encoder coding type %d\n", codec_cfg->coding);
|
||||
|
|
|
|||
|
|
@ -270,7 +270,6 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
|
|||
if (!p->bps)
|
||||
p->bps = p->width * p->height / 8 * (p->fps_out_num / p->fps_out_den);
|
||||
|
||||
|
||||
mpp_enc_cfg_set_s32(cfg, "prep:width", p->width);
|
||||
mpp_enc_cfg_set_s32(cfg, "prep:height", p->height);
|
||||
mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", p->hor_stride);
|
||||
|
|
@ -279,27 +278,6 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
|
|||
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:mode", p->rc_mode);
|
||||
|
||||
switch (p->rc_mode) {
|
||||
case MPP_ENC_RC_MODE_FIXQP : {
|
||||
/* do not set bps on fix qp mode */
|
||||
} break;
|
||||
case MPP_ENC_RC_MODE_CBR : {
|
||||
/* CBR mode has narrow bound */
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_target", p->bps);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16);
|
||||
} break;
|
||||
case MPP_ENC_RC_MODE_VBR : {
|
||||
/* CBR mode has wide bound */
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_target", p->bps);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 1 / 16);
|
||||
} break;
|
||||
default : {
|
||||
mpp_err_f("unsupport encoder rc mode %d\n", p->rc_mode);
|
||||
} break;
|
||||
}
|
||||
|
||||
/* fix input / output frame rate */
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:fps_in_flex", p->fps_in_flex);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:fps_in_num", p->fps_in_num);
|
||||
|
|
@ -314,6 +292,77 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
|
|||
mpp_enc_cfg_set_u32(cfg, "rc:drop_thd", 20); /* 20% of max bps */
|
||||
mpp_enc_cfg_set_u32(cfg, "rc:drop_gap", 1); /* Do not continuous drop frame */
|
||||
|
||||
/* setup bitrate for different rc_mode */
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_target", p->bps);
|
||||
switch (p->rc_mode) {
|
||||
case MPP_ENC_RC_MODE_FIXQP : {
|
||||
/* do not setup bitrate on FIXQP mode */
|
||||
} break;
|
||||
case MPP_ENC_RC_MODE_CBR : {
|
||||
/* CBR mode has narrow bound */
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16);
|
||||
} break;
|
||||
case MPP_ENC_RC_MODE_VBR :
|
||||
case MPP_ENC_RC_MODE_AVBR : {
|
||||
/* VBR mode has wide bound */
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 1 / 16);
|
||||
} break;
|
||||
default : {
|
||||
/* default use CBR mode */
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16);
|
||||
} break;
|
||||
}
|
||||
|
||||
/* setup qp for different codec and rc_mode */
|
||||
switch (p->type) {
|
||||
case MPP_VIDEO_CodingAVC :
|
||||
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", 4);
|
||||
} break;
|
||||
case MPP_ENC_RC_MODE_CBR :
|
||||
case MPP_ENC_RC_MODE_VBR :
|
||||
case MPP_ENC_RC_MODE_AVBR : {
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 26);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 51);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 10);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 51);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 10);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 4);
|
||||
} break;
|
||||
default : {
|
||||
mpp_err_f("unsupport encoder rc mode %d\n", p->rc_mode);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case MPP_VIDEO_CodingVP8 : {
|
||||
/* vp8 only setup base qp range */
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 40);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 127);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 0);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 127);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 0);
|
||||
mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 6);
|
||||
} break;
|
||||
case MPP_VIDEO_CodingMJPEG : {
|
||||
/* jpeg use special codec config to control qtable */
|
||||
mpp_enc_cfg_set_s32(cfg, "jpeg:q_factor", 80);
|
||||
mpp_enc_cfg_set_s32(cfg, "jpeg:qf_max", 99);
|
||||
mpp_enc_cfg_set_s32(cfg, "jpeg:qf_min", 1);
|
||||
} break;
|
||||
default : {
|
||||
} break;
|
||||
}
|
||||
|
||||
/* setup codec */
|
||||
mpp_enc_cfg_set_s32(cfg, "codec:type", p->type);
|
||||
switch (p->type) {
|
||||
|
|
@ -337,40 +386,10 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
|
|||
mpp_enc_cfg_set_s32(cfg, "h264:cabac_en", 1);
|
||||
mpp_enc_cfg_set_s32(cfg, "h264:cabac_idc", 0);
|
||||
mpp_enc_cfg_set_s32(cfg, "h264:trans8x8", 1);
|
||||
|
||||
if (p->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
|
||||
mpp_enc_cfg_set_s32(cfg, "h264:qp_init", 20);
|
||||
mpp_enc_cfg_set_s32(cfg, "h264:qp_max", 16);
|
||||
mpp_enc_cfg_set_s32(cfg, "h264:qp_min", 16);
|
||||
mpp_enc_cfg_set_s32(cfg, "h264:qp_max_i", 20);
|
||||
mpp_enc_cfg_set_s32(cfg, "h264:qp_min_i", 20);
|
||||
} else {
|
||||
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", 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);
|
||||
mpp_enc_cfg_set_s32(cfg, "jpeg:qf_max", 99);
|
||||
mpp_enc_cfg_set_s32(cfg, "jpeg:qf_min", 1);
|
||||
} break;
|
||||
case MPP_VIDEO_CodingHEVC :
|
||||
case MPP_VIDEO_CodingMJPEG :
|
||||
case MPP_VIDEO_CodingVP8 : {
|
||||
mpp_enc_cfg_set_s32(cfg, "vp8:qp_init", 40);
|
||||
mpp_enc_cfg_set_s32(cfg, "vp8:qp_max", 127);
|
||||
mpp_enc_cfg_set_s32(cfg, "vp8:qp_min", 0);
|
||||
mpp_enc_cfg_set_s32(cfg, "vp8:qp_max_i", 127);
|
||||
mpp_enc_cfg_set_s32(cfg, "vp8:qp_min_i", 0);
|
||||
} break;
|
||||
case MPP_VIDEO_CodingHEVC : {
|
||||
mpp_enc_cfg_set_s32(cfg, "h265:qp_init", p->rc_mode == MPP_ENC_RC_MODE_FIXQP ? -1 : 26);
|
||||
mpp_enc_cfg_set_s32(cfg, "h265:qp_max", 51);
|
||||
mpp_enc_cfg_set_s32(cfg, "h265:qp_min", 10);
|
||||
mpp_enc_cfg_set_s32(cfg, "h265:qp_max_i", 46);
|
||||
mpp_enc_cfg_set_s32(cfg, "h265:qp_min_i", 24);
|
||||
} break;
|
||||
default : {
|
||||
mpp_err_f("unsupport encoder coding type %d\n", p->type);
|
||||
|
|
@ -689,7 +708,7 @@ MPP_RET test_mpp_run(MpiEncTestData *p)
|
|||
}
|
||||
|
||||
log_len += snprintf(log_buf + log_len, log_size - log_len,
|
||||
" size %-7d", len);
|
||||
" size %-7u", len);
|
||||
|
||||
if (mpp_packet_has_meta(packet)) {
|
||||
meta = mpp_packet_get_meta(packet);
|
||||
|
|
|
|||
|
|
@ -558,6 +558,12 @@ static MPP_RET mpi_rc_enc_init(MpiRc2TestCtx *ctx)
|
|||
rc_cfg->fps_out_flex = 0;
|
||||
rc_cfg->gop = 60;
|
||||
rc_cfg->max_reenc_times = 1;
|
||||
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
|
||||
/* constant QP mode qp is fixed */
|
||||
rc_cfg->qp_max = 26;
|
||||
rc_cfg->qp_min = 26;
|
||||
rc_cfg->qp_init = 26;
|
||||
}
|
||||
|
||||
ret = enc_mpi->control(*enc_ctx, MPP_ENC_SET_RC_CFG, rc_cfg);
|
||||
if (ret) {
|
||||
|
|
@ -587,14 +593,6 @@ static MPP_RET mpi_rc_enc_init(MpiRc2TestCtx *ctx)
|
|||
codec_cfg->h264.entropy_coding_mode = 1;
|
||||
codec_cfg->h264.cabac_init_idc = 0;
|
||||
|
||||
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
|
||||
/* constant QP mode qp is fixed */
|
||||
codec_cfg->h264.qp_max = 26;
|
||||
codec_cfg->h264.qp_min = 26;
|
||||
codec_cfg->h264.qp_init = 26;
|
||||
codec_cfg->h264.change |= MPP_ENC_H264_CFG_CHANGE_QP_LIMIT;
|
||||
}
|
||||
|
||||
ret = enc_mpi->control(*enc_ctx, MPP_ENC_SET_CODEC_CFG, codec_cfg);
|
||||
if (ret) {
|
||||
mpp_err("mpi control enc set codec cfg failed ret %d\n", ret);
|
||||
|
|
|
|||
|
|
@ -595,6 +595,21 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
|
|||
rc_cfg->fps_out_flex = 0;
|
||||
rc_cfg->gop = fps;
|
||||
rc_cfg->max_reenc_times = 1;
|
||||
rc_cfg->qp_init = -1;
|
||||
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
|
||||
/* constant QP mode qp is fixed */
|
||||
rc_cfg->qp_init = 26;
|
||||
rc_cfg->qp_max = 26;
|
||||
rc_cfg->qp_min = 26;
|
||||
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_CBR) {
|
||||
/* constant bitrate do not limit qp range */
|
||||
rc_cfg->qp_max = 48;
|
||||
rc_cfg->qp_min = 4;
|
||||
} else if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_VBR) {
|
||||
/* variable bitrate has qp min limit */
|
||||
rc_cfg->qp_max = 40;
|
||||
rc_cfg->qp_min = 12;
|
||||
}
|
||||
|
||||
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_RC_CFG, rc_cfg);
|
||||
if (ret) {
|
||||
|
|
@ -618,8 +633,7 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
|
|||
|
||||
codec_cfg->coding = type;
|
||||
codec_cfg->h264.change = MPP_ENC_H264_CFG_CHANGE_PROFILE |
|
||||
MPP_ENC_H264_CFG_CHANGE_ENTROPY |
|
||||
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT;
|
||||
MPP_ENC_H264_CFG_CHANGE_ENTROPY;
|
||||
/*
|
||||
* H.264 profile_idc parameter
|
||||
* 66 - Baseline profile
|
||||
|
|
@ -639,21 +653,6 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
|
|||
codec_cfg->h264.entropy_coding_mode = 1;
|
||||
codec_cfg->h264.cabac_init_idc = 0;
|
||||
|
||||
codec_cfg->h264.qp_init = 0;
|
||||
if (rc_cfg->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
|
||||
/* constant QP mode qp is fixed */
|
||||
codec_cfg->h264.qp_init = 26;
|
||||
codec_cfg->h264.qp_max = 26;
|
||||
codec_cfg->h264.qp_min = 26;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_CODEC_CFG, codec_cfg);
|
||||
if (ret) {
|
||||
mpp_err("mpi control enc set codec cfg failed ret %d\n", ret);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue