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_PARMVIDIOC_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()函数。