7.55. ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF¶
7.55.1. 名称¶
VIDIOC_STREAMON - VIDIOC_STREAMOFF - 启动或停止流式I/O
7.55.2. 概要¶
-
VIDIOC_STREAMON¶
int ioctl(int fd, VIDIOC_STREAMON, const int *argp)
-
VIDIOC_STREAMOFF¶
int ioctl(int fd, VIDIOC_STREAMOFF, const int *argp)
7.55.3. 参数¶
fd
由
open()
返回的文件描述符。argp
指向整数的指针。
7.55.4. 描述¶
VIDIOC_STREAMON
和 VIDIOC_STREAMOFF
ioctl 在流式传输期间启动和停止捕获或输出过程 (内存映射, 用户指针 或 DMABUF) I/O。
捕获硬件被禁用,并且在调用 VIDIOC_STREAMON
之前,不会填充任何输入缓冲区(如果输入队列中有任何空缓冲区)。输出硬件被禁用,并且在调用 VIDIOC_STREAMON
之前,不会产生任何视频信号。
存储器到存储器设备在捕获和输出流类型都调用 VIDIOC_STREAMON
之前不会启动。
如果 VIDIOC_STREAMON
失败,那么任何已经排队的缓冲区将保持排队状态。
VIDIOC_STREAMOFF
ioctl,除了中止或完成任何正在进行的 DMA 之外,还会解锁在物理内存中锁定的任何用户指针缓冲区,并从输入和输出队列中删除所有缓冲区。这意味着所有捕获但尚未出队的图像将丢失,同样所有排队输出但尚未传输的图像也会丢失。I/O 返回到调用 ioctl VIDIOC_REQBUFS 之后的状态,并且可以相应地重新启动。
如果缓冲区已使用 ioctl VIDIOC_QBUF, VIDIOC_DQBUF 排队,并且在从未调用 VIDIOC_STREAMON
的情况下调用 VIDIOC_STREAMOFF
,那么这些排队的缓冲区也将从输入队列中删除,并且所有缓冲区都返回到与调用 ioctl VIDIOC_REQBUFS 之后相同的状态,并且可以相应地重新启动。
两个 ioctl 都接受指向整数的指针,即所需的缓冲区或流类型。这与 struct v4l2_requestbuffers
type
相同。
如果在流式传输已经在进行中时调用 VIDIOC_STREAMON
,或者如果在流式传输已经停止时调用 VIDIOC_STREAMOFF
,则返回 0。在 VIDIOC_STREAMON
的情况下不会发生任何事情,但 VIDIOC_STREAMOFF
会将排队的缓冲区返回到如上所述的起始状态。
注意
应用程序可以在 VIDIOC_STREAMON
或 VIDIOC_STREAMOFF
调用之前或之后被抢占未知的时间段,没有“现在”启动或停止的概念。可以使用缓冲区时间戳与其他事件同步。
7.55.5. 返回值¶
成功时返回 0,出错时返回 -1,并且会适当地设置 errno
变量。通用错误代码在 通用错误代码 章节中描述。
- EINVAL
不支持缓冲区
type
,或者尚未分配缓冲区(内存映射)或排队(输出)。- EPIPE
驱动程序实现 垫层格式配置 并且管道配置无效。
- ENOLINK
驱动程序实现媒体控制器接口并且管道链接配置无效。