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