V4l2 Capture Sequence

转载 2012年03月26日 14:32:55

转:http://blog.csdn.net/qikaibinglan/article/details/6109066

V4l2 Capture Sequence 


v4l2 操作实际上就是 open() 设备, close() 设备,以及中间过程的 ioctl() 操作。对于 ioctl 的调用,要注意对 errno 的判断,如果调用被其他信号中断,即 errno 等于 EINTR 的时候,要重新调用。 

Video capture device 的实际功能就是采集视频信号,并将数字化的图像保存在 memory 中,现在几乎上所有的相关设备都能采集 25/30 帧 /s 。在下面的讨论中,我只列举出一些和 camera 密切相关的一些属性和方法。

1 、 open_device

打开设备一般都是使用 open() 打开 /dev 下的 video 设备文件 ,比如说 /dev/video1, 打开之前首先要对相应的设备文件进行检查 ,比如说使用 stat() 获得文件属性,并判断是否为字符设备文件。

驱动通过主设备号 81 和 0 ~ 255 之间的次设备号来注册 device note ,系统 管理 员通过设备的主次设备号在 /dev 目录下创建相应的字符设备文件。应用 程序不能通过设备的主次设备号来打开设备,而必须通过适当的 device name ,即 /dev 目录下的设备文件来打开设备。

v4l2 支持一个设备文件可以被多次打开,却只允许其中一个应用程序与设备进行数据 交换 ,其他应用程序只能用来设定一些设备参数,对设备进行一些控制。

//====== 相关 spec : http://v4l2spec.bytesex.org/spec/c174.htm#OPEN 

2 、 init_device

对设备进行初始化是一个很复杂的过程,其中要进行一系列参数的协商,其中重要的包括 v4l2_capability, v4l2_cropcap, v4l2_format 等等。

首先使用 VIDIOC_QUERYCAP 命令 来获得当前设备的各个属性,查看设备对各项功能的支持程度:

int ioctl(int fd, int request, struct v4l2_capability *argp);

所有的 v4l2 驱动都必须支持 VIDIOC_QUERYCAP , 而且在打开设备以后,这个 ioctl 必须是被首先调用的。 

v4l2_capability 的各项参数可以查 API ,其中比较重要的是下面的成员变量:

_u32 capabilities

这个 32 位无符号整型定义了当前设备对一些关键属性的支持:

V4L2_CAP_VIDEO_CAPTURE 0x00000001

// 这个设备支持 video capture 的接口,即这个设备具备 video capture 的功能

V4L2_CAP_VIDEO_OUTPUT 0x00000002

// 这个设备支持 video output 的接口,即这个设备具备 video output 的功能

V4L2_CAP_VIDEO_OVERLAY 0x00000004

// 这个设备支持 video overlay 的接口,即这个设备具备 video overlay 的功能 ,在这个功能下会将采集到的 imag 方在视频设备的 meomory 中保存,并直接在屏幕上显示,而不需要经过其他的处理。

V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200

// 这个设备支持 video output overlay( 又名 On-Screen Display) ,这是一个实验性的功能, spec 说明他在将来可能会改变,如果打开这个功能必须将 video overlay 功能给关闭,反之亦然

V4L2_CAP_READWRITE 0x01000000

// 这个设备是否支持 read() 和 write() I/O 操作函数

V4L2_CAP_STREAMING 0x04000000

// 这个设备是否支持 streaming I/O 操作函数

在实际操作过程中,可以将取得的 capabilites 与这些宏进行与远算来判断设备是否支持相应的功能。 

除了 VIDIOC_QUERYCAP 之外,设备其他属性的获得可以通过其他的命令,比如说 VIDIOC_ENUMINPUT 和 VIDIOC_ENUMOUTPUT 可以枚举出设备的输入输出物理连接。

//============== 相关 spec : http://v4l2spec.bytesex.org/spec/x282.htm 



获得 device 的 capability 以后,可以根据应用程序的功能要求对设备参数进行一系列的设置 ,这些参数又分为两部分,一个是 user contrl ,还一个是 extended control ,下面先来讲对 user contrl 的一些参数进行设置。

User control 参数包含一个 ID ,以及相应的 Type ,下面对各个 type 进行简单的列举:

ID Type

V4L2_CID_BASE

// 第一个预定义的 ID ,实际等于 V4L2_CID_BRIGHTNESS ,因为 V4L2_CID_BRIGHTNESS 是第一个预定义的 ID

V4L2_CID_USER_BASE

// 实际上等同于 V4L2_CID_BASE

V4L2_CID_BRIGHTNESS integer

// 图片的亮度,或者说黑色位准

V4L2_CID_AUTO_WHITE_BALANCE boolean

//camera 的自动白平衡

V4L2_CID_EXPOSURE integer

//camera 的爆光时间

V4L2_CID_LASTP1

// 最后一个预定义的 ID ,实际等于上一个 ID + 1

V4L2_CID_PRIVATE_BASE

// 第一个 driver 定义的一般 control ID

可以通过 VIDIOC_QUERYCTRL 和 VIDIOC_QUERYMENU ioctls 来枚举出有效的 control ID ,及其属性,比如说 ID 值,类型,是否有效,是否可修改,最大值,最小值,步长等等 ,主要的数据结构是 v4l2_queryctrl 和 v4l2_querymenu ,他们的结构可以参考 spec 。另外可以通过 V4L2_CID_BASE 和 V4L2_CID_LASTP1 可以枚举出所有的预定义 control ID ,可以通过 V4L2_CID_PRIVATE_BASE 来枚举出所有的驱动定义的 control ID 。 Menu 实际上是同一个 ID 可能具有多个选项的目录。

