dsp下基于双循环缓冲队列的视频采集和显示记录

对最近在设计的视频采集和显示缓冲机制做一个记录,以便以后使用。

视频采集和显示缓冲机制,其实是参考了Linux下v4L2的驱动机制,其采用输入多缓冲frame,输出多缓冲的切换机制。简单的就是ping-pong双缓冲。

本人分别设计了in和out的两个buffer queue。每个queue分为8个子buffer,如下所示。

dsp下基于双循环缓冲队列的视频采集和显示记录

 

其中,分别用类似于指针的frame和free两个偏移量,来维护整个队列的运行。

xxx_offset = (xxx_offset + 1)& 7;//每当发生一次采集图像完成的中断,就对其进行做该操作。

将最新的free地址所在的buffer作为采集buffer。当然在下次中断到来时,采集的图像是放在free帧的黑色位置。

 

类似的outbuffer显存也采用该种模式,free用于接收处理好的数据,frame作为显存空间。:

dsp下基于双循环缓冲队列的视频采集和显示记录

而在显示中,中断产生主要做如下工作:

frame_offset = (frame_offset + 1) & 7进行缓冲循环显示,每次中断后切换到红色位置,但是当前显存地址仍是frame_offset,黑色位置。

 

主程序在循环中对采集的图形做处理,处理的缓冲由frame buffer来维护。处理的图像维护到outbuffer的free 中去。

其实就类似于双缓冲的ping-pong机制,介绍如下:

2组队列,inbuffer1 ,outbuffer1. inbuffer2,outbuffer2.

其实inbuffer1用于采集,outbuffer1用于显示。同时inbuffer2被CPU处理,处理好的数据送outbuffer2。整个周期完成后,下个周期。

切换数据采集到inbuffer2,outbuffer2的数据被用于去显示。下一inbuffer1的数据将被CPU处理存储到outbuffer1中。循环.......

 

在设计上只是为了处理显示更加高效,采用了8对乒乓buffer,来实现类似的功能,运行起来如下图所示:

dsp下基于双循环缓冲队列的视频采集和显示记录

上图的5个过程大致如下分析:

1:表示当前frame处的图像处理完成

2:表示当前图像采集缓冲地址发送切换,发生在中断过程中。

3:表示显存地址发生切换,发送在中断过程中。

4:表示当前free的缓冲放入了处理的数据。

5:数据处理的一个过程,从frame区域经过处理后存放到free中。

以上5个工程,循环工作就构成了双循环缓冲队列的采集、处理和显示过程。

 

 

 

你可能感兴趣的:(队列)