7.66. ioctl VIDIOC_SUBSCRIBE_EVENT, VIDIOC_UNSUBSCRIBE_EVENT

7.66.1. 名称

VIDIOC_SUBSCRIBE_EVENT - VIDIOC_UNSUBSCRIBE_EVENT - 订阅或取消订阅事件

7.66.2. 概要

VIDIOC_SUBSCRIBE_EVENT

int ioctl(int fd, VIDIOC_SUBSCRIBE_EVENT, struct v4l2_event_subscription *argp)

VIDIOC_UNSUBSCRIBE_EVENT

int ioctl(int fd, VIDIOC_UNSUBSCRIBE_EVENT, struct v4l2_event_subscription *argp)

7.66.3. 参数

fd

open() 返回的文件描述符。

argp

指向结构体 v4l2_event_subscription 的指针。

7.66.4. 描述

订阅或取消订阅 V4L2 事件。订阅的事件通过使用 ioctl VIDIOC_DQEVENT ioctl 出队。

type v4l2_event_subscription
结构体 v4l2_event_subscription

__u32

type

事件的类型,请参阅 事件类型

注意

V4L2_EVENT_ALL 可以与 VIDIOC_UNSUBSCRIBE_EVENT 一起使用,一次性取消订阅所有事件。

__u32

id

事件源的ID。如果事件源没有关联的ID,则将此设置为 0。一个事件是否需要ID取决于事件类型。

__u32

flags

事件标志,请参阅 事件标志

__u32

reserved[5]

保留以供将来扩展。驱动程序和应用程序必须将数组设置为零。

事件标志

V4L2_EVENT_SUB_FL_SEND_INITIAL

0x0001

当订阅此事件时,将发送一个包含当前状态的初始事件。这仅对由状态更改触发的事件(例如 V4L2_EVENT_CTRL)有意义。其他事件将忽略此标志。

V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK

0x0002

如果设置此标志,则由 ioctl 直接引起的事件也将发送到调用该 ioctl 的文件句柄。例如,使用 VIDIOC_S_CTRL 更改控件将导致 V4L2_EVENT_CTRL 发送回同一文件句柄。通常,会抑制此类事件以防止反馈循环,在这种循环中,应用程序将控件更改为一个值,然后再更改为另一个值,然后收到一个事件,告知该控件已更改为第一个值。

由于它无法判断该事件是由另一个应用程序还是由 VIDIOC_S_CTRL 调用引起的,因此很难决定是将控件设置为事件中的值还是忽略它。

设置此标志时请仔细考虑,以免陷入这种情况。

7.66.5. 返回值

成功时返回 0,出错时返回 -1,并且 errno 变量会进行相应的设置。通用错误代码在 通用错误代码 章节中描述。