Hello,
I try to extract MPEG4 motion vector using dvsdk_2_10_01_18.
I made a following function to configure motion vector, but the result of this function is failed.
The Result message is "encode Error: Failed to open video encode algorithm: mpeg4enc (0x0)"
Can you give me a correct method or advice?
Thanks,
Wan-Su, Lee
Following is a function which I used.
static int videoEncodeAlgCreate(Engine_Handle hEngine, VIDENC1_Handle *hEncodePtr, int width, int height, int bitrate, int bit_rate_ctrl, int qvalue)
{
VIDENC1_Params params;
VIDENC1_DynamicParams dynamicParams;
VIDENC1_Status encStatus;
XDAS_Int32 status;
VIDENC1_Handle hEncode;
IMP4VENC_Params extParams;
IMP4VENC_DynamicParams extDynParams;
params.size = sizeof(IMP4VENC_Params);
params.encodingPreset = XDM_HIGH_SPEED;
switch(bit_rate_ctrl)
{
case BITRATE_VBR:
params.rateControlPreset = IVIDEO_NONE;
break;
case BITRATE_CVBR:
params.rateControlPreset = IVIDEO_STORAGE;
break;
case BITRATE_CBR:
params.rateControlPreset = IVIDEO_LOW_DELAY;
break;
default:
params.rateControlPreset = IVIDEO_STORAGE;
break;
}
params.maxHeight = height;
params.maxWidth = width;
params.maxFrameRate = gblGetYFactor() == NTSCSTD ? 30000 : 25000;
params.maxBitRate = bitrate < 0 ? 0 : bitrate;
params.inputChromaFormat = XDM_YUV_420SP;
params.dataEndianness = XDM_BYTE;
params.maxInterFrameInterval = 0;
params.inputContentType = IVIDEO_PROGRESSIVE;
params.reconChromaFormat = XDM_YUV_420SP;
extParams.videncParams = params;
extParams.subWindowHeight = height;
extParams.subWindowWidth = width;
extParams.rotation = 0;
hEncode = VIDENC1_create(hEngine, "mpeg4enc", (VIDENC1_Params *)&extParams);
if (hEncode == NULL) {
ERR("Failed to open video encode algorithm: %s (0x%x)\n", "mpeg4enc", Engine_getLastError(hEngine));
return FAILURE;
}
dynamicParams.size = sizeof(IMP4VENC_DynamicParams);
dynamicParams.inputHeight = height;
dynamicParams.inputWidth = width;
dynamicParams.targetBitRate = bitrate < 0 ? 0 : bitrate * 1000;
dynamicParams.intraFrameInterval = VIDEO_LIVEINFO;
dynamicParams.generateHeader = XDM_ENCODE_AU;
dynamicParams.captureWidth = 0;
dynamicParams.forceFrame = IVIDEO_NA_FRAME;
dynamicParams.interFrameInterval = XDM_DEFAULT;
dynamicParams.mbDataFlag = XDM_DEFAULT;
if (gblGetYFactor() == NTSCSTD)
{
dynamicParams.targetFrameRate = 30000;
dynamicParams.refFrameRate = 30000;
}
else
{
dynamicParams.targetFrameRate = 25000;
dynamicParams.refFrameRate = 25000;
}
extDynParams.videncDynamicParams = dynamicParams;
/*
extDynParams.meAlgo = 0;
extDynParams.skipMBAlgo = 0;
extDynParams.intraAlgo = 0;
extDynParams.numMBRows = 5;
extDynParams.unrestrictedMV = 0;
*/
extDynParams.mvDataEnable = 1;
/* Set video encoder dynamic parameters */
encStatus.size = sizeof(VIDENC1_Status);
encStatus.data.buf = NULL;
status = VIDENC1_control(hEncode, XDM_SETPARAMS, (IVIDENC1_DynamicParams *)&extDynParams, &encStatus);
if (status != VIDENC1_EOK)
{
ERR("XDM_SETPARAMS failed, status=%ld\n", status);
return FAILURE;
}
status = VIDENC1_control(hEncode, XDM_GETBUFINFO, (IVIDENC1_DynamicParams *)&extDynParams, &encStatus);
if (status != VIDENC1_EOK)
{
ERR("XDM_GETBUFINFO failed, status=%ld\n", status);
return FAILURE;
}
if( dynamicParams.size == sizeof(IMP4VENC_DynamicParams) )
{
XDAS_Int8 *MV_Addr;
XDAS_Int32 MV_Size;
if( MVData )
{
Memory_contigFree(MVData, MVDataSize);
MVData = NULL;
MVDataSize = 0;
}
MV_Size = encStatus.bufInfo.minOutBufSize[1];//width * height / 32;
MV_Addr = (XDAS_Int8 *)Memory_contigAlloc(MV_Size, Memory_DEFAULTALIGNMENT);
if (MV_Addr == NULL) {
ERR("could not allocate MV output buffer.......\n");
return FAILURE;
}
video_set_mv_data( (void *)MV_Addr, MV_Size);
}
*hEncodePtr = hEncode;
return SUCCESS;
}