DSP

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

2019-07-13 20:06发布

对最近在设计的视频采集和显示缓冲机制做一个记录,以便以后使用。 视频采集和显示缓冲机制,其实是参考了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个工程,循环工作就构成了双循环缓冲队列的采集、处理和显示过程。