新闻中心

EEPW首页>消费电子>设计应用> 基于V4L2视频采集缓存机制应用与实现

基于V4L2视频采集缓存机制应用与实现

作者: 时间:2010-12-24 来源:网络 收藏


这些函数原型一般定义在include/linux/videodev2.h或者videodev.h中。
采集的具体过程描述如下:
(1)打开设备。通过open()函数打开设备文件,返回文件描述符。
(2)初始化设备。首先通过VIDIOC_QUERYCAP查询设备属性,判断该设备是否为一个合法的采集设备,并确定其支持的功能有哪些;然后通过 VIDIOC_S_FMT设置图像的格式,例如图像的大小等;通过VIDIOC_REQBUFS和malloc()分别在内核空间和用户空间分配内存缓冲区;最后通过mmap()函数进行内存映射。
(3)图像采集循环。首先通过VIDIOC_QBUF将空缓冲区移入待处理队列,准备接收图像数据;然后通过VIDIOC_QBUF将满缓冲区移出已处理队列,进行图像的显示和处理;最后通过VIDIOC_STREAMON和VIDIOC_STREAMOFF启动和停止采集。
(4)关闭设备。通过close()函数关闭设备文件。

2 双帧缓存数据传输
采集中,首先在内核空间建立2个图像缓冲区,不断将采集到的图像存放到缓冲区中。当应用程序需要图像时,驱动程序并不做拷贝操作,而是建立内核缓冲区到用户空间的映射,也就是利用mmap()函数,存取其返回的指针,相当于存取内核中的图像缓冲区。由于不需要做额外的复制操作,效率大大提高了,图像采集流程如图1所示。

c.JPG
具体说明如下:
(1)程序首先使用VIDIOC_REQBUFS向驱动程序请求图像缓冲区,v412_requestbuffers结构体包含了所要求缓冲区的类型及数量,但驱动程序有权决定最后返回的数量,因此程序仍需要使用系统返回的缓冲区数量,在这里程序返回2个缓冲区。
(2)由于缓冲区数量有2个,调用2次mmap()建立起用户空间和内核空间缓冲区的对应关系,然后读取mmap()所返回的指针就相当于读取图像缓冲区。
(3)此时驱动程序仍然不能对图像缓冲区做读取,调用2次VIDIOC_QBUF ioctl将缓冲区加入到驱动程序内部的采集序列,之后采集的图像就会被储存到这些缓冲区内。
(4)调用VIDIOC_STREAM ioctl后,驱动程序开始采集图像,并将图像放置到缓冲区内。
(5)虽然缓冲区内已经存放有图像了,但直接去读取某个缓冲区还是需要非常小心的,因为缓冲区仍然在驱动程序的图像采集序列中,有可能读取到一半,驱动程序又使用该缓冲区储存新的图像,而图1中的(5)是最后调用VIDIOC_STREAMOFF,以停止图像采集,此时驱动程序会自动将所有缓冲区从图像采集序列中移除,所以不需要手动调用VIDIOC_DQBUF,接着使用munmap()清除所有的存储区映射导致图像前后不一致。因此要在读取缓冲区前,先调用VIDIOC_DQBUG ioctl,通知驱动程序不要使用此缓冲区,在这个阶段中,通常是以如图2所示的顺序来读取每个缓冲区的。


关键词:视频

评论


相关推荐

技术专区

关闭