3. 输入/输出¶
V4L2 API 定义了几种不同的读写设备的方法。所有与应用程序交换数据的驱动程序必须至少支持其中一种。
使用 read()
和 write()
函数的经典 I/O 方法在打开 V4L2 设备后会自动选择。如果驱动程序不支持此方法,则任何读写尝试都将失败。
其他方法必须通过协商确定。要选择带有内存映射或用户缓冲区的流式 I/O 方法,应用程序需调用 ioctl VIDIOC_REQBUFS ioctl。
视频叠加可以被视为另一种 I/O 方法,尽管应用程序不会直接接收图像数据。通过使用 VIDIOC_S_FMT ioctl 启动视频叠加来选择此方法。有关更多信息,请参阅 视频叠加接口。
通常,每个文件描述符只关联一个 I/O 方法,包括叠加。唯一的例外是不与驱动程序交换数据的应用程序(“面板应用程序”,请参阅 打开和关闭设备)以及为了与 V4L 和 V4L2 的早期版本兼容而允许使用相同文件描述符同时进行视频捕获和叠加的驱动程序。
VIDIOC_S_FMT 和 ioctl VIDIOC_REQBUFS 在一定程度上允许这样做,但为了简化,驱动程序无需支持切换 I/O 方法(在首次从读/写切换后),除非通过关闭并重新打开设备。
以下章节将更详细地描述各种 I/O 方法。