3.1. 读取/写入¶
当 v4l2_capability
结构体的 capabilities
字段中的 V4L2_CAP_READWRITE
标志被设置时,输入和输出设备分别支持 read()
和 write()
函数,该结构体由 ioctl VIDIOC_QUERYCAP ioctl 返回。
驱动程序可能需要 CPU 来复制数据,但也可能支持 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]