3.1. 读/写

ioctl VIDIOC_QUERYCAP ioctl 返回的 v4l2_capability 结构体的 capabilities 字段中的 V4L2_CAP_READWRITE 标志被设置时,输入和输出设备分别支持 read()write() 函数。

驱动程序可能需要 CPU 复制数据,但它们也可能支持 DMA 到用户内存或从用户内存 DMA,因此这种 I/O 方法不一定比仅仅交换缓冲区指针的其他方法效率低。但它被认为是较差的,因为没有传递像帧计数器或时间戳这样的元信息。这些信息对于识别丢帧和与其他数据流同步是必要的。然而,这也是最简单的 I/O 方法,几乎不需要设置来交换数据。它允许这样的命令行技巧(vidctrl 工具是虚构的)

$ vidctrl /dev/video --input=0 --format=YUYV --size=352x288
$ dd if=/dev/video of=myimage.422 bs=202752 count=1

要从设备读取数据,应用程序使用 read() 函数,要写入数据,则使用 write() 函数。如果驱动程序与应用程序交换数据,则必须实现一种 I/O 方法,但不一定是这种方法。[1] 当支持读取或写入时,驱动程序还必须支持 select()poll() 函数。[2]