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 在流式 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_STREAMON
或 VIDIOC_STREAMOFF
调用之前或之后的不确定时间内被抢占,没有“立即”启动或停止的概念。可以使用缓冲区时间戳与其他事件同步。
7.55.5. 返回值¶
成功时返回 0,出错时返回 -1,并且会适当地设置 errno
变量。通用错误代码在 通用错误代码 章节中描述。
- EINVAL
不支持缓冲区
type
,或者尚未分配缓冲区(内存映射)或排队(输出)。- EPIPE
驱动程序实现了 pad 级别格式配置 并且管道配置无效。
- ENOLINK
驱动程序实现了媒体控制器接口并且管道链接配置无效。