7.71. V4L2 read()¶
7.71.1. 名称¶
v4l2-read - 从V4L2设备读取
7.71.2. 概要¶
#include <unistd.h>
-
ssize_t read(int fd, void *buf, size_t count)¶
7.71.3. 参数¶
fd
open()
返回的文件描述符。buf
要填充的缓冲区
count
要读取的最大字节数
7.71.4. 描述¶
read()
尝试从文件描述符fd
读取最多count
个字节到从buf
开始的缓冲区中。缓冲区的data布局在相应的设备接口部分讨论,参见 ##。如果count
为零,read()
返回零并且没有其他结果。如果count
大于SSIZE_MAX
,则结果未指定。无论count
值如何,每次read()
调用最多提供一帧(两个字段)的数据。
默认情况下,read()
会阻塞直到有数据可用。当O_NONBLOCK
标志被赋予open()
函数时,如果没有数据可用,它会立即返回并显示EAGAIN
错误代码。 select()
或poll()
函数始终可用于暂停执行,直到数据变为可用。所有支持read()
函数的驱动程序也必须支持select()
和poll()
。
驱动程序可以使用单个或多个缓冲区以不同的方式实现读取功能,并在内部缓冲区填满后丢弃最旧或最新的帧。
read()
永远不会返回正在填充的缓冲区的“快照”。使用单个缓冲区时,驱动程序将在应用程序开始读取缓冲区时停止捕获,直到读取完成。因此,只有垂直消隐间隔期间可用于读取,或者捕获速率必须低于视频标准的标称帧速率。
当在有效图像期间或分隔顶部和底部场的垂直消隐期间调用时,read()
的行为取决于丢弃策略。丢弃最旧帧的驱动程序会持续捕获到内部缓冲区中,不断覆盖先前未读取的帧,并在read()
调用时接收到的帧完成后返回该帧。
丢弃最新帧的驱动程序会停止捕获,直到下一次read()
调用。在read()
时接收的帧将被丢弃,而是返回以下帧。同样,这意味着捕获速率降低到标称帧速率的一半或更低。此模型的一个示例是bttv驱动程序的视频读取模式,当调用read()
时启动到用户内存的DMA,并在DMA完成时返回。
在多缓冲区模型中,驱动程序维护一个内部缓冲区环,自动前进到下一个空闲缓冲区。这允许应用程序在可以足够快地清空缓冲区时进行连续捕获。同样,当驱动程序耗尽空闲缓冲区时,该行为取决于丢弃策略。
应用程序可以使用VIDIOC_G_PARM和VIDIOC_S_PARM ioctl获取和设置驱动程序内部使用的缓冲区数量。 但是,它们是可选的。丢弃策略不会被报告,也无法更改。有关最低要求,请参见接口。
7.71.5. 返回值¶
成功时,返回读取的字节数。 如果此数字小于请求的字节数或一帧所需的数据量,则不是错误。 例如,发生这种情况可能是因为read()
被信号中断。 出错时,返回 -1,并适当地设置errno
变量。 在这种情况下,下一次读取将从新帧的开头开始。 可能的错误代码是
- EAGAIN
已使用 O_NONBLOCK 选择了非阻塞 I/O,并且没有可立即读取的数据。
- EBADF
fd
不是有效的文件描述符,或者未打开以供读取,或者该进程已经打开了最大数量的文件。- EBUSY
驱动程序不支持多个读取流,并且设备已在使用中。
- EFAULT
buf
引用了无法访问的内存区域。- EINTR
在读取任何数据之前,该调用被信号中断。
- EIO
I/O错误。 这表明存在一些硬件问题或与远程设备(USB摄像头等)通信失败。
- EINVAL
此驱动程序、此设备或通常此类型的设备不支持
read()
函数。