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

关于调用DSP算法的问题

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。

赞(0)
未经允许不得转载:TI中文支持网 » 关于调用DSP算法的问题
分享到: 更多 (0)