V4L2视频采集设备应用程序编程总结(转)
Linux2.x内核中,一部分视频设备(特别是视频输入和采集设备)采用了V4L2模型进行驱动编程。同时提供V4L2的API函数及相关数据结构以供应用程序使用.这里对V4L2视频采集设备的应用程序编程进行总结.
1. 使用的头文件: V4L2模型使用统一的头文件来包含相关的数据结构和宏,它存在于”Linux源码目录/include/linux/videodev.h”以及”Linux源码目录/include/linux/videodev2.h”.通常一个视频设备的驱动程序头文件会包含它.因此,编程时只需要包含视频驱动对应的头文件就可以了.在这里是“/media/davinci_vpfe.h”.
2. 由于在应用程序编程中涉及到V4L2数据结构。而该文件包含于Linux源码中,因此在makefile文件中要包含源码头文件的路径“-I XXX/include”.
3. 编程流程如下:
动作
函数
变量及参数
备注
1
打开视频设备(阻塞或非阻塞)
Open
设备对应路径和名称
一般为“/dev/videoX”X=0,1,2…
2
询问设备的能力和性质
Ioctl
对于输入设备,必然要支持内存映射或用户指针
3
验证视频标准的有效性,并设置设备视频标准
Ioctl
验证标准为设备支持的标准并进行设置后要稍微延时并查询,检查设备是否已设置为相应的标准
4
设置采集设备采集格式
Ioctl
通过配置该结构体,驱动会根据硬件调整像素实际宽,高,每行的字节个数,一幅图像字节数四个参数。程序应根据实际情况修改返回的结果,重新赋值。
5
请求缓冲区,并通过mmap函数映射到用户进程内存空间
Ioctl
1.申请缓冲可能不成功。因此通过v4l2_requestbuffers.count返回值判断是否申请到足够的缓存.一般设置2—3个buffers.在DaVinci的vpfe驱动中默认就设置了3个buffers.多余3个申请失败,少于三个依然使用三个.
2.映射内存出现失败的情况后一定要将已经映射的区域取消映射后再关闭设备
6
将申请到的buffers加入到缓冲队列当中,开始采集
Ioctl
进行采集时先通过VIDIOC_DQBUF将一个buffer从队列中取出来,然后得到它对应映射后的起始地址。进行必要的处理。完毕后一定要将该buffer重新放入队列中,否则程序到最后将无buffer可用。
PS:由于无论是数字视频还是模拟视频,都会有一个i2c配置的过程。从vpfe的驱动代码来看,当设置视频标准时,驱动程序将会调用i2c驱动配置视频源的输出格式。(对于模拟信号通常是TVP5150之类的解码芯片,通过I2C配置,而对于MT9T001之类的芯片则通过I2C直接对其进行配置.)
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cfistalent/archive/2009/12/14/5004865.aspx