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.
Hi,
I designed our application based on MCVIP of av_capture framework. (UDWorks reference design)
Alg_vidEnc is ok and the recorded bitstream file (h264) can be decode by VLC or other player on windows without any warning.
I tried to design the decode_tsk to decode the bitstream file(h264).
There is no error message output from ALG_vidDecRun(), but Alg_vidDec doesn't work well.
The following message is one of our decoding cases. The input image is 704x480@h264 frame.
The size of first frame is "19787" bytes. After decoding by the Alg_vidDec, the runStatus.bytesUsed always is 115 bytes (if it is any Keyframe and start code is "00 00 00 01 27").
It doest not be a same small value and the decoded result is bad.
[output message] Creating ALG_vidDec (codec=0, width=720, height=480) |
[Alg_vidDec initial parameters] vidDecCreatePrm.codec = ALG_VID_CODEC_H264; |
[source] static int DECODE_decode(int inDataSize)
|
Hi,
Just to confirm, what is the version of encoder and decoder that you are using? Does the regular DVR application provided in the DVR Reference Design (uimain) work well for video playback?
Regards,
Anshuman
Hi,
We don't use the tvp5158, and I think that 'uimain' hardly runs on our EVM board without modifing.
I tried ALG_vidDecTestMain that provides by alg_vidDec.c still get same bad result.
I have been comparing the source code between us and udworks, but can't get any idea.
Or I missed the configuration for dvsdk, kernel or alg library?
Maybe I need a simple program that using the av_capture framework to decode 704x480@h264 correctly.
[our system information]
av_capture is grabbed from 1.0 udworks framework
dvsdk_2_10_01_18
linux-2.6.18_pro500
[encode and decode version]
I saw VIDENC1_xxx and VIDDEC2_xxx are used by alg_vidEnc and alg_vidDec.
How to check right version of codec?
[alg_server.cfg]
var osalGlobal = xdc.useModule('ti.sdo.ce.osal.Global');
osalGlobal.runtimeEnv = osalGlobal.LINUX;
environment['xdc.cfg.check.fatal'] = 'false';
var RMAN = xdc.useModule('ti.sdo.fc.rman.RMAN');
RMAN.useDSKT2 = false;
RMAN.persistentAllocFxn = "__ALG_allocMemory";
RMAN.persistentFreeFxn = "__ALG_freeMemory";
RMAN.semCreateFxn = "Sem_create";
RMAN.semDeleteFxn = "Sem_delete";
RMAN.semPendFxn = "Sem_pend";
RMAN.semPostFxn = "Sem_post";
RMAN.tableSize = 10;
RMAN.trace = true;
RMAN.debug = true;
var EDMA3 = xdc.useModule('ti.sdo.fc.edma3.Settings');
EDMA3.globalInit = true;
EDMA3.maxQdmaChannels = [10,10,10,10];
EDMA3.trace = false;
EDMA3.debug = false;
var vicp = xdc.useModule('ti.sdo.linuxutils.vicp.VICP');
vicp.debug = false;
var HDVICP = xdc.useModule('ti.sdo.fc.ires.hdvicp.HDVICP');
HDVICP.trace = false;
HDVICP.debug = false;
//Change this to VICP if the chip is not DM355
var VICP = xdc.useModule('ti.sdo.fc.ires.vicp.VICP2');
VICP.debug = true;
var VICPSYNC = xdc.useModule('ti.sdo.fc.vicpsync.VICPSYNC');
VICPSYNC.debug = false;
var HDVICPSYNC = xdc.useModule('ti.sdo.fc.hdvicpsync.HDVICPSYNC');
HDVICPSYNC.debug = false;
HDVICPSYNC.trace = false;
var VICP = xdc.useModule('ti.sdo.fc.memutils.MEMUTILS');
DDRSPACE = xdc.useModule('ti.sdo.fc.ires.addrspace.ADDRSPACE');
var EDMA3CHAN = xdc.useModule('ti.sdo.fc.ires.edma3chan.EDMA3CHAN');
EDMA3CHAN.trace = false;
EDMA3CHAN.debug = false;
var LSP = xdc.useModule('ti.sdo.linuxutils.edma.EDMA');
LSP.debug = false;
var CMEM = xdc.useModule('ti.sdo.linuxutils.cmem.CMEM');
var ALG_MEM = xdc.useModule('ti.sdo.ce.alg.Settings');
ALG_MEM.useHeap = true;
xdc.loadPackage("ti.sdo.ce.video2");
xdc.loadPackage("ti.sdo.fc.hdvicpsync");
/* This package provides mock implementation of Locks and Semaphores */
/* var EX = xdc.useModule("ti.sdo.fc.rman.examples.EXAMPLE");*/
/*EX.debug = false;*/
/*
* ======== Engine Configuration ========
*/
var MPEG4ENC = xdc.useModule('ti.sdo.codecs.mpeg4enc.ce.MPEG4ENC');
var H264ENC = xdc.useModule('ti.sdo.codecs.h264enc.ce.H264ENC');
var JPEGENC = xdc.useModule('ti.sdo.codecs.jpegenc.ce.JPEGENC');
var G711ENC = xdc.useModule('ti.sdo.ce.examples.codecs.g711.G711ENC');
var MPEG4DEC = xdc.useModule('ti.sdo.codecs.mpeg4dec.ce.MPEG4DEC');
var H264DEC = xdc.useModule('ti.sdo.codecs.h264dec.ce.H264DEC');
var JPEGDEC = xdc.useModule('ti.sdo.codecs.jpegdec.ce.JPEGDEC');
var G711DEC = xdc.useModule('ti.sdo.ce.examples.codecs.g711.G711DEC');
var Engine = xdc.useModule('ti.sdo.ce.Engine');
var myEngine = Engine.create("alg_server", [
{name: "mpeg4enc", mod: MPEG4ENC, local: true, groupId: 1},
{name: "h264enc", mod: H264ENC, local: true, groupId: 1},
{name: "jpegenc", mod: JPEGENC, local: true, groupId: 1},
{name: "g711enc", mod: G711ENC, local: true},
{name: "mpeg4dec", mod: MPEG4DEC, local: true, groupId: 1},
{name: "h264dec", mod: H264DEC, local: true, groupId: 1},
{name: "jpegdec", mod: JPEGDEC, local: true, groupId: 1},
{name: "g711dec", mod: G711DEC, local: true},
]);
/* set the cache enabling feature of CE for ARM-side algos - Required for audio decoder*/
/*
algSettings = xdc.useModule('ti.sdo.ce.alg.Settings');
algSettings.useCache = true;
*/
Program.main = null;
it is our layout of dvsdk directory.
Hi,
What is the displayDelay setting that you have done for H.264 Decoder Create time parameter?
Regards,
Anshuman
Hi,
pObj->h264Params.displayDelay = 0;
[It is the partial of source fromalg_vidDec.c] void *ALG_vidDecCreate(ALG_VidDecCreate *create) |
Best Regards,
Person
I tried to change the displayDelay to 16.
It seems still gets same bad result. I am stuck.
Hi,
I have couple of recommendations for you:
1. Switch to ver 1.8 of DVR RDK. I have checked the alg_vidDec.c test code to ensure it works for the H.264 decoder.
2. Refer to the attached alg_vidDec.c file and build it in your application. I just built and used it and it works reliably. You can use "moduletest.out alg_vidDec" and try decoding D1 stream. You might have to port this file for your software package.
3. Share your stream with us and i can try decoding it in our setup, to ensure that the stream is fine.
Regards,
Anshuman
#include <alg_priv.h> #include <alg_vidDec.h> #include <alg_jpgDec.h> #include <osa_cmem.h> #include <osa_file.h> #include <drv_display.h> #include <drv_frameCopy.h> #include <ti/sdo/codecs/h264dec/ih264vdec.h> //#define ALG_VID_DEC_DEBUG //#define ALG_VID_DEC_TEST_DEBUG #define ALG_VID_DEC_MAX_BITRATE (4*1024*1024) typedef struct { VIDDEC2_Handle hDecode; VIDDEC2_Status decStatus; VIDDEC2_Params params; VIDDEC2_DynamicParams dynamicParams; IH264VDEC_Params h264Params; char algName[20]; ALG_VidDecCreate createPrm; int curFrameNum; int outStartX; int outStartY; void *hJpgDecode; } ALG_VidDecObj; void *ALG_vidDecCreate(ALG_VidDecCreate *create) { ALG_VidDecObj *pObj; pObj = OSA_memAlloc(sizeof(*pObj)); if(pObj==NULL) return NULL; memset(pObj, 0, sizeof(*pObj)); memcpy(&pObj->createPrm, create, sizeof(pObj->createPrm)); switch(create->codec) { case ALG_VID_CODEC_H264: strcpy(pObj->algName, ALG_VID_CODEC_H264_DEC_NAME); break; case ALG_VID_CODEC_MPEG4: strcpy(pObj->algName, ALG_VID_CODEC_MPEG4_DEC_NAME); break; case ALG_VID_CODEC_MJPEG: { ALG_JpgDecCreate jpgDecCreate; jpgDecCreate.dataFormat = create->dataFormat; jpgDecCreate.maxWidth = create->maxWidth; jpgDecCreate.maxHeight = create->maxHeight; pObj->hJpgDecode = ALG_jpgDecCreate(&jpgDecCreate); if(pObj->hJpgDecode==NULL) return NULL; return pObj; } break; default: OSA_memFree(pObj); return NULL; } memcpy(&pObj->h264Params, &IH264VDEC_PARAMS, sizeof(pObj->h264Params)); pObj->params.size = sizeof(VIDDEC2_Params); pObj->params.maxHeight = create->maxHeight; pObj->params.maxWidth = create->maxWidth; pObj->params.maxFrameRate = 0; pObj->params.maxBitRate = ALG_VID_DEC_MAX_BITRATE; pObj->params.dataEndianness = XDM_BYTE; pObj->params.forceChromaFormat = 9; pObj->h264Params.displayDelay = 0; pObj->h264Params.hdvicpHandle = NULL; // pObj->h264Params.resetHDVICPeveryFrame = TRUE; pObj->h264Params.disableHDVICPeveryFrame = 0; pObj->h264Params.frame_closedloop_flag = 1; pObj->h264Params.inputDataMode = 1; pObj->h264Params.sliceFormat = 1; pObj->h264Params.viddecParams = pObj->params; pObj->h264Params.viddecParams.size = sizeof(pObj->h264Params); /* Create video decoder instance */ pObj->hDecode = VIDDEC2_create(gALG_hEngine, pObj->algName, &pObj->h264Params); if (pObj->hDecode == NULL) { OSA_ERROR("Failed to open video decode algorithm (%s)\n", pObj->algName); OSA_memFree(pObj); return NULL; } return (void*)pObj; } int ALG_vidDecRun(void *hndl, ALG_VidDecRunPrm *prm, ALG_VidDecRunStatus *runStatus) { VIDDEC2_InArgs inArgs; VIDDEC2_OutArgs outArgs; XDM1_BufDesc inBufDesc; XDM_BufDesc outBufDesc; XDAS_Int32 outBufSizeArray[2]; XDAS_Int32 status; XDAS_Int8 *outBufPtrs[2]; ALG_VidDecObj *pObj; IH264VDEC_DynamicParams h264DynParams; pObj = (ALG_VidDecObj *)hndl; if(pObj==NULL) return OSA_EFAIL; if(pObj->createPrm.codec == ALG_VID_CODEC_MJPEG) { ALG_JpgDecRunPrm jpgDecRun; ALG_JpgDecRunStatus jpgDecStatus; jpgDecRun.inAddr = prm->inAddr; jpgDecRun.inDataSize = prm->inDataSize; jpgDecRun.outAddr = prm->outAddr; jpgDecRun.outOffsetH = prm->outOffsetH; jpgDecRun.outOffsetV = prm->outOffsetV; jpgDecRun.outStartX = 0; jpgDecRun.outStartY = 0; status = ALG_jpgDecRun(pObj->hJpgDecode, &jpgDecRun, &jpgDecStatus); if(status!=OSA_SOK) return OSA_EFAIL; runStatus->bytesUsed = jpgDecStatus.bytesUsed; runStatus->isKeyFrame = TRUE; runStatus->frameWidth = jpgDecStatus.frameWidth; runStatus->frameHeight= jpgDecStatus.frameHeight; runStatus->outputBufId= prm->inputBufId; runStatus->freeBufId = prm->inputBufId; runStatus->outStartX = jpgDecRun.outStartX; runStatus->outStartY = jpgDecRun.outStartY; runStatus->outOffsetH = jpgDecRun.outOffsetH; runStatus->outOffsetV = jpgDecRun.outOffsetV; return OSA_SOK; } if(pObj->hDecode==NULL) return OSA_EFAIL; if(pObj->curFrameNum==0) { pObj->dynamicParams.size = sizeof(VIDDEC2_DynamicParams); pObj->dynamicParams.decodeHeader = XDM_DECODE_AU; pObj->dynamicParams.displayWidth = prm->outOffsetH; pObj->dynamicParams.frameSkipMode = IVIDEO_NO_SKIP; pObj->dynamicParams.frameOrder = IVIDDEC2_DECODE_ORDER; pObj->decStatus.size = sizeof(VIDDEC2_Status); pObj->decStatus.data.buf = NULL; h264DynParams.viddecDynamicParams = pObj->dynamicParams; h264DynParams.viddecDynamicParams.size = sizeof(h264DynParams); h264DynParams.resetHDVICPeveryFrame = 1; h264DynParams.dataSyncHandle = NULL; h264DynParams.getDataFxn = NULL; status = VIDDEC2_control(pObj->hDecode, XDM_SETPARAMS, &h264DynParams, &pObj->decStatus); if (status != VIDDEC2_EOK) { OSA_ERROR("XDM_SETPARAMS failed, status=%ld\n", status); return OSA_EFAIL; } /* Get buffer information from video decoder */ pObj->decStatus.size = sizeof(VIDDEC2_Status); pObj->decStatus.data.buf = NULL; pObj->dynamicParams.size = sizeof(VIDDEC2_DynamicParams); status = VIDDEC2_control(pObj->hDecode, XDM_GETBUFINFO, &pObj->dynamicParams, &pObj->decStatus); if (status != VIDDEC2_EOK) { OSA_ERROR("XDM_GETBUFINFO failed, status=%ld\n", status); return OSA_EFAIL; } #ifdef ALG_VID_DEC_DEBUG OSA_printf(" ALG: VidDec: XDM_GETBUFINFO: min out bufs:%ld,size:%ld %ld\n",pObj->decStatus.bufInfo.minNumOutBufs,pObj->decStatus.bufInfo.minOutBufSize[0], pObj->decStatus.bufInfo.minOutBufSize[1]); #endif } pObj->dynamicParams.size = sizeof(VIDDEC2_DynamicParams); pObj->decStatus.size = sizeof(VIDDEC2_Status); pObj->decStatus.data.buf = NULL; outBufSizeArray[0] = (prm->outOffsetH)*(prm->outOffsetV); outBufSizeArray[1] = outBufSizeArray[0]/2; inBufDesc.descs[0].bufSize = prm->inDataSize; inBufDesc.descs[0].buf = (XDAS_Int8 *)prm->inAddr; inBufDesc.numBufs = 1; outBufPtrs[0] = (XDAS_Int8 *)prm->outAddr; outBufPtrs[1] = (XDAS_Int8 *)(prm->outAddr + outBufSizeArray[0]) ; outBufDesc.bufSizes = outBufSizeArray; outBufDesc.bufs = (XDAS_Int8 **) &outBufPtrs; outBufDesc.numBufs = 2; inArgs.size = sizeof(VIDDEC2_InArgs); inArgs.numBytes = prm->inDataSize; inArgs.inputID = prm->inputBufId+1; // must be greater than 0 outArgs.size = sizeof(VIDDEC2_OutArgs); outArgs.outBufsInUseFlag=0; status = VIDDEC2_process(pObj->hDecode, &inBufDesc, &outBufDesc, &inArgs, &outArgs); status = VIDDEC2_control(pObj->hDecode, XDM_GETSTATUS, &pObj->dynamicParams, &pObj->decStatus); if (status != VIDDEC2_EOK) { OSA_ERROR("XDM_GETSTATUS failed, status=%ld\n", status); return OSA_EFAIL; } runStatus->bytesUsed = outArgs.bytesConsumed; if (status != VIDDEC2_EOK) { OSA_ERROR("status=%ld\n", status); return OSA_EFAIL; } switch (outArgs.displayBufs[0].frameType) { case IVIDEO_I_FRAME: runStatus->isKeyFrame = TRUE; break; case IVIDEO_P_FRAME: runStatus->isKeyFrame = FALSE; break; case IVIDEO_B_FRAME: runStatus->isKeyFrame = FALSE; break; case IVIDEO_IDR_FRAME: runStatus->isKeyFrame = TRUE; break; case IVIDEO_II_FRAME: runStatus->isKeyFrame = TRUE; break; case IVIDEO_PP_FRAME: runStatus->isKeyFrame = FALSE; break; default: runStatus->isKeyFrame = FALSE; break; } runStatus->frameWidth = pObj->decStatus.outputWidth; runStatus->frameHeight = pObj->decStatus.outputHeight; if(outArgs.outBufsInUseFlag == 1) { inBufDesc.descs[0].buf = (XDAS_Int8 *)prm->inAddr + runStatus->bytesUsed; status = VIDDEC2_process(pObj->hDecode, &inBufDesc, &outBufDesc, &inArgs, &outArgs); runStatus->bytesUsed += outArgs.bytesConsumed; if (status != VIDDEC2_EOK) { OSA_ERROR("status=%ld\n", status); // return OSA_EFAIL; } VIDDEC2_control(pObj->hDecode, XDM_GETSTATUS, &pObj->dynamicParams, &pObj->decStatus); if (status != VIDDEC2_EOK) { OSA_ERROR("XDM_GETSTATUS failed with error code = 0x%x , status=%ld\n", pObj->decStatus.extendedError,status); // OSA_fileWriteFile("InputBitstream.dat", (XDAS_Int8 *)prm->inAddr, prm->inDataSize); OSA_printf("\r\n Bytes Consumed so far = %d ",runStatus->bytesUsed); return OSA_EFAIL; } } if(outArgs.displayBufs[0].bufDesc[0].buf == NULL) { return OSA_EFAIL; } else { runStatus->outputBufId = outArgs.outputID[0]-1; // to adjust for +1 done in inputID runStatus->freeBufId = outArgs.freeBufID[0]-1; if(pObj->curFrameNum==0) { pObj->outStartY = ((Uint32)outArgs.displayBufs[0].bufDesc[0].buf - (Uint32)prm->outAddr)/prm->outOffsetH; pObj->outStartX = ((Uint32)outArgs.displayBufs[0].bufDesc[0].buf - (Uint32)prm->outAddr)%prm->outOffsetH; } runStatus->outStartX = pObj->outStartX; runStatus->outStartY = pObj->outStartY; runStatus->outOffsetH= prm->outOffsetH; runStatus->outOffsetV= prm->outOffsetV; } pObj->curFrameNum++; return OSA_SOK; } int ALG_vidDecDelete(void *hndl) { ALG_VidDecObj *pObj; pObj = (ALG_VidDecObj *)hndl; if(pObj==NULL) return OSA_EFAIL; if(pObj->createPrm.codec == ALG_VID_CODEC_MJPEG) { ALG_jpgDecDelete(pObj->hJpgDecode); } else { if(pObj->hDecode==NULL) return OSA_EFAIL; VIDDEC2_delete(pObj->hDecode); } OSA_memFree(pObj); return OSA_SOK; } static DRV_DisplayWinHndl gDRV_displayHndl; static DRV_DisplayBufInfo gDRV_displayInfo; static int gDRV_displayBufId; static int ALG_vidDecTestDisplayCreate() { DRV_DisplayWinConfig displayConfig; int status; displayConfig.winId = DRV_DISPLAY_VID_WIN_0; displayConfig.numBuf = 3; displayConfig.dataFormat = DRV_DATA_FORMAT_YUV420; displayConfig.startX = 0; displayConfig.startY = 0; displayConfig.width = 720; displayConfig.height = 480; displayConfig.offsetH = OSA_align(displayConfig.width, 32); displayConfig.offsetV = displayConfig.height; displayConfig.zoomH = 0; displayConfig.zoomV = 0; gDRV_displayBufId=0; OSA_printf(" ALG: VidDec: Opening display.\n"); status = DRV_displaySetMode(DRV_DISPLAY_MODE_NTSC); if(status!=OSA_SOK) goto error_exit; status = DRV_displayOpen(&gDRV_displayHndl, &displayConfig); if(status!=OSA_SOK) goto error_exit; DRV_displayOsdWinEnable(&gDRV_displayHndl, 0, FALSE); DRV_displayGetBufInfo(&gDRV_displayHndl, &gDRV_displayInfo); error_exit: if(status!=OSA_SOK) OSA_ERROR("Display Init!!!\n"); return status; } static int ALG_vidDecTestDisplayCopy(Uint8 *outVirtAddr, Uint8 *outPhysAddr, ALG_VidDecRunStatus *vidDecStatus) { int status; DRV_FrameCopyPrm frameCopy; frameCopy.srcPhysAddr = outPhysAddr; frameCopy.srcVirtAddr = outVirtAddr; frameCopy.dstPhysAddr = gDRV_displayInfo.physAddr[gDRV_displayBufId]; frameCopy.dstVirtAddr = gDRV_displayInfo.virtAddr[gDRV_displayBufId]; frameCopy.srcOffsetH = vidDecStatus->outOffsetH; frameCopy.srcOffsetV = vidDecStatus->outOffsetV; frameCopy.dstOffsetH = gDRV_displayInfo.offsetH; frameCopy.dstOffsetV = gDRV_displayInfo.offsetV; frameCopy.copyWidth = vidDecStatus->frameWidth; frameCopy.copyHeight = vidDecStatus->frameHeight; frameCopy.dataFormat = gDRV_displayInfo.dataFormat; frameCopy.srcStartX = vidDecStatus->outStartX; frameCopy.srcStartY = vidDecStatus->outStartY; frameCopy.dstStartX = 0; frameCopy.dstStartY = 0; status = DRV_frameCopy(NULL, &frameCopy); if(status!=OSA_SOK) { OSA_ERROR("DRV_frameCopy(A)\n"); } DRV_displaySwitchBuf( &gDRV_displayHndl, &gDRV_displayBufId); return status; } static int ALG_vidDecTestDisplayDelete() { DRV_displayOsdWinEnable(&gDRV_displayHndl, 0, TRUE); DRV_displayClose(&gDRV_displayHndl); return OSA_SOK; } int ALG_vidDecTestMain(int argc, char **argv) { int status, bufId, count, whOffset, frameWidth, frameHeight; Uint8 *inVirtAddr=NULL, *inPhysAddr, *outVirtAddr[2], *outPhysAddr[2], *curInAddr; OSA_PrfHndl prfVidDec; Uint32 size=10*MB, fileSize, totalDecSize; void *algVidDecHndl; ALG_VidDecCreate createPrm; ALG_VidDecRunPrm runPrm; ALG_VidDecRunStatus runStatus; char filename[100]; int runCount=0; if(argc>0) { status = DRV_init(); if(status!=OSA_SOK) { OSA_ERROR("DRV_init()\n"); return status; } status = ALG_sysInit(); if(status!=OSA_SOK) { DRV_exit(); return status; } } strcpy(filename, "test.264"); frameWidth = 720; frameHeight = 480; if(argc > 2) { strcpy(filename, argv[2]); if(argc>3) frameWidth = atoi(argv[3]); if(argc>4) frameHeight = atoi(argv[4]); } if(frameWidth==0||frameHeight==0) { OSA_ERROR("Illegal parameters!!!\n"); } inVirtAddr = OSA_cmemAlloc(size, 32); outVirtAddr[0] = OSA_cmemAlloc(2*MB, 32); outVirtAddr[1] = OSA_cmemAlloc(2*MB, 32); inPhysAddr = OSA_cmemGetPhysAddr(inVirtAddr); outPhysAddr[0] = OSA_cmemGetPhysAddr(outVirtAddr[0]); outPhysAddr[1] = OSA_cmemGetPhysAddr(outVirtAddr[1]); memset(outVirtAddr[0], 0xFF, 2*MB); memset(outVirtAddr[1], 0xFF, 2*MB); if( inVirtAddr==NULL || outVirtAddr[0] == NULL || outVirtAddr[1] == NULL || inPhysAddr==NULL || outPhysAddr[0] == NULL || outPhysAddr[1] == NULL ) { OSA_ERROR("OSA_cmemAlloc()\n"); goto error_exit; } status = OSA_fileReadFile(filename, inVirtAddr, size,0, &fileSize); if(status!=OSA_SOK) { OSA_ERROR("OSA_fileReadFile()\n"); goto error_exit; } test_again: OSA_prfReset(&prfVidDec); createPrm.codec = ALG_VID_CODEC_H264; createPrm.dataFormat = DRV_DATA_FORMAT_YUV420; createPrm.maxWidth = frameWidth; createPrm.maxHeight = frameHeight; algVidDecHndl = ALG_vidDecCreate(&createPrm); if(algVidDecHndl==NULL) { OSA_ERROR("ALG_vidDecCreate()\n"); goto error_exit; } curInAddr = inVirtAddr; totalDecSize = 0; bufId=0; count=0; ALG_vidDecTestDisplayCreate(); whOffset = 0; if(createPrm.codec==ALG_VID_CODEC_H264) whOffset = 96; OSA_printf(" ALG: VidDec: Decode in progress!!!\n"); while(totalDecSize < fileSize) { runPrm.inAddr = curInAddr; runPrm.outAddr = outVirtAddr[bufId]; runPrm.inDataSize = 100*KB; runPrm.outOffsetH = OSA_align(createPrm.maxWidth+whOffset, 32); runPrm.outOffsetV = createPrm.maxHeight+whOffset; runPrm.inputBufId = bufId; OSA_prfBegin(&prfVidDec); status = ALG_vidDecRun(algVidDecHndl, &runPrm, &runStatus); OSA_prfEnd(&prfVidDec, 1); #ifdef ALG_VID_DEC_TEST_DEBUG OSA_printf(" ALG: VidDec: %ld:%ld:%ld:%dx%d:%ld: %ld bytes (%ld, %ld)\n", runStatus.freeBufId, runPrm.inputBufId, runStatus.outputBufId, runStatus.frameWidth, runStatus.frameHeight, runStatus.isKeyFrame, runStatus.bytesUsed, runStatus.outStartX, runStatus.outStartY ); #endif if(status==OSA_SOK) { //runStatus.bytesUsed += 3; curInAddr += runStatus.bytesUsed; totalDecSize += runStatus.bytesUsed; } else { OSA_printf(" ALG: VidDec: ALG_vidDecRun() ERROR !!!\n"); break; } ALG_vidDecTestDisplayCopy( outVirtAddr[runStatus.outputBufId], outPhysAddr[runStatus.outputBufId], &runStatus ); bufId ^= 1; count++; if(count>1000) break; } OSA_printf(" ALG: VidDec: Decode DONE!!!\n"); ALG_vidDecTestDisplayDelete(); ALG_vidDecDelete(algVidDecHndl); OSA_prfPrint(&prfVidDec, "VID DEC", 0); runCount++; #if 0 if(runCount<10) goto test_again; #endif error_exit: if(inVirtAddr) OSA_cmemFree(inVirtAddr); if(outVirtAddr[0]) OSA_cmemFree(outVirtAddr[0]); if(outVirtAddr[1]) OSA_cmemFree(outVirtAddr[1]); if(argc>0) { ALG_sysExit(); DRV_exit(); } return status; }
Hi,
I will try your suggestion.
The file is too big. How to send it for you.
file size:2.40 MB
Hi,
I don't know how to attach the file. The image is ok, but the bistream file is not.
I tried the moduletest.out of DVRRDK_v1.0 and get result as following.
[result] root@192.168.4.13:/dvr# ./moduletest.out alg_vidDec CLK Hz, cmem initialize |
I get more errors with DVRRDK_v1.8, and I think that need more modifies for my enviroment.
[result] root@192.168.4.13:/dvr# ./moduletest.out alg_vidDec CLK Hz, CMEM Error: getPool: Failed to get a pool fitting a size 28672 |
Hi,
It works. I have a mistak.
To change the legacy dvsdk to udworks one.
Thank you very much!!