对最近在设计的视频采集和显示缓冲机制做一个记录,以便以后使用。
视频采集和显示缓冲机制,其实是参考了Linux下v4L2的驱动机制,其采用输入多缓冲frame,输出多缓冲的切换机制。简单的就是ping-pong双缓冲。
本人分别设计了in和out的两个buffer queue。每个queue分为8个子buffer,如下所示。
其中,分别用类似于指针的frame和free两个偏移量,来维护整个队列的运行。
xxx_offset = (xxx_offset + 1)& 7;//每当发生一次采集图像完成的中断,就对其进行做该操作。
将最新的free地址所在的buffer作为采集buffer。当然在下次中断到来时,采集的图像是放在free帧的黑 {MOD}位置。
类似的outbuffer显存也采用该种模式,free用于接收处理好的数据,frame作为显存空间。:
而在显示中,中断产生主要做如下工作:
frame_offset = (frame_offset + 1) & 7进行缓冲循环显示,每次中断后切换到红 {MOD}位置,但是当前显存地址仍是frame_offset,黑 {MOD}位置。
主程序在循环中对采集的图形做处理,处理的缓冲由frame buffer来维护。处理的图像维护到outbuffer的free 中去。
其实就类似于双缓冲的ping-pong机制,介绍如下:
2组队列,inbuffer1 ,outbuffer1. inbuffer2,outbuffer2.
其实inbuffer1用于采集,outbuffer1用于显示。同时inbuffer2被CPU处理,处理好的数据送outbuffer2。整个周期完成后,下个周期。
切换数据采集到inbuffer2,outbuffer2的数据被用于去显示。下一inbuffer1的数据将被CPU处理存储到outbuffer1中。循环.......
在设计上只是为了处理显示更加高效,采用了8对乒乓buffer,来实现类似的功能,运行起来如下图所示:
上图的5个过程大致如下分析:
1:表示当前frame处的图像处理完成
2:表示当前图像采集缓冲地址发送切换,发生在中断过程中。
3:表示显存地址发生切换,发送在中断过程中。
4:表示当前free的缓冲放入了处理的数据。
5:数据处理的一个过程,从frame区域经过处理后存放到free中。
以上5个工程,循环工作就构成了双循环缓冲队列的采集、处理和显示过程。