zoukankan      html  css  js  c++  java
  • dsp下基于双循环缓冲队列的视频采集和显示记录

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

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

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

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

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

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

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

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

    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,来实现类似的功能,运行起来如下图所示:

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

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

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

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

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

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

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

  • 相关阅读:
    clickhouse-(04)-常用高阶函数
    clickhouse-(03)-库和表引擎
    clickhouse-(02)-适合的场景
    clickhouse-(01)-安装
    MySQL实战45讲-笔记
    Linux软连接和硬链接
    直接访问和间接访问
    指针和地址的区别
    配置Apache 运行CGI---------笔记
    配置Apache 运行CGI
  • 原文地址:https://www.cnblogs.com/pangblog/p/3303929.html
Copyright © 2011-2022 走看看