在soc模式下客户用ffmpeg解码时拿到AVframe将data[0-3] copy到系统内存发现copy时间是在20ms左右而相同数据量在系统内存两块地址copy只需要1-3ms
上述问题的原因是系统在ffmpeg中默认是禁止cache的,因此用cpu copy性能很低,使能cache就能达到系统内存互相copy同样的速度。可以用以下接口使能cache.
| av_dict_set_int(&opts, "enable_cache", 1, 0);
但是这样直接copy数据保存是非常占用内存、带宽和cpu算力的,我们推荐采用零拷贝的方式来实现原始解码数据的保存:
a. 推荐使用 extra_frame_buffer_num 参数指定增大硬件帧缓存数量,可以根据自己的需要选择缓存帧的数量。这个方式的弊端,一个是占用解码器内存,可能减少视频解码的路数;另一个是当不及时释放,当缓存帧全部用完时,会造成视频硬件解码堵塞。
| av_dict_set_int(&opts, "extra_frame_buffer_num", extra_frame_buffer_num, 0);
b. 推荐使用 output_format参数设置解码器输出压缩格式数据,然后使用vpp处理输出非压缩yuv数据(当需要缩放,crop时,可以同步完成),然后直接零拷贝引用非压缩yuv数据。这种方式不会影响到硬件解码性能,并且可以缓存的数据空间也大很多
| av_dict_set_int(&opts, "output_format", 101, 0);