This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于调用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帧左右),再处理新来的帧。

 

欢迎大家拍砖,谢谢