7.8. ioctl VIDIOC_DQEVENT¶
7.8.1. 名称¶
VIDIOC_DQEVENT - 出队事件
7.8.2. 概要¶
-
VIDIOC_DQEVENT¶
int ioctl(int fd, VIDIOC_DQEVENT, struct v4l2_event *argp)
7.8.3. 参数¶
fd
由
open()
返回的文件描述符。argp
指向 struct
v4l2_event
的指针。
7.8.4. 描述¶
从视频设备出队一个事件。此 ioctl 不需要任何输入。struct v4l2_event
结构的所有字段都由驱动程序填充。文件句柄还将接收应用程序可以通过例如使用 select 系统调用获取的异常。
-
类型 v4l2_event¶
__u32 |
|
事件的类型,请参阅事件类型。 |
union { |
|
|
struct |
|
事件 |
struct |
|
事件 |
struct |
|
事件 |
struct |
|
事件 V4L2_EVENT_MOTION_DET 的事件数据。 |
struct |
|
事件 V4L2_EVENT_SOURCE_CHANGE 的事件数据。 |
__u8 |
|
事件数据。由事件类型定义。该联合应该用于为事件定义易于访问的类型。 |
} |
||
__u32 |
|
不包括此事件的待处理事件数。 |
__u32 |
|
事件序列号。对于发生的每个已订阅事件,序列号都会递增。如果序列号不连续,则表示事件已丢失。 |
struct timespec |
|
事件时间戳。时间戳取自 |
u32 |
|
与事件源关联的 ID。如果事件没有关联的 ID(这取决于事件类型),则为 0。 |
__u32 |
|
保留以供将来扩展。驱动程序必须将数组设置为零。 |
|
0 |
所有事件。V4L2_EVENT_ALL 仅在 VIDIOC_UNSUBSCRIBE_EVENT 中有效,用于一次取消订阅所有事件。 |
|
1 |
此事件在垂直同步时触发。此事件具有与之关联的 struct |
|
2 |
当到达流的末尾时触发此事件。这通常与 MPEG 解码器一起使用,以在 MPEG 流的最后一个被解码时向应用程序报告。 |
|
3 |
此事件要求 如果由于调用 VIDIOC_S_CTRL 或 VIDIOC_S_EXT_CTRLS 而生成事件,则该事件将不会发送到调用 ioctl 函数的文件句柄。这可以防止讨厌的反馈循环。如果您确实想要获取该事件,请设置 当引发的事件多于内部空间时,此事件类型将确保不会丢失任何信息。在这种情况下,将保留第二个最旧事件的 struct |
|
4 |
在开始接收帧时立即触发。此事件具有与之关联的 struct 如果硬件需要在缓冲区欠载的情况下停止,它可能无法生成此事件。在这种情况下,struct |
|
5 |
当视频设备在运行时检测到源参数更改时,将触发此事件。它可以是由视频解码器触发的运行时分辨率更改,或输入连接器上发生的格式更改。此事件要求 此事件具有与之关联的 struct |
|
6 |
每当一个或多个区域的运动检测状态更改时触发。此事件具有与之关联的 struct |
|
0x08000000 |
驱动程序专用事件的基本事件号。 |
-
类型 v4l2_event_vsync¶
__u8 |
|
即将到来的字段。请参阅枚举 |
-
类型 v4l2_event_ctrl¶
__u32 |
|
一个位掩码,用于指示发生了哪些更改。请参阅控制更改。 |
__u32 |
|
控件的类型。请参阅枚举 |
union { |
(匿名) |
|
__s32 |
|
32 位控件类型的控件的 32 位值。这对于字符串控件为 0,因为字符串的值无法使用 ioctl VIDIOC_DQEVENT 传递。 |
__s64 |
|
64 位控件类型的控件的 64 位值。 |
} |
||
__u32 |
|
控件标志。请参阅控制标志。 |
__s32 |
|
控件的最小值。请参阅 struct v4l2_queryctrl。 |
__s32 |
|
控制的最大值。请参阅结构体 v4l2_queryctrl。 |
__s32 |
|
控制的步长值。请参阅结构体 v4l2_queryctrl。 |
__s32 |
|
控制的默认值。请参阅结构体 v4l2_queryctrl。 |
-
类型 v4l2_event_frame_sync¶
__u32 |
|
正在接收的帧的序列号。 |
-
类型 v4l2_event_src_change¶
__u32 |
|
一个位掩码,指示发生了什么变化。请参阅 源更改。 |
-
类型 v4l2_event_motion_det¶
__u32 |
|
目前只有一个标志可用:如果设置了 |
__u32 |
|
正在接收的帧的序列号。仅当设置了 |
__u32 |
|
报告运动的区域的位掩码。至少有一个区域。如果此字段为 0,则根本未检测到任何运动。如果没有 |
|
0x0001 |
此控制事件被触发是因为控制的值已更改。特殊情况:易失性控件不生成此事件;如果控件设置了 |
|
0x0002 |
此控制事件被触发是因为控制标志已更改。 |
|
0x0004 |
此控制事件被触发是因为控制的最小值、最大值、步长或默认值已更改。 |
|
0x0008 |
此控制事件被触发是因为控制的维度已更改。请注意,维度的数量保持不变。 |
|
0x0001 |
当在输入端检测到分辨率更改时,会触发此事件。这可能来自输入连接器或视频解码器。应用程序将必须查询新的分辨率(如果有,信号也可能丢失)。 对于有状态解码器,请遵循 内存到内存有状态视频解码器接口 中的指南。视频捕获设备必须使用 ioctl VIDIOC_QUERY_DV_TIMINGS 或 VIDIOC_QUERYSTD 查询新的时序。 重要提示:即使新的视频时序看起来与旧的时序相同,收到此事件也表明视频信号存在问题,您必须停止并重新启动流式传输(VIDIOC_STREAMOFF 后跟 VIDIOC_STREAMON)。原因是许多视频捕获设备无法从信号的临时丢失中恢复,因此需要重新启动流式 I/O 以使硬件与视频信号同步。 |
7.8.5. 返回值¶
成功时返回 0,错误时返回 -1,并且会设置 errno
变量。通用错误代码在 通用错误代码 章节中描述。