CPU : Davinci DM8168
DVRRDK: 3.0
Hi everyone
In my usecase, DMA copy data from PCIE and receive the data of the network by the live555,DMA copy the data to display and occur the split screen int the window after the DM8168 run for a while.
Below is our code.
DMA copy data the init code:
status = Vsys_allocBuf(FRAMEBUF_HEAP_SR_ID,thrObj->bufSize,1024,&thrObj->bufInfo[i]);
if (ERROR_NONE == status)
{
bufList.numFrames++;
pFrame = &bufList.frames[i];
pFrame->channelNum = 0;
pFrame->fid = 0;
pFrame->frameHeight = thrObj->frameHight;
pFrame->frameWidth = thrObj->frameWidth;
pFrame->framePitch[0] = (pFrame->frameWidth)*2;
pFrame->phyAddr[0][0] = thrObj->bufInfo[i].physAddr;
pFrame->addr[0][0] = thrObj->bufInfo[i].virtAddr;
}
status = IpcFramesOutLink_putFullVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0,&bufList);
OSA_assert(0 == status);
int dmainitret = OSA_dmaInit();
OSA_dmaOpen(&thrObj->dmaHndl, OSA_DMA_MODE_NORMAL, 1);
thrObj->copy2D.copyWidth = (thrObj->frameWidth) * 2;
thrObj->copy2D.copyHeight = thrObj->frameHight;
thrObj->copy2D.srcOffsetH = (thrObj->frameWidth) * 2;
thrObj->copy2D.dstOffsetH = (thrObj->frameWidth) * 2;
thrObj->copy2D.skipH = 0;
DMA copy data the run code:
status = IpcFramesOutLink_getEmptyVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0,&bufList);
OSA_assert(0 == status);
if (bufList.numFrames)
{
i = 0;
while (i < bufList.numFrames)
{
unsigned long ppIndex = ioctl(thrObj->devfd, 4, 0);
pFrame = &bufList.frames[i];
pFrame->channelNum = 0;
pFrame->fid = 0;
pFrame->frameHeight = thrObj->frameHight;
pFrame->frameWidth = thrObj->frameWidth;
pFrame->framePitch[0] = (pFrame->frameWidth)*2;
thrObj->copy2D.srcPhysAddr = (unsigned long)ppMemPhyAddr[ppIndex];
thrObj->copy2D.dstPhysAddr = (unsigned long)pFrame->phyAddr[0][0];
OSA_dmaCopy2D(&thrObj->dmaHndl, &thrObj->copy2D, 1);
i++;
}
status = IpcFramesOutLink_putFullVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0,&bufList);
ipcBit run code
status = OSA_queGet(&(ipc_ctrl.queEmptyOut), (Int32 *) (&pEmptyBuf),OSA_TIMEOUT_FOREVER);
//to append treatment for queget failure...
pEmptyBuf->channelNum = pStream->decChannel;
pEmptyBuf->codingType = 0;
pEmptyBuf->timeStamp = OSA_getCurTimeInMsec();
pEmptyBuf->fillLength = 0;
status = getOneFrame(pStream, pEmptyBuf->addr,&(pEmptyBuf->fillLength));
status = OSA_quePut(&(ipc_ctrl.queFullOut), (Int32) pEmptyBuf,OSA_TIMEOUT_FOREVER);
the link code:
System_LinkQueInfo queInfo;
queInfo.numCh = GetStreamNum(pChannels);
for (pHChannelNode = pChannels->hChannelList[CHANNEL_CLS_STREAM]->next, i = 0;
pHChannelNode && (i < GetStreamNum(pChannels));
pHChannelNode = pHChannelNode->next, i ++)
{
queInfo.chInfo[i].bufType = SYSTEM_BUF_TYPE_VIDBITSTREAM;
queInfo.chInfo[i].codingformat = pHChannelNode->body.hChannel->entity.stream.format;
queInfo.chInfo[i].height = pHChannelNode->body.hChannel->entity.stream.height;
queInfo.chInfo[i].width = pHChannelNode->body.hChannel->entity.stream.width;
queInfo.chInfo[i].memType = SYSTEM_MT_TILEDMEM;
queInfo.chInfo[i].dataFormat = SYSTEM_DF_YUV420P;
queInfo.chInfo[i].scanFormat = Vsys_isStdInterlaced(pHChannelNode->body.hChannel->entity.stream.std) ?
SYSTEM_SF_INTERLACED : SYSTEM_SF_PROGRESSIVE;
}
esipcBitsOutHostPrm0.baseCreateParams.numOutQue = 1;
esipcBitsOutHostPrm0.baseCreateParams.numChPerOutQue[0] = GetStreamNum(pChannels);
esipcBitsOutHostPrm0.baseCreateParams.outQueParams[0].nextLink = esipcBitsInVideoId0;
esipcBitsOutHostPrm0.bufPoolPerCh = FALSE;
esipcBitsOutHostPrm0.numBufPerCh[0] = 16;
IPCBitsOutHLOS_Params_Init(&esipcBitsOutHostPrm0, &queInfo);
esipcBitsInVideoPrm0.baseCreateParams.inQueParams.prevLinkId = esipcBitsOutHostId0;
esipcBitsInVideoPrm0.baseCreateParams.inQueParams.prevLinkQueId = 0;
esipcBitsInVideoPrm0.baseCreateParams.numOutQue = 1;
esipcBitsInVideoPrm0.baseCreateParams.numChPerOutQue[0] = GetStreamNum(pChannels);
esipcBitsInVideoPrm0.baseCreateParams.outQueParams[0].nextLink = esdecId0;
IPCBitsInRTOS_Params_Init(&esipcBitsInVideoPrm0);
for (pHChannelNode = pChannels->hChannelList[CHANNEL_CLS_STREAM]->next, i = 0;
pHChannelNode && (i < GetStreamNum(pChannels));
pHChannelNode = pHChannelNode->next, i ++)
{
esdecPrm0.chCreateParams[i].format = pHChannelNode->body.hChannel->entity.stream.format;
esdecPrm0.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY;
esdecPrm0.chCreateParams[i].targetMaxWidth = pHChannelNode->body.hChannel->entity.stream.width;
esdecPrm0.chCreateParams[i].targetMaxHeight = pHChannelNode->body.hChannel->entity.stream.height;
esdecPrm0.chCreateParams[i].fieldMergeDecodeEnable = FALSE;
esdecPrm0.chCreateParams[i].algCreateStatus = DEC_LINK_ALG_CREATE_STATUS_CREATE;
esdecPrm0.chCreateParams[i].defaultDynamicParams.targetFrameRate = pHChannelNode->body.hChannel->entity.stream.frameRate;
esdecPrm0.chCreateParams[i].defaultDynamicParams.targetBitRate = pHChannelNode->body.hChannel->entity.stream.targetBitRate;
esdecPrm0.chCreateParams[i].numBufPerCh = 16;
esdecPrm0.chCreateParams[i].algCreateStatus = TRUE;
}
esdecPrm0.inQueParams.prevLinkId = esipcBitsInVideoId0;
esdecPrm0.inQueParams.prevLinkQueId = 0;
esdecPrm0.outQueParams.nextLink = esipcOutVideoId0;
esdecPrm0.tilerEnable = TRUE;
esipcOutVideoPrm0.inQueParams.prevLinkId = esdecId0;
esipcOutVideoPrm0.inQueParams.prevLinkQueId = 0;
esipcOutVideoPrm0.numOutQue = 1;
esipcOutVideoPrm0.outQueParams[0].nextLink = esipcInVpssId0;
esipcOutVideoPrm0.notifyNextLink = TRUE;
esipcOutVideoPrm0.notifyPrevLink = FALSE;
esipcOutVideoPrm0.noNotifyMode = FALSE;
esipcInVpssPrm0.inQueParams.prevLinkId = esipcOutVideoId0;
esipcInVpssPrm0.inQueParams.prevLinkQueId = 0;
esipcInVpssPrm0.numOutQue = 1;
esipcInVpssPrm0.outQueParams[0].nextLink = esmergeId0;
esipcInVpssPrm0.notifyNextLink = TRUE;
esipcInVpssPrm0.notifyPrevLink = TRUE;
esipcInVpssPrm0.noNotifyMode = FALSE;
esipcFramesOutHostPrm0.baseCreateParams.inQueParams.prevLinkId = SYSTEM_LINK_ID_INVALID;
esipcFramesOutHostPrm0.baseCreateParams.inQueParams.prevLinkQueId = 0;
esipcFramesOutHostPrm0.baseCreateParams.numOutQue = 1;
esipcFramesOutHostPrm0.baseCreateParams.numChPerOutQue[0] = 1;
esipcFramesOutHostPrm0.baseCreateParams.outQueParams[0].nextLink = esipcFramesInVpssId0;
esipcFramesOutHostPrm0.baseCreateParams.inputFrameRate = 60;
esipcFramesOutHostPrm0.baseCreateParams.outputFrameRate = 60;
esipcFramesOutHostPrm0.baseCreateParams.notifyNextLink = TRUE;
esipcFramesOutHostPrm0.baseCreateParams.notifyPrevLink = FALSE;
esipcFramesOutHostPrm0.baseCreateParams.notifyProcessLink = FALSE;
esipcFramesOutHostPrm0.baseCreateParams.noNotifyMode = FALSE;
esipcFramesOutHostPrm0.inQueInfo.numCh = 1;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].startX = 0;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].startY = 0;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].height = 720;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].width = 1280;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].pitch[0] = 2560;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].bufType = SYSTEM_BUF_TYPE_VIDFRAME;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].bufferFmt = 1;//0;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].codingformat = IVIDEO_H264HP;//0;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].memType = SYSTEM_MT_NONTILEDMEM;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].dataFormat = SYSTEM_DF_YUV422I_YUYV;
esipcFramesOutHostPrm0.inQueInfo.chInfo[0].scanFormat = SYSTEM_SF_PROGRESSIVE;
System_linkCreate(esipcFramesOutHostId0, &esipcFramesOutHostPrm0, sizeof(esipcFramesOutHostPrm0));
esipcFramesInVpssPrm0.baseCreateParams.inQueParams.prevLinkId = esipcFramesOutHostId0;
esipcFramesInVpssPrm0.baseCreateParams.inQueParams.prevLinkQueId = 0;
esipcFramesInVpssPrm0.baseCreateParams.inputFrameRate = 60;
esipcFramesInVpssPrm0.baseCreateParams.noNotifyMode = FALSE;
esipcFramesInVpssPrm0.baseCreateParams.notifyNextLink = TRUE;
esipcFramesInVpssPrm0.baseCreateParams.notifyPrevLink = TRUE;
esipcFramesInVpssPrm0.baseCreateParams.numOutQue = 1;
esipcFramesInVpssPrm0.baseCreateParams.numChPerOutQue[0] = 1;
esipcFramesInVpssPrm0.baseCreateParams.outQueParams[0].nextLink = esmergeId0;
esipcFramesInVpssPrm0.baseCreateParams.outputFrameRate = 60;
What cause this issue, and how can I fix it?
Appreciate it for your response!