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里面处理运行。”