diff --git a/inc/rk_mpi.h b/inc/rk_mpi.h index eab23c62..ab13c24c 100644 --- a/inc/rk_mpi.h +++ b/inc/rk_mpi.h @@ -172,7 +172,6 @@ typedef struct MppEncConfig_t { RK_S32 profile; RK_S32 level; RK_S32 cabac_en; - RK_S32 trans8x8_en; } MppEncConfig; /* diff --git a/inc/vpu_api.h b/inc/vpu_api.h index 6e5f517e..92cf4740 100644 --- a/inc/vpu_api.h +++ b/inc/vpu_api.h @@ -221,8 +221,8 @@ typedef enum VPU_FRAME_ERR { typedef struct EncParameter { RK_S32 width; RK_S32 height; - RK_S32 rc_mode; - RK_S32 bitRate; + RK_S32 rc_mode; /* 0 - CQP mode; 1 - CBR mode; */ + RK_S32 bitRate; /* target bitrate */ RK_S32 framerate; RK_S32 qp; RK_S32 enableCabac; diff --git a/mpp/codec/mpp_enc.cpp b/mpp/codec/mpp_enc.cpp index eaab5f50..43567445 100644 --- a/mpp/codec/mpp_enc.cpp +++ b/mpp/codec/mpp_enc.cpp @@ -399,53 +399,52 @@ MPP_RET mpp_enc_control(MppEnc *enc, MpiCmd cmd, void *param) } // TODO - MppEncConfig *mppCfg = (MppEncConfig*)param; + MppEncConfig *mpp_cfg = (MppEncConfig*)param; H264EncConfig *encCfg = &(enc->encCfg); switch (cmd) { case MPP_ENC_SET_CFG: - encCfg->streamType = H264ENC_BYTE_STREAM;//H264ENC_NAL_UNIT_STREAM; // decide whether stream start with start code,e.g."00 00 00 01" + //H264ENC_NAL_UNIT_STREAM; // decide whether stream start with start code,e.g."00 00 00 01" + encCfg->streamType = H264ENC_BYTE_STREAM; encCfg->frameRateDenom = 1; - if (0 != mppCfg->profile) - encCfg->profile = (h264e_profile)mppCfg->profile; + if (mpp_cfg->profile) + encCfg->profile = (h264e_profile)mpp_cfg->profile; else encCfg->profile = H264_PROFILE_BASELINE; - if (0 != mppCfg->level) - encCfg->level = (H264EncLevel)mppCfg->level; + if (mpp_cfg->level) + encCfg->level = (H264EncLevel)mpp_cfg->level; else encCfg->level = H264ENC_LEVEL_4_0; - if (0 != mppCfg->width && 0 != mppCfg->height) { - encCfg->width = mppCfg->width; - encCfg->height = mppCfg->height; - mpp_log("width %d height %d", encCfg->width, encCfg->height); + if (mpp_cfg->width && mpp_cfg->height) { + encCfg->width = mpp_cfg->width; + encCfg->height = mpp_cfg->height; } else - mpp_err("Width or height is not set, width %d height %d", mppCfg->width, mppCfg->height); - if (0 != mppCfg->fps_in) - encCfg->frameRateNum = mppCfg->fps_in; + mpp_err("width %d height %d is not available\n", mpp_cfg->width, mpp_cfg->height); + if (mpp_cfg->fps_in) + encCfg->frameRateNum = mpp_cfg->fps_in; else encCfg->frameRateNum = 30; - if (mppCfg->gop > 0) - encCfg->intraPicRate = mppCfg->gop; + if (mpp_cfg->gop > 0) + encCfg->intraPicRate = mpp_cfg->gop; else encCfg->intraPicRate = 30; - if (0 != mppCfg->cabac_en) - encCfg->enable_cabac = mppCfg->cabac_en; // TODO + if (mpp_cfg->cabac_en) + encCfg->enable_cabac = mpp_cfg->cabac_en; else encCfg->enable_cabac = 0; - if (0 != mppCfg->trans8x8_en) - encCfg->transform8x8_mode = mppCfg->trans8x8_en; // TODO - else - encCfg->transform8x8_mode = 0; + + encCfg->transform8x8_mode = (encCfg->profile >= H264_PROFILE_HIGH) ? (1) : (0); encCfg->chroma_qp_index_offset = 2; // TODO - encCfg->pic_init_qp = 26; // TODO + encCfg->pic_init_qp = mpp_cfg->qp; // TODO encCfg->keyframe_max_interval = 150; // TODO encCfg->second_chroma_qp_index_offset = 2; // TODO - encCfg->pps_id = 0; // TODO - encCfg->input_image_format = H264ENC_YUV420_SEMIPLANAR; // TODO + encCfg->pps_id = 0; + encCfg->input_image_format = H264ENC_YUV420_SEMIPLANAR; controller_config(enc->controller, SET_ENC_CFG, (void *)encCfg); mpp_extra_info_generate(&(enc->extra_info_cfg), &(enc->encCfg)); + mpp_hal_control(enc->hal, MPP_ENC_SET_EXTRA_INFO, (void*)(&(enc->extra_info_cfg))); mpp_hal_control(enc->hal, MPP_ENC_GET_EXTRA_INFO, (void*)(&(enc->extra_info))); diff --git a/mpp/legacy/vpu_api_legacy.cpp b/mpp/legacy/vpu_api_legacy.cpp index a7e6d25e..9469a82d 100644 --- a/mpp/legacy/vpu_api_legacy.cpp +++ b/mpp/legacy/vpu_api_legacy.cpp @@ -31,6 +31,20 @@ RK_U32 vpu_api_debug = 0; +static RK_U32 hevc_ver_align_8(RK_U32 val) +{ + return MPP_ALIGN(val, 8); +} + +static RK_U32 hevc_ver_align_256_odd(RK_U32 val) +{ + return MPP_ALIGN(val, 256) | 256; +} + +static RK_U32 default_align_16(RK_U32 val) +{ + return MPP_ALIGN(val, 16); +} VpuApiLegacy::VpuApiLegacy() : mpp_ctx(NULL), @@ -43,7 +57,6 @@ VpuApiLegacy::VpuApiLegacy() : memGroup(NULL), pictureMem(NULL), outbufMem(NULL), - outData(NULL), use_fd_flag(0), mEosSet(0) { @@ -76,10 +89,7 @@ VpuApiLegacy::~VpuApiLegacy() mpp_err("memGroup deInit"); mpp_buffer_group_put(memGroup); } - if (outData != NULL) { - free(outData); - outData = NULL; - } + mpp_destroy(mpp_ctx); vpu_api_dbg_func("leave\n"); @@ -133,28 +143,40 @@ RK_S32 VpuApiLegacy::init(VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_s return ret; } - if (MPP_CTX_ENC == type && mpp_ctx) { - EncParameter_t *encParam = (EncParameter_t*)ctx->private_data; - MppEncConfig encCfg; - memset(&encCfg, 0, sizeof(MppEncConfig)); - // TODO - if (0 != encParam->width && 0 != encParam->height) { - encCfg.width = encParam->width; - encCfg.height = encParam->height; - } else - mpp_err("Width and height is not set."); - outData = (RK_U8*)malloc(encParam->width * encParam->height); - if (0 != encParam->levelIdc) - encCfg.level = encParam->levelIdc; - if (0 != encParam->framerate) - encCfg.fps_in = encParam->framerate; - if (0 != encParam->framerateout) - encCfg.fps_out = encParam->framerateout; + if (MPP_CTX_ENC == type) { + EncParameter_t *param = (EncParameter_t*)ctx->private_data; + MppEncConfig mpp_cfg; + + memset(&mpp_cfg, 0, sizeof(mpp_cfg)); + + mpp_log("setup encoder rate control config:\n"); + mpp_log("width %4d height %4d format %d\n", param->width, param->height, param->format); + mpp_log("rc_mode %s qp %d bps %d\n", (param->rc_mode) ? ("VBR") : ("CQP"), param->qp, param->bitRate); + mpp_log("fps in %d fps out %d gop %d\n", param->framerate, param->framerateout, param->intraPicRate); + mpp_log("setup encoder stream feature config:\n"); + mpp_log("profile %d level %d cabac %d\n", param->profileIdc, param->levelIdc, param->enableCabac); + + mpp_assert(param->width); + mpp_assert(param->height); + + mpp_cfg.width = param->width; + mpp_cfg.height = param->height; + mpp_cfg.format = param->format; + mpp_cfg.rc_mode = param->rc_mode; + mpp_cfg.bps = param->bitRate; + mpp_cfg.fps_in = param->framerate; + if (param->framerateout) + mpp_cfg.fps_out = param->framerateout; else - encCfg.fps_out = encParam->framerate; - if (0 != encParam->intraPicRate) - encCfg.gop = encParam->intraPicRate; - mpi->control(mpp_ctx, MPP_ENC_SET_CFG, &encCfg); // input parameter config + mpp_cfg.fps_out = param->framerate; + mpp_cfg.qp = (param->qp) ? (param->qp) : (26); + mpp_cfg.gop = param->intraPicRate; + + mpp_cfg.profile = param->profileIdc; + mpp_cfg.level = param->levelIdc; + mpp_cfg.cabac_en = param->enableCabac; + + mpi->control(mpp_ctx, MPP_ENC_SET_CFG, &mpp_cfg); if (mpp_enc_get_extra_data_size(mpp_ctx) > 0) { ctx->extradata_size = mpp_enc_get_extra_data_size(mpp_ctx); @@ -577,9 +599,8 @@ RK_S32 VpuApiLegacy::encoder_sendframe(VpuCodecContext *ctx, EncInputStream_t *a info.size = aEncInStrm->size; info.fd = aEncInStrm->bufPhyAddr; - mpp_log_f("aEncInStrm->nFlags %d size %d pts %lld\n", - aEncInStrm->nFlags, aEncInStrm->size, aEncInStrm->timeUs); - vpu_api_dbg_input("input info fd %d size %d\n", info.fd, info.size); + vpu_api_dbg_input("input fd %d size %d flag %d pts %lld\n", + info.fd, info.size, aEncInStrm->timeUs, aEncInStrm->nFlags); ret = mpp_frame_init(&frame); if (MPP_OK != ret) { @@ -683,20 +704,6 @@ RK_S32 VpuApiLegacy::perform(RK_U32 cmd, RK_U32 *data) return 0; } -static RK_U32 hevc_ver_align_8(RK_U32 val) -{ - return MPP_ALIGN(val, 8); -} - -static RK_U32 hevc_ver_align_256_odd(RK_U32 val) -{ - return MPP_ALIGN(val, 256) | 256; -} - -static RK_U32 default_align_16(RK_U32 val) -{ - return MPP_ALIGN(val, 16); -} RK_S32 VpuApiLegacy::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param) { vpu_api_dbg_func("enter\n"); diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index ebabdba1..2ef1cfba 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -498,27 +498,6 @@ MPP_RET Mpp::control(MpiCmd cmd, MppParam param) return ret; } -MPP_RET Mpp::config(MpiCmd cmd, MppEncConfig cfg) -{ - switch (cmd) { - case MPP_ENC_SET_CFG: - mEnc = mpp_calloc(MppEnc, 1); - if (NULL == mEnc) { - mpp_err_f("failed to malloc context\n"); - return MPP_ERR_NULL_PTR; - } - mEnc->mpp = this; // TODO put these code into config function - - mpp_enc_control(mEnc, cmd, &cfg); - break; - default: - mpp_log("MpiCmd is not found in mpi_config."); - break; - } - - return MPP_OK; -} - MPP_RET Mpp::reset() { if (!mInitDone) @@ -667,8 +646,8 @@ MPP_RET Mpp::control_enc(MpiCmd cmd, MppParam param) switch (cmd) { case MPP_ENC_SET_CFG : { - if (mEnc) - ret = mpp_enc_control(mEnc, cmd, param); + mpp_assert(mEnc); + ret = mpp_enc_control(mEnc, cmd, param); } break; default : { } break; diff --git a/mpp/mpp.h b/mpp/mpp.h index cc97d212..f4b07b50 100644 --- a/mpp/mpp.h +++ b/mpp/mpp.h @@ -76,7 +76,6 @@ public: MPP_RET reset(); MPP_RET control(MpiCmd cmd, MppParam param); - MPP_RET config(MpiCmd cmd, MppEncConfig cfg); mpp_list *mPackets; mpp_list *mFrames;