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_STREAMONVIDIOC_STREAMOFF ioctl 在流式 I/O 期间启动和停止捕获或输出过程 (内存映射用户指针DMABUF)。

在调用 VIDIOC_STREAMON 之前,捕获硬件将被禁用,并且不会填充任何输入缓冲区(如果在传入队列中有任何空缓冲区)。在调用 VIDIOC_STREAMON 之前,输出硬件将被禁用,并且不会产生任何视频信号。

在捕获和输出流类型都调用 VIDIOC_STREAMON 之前,内存到内存设备不会启动。

如果 VIDIOC_STREAMON 失败,则任何已排队的缓冲区将保持排队状态。

除了中止或完成任何正在进行的 DMA 之外,VIDIOC_STREAMOFF ioctl 还会解锁物理内存中锁定的任何用户指针缓冲区,并从传入和传出队列中删除所有缓冲区。这意味着所有捕获但尚未出列的图像都将丢失,同样所有已排队用于输出但尚未传输的图像也将丢失。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_STREAMONVIDIOC_STREAMOFF 调用之前或之后的不确定时间内被抢占,没有“立即”启动或停止的概念。可以使用缓冲区时间戳与其他事件同步。

7.55.5. 返回值

成功时返回 0,出错时返回 -1,并且会适当地设置 errno 变量。通用错误代码在 通用错误代码 章节中描述。

EINVAL

不支持缓冲区 type,或者尚未分配缓冲区(内存映射)或排队(输出)。

EPIPE

驱动程序实现了 pad 级别格式配置 并且管道配置无效。

ENOLINK

驱动程序实现了媒体控制器接口并且管道链接配置无效。