This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Extract motion vector from dm365

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;
}