1.8. 数字视频 (DV) 时序

到目前为止讨论的视频标准主要处理模拟电视和相应的视频时序。如今,存在许多不同的硬件接口,例如高清电视接口(HDMI)、VGA、DVI 连接器等,它们传输视频信号,并且需要扩展 API 以选择这些接口的视频时序。由于 v4l2_std_id 可用位数有限,因此无法扩展,因此添加了一组新的 ioctl 来设置/获取输入和输出的视频时序。

这些 ioctl 处理定义每个视频格式的详细数字视频时序。这包括诸如活动视频宽度和高度、信号极性、前沿、后沿、同步宽度等参数。linux/v4l2-dv-timings.h 头部可用于获取 CEA-861-EVESA DMT 标准中格式的时序。

为了枚举和查询设备支持的 DV 时序的属性,应用程序使用 ioctl VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGSioctl VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP ioctl。要为设备设置 DV 时序,应用程序使用 VIDIOC_S_DV_TIMINGS ioctl,要获取当前的 DV 时序,它们使用 VIDIOC_G_DV_TIMINGS ioctl。要检测视频接收器看到的 DV 时序,应用程序使用 ioctl VIDIOC_QUERY_DV_TIMINGS ioctl。

当硬件检测到视频源发生变化时(例如,视频信号出现或消失,或者视频分辨率发生变化),它将发出一个 V4L2_EVENT_SOURCE_CHANGE 事件。使用 ioctl VIDIOC_SUBSCRIBE_EVENTioctl VIDIOC_DQEVENT 来检查是否报告了此事件。

如果视频信号发生变化,则应用程序必须停止流式传输,释放所有缓冲区,并调用 ioctl VIDIOC_QUERY_DV_TIMINGS 来获取新的视频时序,如果它们有效,则可以通过调用 ioctl VIDIOC_S_DV_TIMINGS 来设置这些时序。 这还将更新格式,因此请使用 ioctl VIDIOC_G_FMT 来获取新格式。 现在,应用程序可以分配新的缓冲区并再次开始流式传输。

ioctl VIDIOC_QUERY_DV_TIMINGS 将仅报告硬件检测到的内容,它永远不会更改配置。如果当前设置的时序和实际检测到的时序不同,那么通常这意味着您将无法捕获任何视频。正确的方法是依赖 V4L2_EVENT_SOURCE_CHANGE 事件,以便您知道何时发生了变化。

应用程序可以利用 输入功能输出功能 标志来确定是否可以将数字视频 ioctl 用于给定的输入或输出。