diff --git a/mpp/codec/enc/h264/src/encasiccontroller.c b/mpp/codec/enc/h264/src/encasiccontroller.c index 9ed1bc4a..cedaf70f 100644 --- a/mpp/codec/enc/h264/src/encasiccontroller.c +++ b/mpp/codec/enc/h264/src/encasiccontroller.c @@ -102,7 +102,7 @@ void EncAsicFrameStart(void * inst, regValues_s * val, h264e_syntax *syntax_data syntax_data->target_error[iCount] = val->targetError[iCount]; } for (iCount = 0; iCount < 7; ++iCount) { - syntax_data->delta_qp[iCount] = val->deltaQp[6-iCount]; + syntax_data->delta_qp[iCount] = val->deltaQp[6 - iCount]; } } syntax_data->output_strm_limit_size = val->outputStrmSize; diff --git a/mpp/codec/enc/h264/src/h264e_api.c b/mpp/codec/enc/h264/src/h264e_api.c index 915534e0..45154f12 100644 --- a/mpp/codec/enc/h264/src/h264e_api.c +++ b/mpp/codec/enc/h264/src/h264e_api.c @@ -388,6 +388,11 @@ MPP_RET h264e_config(void *ctx, RK_S32 cmd, void *param) *((RK_U32*)param) = getOutputStreamSize(enc); ret = MPP_OK; } break; + case SET_IDR_FRAME : { + H264EncRateCtrl *enc_rc_cfg = &enc->enc_rc_cfg; + enc->intraPeriodCnt = enc_rc_cfg->intraPicRate; + ret = MPP_OK; + } break; default: mpp_err("No correspond cmd found, and can not config!"); break; diff --git a/mpp/codec/inc/encoder_codec_api.h b/mpp/codec/inc/encoder_codec_api.h index 6146fa28..84542fdb 100644 --- a/mpp/codec/inc/encoder_codec_api.h +++ b/mpp/codec/inc/encoder_codec_api.h @@ -31,6 +31,7 @@ typedef enum EncCfgCmd_t { SET_ENC_RC_CFG, GET_ENC_EXTRA_INFO, GET_OUTPUT_STREAM_SIZE, + SET_IDR_FRAME, } EncCfgCmd; /* diff --git a/mpp/codec/mpp_enc.cpp b/mpp/codec/mpp_enc.cpp index 5ca6045e..bae38a84 100644 --- a/mpp/codec/mpp_enc.cpp +++ b/mpp/codec/mpp_enc.cpp @@ -420,10 +420,12 @@ MPP_RET mpp_enc_control(MppEnc *enc, MpiCmd cmd, void *param) *mpp_cfg = enc->mpp_cfg; ret = MPP_OK; } break; + case MPP_ENC_SET_IDR_FRAME : { + ret = controller_config(enc->controller, SET_IDR_FRAME, param); + } break; case MPP_ENC_GET_EXTRA_INFO : case MPP_ENC_SET_RC_CFG : case MPP_ENC_GET_RC_CFG : - case MPP_ENC_SET_IDR_FRAME : case MPP_ENC_SET_OSD_PLT_CFG : case MPP_ENC_SET_OSD_DATA_CFG : case MPP_ENC_SET_SEI_CFG : diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index adacfce0..13812b71 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -35,6 +35,8 @@ #define MPI_ENC_IO_COUNT (4) #define MAX_FILE_NAME_LENGTH 256 +#define MPI_ENC_TEST_SET_IDR_FRAME 0 + typedef struct { char file_input[MAX_FILE_NAME_LENGTH]; char file_output[MAX_FILE_NAME_LENGTH]; @@ -409,6 +411,17 @@ int mpi_enc_test(MpiEncTestCmd *cmd) mpp_task_meta_set_packet(task, KEY_OUTPUT_PACKET, packet); mpp_task_meta_set_buffer(task, KEY_MOTION_INFO, md_info_buf); + /* set idr frame */ +#if MPI_ENC_TEST_SET_IDR_FRAME + if (frame_count && frame_count % (mpp_cfg.gop / 4) == 0) { + ret = mpi->control(ctx, MPP_ENC_SET_IDR_FRAME, NULL); + if (MPP_OK != ret) { + mpp_err("mpi control enc set idr frame failed\n"); + goto MPP_TEST_OUT; + } + } +#endif + /* gen and cfg osd plt */ mpi_enc_gen_osd_data(&osd_data, osd_data_buf, frame_count); ret = mpi->control(ctx, MPP_ENC_SET_OSD_DATA_CFG, &osd_data);