int ioctl(int fd, int request,struct v4l2_queryctrl *argp);

int ioctl(int fd, int request, struct v4l2_querymenu *argp);

获得 user control ID 以后,可以对其中可以修改的 ID 按照应用程序的要求进行修改 VIDIOC_G_CTRL, VIDIOC_S_CTRL :

int ioctl(int fd, int request, struct v4l2_control *argp);

v4l2_control 的结构比较简单,就是相应的 ID 及其 value 。

//========== 相关 spec : http://v4l2spec.bytesex.org/spec/x542.htm 



除了 user control 之外还有一个就是扩展控制,扩展控制可以同时原子的对多个 ID 进行 control ,相关命令是三个: VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS 和 VIDIOC_TRY_EXT_CTRLS :

int ioctl(int fd, int request, struct v4l2_ext_controls *argp);

其中最重要的是 v4l2_ext_controls 这个数据结构,它包含几个内容:

__u32 ctrl_class

// 现在 spec 中只定义了两种类型的 class : V4L2_CTRL_CLASS_USER 和 V4L2_CTRL_CLASS_MPEG

__u32 count

//ctrl 数组中的 control ,即 v4l2_ext_control 的个数

struct v4l2_ext_control * controls

//control 数组, v4l2_ext_control 包含要设定的 ID ,以及 value

应用程序可以使用 V4L2_CTRL_FLAG_NEXT_CTRL 来对扩展 control 进行枚举, V4L2_CTRL_FLAG_NEXT_CTRL 返回下一个 ID 更高的 control ID :

struct v4l2_queryctrl qctrl;

qctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;

while (0 == ioctl (fd, VIDIOC_QUERYCTRL, &qctrl)) {

/* ... */

qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;

}

要枚举指定的 control class 中的 control 可以使用下面的方法:

qctrl.id = V4L2_CTRL_CLASS_MPEG | V4L2_CTRL_FLAG_NEXT_CTRL;

while (0 == ioctl (fd, VIDIOC_QUERYCTRL, &qctrl)) {

if (V4L2_CTRL_ID2CLASS (qctrl.id) != V4L2_CTRL_CLASS_MPEG)

break;

/* ... */

qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;

}

当然前提是驱动必须提供对 V4L2_CTRL_FLAG_NEXT_CTRL 的支持。

应用程序可以为创建一个控制面板,其中包含一系列控制,每个 control class 用一个 V4L2_CTRL_TYPE_CTRL_CLASS 类型开始,当使用 VIDIOC_QUERYCTRL 的时候将返回这个 control class 的 name ,下面我们来看 camera control class 的一些 control :

ID Type

V4L2_CID_CAMERA_CLASS class

//camera class 的描述符,当调用 VIDIOC_QUERYCTRL 的时候将返回一个对这个 class 的描述

V4L2_CID_EXPOSURE_AUTO integer

// 自动爆光

V4L2_CID_FOCUS_AUTO boolean 

// 自动对焦

//============== 相关 spec : http://v4l2spec.bytesex.org/spec/x802.htm

相关文章推荐

V4l2 Capture Sequence

v4l2 操作实际上就是 open() 设备, close() 设备,以及中间过程的 ioctl() 操作。对于 ioctl 的调用,要注意对 errno 的判断,如果调用被其他信号中断,即...

V4l2 Capture Sequence

v4l2 操作实际上就是 open() 设备, close() 设备,以及中间过程的 ioctl() 操作。对于 ioctl 的调用,要注意对 errno 的判断,如果调用被其他信号中断,即 ...

V4l2 Capture Sequence 捕获过程

v4l2 操作实际上就是 open() 设备, close() 设备,以及中间过程的 ioctl() 操作。对于 ioctl 的调用,要注意对 errno 的判断,如果调用被其他信号中断,即 e...

V4l2 Capture Sequence

v4l2操作实际上就是open()设备,close()设备,以及中间过程的ioctl()操作。对于ioctl的调用,要注意对errno的判断,如果调用被其他信号中断,即errno等于EINTR的时候,...
  • muojie
  • muojie
  • 2011-01-05 20:43
  • 1234

3.1 mxc_v4l2_capture.c分析---probe函数分析

mxc_v4l2_capture.c函数提供了应用程序中的一些接口函数,所以从分析它开始: (一)看一个驱动程序从它的入口函数开始: module_init(camera_init); stat...

V4L2 video capture example

转载于这里 /* * V4L2 video capture example * * This program can be used and distributed without res...

v4l2 preview capture 测试程序

#ifdef __cplusplusextern "C"{#endif/*===============================================================...

V4L2 camera 驱动 capture测试程序

在网上找了一个测试程序, 看了看,是根据capture.c修改的。测试步骤如下 1. gcc -o capture_image capture_image.c 2. ctrl+alt+f1 切换到...

以capture.c为例子解析V4L2过程

转载时请注明出处和作者联系方式 文章出处:http://blog.csdn.net/jack0106 作者联系方式:冯牮 fengjian0106@yahoo.com.cn     ...
  • Jfuck
  • Jfuck
  • 2012-11-10 15:43
  • 2951

v4l2 camera capture and config

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)