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帧左右),再处理新来的帧。
欢迎大家拍砖,谢谢
Chris Meng:
你好,
OSD link为例,OSD link会把OSD加在buffer图像上,然后把这个buffer指针返回到调用OSD link的link。这个buffer queue不是OSD link申请的,而是前面的link申请的。这个buffer要等到encode link把图像编码好后,才能一级一级还回去,直到还给申请buffer的link。当后面的link处理比较慢,没有及时返还buffer,会出现申请buffer的link没有buffer可用,这里就会把数据丢了。
mi zhu yu:
回复 Chris Meng:
非常感谢
shuyu liang:
回复 Chris Meng:
您好
想请教下,现在link到底是个什么方式?在哪个文档上能个看到吗?
shuyu liang:
回复 Chris Meng:
Chris Meng
你好,
OSD link为例,OSD link会把OSD加在buffer图像上,然后把这个buffer指针返回到调用OSD link的link。这个buffer queue不是OSD link申请的,而是前面的link申请的。这个buffer要等到encode link把图像编码好后,才能一级一级还回去,直到还给申请buffer的link。当后面的link处理比较慢,没有及时返还buffer,会出现申请buffer的link没有buffer可用,这里就会把数据丢了。
Chris Meng:
回复 shuyu liang:
你好,
建议你看看DVR RDK里面的培训资料dvr_rdk/docs/Trainings。