常见的丢帧问题定位及解决方法

常见的几种丢帧原因:

  1. 应用调用MI_VENC_GetStream()取流不及时,比如设置30fps,每秒却只调用20次取流接口。

  2. Vpe或者divp设置depth不够,output buffer轮循不过来,比如子码流设置20fps,depth却只设置1张。

  3. 硬件Scale或者venc工作异常,出现Rfull或者venc hung导致丢了几帧数据。

  4. 应用调用MI_VENC_SetSuperFrameCfg()开启超大帧丢帧或者重编机制,当出现size过大的帧会被丢弃。

出现帧率不够或者断流时,定位过程:

  1. 留意串口和/proc/kmsg有没有异常打印(mi_sys和mi_venc的debug_leve不能设置小于2)类似:

    process exceed timeout MillsecAfterTaskEnqueued

    或者类似:[MI WRN ]: _MI_SYS_Try_DequeueInputTaskNoLock[8674]: [thread:venc0_P0_MAIN] module id[2] dev id[0] pass id[0] inputtask is not finished more than 2seconds

    或者类似:Rfull

    或者类似:IMI OFlow

    或者类似:[CMDQ]cmdq(1) ERR: WAIT_TRIG_TIMEOUT ,

  2. 如果多路流都有帧率不够的问题,查看sensor帧率是否足够:

    Frame_interval : 应该略小于sensor帧率的倒数,并且保持稳定不会跳动很大。否则是sensor驱动问题。

    ISP_FIFO_FULL :表示isp统计的,从MIPI接收丢了几帧。正常应该为0,或者保持某个值不动。

    如果ISP_FIFO_FULL值异常,大概率是isp出现了回挡(OSD叠加、scale异常、ring mode rfull和imi mode OFlow都有可能导致回档)。

    如果ISP_FIFO_FULL值正常,Frame_interval和帧率不符合,可能是驱动问题,或者应用下给sensor帧率下错。

  3. 检查sensor帧率设置:

  4. 如果是单路流帧率不够,其他路流帧率正常,检查vpe output framerate 和 venc output framerate:

    DstFrmrate:应用设置的vpe目标帧率,检查是不是客户参数设置出错。

    BufCntQuota:应用设置的vpe port buffer块数,如果是port 2 的fps不够,大概率是depth不够,output buffer轮循不过来。可以给port 2的depth增加1块试试。

    Fps:output port的实际输出帧率,如果不够,尝试该通道上所有RGN关闭。(RGN如果画太多,当它的带宽优化级较高时有可能出现vpe port帧率不够)。

    同理,如果vpe port的fps够,但是串接的divp 的帧率不够,也有可能是divp上RGN太多。

    Inputport DropCnt:如果应用取流不及时,venc output buffer占满,encoder就开始drop yuv frame。因此这个值一直增加表示应用有取流不及时的行为。

    OutputPort DropCnt:如果开启超大帧丢帧或者重编机制,或者encoder编出一帧size过大放不下Output buffer,该帧会被丢帧,这个值就会增加。

  5. 举例:

    我们的venc ring buffer是长*宽*50%,里面最多能同时缓存MaxSteamCnt 默认这个值是6张。客户设置码率是6M。venc outputbuffer里偶尔出现要塞第6张的时候,剩余空间不够放第6张了,就会被丢掉,output dropCnt就会+1。解决output drop的方式是增加output buffer size,或者减少码率让每帧体积变小,或者减少MaxStreamCnt,但是减少MaxStreamCnt 意味客户取流要更快。