Int32 AlgLink_algProcessData(AlgLink_Obj * pObj)
{
UInt32 frameId, status;
System_LinkInQueParams *pInQueParams;
FVID2_Frame *pFrame;
FVID2_FrameList frameList;
pInQueParams = &pObj->createArgs.inQueParams;
System_getLinksFullFrames(pInQueParams->prevLinkId,
pInQueParams->prevLinkQueId, &frameList);
if (frameList.numFrames)
{
/* SCD should be done first as it requires to operate on raw YUV */
if (pObj->createArgs.enableSCDAlg)
{
status = AlgLink_ScdalgProcessData(&pObj->scdAlg, &frameList, &pObj->outObj[0].bufOutQue);
if (status == FVID2_SOK)
{
/* Send-out the output bitbuffer */
System_sendLinkCmd(pObj->createArgs.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink,
SYSTEM_CMD_NEW_DATA);
}
}
for(frameId=0; frameId<frameList.numFrames; frameId++)
{
pFrame = frameList.frames[frameId];
if(pFrame->channelNum >= pObj->inQueInfo.numCh)
continue;
// do SW OSD
if (pObj->createArgs.enableOSDAlg)
{
AlgLink_OsdalgProcessFrame(&pObj->osdAlg, pFrame);
}
}
System_putLinksEmptyFrames(pInQueParams->prevLinkId,
pInQueParams->prevLinkQueId, &frameList);
}
return FVID2_SOK;
}
这是进行DSP算法处理的程序,对这段程序我有几个不懂的地方:
1:System_getLinksFullFrames(pInQueParams->prevLinkId,pInQueParams->prevLinkQueId, &frameList);
这个函数是从上一个link获取帧buffer,这个link应该是capture_link,我想知道DSP获取这个帧buffer时,是直接把frameList中的帧buffer读取到DSP核自己的缓存区,还是在上一个link的缓存区中?
2:我把这个DSP算法程序加上打印信息,具体程序如下
Int32 AlgLink_algProcessData(AlgLink_Obj * pObj)
{
UInt32 frameId, status,n;
System_LinkInQueParams *pInQueParams;
FVID2_Frame *pFrame;
FVID2_FrameList frameList;
pInQueParams = &pObj->createArgs.inQueParams;
System_getLinksFullFrames(pInQueParams->prevLinkId,
pInQueParams->prevLinkQueId, &frameList);
Vps_printf("*************************************************\n");
Vps_printf(" %d :frameList.numFrames: %d !!!\n",Clock_getTicks(),frameList.numFrames);
Vps_printf("**************************************************\n");
if (frameList.numFrames)
{
n=0;
/* SCD should be done first as it requires to operate on raw YUV */
if (pObj->createArgs.enableSCDAlg)
{
status = AlgLink_ScdalgProcessData(&pObj->scdAlg, &frameList, &pObj->outObj[0].bufOutQue);
if (status == FVID2_SOK)
{
/* Send-out the output bitbuffer */
System_sendLinkCmd(pObj->createArgs.outQueParams[ALG_LINK_SCD_OUT_QUE].nextLink,
SYSTEM_CMD_NEW_DATA);
}
}
for(frameId=0; frameId<frameList.numFrames; frameId++)
{
pFrame = frameList.frames[frameId];
if(pFrame->channelNum >= pObj->inQueInfo.numCh)
continue;
// do SW OSD
if (pObj->createArgs.enableOSDAlg)
{
AlgLink_OsdalgProcessFrame(&pObj->osdAlg, pFrame);
}
n++;
Vps_printf(" %d :The number of n is %d !!!\n",Clock_getTicks(),n);
}
System_putLinksEmptyFrames(pInQueParams->prevLinkId,
pInQueParams->prevLinkQueId, &frameList);
}
return FVID2_SOK;
}
这时打印信息如附件1
但当我把 AlgLink_OsdalgProcessFrame(&pObj->osdAlg, pFrame);屏蔽时,打印消息如附件2
我想知道为什么差别这么大?
3:加算法处理函数 AlgLink_OsdalgProcessFrame(&pObj->osdAlg, pFrame);时大概每秒处理30帧左右,但不加这个算法时,每秒调用这个Int32 AlgLink_algProcessData(AlgLink_Obj * pObj)函数的次数大于60+次,这样下去buffer中的帧会溢出,我想知道帧是从哪儿溢出的?
对于这个问题我是这样猜想的,第一种情况:当新的数据来时,DSP丢弃没处理完的帧,直接处理新来的帧。第二种情况:DSP必须处理完从buffer中读取的帧(可能是5,6帧左右),再处理新来的帧。
欢迎大家拍砖,谢谢