
053、海思Hi3516/Hi3559 MPP平台全链路适配:VI-VPSS-VENC的Buffer管理、延迟控制与量产参数固化去年有个项目,Hi3516DV300做双目结构光,客户反馈说画面偶尔“卡一下”,不是掉帧那种卡,是那种“顿挫感”,像老式胶片电影换帧。我们抓了三天log,最后定位到是VPSS的Group里,低帧率通道的Buffer没有及时释放,导致VENC侧拿到的帧时间戳抖动。这个问题在文档里根本找不到,得靠对MPP Buffer流转的底层理解才能解。今天就把这条链路上那些“文档不会写、调试才见鬼”的坑,一次性说透。先说VI侧。VI采集的Buffer,本质上是ISP输出的一整块物理连续内存,海思叫VB(Video Buffer)。很多人上来就调SAMPLE_COMM_VI_StartVi,然后就不管了,这是大忌。VI的Buffer数量,直接决定了你能否扛住帧率波动。Hi3516上,我习惯把VI的VB个数设为“最大帧率×3”再加2个余量。比如30fps,就设92个,别问为什么是92不是90,因为海思的VB池是按块对齐的,你设90,它实际给你分配的可能还是按16对齐,多两个不亏,少了就等着丢帧。更关键的是,VI的Buffer必须走VB_CONF_S里的stVbConf配置公共VB池,而不是用VB_CONF_S里的私有池。公共池的好处是,VPSS和VENC可以共享同一块物理内存,省去一次memcpy。这里踩过坑:如果你在VI里用了私有池,VPSS再开自己的私有池,那么每一帧都要做一次物理拷贝,3516的DDR带宽瞬间被吃掉3