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.

DM8127 Frame进入DSP处理后连入到VPSS问题



DM8127的设备,自己根据multich_dualstream_demo.c修改了一种解决方案,在camera与merge之间加入了DSP端的处理。

总共加入了5各部分,分别是ipcFramesOutVpss、ipcFramesInDsp、Ne(dsp端算法)、ipcFramesOutDsp、ipcFramesInVpss,前后分别与camera和merge连接。

但系统启动后出以下错误:

[m3vpss ]  9241: Assertion @ Line: 563 in links_common/ipcFramesIn/ipcFramesInLink_tsk.c: pListElem->frameBuf.phyAddr[0][0] == pFrameBuf->addr[0][0] : failed !!!

 

我的Ne(dsp)算法中一些设置如下:

typedef struct {  

    Utils_TskHndl tsk;

    NeLink_CreateParams createArgs;

    UInt32 receviedFrameCount;

    System_LinkInfo info;

    System_LinkInfo inTskInfo;

    System_LinkQueInfo inQueInfo;

    FVID2_Frame outFrames[NE_LINK_MAX_OUT_FRAMES];

    NeLink_perFrameConfig perFrameCfg[NE_LINK_MAX_OUT_FRAMES];

    FVID2_Format bufferFrameFormat;

    Utils_BufHndl outFrameQue; 

    System_FrameInfo frameInfo[NE_LINK_MAX_OUT_FRAMES];

    FVID2_FrameList outFrameList;

} NeLink_Obj;

 NE_LINK_MAX_OUT_FRAMES 为 4

算法:

Int32 NeLink_algTestFrames(NeLink_Obj *pObj)

 {

     Int32 status;

     Int32 frameId;

     UInt32 edmaWidth, edmaHeight;

     FVID2_Frame *pEmptyFrame;  

     FVID2_Frame *pFullFrame;

     FVID2_FrameList frameList;

     System_LinkInQueParams *pInQueParams;

     NeLink_CreateParams *pNeParams = &pObj->createArgs;

     pInQueParams = &pNeParams->inQueParams;

     System_getLinksFullFrames(pInQueParams->prevLinkId, pInQueParams->prevLinkQueId, &frameList);

     if (frameList.numFrames)

     {

          for (frameId = 0; frameId < frameList.numFrames; frameId++)  

         {

                   status = Utils_bufGetEmptyFrame(&pObj->outFrameQue, &pEmptyFrame,BIOS_NO_WAIT);

                   if ((status == FVID2_SOK) && (pEmptyFrame != NULL))

                   {

                          pFullFrame = frameList.frames[frameId]; 

                          edmaWidth  = pObj->inQueInfo.chInfo[0].width;

                          edmaHeight = pObj->inQueInfo.chInfo[0].height;

                          memcpy(pEmptyFrame->addr[0][0], pFullFrame->addr[0][0], edmaWidth * edmaHeight);

                          pEmptyFrame->timeStamp = pFullFrame->timeStamp;

                          /* put the buffer into full queue */

                          status = Utils_bufPutFullFrame(&pObj->outFrameQue, pEmptyFrame);

                          UTILS_assert(status == FVID2_SOK);

                          System_sendLinkCmd(pObj->createArgs.outQueParams.nextLink, SYSTEM_CMD_NEW_DATA);

               }

          }

          System_putLinksEmptyFrames(pInQueParams->prevLinkId, pInQueParams->prevLinkQueId, &frameList);

     }

     return FVID2_SOK;

}

 

Int32 NeLink_getFullFrames(Utils_TskHndl * pTsk, UInt16 queId,  FVID2_FrameList * pFrameList)

 {

      Int32 status;

      NeLink_Obj *pObj = (NeLink_Obj *) pTsk->appData;

      status = Utils_bufGetFull(&pObj->outFrameQue, pFrameList, BIOS_NO_WAIT);

      UTILS_assert(status == FVID2_SOK);

      return FVID2_SOK;

 }

 

Int32 NeLink_putEmptyFrames(Utils_TskHndl * pTsk, UInt16 queId, FVID2_FrameList * pFrameList)

 {

    UInt32 status;

    UInt32 frameId;

    FVID2_Frame *pFrame = NULL;

    NeLink_Obj *pObj = (NeLink_Obj *) pTsk->appData;

    for (frameId = 0; frameId < pFrameList->numFrames; frameId++)

    {

          pFrame = &pObj->outFrames[frameId];

          status = Utils_bufPutEmptyFrame(&pObj->outFrameQue, pFrame);

          UTILS_assert(status == FVID2_SOK);

     } 

     return FVID2_SOK;

}

 

首先请问这种方式可行吗?即从Vpss拿到帧送入DSP再送回Vpss。其次就是上述算法内缺少了哪些操作导致出错?另外,有没有关于ipcFramesLink的说明?