文件名称:输入和输出-美国泰克tds2012b数字示波器用户手册
文件大小:1.96MB
文件格式:PDF
更新时间:2024-06-27 11:43:13
v4l2中文 v4l2规范 v4l2.pdf v4l2中文规范
四、 输入和输出 这是不定期发布的关于写视频驱动程序的 LWN 系统文章的第四篇。没有看过介绍的,也许想从那里开 始。本周的文章介绍的是应用程序如何确定在特定适配器上哪些输入和输出可用,并且在它们之间做出选 择。 在很多情况下,视频适配器并不能提供很多的输入输出选项。比如摄像头控制器,可能只是提供摄像 头信号输入,而没什么别的功能;然而,在一些其他的情况下,事情就变得复杂了。一个电视卡板上不同 的接口可能对应不同的输入。他甚至可能拥有可独立发挥功能的多路调谐器。有时,那些输入会有不同的 特性,有些调谐器可以支持比其他的更广泛的视频标准。对于输出来说,也有同样的问题。 很明显,一个应用若想有效地利用视频适配器,它必须有能力找到可用的输入和输出,而且他必须能 找到他想操作的那一个。为此,Video4Linux2 API 提供三种不同的 ioctl()调用来处理输入,相应地有三个来 处理输出。这三个(对于硬件支持的每一个功能)驱动都要支持。虽然如此,对于简单的硬件而言,代码还是 很简单的。驱动也要提供一此启动时的默认值。然而,驱动不应在应用退出时重置输入输出信息。在多次 打开之间,对于其他视频参数也应维持不变。 1. 视频标准 在我们进入输入输出的细节之前,我们应该先了解一下视频标准。这些标准描述的是视频如何为传输 而进行格式化——分辨率、帧率等。这些标准通常是由每一个国家的监管部门制定的。现在世界上使用的 标准主要有三个:NTSC(主要是北美使用)、PAL(主要是欧洲、非洲和中国)和 SECAM(法、俄和非洲部分地 区)。然而这些标准在国家之间都有变化,而且有些设备比其他设备能更加灵活,能与更多的标准变种协同 工作。 V4L2 使用 v4l2_std_id 来代表视频标准,它是一个 64 位的掩码。每个标准变种在掩码中就是一位。所 以 “ 标 准 ”NTSC 的 定 义 为 V4L2_STD_NTSC_M, 值 为 0x1000 ; 而 日 本 的 变 种 就 是 V4L2_STD_NTSC_M_JP(0x2000) 。 如 果一 个 设备 可 以 处 理 所 有 NTSC 变 种 , 它 就 可以 设为 V4L2_STD_NTSC,它将所有相关位置位。对 PAL 和 SECAM 标准,也存在一组类似的位集。这个网页有 完整的列表。 对于用户空间而言,V4L2 提供一个 ioctl()命令(VIDIOC_ENUMSTD),它允许应用查询设备实现了哪 些标准。驱动却无需直接回答查询,而是将 video_device 结构体的 tvnorm 字段设置为它所支持的所有标准。 然后 V4L2 层会向应用回复所支持的标准。VIDIOC_G_STD 命令可以用来查询现在哪种标准是激活的,它 也是在 V4L2 层通过返回 video_device 结构的 current_norm 字段来处理的。驱动程序应在启动时,初始化 current_norm 来反映现实情况。有些应用即使他并没有设置过标准,发现标准没有被设置也会感到困惑。 当某个应用想要申请某个特定标准时,会发出一个 VIDIOC_S_STD 调用,该调用传到驱动时通过下面 的回调函数实现: int (*vidioc_s_std) (struct file *file, void *private_data, v4l2_std_id std); 驱动要对硬件编程,以使用特定的标准,并返回 0(或是负的错误码)。V4L2 层需要把 current_norm 设 为新的值。 应用可能想要知道硬件所看到的是何种信号,答案可以通过 VIDIOC_QUERYSTD 找到,它到了驱动里 面就是: int (*vidioc_querystd) (struct file *file, void *private_data, v4l2_std_id *std); Video for Linux Two(V4L2)——驱动编写指南 tekkamanninja.blog.chinaunix.net 第 9/30页 08/19/2012