[mpp_enc]: fix crash in vpu_api_legacy.cpp

[mpi]: use new control macro system

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@1050 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
ChenHengming
2016-07-20 07:54:31 +00:00
parent 7c00f5b2a6
commit 1a2551ec3e
11 changed files with 232 additions and 126 deletions

View File

@@ -22,6 +22,7 @@
typedef enum {
MPP_CTX_DEC,
MPP_CTX_ENC,
MPP_CTX_ISP,
MPP_CTX_BUTT,
} MppCtxType;
@@ -58,36 +59,62 @@ typedef enum {
MPP_VIDEO_CodingMax = 0x7FFFFFFF
} MppCodingType;
/*
* Command id bit usage is defined as follows:
* bit 20 - 23 - module id
* bit 16 - 19 - contex id
* bit 0 - 15 - command id
*/
#define CMD_MODULE_ID_MASK (0x00F00000)
#define CMD_MODULE_OSAL (0x00100000)
#define CMD_MODULE_MPP (0x00200000)
#define CMD_MODULE_CODEC (0x00300000)
#define CMD_MODULE_HAL (0x00400000)
#define CMD_CTX_ID_MASK (0x000F0000)
#define CMD_CTX_ID_DEC (0x00010000)
#define CMD_CTX_ID_ENC (0x00020000)
#define CMD_CTX_ID_ISP (0x00030000)
#define CMD_ID_MASK (0x0000FFFF)
typedef enum {
MPP_CMD_BASE = 0,
MPP_OSAL_CMD_BASE = CMD_MODULE_OSAL,
MPP_OSAL_CMD_END,
MPP_CMD_BASE = CMD_MODULE_MPP,
MPP_ENABLE_DEINTERLACE,
MPP_SET_OUTPUT_BLOCK,
MPP_CMD_END,
MPP_HAL_CMD_BASE = 0x10000,
MPP_OSAL_CMD_BASE = 0x20000,
MPP_CODEC_CMD_BASE = 0x30000,
MPP_CODEC_SET_INFO_CHANGE_READY,
MPP_CODEC_SET_FRAME_INFO,
MPP_CODEC_CMD_BASE = CMD_MODULE_CODEC,
MPP_CODEC_GET_FRAME_INFO,
MPP_CODEC_GET_VPUMEM_USED_COUNT,
MPP_CODEC_CMD_END,
MPP_DEC_CMD_BASE = 0x40000,
MPP_DEC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_DEC,
MPP_DEC_SET_FRAME_INFO, /* vpu api legacy control for buffer slot dimension init */
MPP_DEC_SET_EXT_BUF_GROUP, /* IMPORTANT: set external buffer group to mpp decoder */
MPP_DEC_SET_INFO_CHANGE_READY,
MPP_DEC_SET_INTERNAL_PTS_ENABLE,
MPP_DEC_SET_VC1_EXTRA_DATA,
MPP_DEC_SET_PARSER_SPLIT_MODE, /* Need to setup before init */
MPP_DEC_SET_PARSER_FAST_MODE, /* Need to setup before init */
MPP_DEC_GET_STREAM_COUNT,
MPP_DEC_GET_VPUMEM_USED_COUNT,
MPP_DEC_SET_VC1_EXTRA_DATA,
MPP_DEC_CMD_END,
MPP_ENC_CMD_BASE = 0x50000,
MPP_ENC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ENC,
MPP_ENC_SET_CFG,
MPP_ENC_GET_CFG,
MPP_ENC_SET_EXTRA_INFO,
MPP_ENC_GET_EXTRA_INFO,
MPP_ENC_SETCFG,
MPP_ENC_GETCFG,
MPP_ENC_SETFORMAT,
MPP_ENC_SETIDRFRAME,
MPP_ENC_SET_FORMAT,
MPP_ENC_SET_IDR_FRAME,
MPP_ENC_CMD_END,
MPP_ISP_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ISP,
MPP_ISP_CMD_END,
MPP_HAL_CMD_BASE = CMD_MODULE_HAL,
MPP_HAL_CMD_END,
MPI_CMD_BUTT,
} MpiCmd;
@@ -177,7 +204,6 @@ typedef struct MppEncConfig_t {
* reset : discard all packet and frame, reset all component,
* for both decoder and encoder
* control : control function for mpp property setting
* config : config function for encoder, not implement yet.
*/
typedef struct MppApi_t {
RK_U32 size;
@@ -203,7 +229,6 @@ typedef struct MppApi_t {
// control interface
MPP_RET (*reset)(MppCtx ctx);
MPP_RET (*control)(MppCtx ctx, MpiCmd cmd, MppParam param);
MPP_RET (*config)(MppCtx ctx, MpiCmd cmd, MppEncConfig cfg);
RK_U32 reserv[16];
} MppApi;

View File

@@ -53,7 +53,7 @@ void *mpp_enc_hal_thread(void *data);
MPP_RET mpp_enc_init(MppEnc *enc, MppCodingType coding);
MPP_RET mpp_enc_deinit(MppEnc *enc);
MPP_RET mpp_enc_config(MppEnc *enc, MpiCmd cmd, void *param);
MPP_RET mpp_enc_control(MppEnc *enc, MpiCmd cmd, void *param);
MPP_RET mpp_enc_notify(void *ctx, void *info);
MPP_RET mpp_enc_reset(MppEnc *enc);

View File

@@ -958,7 +958,7 @@ MPP_RET mpp_dec_control(MppDec *dec, MpiCmd cmd, void *param)
mpp_hal_control(dec->hal, cmd, param);
switch (cmd) {
case MPP_CODEC_SET_FRAME_INFO : {
case MPP_DEC_SET_FRAME_INFO : {
VPU_GENERIC *p = (VPU_GENERIC *)param;
MppFrame frame = NULL;
mpp_frame_init(&frame);
@@ -971,7 +971,7 @@ MPP_RET mpp_dec_control(MppDec *dec, MpiCmd cmd, void *param)
mpp_slots_set_prop(dec->frame_slots, SLOTS_FRAME_INFO, frame);
mpp_frame_deinit(&frame);
} break;
case MPP_CODEC_GET_VPUMEM_USED_COUNT: {
case MPP_DEC_GET_VPUMEM_USED_COUNT: {
RK_S32 *p = (RK_S32 *)param;
*p = mpp_buf_slot_get_used_size(dec->frame_slots);
} break;

View File

@@ -299,7 +299,7 @@ MPP_RET mpp_enc_notify(void *ctx, void *info)
return MPP_OK;
}
MPP_RET mpp_enc_config(MppEnc *enc, MpiCmd cmd, void *param)
MPP_RET mpp_enc_control(MppEnc *enc, MpiCmd cmd, void *param)
{
if (NULL == enc) {
mpp_err_f("found NULL input enc %p\n", enc);
@@ -311,7 +311,7 @@ MPP_RET mpp_enc_config(MppEnc *enc, MpiCmd cmd, void *param)
H264EncConfig *encCfg = &(enc->encCfg);
switch (cmd) {
case MPP_ENC_SETCFG:
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"
encCfg->frameRateDenom = 1;
if (0 != mppCfg->profile)

View File

@@ -539,7 +539,7 @@ MPP_RET rkv_h264d_control(void *hal, RK_S32 cmd_type, void *param)
INP_CHECK(ret, NULL == p_hal);
FunctionIn(p_hal->logctx.parr[RUN_HAL]);
switch ((MpiCmd)cmd_type) {
case MPP_CODEC_SET_FRAME_INFO: {
case MPP_DEC_SET_FRAME_INFO: {
VPU_GENERIC *p = (VPU_GENERIC *)param;
if (p->CodecType == MPP_FMT_YUV422SP) {
mpp_slots_set_prop(p_hal->frame_slots, SLOTS_LEN_ALIGN, rkv_len_align_422);

View File

@@ -117,7 +117,14 @@ RK_S32 VpuApiLegacy::init(VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_s
mpp_err("found invalid context input");
return MPP_ERR_NULL_PTR;
}
if (MPP_CTX_ENC == type) {
ret = mpp_init(mpp_ctx, type, (MppCodingType)ctx->videoCoding);
if (ret) {
mpp_err_f(" init error. \n");
return ret;
}
if (MPP_CTX_ENC == type && mpp_ctx) {
EncParameter_t *encParam = (EncParameter_t*)ctx->private_data;
MppEncConfig encCfg;
memset(&encCfg, 0, sizeof(MppEncConfig));
@@ -138,15 +145,8 @@ RK_S32 VpuApiLegacy::init(VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_s
encCfg.fps_out = encParam->framerate;
if (0 != encParam->intraPicRate)
encCfg.gop = encParam->intraPicRate;
mpi->config(mpp_ctx, MPP_ENC_SETCFG, encCfg); // input parameter config
}
ret = mpp_init(mpp_ctx, type, (MppCodingType)ctx->videoCoding);
if (ret) {
mpp_err_f(" init error. \n");
return ret;
}
// TODO
if(MPP_CTX_ENC == type) {
mpi->control(mpp_ctx, MPP_ENC_SET_CFG, &encCfg); // input parameter config
if (mpp_enc_get_extra_data_size(mpp_ctx) > 0) {
ctx->extradata_size = mpp_enc_get_extra_data_size(mpp_ctx);
ctx->extradata = mpp_enc_get_extra_data(mpp_ctx);
@@ -603,7 +603,7 @@ RK_S32 VpuApiLegacy::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param)
case VPU_API_SET_DEFAULT_WIDTH_HEIGH: {
RK_U32 ImgWidth = 0;
VPU_GENERIC *p = (VPU_GENERIC *)param;
mpicmd = MPP_CODEC_SET_FRAME_INFO;
mpicmd = MPP_DEC_SET_FRAME_INFO;
/**hightest of p->ImgWidth bit show current dec bitdepth
* 0 - 8bit
* 1 - 10bit
@@ -628,7 +628,7 @@ RK_S32 VpuApiLegacy::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param)
break;
}
case VPU_API_SET_INFO_CHANGE: {
mpicmd = MPP_CODEC_SET_INFO_CHANGE_READY;
mpicmd = MPP_DEC_SET_INFO_CHANGE_READY;
break;
}
case VPU_API_USE_FAST_MODE: {
@@ -640,7 +640,7 @@ RK_S32 VpuApiLegacy::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param)
break;
}
case VPU_API_GET_VPUMEM_USED_COUNT: {
mpicmd = MPP_CODEC_GET_VPUMEM_USED_COUNT;
mpicmd = MPP_DEC_GET_VPUMEM_USED_COUNT;
break;
}
default: {

View File

@@ -57,24 +57,6 @@ static MPP_RET _check_mpp_ctx(MpiImpl *p, const char *caller)
return MPP_OK;
}
static MPP_RET mpi_config(MppCtx ctx, MpiCmd cmd, MppEncConfig cfg)
{
MPP_RET ret = MPP_NOK;
MpiImpl *p = (MpiImpl *)ctx;
mpi_dbg_func("enter ctx %p cfg %p\n", ctx, cfg);
do {
ret = check_mpp_ctx(p);
if (ret)
break;
ret = p->ctx->config(cmd, cfg); // configure parameter set
} while (0);
mpi_dbg_func("leave ret %d\n", ret);
return ret;
}
static MPP_RET mpi_decode(MppCtx ctx, MppPacket packet, MppFrame *frame)
{
MPP_RET ret = MPP_NOK;
@@ -351,7 +333,6 @@ static MppApi mpp_api = {
mpi_enqueue,
mpi_reset,
mpi_control,
mpi_config,
{0},
};

View File

@@ -363,74 +363,54 @@ MPP_RET Mpp::enqueue(MppPortType type, MppTask task)
MPP_RET Mpp::control(MpiCmd cmd, MppParam param)
{
switch (cmd) {
case MPP_DEC_SET_EXT_BUF_GROUP: {
mpp_log("mpi_control group %p\n", param);
mFrameGroup = (MppBufferGroup)param;
mpp_buffer_group_set_listener((MppBufferGroupImpl *)param, (void *)mThreadCodec);
mpp_log("signal codec thread\n");
mThreadCodec->signal();
break;
}
case MPP_SET_OUTPUT_BLOCK: {
RK_U32 block = *((RK_U32 *)param);
mOutputBlock = block;
break;
}
case MPP_CODEC_SET_INFO_CHANGE_READY: {
if (mType == MPP_CTX_DEC) {
mpp_buf_slot_ready(mDec->frame_slots);
}
break;
}
case MPP_CODEC_SET_FRAME_INFO: {
MPP_RET ret = MPP_NOK;
switch (cmd & CMD_MODULE_ID_MASK) {
case CMD_MODULE_OSAL : {
ret = control_osal(cmd, param);
} break;
case CMD_MODULE_MPP : {
ret = control_mpp(cmd, param);
} break;
case CMD_MODULE_CODEC : {
switch (cmd & CMD_CTX_ID_MASK) {
case CMD_CTX_ID_DEC : {
mpp_assert(mType == MPP_CTX_DEC);
mpp_dec_control(mDec, cmd, param);
break;
}
case MPP_DEC_SET_INTERNAL_PTS_ENABLE: {
if (mType == MPP_CTX_DEC &&
(mCoding == MPP_VIDEO_CodingMPEG2 ||
mCoding == MPP_VIDEO_CodingMPEG4)) {
mpp_dec_control(mDec, cmd, param);
} else {
mpp_err("type %x coding %x does not support use internal pts control\n");
}
break;
}
case MPP_DEC_SET_PARSER_SPLIT_MODE: {
RK_U32 flag = *((RK_U32 *)param);
mParserNeedSplit = flag;
break;
}
case MPP_DEC_SET_PARSER_FAST_MODE: {
RK_U32 flag = *((RK_U32 *)param);
mParserFastMode = flag;
break;
}
case MPP_DEC_GET_STREAM_COUNT: {
AutoMutex autoLock(mPackets->mutex());
mpp_assert(mType == MPP_CTX_DEC);
*((RK_S32 *)param) = mPackets->list_size();
break;
}
case MPP_CODEC_GET_VPUMEM_USED_COUNT: {
AutoMutex autoLock(mPackets->mutex());
if (mType == MPP_CTX_DEC) {
mpp_dec_control(mDec, cmd, param);
}
break;
mpp_assert(cmd > MPP_DEC_CMD_BASE);
mpp_assert(cmd < MPP_DEC_CMD_END);
ret = control_dec(cmd, param);
} break;
case CMD_CTX_ID_ENC : {
mpp_assert(mType == MPP_CTX_ENC);
mpp_assert(cmd > MPP_ENC_CMD_BASE);
mpp_assert(cmd < MPP_ENC_CMD_END);
ret = control_enc(cmd, param);
} break;
case CMD_CTX_ID_ISP : {
mpp_assert(mType == MPP_CTX_ISP);
ret = control_isp(cmd, param);
} break;
default : {
ret = control_codec(cmd, param);
} break;
}
} break;
default : {
} break;
}
return MPP_OK;
if (ret)
mpp_err("command %x param %p ret %d\n", cmd, param, ret);
return ret;
}
MPP_RET Mpp::config(MpiCmd cmd, MppEncConfig cfg)
{
switch (cmd) {
case MPP_ENC_SETCFG:
case MPP_ENC_SET_CFG:
mEnc = mpp_calloc(MppEnc, 1);
if (NULL == mEnc) {
mpp_err_f("failed to malloc context\n");
@@ -438,7 +418,7 @@ MPP_RET Mpp::config(MpiCmd cmd, MppEncConfig cfg)
}
mEnc->mpp = this; // TODO put these code into config function
mpp_enc_config(mEnc, cmd, &cfg);
mpp_enc_control(mEnc, cmd, &cfg);
break;
default:
mpp_log("MpiCmd is not found in mpi_config.");
@@ -499,3 +479,122 @@ MPP_RET Mpp::reset()
return MPP_OK;
}
MPP_RET Mpp::control_mpp(MpiCmd cmd, MppParam param)
{
MPP_RET ret = MPP_NOK;
mpp_assert(cmd > MPP_CMD_BASE);
mpp_assert(cmd < MPP_CMD_END);
switch (cmd) {
case MPP_SET_OUTPUT_BLOCK: {
RK_U32 block = *((RK_U32 *)param);
mOutputBlock = block;
} break;
default : {
} break;
}
return ret;
}
MPP_RET Mpp::control_osal(MpiCmd cmd, MppParam param)
{
MPP_RET ret = MPP_NOK;
mpp_assert(cmd > MPP_OSAL_CMD_BASE);
mpp_assert(cmd < MPP_OSAL_CMD_END);
(void)cmd;
(void)param;
return ret;
}
MPP_RET Mpp::control_codec(MpiCmd cmd, MppParam param)
{
MPP_RET ret = MPP_NOK;
mpp_assert(cmd > MPP_CODEC_CMD_BASE);
mpp_assert(cmd < MPP_CODEC_CMD_END);
(void)cmd;
(void)param;
return ret;
}
MPP_RET Mpp::control_dec(MpiCmd cmd, MppParam param)
{
MPP_RET ret = MPP_NOK;
switch (cmd) {
case MPP_DEC_SET_FRAME_INFO: {
ret = mpp_dec_control(mDec, cmd, param);
} break;
case MPP_DEC_SET_EXT_BUF_GROUP: {
mpp_log("mpi_control group %p\n", param);
mFrameGroup = (MppBufferGroup)param;
ret = mpp_buffer_group_set_listener((MppBufferGroupImpl *)param, (void *)mThreadCodec);
mpp_log("signal codec thread\n");
mThreadCodec->signal();
} break;
case MPP_DEC_SET_INFO_CHANGE_READY: {
ret = mpp_buf_slot_ready(mDec->frame_slots);
} break;
case MPP_DEC_SET_INTERNAL_PTS_ENABLE: {
if (mCoding == MPP_VIDEO_CodingMPEG2 || mCoding == MPP_VIDEO_CodingMPEG4) {
ret = mpp_dec_control(mDec, cmd, param);
} else {
mpp_err("coding %x does not support use internal pts control\n", mCoding);
}
} break;
case MPP_DEC_SET_PARSER_SPLIT_MODE: {
RK_U32 flag = *((RK_U32 *)param);
mParserNeedSplit = flag;
ret = MPP_OK;
} break;
case MPP_DEC_SET_PARSER_FAST_MODE: {
RK_U32 flag = *((RK_U32 *)param);
mParserFastMode = flag;
ret = MPP_OK;
} break;
case MPP_DEC_GET_STREAM_COUNT: {
AutoMutex autoLock(mPackets->mutex());
*((RK_S32 *)param) = mPackets->list_size();
ret = MPP_OK;
} break;
case MPP_DEC_GET_VPUMEM_USED_COUNT: {
ret = mpp_dec_control(mDec, cmd, param);
} break;
default : {
} break;
}
return ret;
}
MPP_RET Mpp::control_enc(MpiCmd cmd, MppParam param)
{
MPP_RET ret = MPP_NOK;
switch (cmd) {
case MPP_ENC_SET_CFG : {
if (mEnc)
ret = mpp_enc_control(mEnc, cmd, param);
} break;
default : {
} break;
}
return ret;
}
MPP_RET Mpp::control_isp(MpiCmd cmd, MppParam param)
{
MPP_RET ret = MPP_NOK;
mpp_assert(cmd > MPP_ISP_CMD_BASE);
mpp_assert(cmd < MPP_ISP_CMD_END);
(void)cmd;
(void)param;
return ret;
}

View File

@@ -140,6 +140,13 @@ private:
RK_U32 mParserNeedSplit;
RK_U32 mParserInternalPts; /* for MPEG2/MPEG4 */
MPP_RET control_mpp(MpiCmd cmd, MppParam param);
MPP_RET control_osal(MpiCmd cmd, MppParam param);
MPP_RET control_codec(MpiCmd cmd, MppParam param);
MPP_RET control_dec(MpiCmd cmd, MppParam param);
MPP_RET control_enc(MpiCmd cmd, MppParam param);
MPP_RET control_isp(MpiCmd cmd, MppParam param);
Mpp(const Mpp &);
Mpp &operator=(const Mpp &);
};

View File

@@ -45,8 +45,7 @@ int pthread_setname_np(pthread_t thread, const char *name);
#include <semaphore.h>
#include <pthread.h>
#ifdef ARMLINUX
#elif defined(ANDROID)
#ifndef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER
#endif

View File

@@ -155,7 +155,7 @@ int mpi_test()
mpp_log("decode_get_frame get info changed found\n");
// if work in external buffer mode re-commit buffer here
mpi->control(ctx, MPP_CODEC_SET_INFO_CHANGE_READY, NULL);
mpi->control(ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);
} else
i++;
@@ -192,11 +192,8 @@ int mpi_test()
memset(&cfg, 0, sizeof(cfg));
ret = mpi->config(ctx, MPP_ENC_SETCFG, cfg);
if (MPP_OK != ret) {
mpp_err("mpi->config failed\n");
goto MPP_TEST_FAILED;
}
cmd = MPP_ENC_SET_CFG;
param = &cfg;
ret = mpi->control(ctx, cmd, param);
if (MPP_OK != ret) {
@@ -204,8 +201,6 @@ int mpi_test()
goto MPP_TEST_FAILED;
}
// interface with both input and output
for (i = 0; i < MPI_ENC_LOOP_COUNT; i++) {
mpp_frame_init(&enc_in);