常见的丢帧问题定位及解决方法
常见的几种丢帧原因:
-
应用调用MI_VENC_GetStream()取流不及时,比如设置30fps,每秒却只调用20次取流接口。
-
Vpe或者divp设置depth不够,output buffer轮循不过来,比如子码流设置20fps,depth却只设置1张。
-
硬件Scale或者venc工作异常,出现Rfull或者venc hung导致丢了几帧数据。
-
应用调用MI_VENC_SetSuperFrameCfg()开启超大帧丢帧或者重编机制,当出现size过大的帧会被丢弃。
出现帧率不够或者断流时,定位过程:
-
留意串口和/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 ,
-
如果多路流都有帧率不够的问题,查看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帧率下错。
-
检查sensor帧率设置:
-
如果是单路流帧率不够,其他路流帧率正常,检查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,该帧会被丢帧,这个值就会增加。
-
举例:
我们的venc ring buffer是长*宽*50%,里面最多能同时缓存MaxSteamCnt 默认这个值是6张。客户设置码率是6M。venc outputbuffer里偶尔出现要塞第6张的时候,剩余空间不够放第6张了,就会被丢掉,output dropCnt就会+1。解决output drop的方式是增加output buffer size,或者减少码率让每帧体积变小,或者减少MaxStreamCnt,但是减少MaxStreamCnt 意味客户取流要更快。