TI中文支持网
TI专业的中文技术问题搜集分享网站

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的说明?

Chris Meng:

你好,

目前IPNC软件里的dsp link是一个proces link,没有下一个link,直接返回调用的link的。建议你先参考目前有的link。下面的流程你是否能尝试?

IPCframeout (vpss)-》ipcframein(dsp)-》DSP pocess link-》IPCframeout (vpss)-》ipcm3out(vpss)-》ipcm3in(video)

Micky xie:

回复 Chris Meng:

您好,

我在DSP的link中加入了nextlink的支持也是不行的吗?比如System_registerLink()之前设置了linkObj的linkGetFullFrames、linkPutEmptyFrames、getLinkInfo接口,当然这些接口是对outFrameQue队列的操作,队列在creat时也创建好了。

另外,您所指的这个流程中,

IPCframeout (vpss)-》ipcframein(dsp)-》DSP pocess link-》IPCframeout (vpss)-》ipcm3out(vpss)-》ipcm3in(video)。

我不太明白dsplink之后,DSP pocess link-》IPCframeout(vpss)-》ipcm3out(vpss)-》ipcm3in(video)直接这么连接吗?还是DSP pocess link-》ipcm3out(dsp)-》ipcm3in(video)?或者别的?

Chris Meng:

回复 Micky xie:

DSPLInk是proces link直接返回调用它的linkIPCframeout(vpss)

Micky xie:

回复 Chris Meng:

此外,如果将ipcFrameOut按照processlink的方式连接DSP,其nextlink接后续部分是否可行?

 ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkId = gVcamModuleContext.cameraId;

 ipcFramesOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 1;

  ipcFramesOutVpssPrm.baseCreateParams.notifyPrevLink = TRUE;

 ipcFramesOutVpssPrm.baseCreateParams.numOutQue = 1;

 ipcFramesOutVpssPrm.baseCreateParams.outQueParams[0].nextLink = mergeId[CAM_STREAM_MERGE_IDX];

 ipcFramesOutVpssPrm.baseCreateParams.notifyNextLink = TRUE;

 ipcFramesOutVpssPrm.baseCreateParams.processLink = ipcFramesInDspId;            // 后接DSP

 ipcFramesOutVpssPrm.baseCreateParams.notifyProcessLink = TRUE;

 ipcFramesOutVpssPrm.baseCreateParams.noNotifyMode = FALSE;

Chris Meng:

回复 Micky xie:

你好,

ipcFrameout link就是用于传递frame数据的,请不要设置 ipcFramesOutVpssPrm.baseCreateParams.processLink = ipcFramesInDspId; 。请把ipcFrameout link的nextLink设置为ipcFramein (dsp)。你可以把你自己的dsp算法作为函数在dsp process link里面处理运行。

Micky xie:

回复 Chris Meng:

您好,

请问A8有没有对frame操作的link?我见有从A8进出的frame及bits的link通道,但没看到实际针对帧图的操作。

如果自己添加的话,参照哪个比较容易呢?

Micky xie:

回复 Chris Meng:

Up

Albert Lee2:

回复 Micky xie:

Micky,我最近也在弄8127,A8那端是使用McFW API 对link进行操作控制的,在A8端有一个不完整的帧信息的存储操作。方便的话大家相互交流下,我的QQ是1967651954。谢谢

map dog:

回复 Chris Meng:

你好,我就是参照上述的方式做的,运行过程之中也没有抱什么错误,就是在DSP pocess link这里的时候,发现没有数据,请问是怎么回事呢???????????

IT男:

回复 Chris Meng:

你这是误导别人吗?

“请不要设置 ipcFramesOutVpssPrm.baseCreateParams.processLink = ipcFramesInDspId; 。请把ipcFrameout link的nextLink设置为ipcFramein (dsp)。你可以把你自己的dsp算法作为函数在dsp process link里面处理运行。”

赞(0)
未经允许不得转载:TI中文支持网 » DM8127 Frame进入DSP处理后连入到VPSS问题
分享到: 更多 (0)