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 开始,可以就事件给出某些保证
每个订阅的事件都有其自己的内部专用事件队列。这意味着一种事件类型的泛滥不会干扰其他事件类型。
如果特定订阅事件的内部事件队列已满,则该队列中最旧的事件将被丢弃。
在适用的情况下,某些事件类型可以确保即将被丢弃的最旧事件的有效负载将与下一个最旧事件的有效负载合并。从而确保不会丢失信息,而只是丢失了导致该信息的中间步骤。请参阅要订阅的事件的文档,以确定这是否适用于该事件。