项目中遇到一个问题,需要得到V4L2 Sensor前端吐帧的帧率,本来直接看sensor配置参数即可达到目的,可是作为一个做事严谨的工程师,必须要做到耳听为虚,眼见为实,只有看到实实在在的统计信息,才能相信数据是正确的。
那么该怎么做到呢? V4L2框架的架构如下图所示,从图中我们可以看到,视频设备在抓取到视频图像后,会调用vb2_buffer_done回调函数将帧上报给v4l2 核心层函数,其中vb2_buffer_done是核心层实现的回调函数。vb2_buffer_done是外部连接(EXPORT_SYMBOL_GPL)的符号,可以由模块调用。调用路径一般由VIDEO设备的中断触发,通过:
xxx_video_frame_arrive_irq->...->vb2_buffer_done->(v4l2 core).到到V4L2核心实现。
如果在这里实现信息统计,无疑得到的是实实在在的帧率信息,我们来实现一下:
实际运行一下看看:
每隔一秒打印的当前帧计数,可以看到,sensor过来的实际的帧率是60fps。
前面我们确认了,sensor端过来的帧率是60fps,那么经过常常的V4L2框架流水线式处理后,这个帧率会发生变化吗?想要确认这个问题,就需要我们统计一下用户层的帧率了。
用户层统计帧率的代码如下:
打印输出: