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.

In 8168 ,DMA copy data occur split screen

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!