4.12. 事件接口

V4L2事件接口提供了一种方法,使用户可以立即收到设备上发生的某些情况的通知。 例如,这可能包括帧开始或信号丢失事件。 V4L2控件的值或状态的更改也可以通过事件报告。

要接收事件,首先必须使用ioctl VIDIOC_SUBSCRIBE_EVENT, VIDIOC_UNSUBSCRIBE_EVENT ioctl订阅用户感兴趣的事件。 订阅事件后,可以使用ioctl VIDIOC_DQEVENT ioctl对已订阅类型的事件进行出队操作。 可以使用VIDIOC_UNSUBSCRIBE_EVENT ioctl取消订阅事件。 特殊事件类型V4L2_EVENT_ALL可用于取消订阅驱动程序支持的所有事件。

事件订阅和事件队列特定于文件句柄。 在一个文件句柄上订阅事件不会影响其他文件句柄。

通过在视频设备上使用select或poll系统调用来获取有关可出队事件的信息。 V4L2事件在poll系统调用中使用POLLPRI事件,在select系统调用中使用异常。

从内核3.1开始,可以对事件做出某些保证

  1. 每个订阅的事件都有其自己的内部专用事件队列。 这意味着一种事件类型的泛滥不会干扰其他事件类型。

  2. 如果特定订阅事件的内部事件队列已满,则该队列中最旧的事件将被丢弃。

  3. 在适用的情况下,某些事件类型可以确保即将被丢弃的最旧事件的有效负载与下一个最旧事件的有效负载合并。 从而确保不会丢失信息,而只是导致该信息的中间步骤。 有关此是否适用于该事件,请参见要订阅的事件的文档。