3. 输入/输出

V4L2 API 定义了几种不同的方法来从设备读取或写入设备。所有与应用程序交换数据的驱动程序都必须支持至少一种方法。

在使用 read()write() 函数打开 V4L2 设备后,会自动选择经典的 I/O 方法。如果驱动程序不支持此方法,则任何时候尝试读取或写入都会失败。

其他方法必须进行协商。要选择使用内存映射或用户缓冲区的流式 I/O 方法,应用程序会调用 ioctl VIDIOC_REQBUFS ioctl。

视频叠加可以被认为是另一种 I/O 方法,尽管应用程序不会直接接收图像数据。它通过使用 VIDIOC_S_FMT ioctl 初始化视频叠加来选择。有关更多信息,请参见 视频叠加接口

通常,每个文件描述符只关联一种 I/O 方法,包括叠加。唯一的例外是不与驱动程序交换数据的应用程序(“面板应用程序”,请参见 打开和关闭设备)以及允许使用相同的文件描述符同时进行视频捕获和叠加的驱动程序,以便与 V4L 和早期版本的 V4L2 兼容。

VIDIOC_S_FMTioctl VIDIOC_REQBUFS 在某种程度上允许这样做,但是为了简单起见,驱动程序不需要支持切换 I/O 方法(在首先从读取/写入切换之后),除非通过关闭并重新打开设备。

以下各节将更详细地描述各种 I/O 方法。