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.

DM8168从本地读文件解码,帧率控制。



我用的平台是DM8168,想从本地读一个文件送到dsp去做算法处理,但是不知道如何控制帧率,现在帧率特别快,监控的HDMI上就像快进一样。

框架是DVRRDK4.3, 框架下有demo_vdec_vdis 仔细看过这个demo的代码,Link的连接就是仿造这个demo搭建的,但是这个demo的Link连接

也没有帧率控制,而是靠swMsPrm[i].maxInputQueLen = SYSTEM_SW_MS_INVALID_INPUT_QUE_LEN;这个参数来“缓解”的帧率问题,如果把这个

参数的值改为SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN,那在HDMI上也是跟快进一样。

现在我自己的Link连接 是在decLink后加了一个deiLink,目的为了做格式转换,dei的配置如下。

DeiLink_CreateParams_Init(&deiPrm);
deiPrm.inQueParams.prevLinkId = gMultiCh_VdecVdisObj.ipcInVpssId;
deiPrm.inQueParams.prevLinkQueId = 0;
deiPrm.setVipScYuv422Format = FALSE;
// Set Output Scaling at DEI based on ratio
deiPrm.enableOut[DEI_LINK_OUT_QUE_VIP_SC] = TRUE;
deiPrm.inputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30;
deiPrm.outputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30;
deiPrm.inputDeiFrameRate = 30;
deiPrm.outputDeiFrameRate = 30;
deiPrm.outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = gVcapModuleContext.ipcFramesOutVpssId[0];
deiPrm.enableDeiForceBypass = TRUE;

这里有一个小问题,查阅文档说decLink的输出格式是YUV420的,但是我送到算法那里,算法会失效,而经过deiLink转换格式后算法就正常工作了,

deiPrm.setVipScYuv422Format = FALSE; 应该是有转换格式的作用。

那么问题来了,加了参数deiPrm.enableDeiForceBypass = TRUE,整个Link的帧率不受控制,在HDMI上像快进一样,怎么都调不好,调节

swMsPrm[i].maxInputQueLen参数也没有用。如果把这个参数置为FALSE,视频就卡在第一帧,数据不流通。

现在可把我难住了。后来考虑过把deiLink换成nsfLink,因为这个Link也有转换格式的功能,但是在LINK启动的时候总是报错

 [m3vpss ]  28873: Assertion @ Line: 219 in links_m3vpss/nsf/nsfLink_drv.c: pObj->fvidHandleNsf != NULL : failed !!!

各位大佬,还请不吝赐教,谢谢!!!!!!!!!!!!

  • 你好;

           你在读本地文件的时候,就可以控制读本地文件的帧率,如果你不做控制,最后就只能受处理模块性能的限制,或者带宽等,可能会快很多倍的;

  • 谢谢你的指点,我现在就是不知道怎么控制读取本地文件的帧率,要怎么控制啊?这一块代码是在哪里?  谢谢!

  • 你读的数据有时间戳吗?

    每次是读一帧数据吗?

  • 在demo_vdec_vdis里 它的第一个Link是这样连接的

    ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink= gVdecModuleContext.ipcBitsInRTOSId;
    ipcBitsOutHostPrm.baseCreateParams.notifyNextLink = FALSE;
    ipcBitsOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;
    ipcBitsOutHostPrm.baseCreateParams.noNotifyMode = TRUE;
    ipcBitsOutHostPrm.baseCreateParams.numOutQue = 1;
    ipcBitsOutHostPrm.inQueInfo.numCh = gVdecModuleContext.vdecConfig.numChn;

    其实我只知道怎么连接Link ,这个读文件的LINK 内部具体是怎么读取文件了(以及如何做读取速度的控制) 我还没有找到代码在哪里。。。

    新手,刚刚接触dvrrdk这个框架 不久,还请指点!

  • 你是使用的哪个版本的SDK ?

  • DVRRDK_04.00.00.03

    我顺着让输入解码ini文件的提示,找到了关于读取文件时间截的设置函数

    static Void VdecVdis_setFrameTimeStamp(VCODEC_BITSBUF_S *pEmptyBuf)
    {
    UInt64 curTimeStamp =
    gVdecVdis_config.frameCnt[pEmptyBuf->chnId] * VDEC_VDIS_FRAME_DURATION_MS;
    pEmptyBuf->lowerTimeStamp = (UInt32)(curTimeStamp & 0xFFFFFFFF);
    pEmptyBuf->upperTimeStamp = (UInt32)((curTimeStamp >> 32)& 0xFFFFFFFF);
    pEmptyBuf->timestamp = (UInt32)Avsync_getWallTime();
    if (0 == gVdecVdis_config.frameCnt[pEmptyBuf->chnId])
    {
    UInt32 displayChId;

    Vdec_mapDec2DisplayChId(VDIS_DEV_HDMI,pEmptyBuf->chnId,&displayChId);
    Vdis_setFirstVidPTS(VDIS_DEV_HDMI,displayChId,curTimeStamp);
    Vdec_mapDec2DisplayChId(VDIS_DEV_HDCOMP,pEmptyBuf->chnId,&displayChId);
    Vdis_setFirstVidPTS(VDIS_DEV_HDCOMP,displayChId,curTimeStamp);
    Vdec_mapDec2DisplayChId(VDIS_DEV_SD,pEmptyBuf->chnId,&displayChId);
    Vdis_setFirstVidPTS(VDIS_DEV_SD,displayChId,curTimeStamp);
    }
    gVdecVdis_config.frameCnt[pEmptyBuf->chnId] += 1;
    }

    但是我不知道怎么修改才能满足 fps=30, 以及如何通过LinkParam来修改时间截??

    谢谢哈

  • 你本地读的是 h264 的文件还是 其他格式的文件 ?