We have some problems getting our H.264 decoder application running on DM365.
We are able to create codec successfully, but when we call VIDDEC2_process the function sometimes blocks at
VISA_enter((VISA_Handle)handle);
retVal = fxns->process(alg, inBufs, outBufs, inArgs, outArgs);
VISA_exit((VISA_Handle)handle);
But we use modules_test play local file successfully.
[Our System Information]
DVSDK_2_10_01_18
H.264 High Profile Decoder on DM365 Version 01.10.00
linux-2.6.18_pro500
framework_components_2_25_00_04
linuxutils_2_24_03
Switching CE_DEBUG to 3 I can see the output message (The input stream is 1024x768@h264 frame over RTSP.):
@46,077,553us: [+5 T:0x48cef490 S:0x48cee344] CV - VISA_enter(visa=0x51cbf8): algHandle = 0x51cc30 @46,089,564us: [+0 T:0x48cef490 S:0x48cee334] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x51cc30) @46,089,790us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Entered SemMP_pend> sem[0x51a3d0] timeout[0xffffffff] @46,089,998us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Leaving SemMP_pend> sem[0x51a3d0] status[0] @46,093,434us: [+0 T:0x48cef490 S:0x48cee344] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit @46,123,534us: [+5 T:0x48cef490 S:0x48cee34c] CV - VISA_exit(visa=0x51cbf8): algHandle = 0x51cc30 @46,123,780us: [+0 T:0x48cef490 S:0x48cee33c] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Enter(alg=0x51cc30) @46,123,987us: [+0 T:0x48cef490 S:0x48cee31c] ti.sdo.ce.osal.SemMP - Entered SemMP_post> sem[0x51a3d0] @46,124,182us: [+0 T:0x48cef490 S:0x48cee31c] ti.sdo.ce.osal.SemMP - Leaving SemMP_post> sem[0x51a3d0] @46,124,354us: [+0 T:0x48cef490 S:0x48cee34c] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Exit @46,458,119us: [+0 T:0x48cef490 S:0x48cee364] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_process> Exit (handle=0x51cbf8, retVal=0x0) @46,458,353us: [+0 T:0x48cef490 S:0x48cee344] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_control> Enter (handle=0x51cbf8, id=0, dynParams=0x51cb80 (size=0x1c), status=0x51caac (size=0xb8) @46,461,351us: [+5 T:0x48cef490 S:0x48cee324] CV - VISA_enter(visa=0x51cbf8): algHandle = 0x51cc30 @46,461,542us: [+0 T:0x48cef490 S:0x48cee314] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x51cc30) @46,461,715us: [+0 T:0x48cef490 S:0x48cee2dc] ti.sdo.ce.osal.SemMP - Entered SemMP_pend> sem[0x51a3d0] timeout[0xffffffff] @46,461,957us: [+0 T:0x48cef490 S:0x48cee2dc] ti.sdo.ce.osal.SemMP - Leaving SemMP_pend> sem[0x51a3d0] status[0] @46,462,159us: [+0 T:0x48cef490 S:0x48cee324] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit @46,462,337us: [+5 T:0x48cef490 S:0x48cee32c] CV - VISA_exit(visa=0x51cbf8): algHandle = 0x51cc30 @46,469,039us: [+0 T:0x48cef490 S:0x48cee31c] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Enter(alg=0x51cc30) @46,469,300us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Entered SemMP_post> sem[0x51a3d0] @46,469,637us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Leaving SemMP_post> sem[0x51a3d0] @46,469,814us: [+0 T:0x48cef490 S:0x48cee32c] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Exit @46,469,966us: [+0 T:0x48cef490 S:0x48cee344] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_control> Exit (handle=0x51cbf8, retVal=0x0) @46,483,722us: [+0 T:0x48cef490 S:0x48cee364] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_process> Enter (handle=0x51cbf8, inBufs=0x48ceeba8, outBufs=0x48ceeca0, inArgs=0x48ceecac, outArgs=0x48cee408) @46,483,957us: [+5 T:0x48cef490 S:0x48cee344] CV - VISA_enter(visa=0x51cbf8): algHandle = 0x51cc30 @46,484,178us: [+0 T:0x48cef490 S:0x48cee334] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x51cc30) @46,484,351us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Entered SemMP_pend> sem[0x51a3d0] timeout[0xffffffff] @46,484,545us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Leaving SemMP_pend> sem[0x51a3d0] status[0] @46,484,738us: [+0 T:0x48cef490 S:0x48cee344] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit @46,509,921us: [+5 T:0x48cef490 S:0x48cee34c] CV - VISA_exit(visa=0x51cbf8): algHandle = 0x51cc30 @46,510,162us: [+0 T:0x48cef490 S:0x48cee33c] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Enter(alg=0x51cc30) @46,510,395us: [+0 T:0x48cef490 S:0x48cee31c] ti.sdo.ce.osal.SemMP - Entered SemMP_post> sem[0x51a3d0] @46,510,594us: [+0 T:0x48cef490 S:0x48cee31c] ti.sdo.ce.osal.SemMP - Leaving SemMP_post> sem[0x51a3d0] @46,510,771us: [+0 T:0x48cef490 S:0x48cee34c] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Exit @46,510,926us: [+0 T:0x48cef490 S:0x48cee364] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_process> Exit (handle=0x51cbf8, retVal=0x0) @46,511,092us: [+0 T:0x48cef490 S:0x48cee344] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_control> Enter (handle=0x51cbf8, id=0, dynParams=0x51cb80 (size=0x1c), status=0x51caac (size=0xb8) @46,511,288us: [+5 T:0x48cef490 S:0x48cee324] CV - VISA_enter(visa=0x51cbf8): algHandle = 0x51cc30 @46,511,451us: [+0 T:0x48cef490 S:0x48cee314] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x51cc30) @46,511,616us: [+0 T:0x48cef490 S:0x48cee2dc] ti.sdo.ce.osal.SemMP - Entered SemMP_pend> sem[0x51a3d0] timeout[0xffffffff] @46,511,834us: [+0 T:0x48cef490 S:0x48cee2dc] ti.sdo.ce.osal.SemMP - Leaving SemMP_pend> sem[0x51a3d0] status[0] @46,512,033us: [+0 T:0x48cef490 S:0x48cee324] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit @46,512,214us: [+5 T:0x48cef490 S:0x48cee32c] CV - VISA_exit(visa=0x51cbf8): algHandle = 0x51cc30 @46,512,534us: [+0 T:0x48cef490 S:0x48cee31c] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Enter(alg=0x51cc30) @46,512,731us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Entered SemMP_post> sem[0x51a3d0] @46,512,923us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Leaving SemMP_post> sem[0x51a3d0] @46,513,094us: [+0 T:0x48cef490 S:0x48cee32c] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Exit @46,513,301us: [+0 T:0x48cef490 S:0x48cee344] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_control> Exit (handle=0x51cbf8, retVal=0x0) @46,918,551us: [+0 T:0x48cef490 S:0x48cee364] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_process> Enter (handle=0x51cbf8, inBufs=0x48ceeba8, outBufs=0x48ceeca0, inArgs=0x48ceecac, outArgs=0x48cee408) @46,918,787us: [+5 T:0x48cef490 S:0x48cee344] CV - VISA_enter(visa=0x51cbf8): algHandle = 0x51cc30 @46,918,966us: [+0 T:0x48cef490 S:0x48cee334] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x51cc30) @46,919,136us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Entered SemMP_pend> sem[0x51a3d0] timeout[0xffffffff] @46,919,436us: [+0 T:0x48cef490 S:0x48cee2fc] ti.sdo.ce.osal.SemMP - Leaving SemMP_pend> sem[0x51a3d0] status[0] @46,919,663us: [+0 T:0x48cef490 S:0x48cee344] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit |
[alg_vidDec.c code]
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; }
pObj->params.size = sizeof(VIDDEC2_Params); pObj->params.maxHeight = create->maxHeight; pObj->params.maxWidth = create->maxWidth; pObj->params.maxFrameRate = 30000; pObj->params.maxBitRate = ALG_VID_DEC_MAX_BITRATE; pObj->params.dataEndianness = XDM_BYTE; //pObj->params.forceChromaFormat = 9; //by parry pObj->params.forceChromaFormat = XDM_YUV_420SP;
#if 1 // by parry memcpy(&pObj->h264Params, &IH264VDEC_PARAMS, sizeof(pObj->h264Params)); pObj->h264Params.displayDelay = 2; pObj->h264Params.hdvicpHandle = (void*) NULL; pObj->h264Params.disableHDVICPeveryFrame = 1; pObj->h264Params.viddecParams = pObj->params; pObj->h264Params.viddecParams.size = sizeof(pObj->h264Params); #endif
/* Create video decoder instance */ //pObj->hDecode = VIDDEC2_create(gALG_hEngine, pObj->algName, &pObj->params); //by parry 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; //by parry 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;
//by parry 2010.0908 pObj->dynamicParams.frameOrder = IVIDDEC2_DECODE_ORDER; #if 1 //pObj->dynamicParams.mbDataFlag = 1; this flag is not used by the version of decoder //pObj->dynamicParams.newFrameFlag = 1; this flag is not used by the version of decoder h264DynParams.viddecDynamicParams = pObj->dynamicParams; h264DynParams.resetHDVICPeveryFrame=1; #endif
pObj->decStatus.size = sizeof(VIDDEC2_Status); pObj->decStatus.data.buf = NULL;
// by parry h264DynParams.viddecDynamicParams = pObj->dynamicParams; h264DynParams.resetHDVICPeveryFrame = 1;
//status = VIDDEC2_control(pObj->hDecode, XDM_SETPARAMS, &pObj->dynamicParams, &pObj->decStatus); //by parry 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); #if 1 status = VIDDEC2_control(pObj->hDecode, XDM_GETBUFINFO, &h264DynParams, &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 #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.numBufs = 1; inBufDesc.descs[0].bufSize = prm->inDataSize; inBufDesc.descs[0].buf = (XDAS_Int8 *)prm->inAddr;
outBufPtrs[0] = (XDAS_Int8 *)prm->outAddr; outBufPtrs[1] = (XDAS_Int8 *)(prm->outAddr + outBufSizeArray[0]) ;
outBufDesc.numBufs = 2; outBufDesc.bufSizes = outBufSizeArray; outBufDesc.bufs = (XDAS_Int8 **) &outBufPtrs;
inArgs.size = sizeof(VIDDEC2_InArgs); inArgs.numBytes = prm->inDataSize; inArgs.inputID = prm->inputBufId+1; // must be greater than 0 OSA_printf("/******************/\n " "inArgs.numBytes: %d \n" "inArgs.size: %d\n" "inArgs.inputID: %d\n", inArgs.numBytes ,inArgs.size,inArgs.inputID); //by parry outArgs.size = sizeof(VIDDEC2_OutArgs); outArgs.outBufsInUseFlag = 0;
status = VIDDEC2_process(pObj->hDecode, &inBufDesc, &outBufDesc, &inArgs, &outArgs);
#if 1 status = VIDDEC2_control(pObj->hDecode, XDM_GETSTATUS, &h264DynParams, &pObj->decStatus); if (status != VIDDEC2_EOK) { OSA_ERROR("XDM_GETSTATUS failed, status=%ld\n", status); return OSA_EFAIL; } #endif runStatus->bytesUsed = outArgs.bytesConsumed; //by parry must add
if (status != VIDDEC2_EOK) { OSA_ERROR("status=%ld\n", status); return OSA_EFAIL; } OSA_printf("outArgs.displayBufs[0].frameType :%d\n",outArgs.displayBufs[0].frameType);
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; } #if 1 status = VIDDEC2_control(pObj->hDecode, XDM_GETSTATUS, &h264DynParams, &pObj->decStatus); if (status != VIDDEC2_EOK) { OSA_ERROR("XDM_GETSTATUS failed, status=%ld\n", status); return OSA_EFAIL; } #endif
runStatus->frameWidth = pObj->decStatus.outputWidth; runStatus->frameHeight = pObj->decStatus.outputHeight;
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; } |