V4L2文档翻译(一)

作者:襄阳西继迅达电梯有限公司  发布时间:2017-09-05 12:29:47
V4L2文档翻译(一)

V4L2驱动以内核模块形式存在,可以被系统管理员手动加载或当发现设备时自动加载。驱动被编入videodev模块,其提供帮助函数以及在此文档的一个常用应用接口描述。

每一个驱动注册一个或多个设备节点后他们的主设备号都是81,而子设备号在0~255之间。除非通过CONFIG_VIDEO_FIXED_MINOR_RANGES编译选项编译内核,否则子设备号是动态分配的。而且,子设备号分配范围与设备节点类型有关(video、radio等)。

很多驱动支持通过video_nr,radio_nr或vbi_nr模块设置来选择特殊的video/radio/vbi节点号。这就允许用户申请指定的设备节点名称,如/dev/video5而不是交给系统生成。当驱动支持多个同类设备有多余一个设备节点号时候,可如下:

>modprobe mydriver video_nr=0,1 radio_nr=0,1

在/etc/modules.conf中可以这样写:

options mydriver video_nr=0,1 radio_nr=0,1

如果在模块设置中没有给定设备节点号则驱动会默认进行分配。

通常情况下udev会为你在/dev下自动创建设备节点。如果udev没有安装,那么你需要使能CONFIG_VIDEO_FIXED_MINOR_RANGES内核选项,这样就可以将子设备号设定为设备节点号了,即子设备号5同样会使设备节点名为video5。此特性会使不同类型设备拥有不同范围的子设备号。这些范围在第四节:接口中将给出。(不绕弯子了,我这里给直接列出来)

类型 范围

video 0~63

vbi 224~255

vtx 192~223

radio 64~127

SDR 0~255

特殊文件的创建(用mknod)是一个特殊操作,而且这些设备不能通过主设备号和子设备号打开。这意味着应用程序不能扫描加载上的或安装上的驱动。用户必须敲入一个设备名,或者说应用程序可以尝试使用常规的设备名称。

相关设备

设备可以支持好几个功能,如视频捕捉、VBI捕捉以及无线广播。

V4L2 API为这些功能分别创建不同的设备节点。

V4L2 API被设计成一个设备节点可以支持所有功能。不过实际上这却从来没有奏效过:应用程序从来没有使用过这项特性,而且许多驱动也没有支持此特性,就算他们支持了也从来没有被测试过。另外,在不同功能间切换设备节点只是在使用流数据IO API时需要,并不能用read()/write() API。

如今每个设备节点只支持一个功能。

除了视频输入、输出外硬件还可能同时支持声音取样和播放。如果这样的话,这些功能要以ALSA PCM设备形式存在。

所有这些设备有一个问题,就是V4L2 API并没有提供找到相关设备的规则。有些确实很复杂的设备使用多媒体控制器来达到这个目的。但是大多数设备并不用它,现存的一些代码表示他们使用sysfs来发现相关设备,还没有一个库可以为使用多媒体控制器的设备和没使用的设备提供一个单一的API。如果你想来从事这个工作的话请先写一封邮件到此邮件列表:

多重打开

V4L2设备可以被打开超过一次。一旦驱动支持这样做,用户就可以像这样使用:开启一个表盘程序来控制比如亮度或声音音量,然后另一个程序来捕捉视频和音频。换句话说,就是表盘程序相当于ALSA声音混合程序。只是打开一个V4L2设备并不会改变设备的状态。

当一个应用程序因为需要流数据而申请了内存空间后(通过VIDIOC_REQBUFS或VIDIOC_CREATE_BUFS ioctl,或通过read()或write()函数)这个程序(文件句柄)就成为了此设备的拥有者。再不会允许对内存空间大小做改动的动作(VIDIOC_S_FMT ioctl动作),而且其他应用再不被允许申请内存或开始、停止数据流,一旦这样做了会返回EBUSY错误代码。

只是打开V4L2设备不会允许独占访问。无论对请求类型数据分配的权限是读还是写,初始化数据都会发生交换,而且对文件句柄来说还会改变相关属性。应用程序可以通过使用优先级机制请求附加特选。

共享数据流

V4L2驱动不支持多个应用通过拷贝缓存的方式在同一设备上读写同一数据流,或时间复用,或其他类似方式。在用户空间使用代理程序处理这种情况会更好。

功能

应用程序可以使用open()和close()对V4L2设备执行打开和关闭操作。设备可以通过ioctl编程来完成接下来的章节所讲述的内容。

功能查询

因为V4L2涵盖了各种各样的设备,但并不是所有类型的设备都可以使用各种API。此外,相同类型的设备也可能拥有不同的功能以及允许省略一点复杂或并不太重要的API。

VIDIOC_QUERYCAP ioctl命令可以查看内核设备对规范的兼容有效性,查询功能和IO方法都是需要设备支持的。

从内核版本3.1开始,VIDIOC_QUERYCAP将会返回V4L2 API版本,通常是与内核版本匹配的。没有必要通过VIDIOC_QUERTCAP检查一个特殊的ioctl是否支持,如果驱动不支持V4L2会返回ENOTTY错误码。

可以通过不同的ioctl查询其他特性,如通过VIDIOC_ENUMINPUT查询设备视频连接器的数量、类型及名字。尽管API的目的主要是抽象,VIDIOC_QUERYCAP ioctl仍然允许驱动透过特殊应用程序来实现个性化。

所有V4L2驱动都必须支持VIDIOC_QUERYCAP,应用程序往往在打开设备后就执行这个ioctl。

程序优先级

当多个应用程序共享同一个设备时,需要给他们分配不同的优先级。相反的一个视频录制应用程序执行如rm -rf /这类命令可能会阻塞其他程序改变视频控制或切换当前TV频道。另一个目的是允许低优先级应用程序工作在后台,这样用户控制程序就可以优先并能够在稍后自动恢复设备控制。

由于这些特性不能在完全在用户空间施行,所以V4L2定义了VIDIOC_G_PRIORITY和VIDIOC_S_PRIORITY ioctl来通过文件描述符申请和查询准入优先级。驱动不支持这些ioctl的情况下,打开一个设备会分配一个中等级优先级,这与早起版本的V4L2兼容。当应用程序通过VIDIOC_QUERYCAP ioctl查询完功能后可以通过VIDIOC_S_PRIORITY请求不同的优先级。

如VIDIOC_S_INPUT等这种会改变驱动属性的ioctl在其他程序申请了更高的优先级后会返回EBUSY错误码。

视频输入和输出

视频输入输出一个设备的物理连线。如RF连线(天线、电缆),视频连线,或RGB连线。视频和VBI捕捉设备需要输入,而视频和VBI输出设备需要输出,至少各一个。Radio无限通讯设备并没有视频输入输出。

应用程序可以通过VIDIOC_ENUMINPUT和VIDIOC_ENUMOUTPUT ioctl来查看有效输入和输出的数量和属性。VIDIOC_ENUMINPUT ioctl会返回v4l2_input结构体,也会返回被查询的视频输入设备的状态信息。

VIDIOC_G_INPUT和VIDIOC_G_OUTPUT ioctl将会返回当前视频输入或输出的索引。应用程序可以通过VIDIOC_S_INPUT和VIDIOC_S_OUTPUT ioctl来选择不同输入或输出。设备若拥有一个或多个的输入、输出,则必须在驱动中声明所有的输入、输出ioctl。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉做网站 http://www.feimao666.com

  • 上一篇:明星经济:从脸面代言到合体产品
  • 下一篇:最后一页
  •