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
struct 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 变量。 通用错误代码在 通用错误代码 章节中描述。