6.2. V4L2 API 的更改

在 V4L API 被添加到内核后不久,它就被批评为过于不灵活。 1998 年 8 月,Bill Dirks 提出了许多改进建议,并开始编写文档、示例驱动程序和应用程序。在其他志愿者的帮助下,这最终成为了 V4L2 API,它不仅是 V4L API 的扩展,而且是它的替代品。然而,又过了四年和两个稳定的内核版本,新的 API 最终才被接受并以现在的形式包含到内核中。

6.2.1. 早期版本

1998-08-20:第一个版本。

1998-08-27:引入了 select() 函数。

1998-09-10:新的视频标准接口。

1998-09-18:VIDIOC_NONCAP ioctl 被替换为无意义的 O_TRUNC open() 标志,并定义了别名 O_NONCAPO_NOIO。如果应用程序仅打算访问控件,而不是需要独占访问的捕获应用程序,则可以设置此标志。VIDEO_STD_XXX 标识符现在是序数而不是标志,并且 video_std_construct() 辅助函数接受 id 和传输参数。

1998-09-28:改进的视频标准。使视频控件可单独枚举。

1998-10-02:从结构 video_standard 中删除了 id 字段,并重命名了颜色副载波字段。ioctl VIDIOC_QUERYSTD, VIDIOC_SUBDEV_QUERYSTD ioctl 重命名为 ioctl VIDIOC_ENUMSTD, VIDIOC_SUBDEV_ENUMSTDVIDIOC_G_INPUT 重命名为 ioctl VIDIOC_ENUMINPUT。发布了 Codec API 的初稿。

1998-11-08:许多小改动。大多数符号已被重命名。对 struct v4l2_capability 的一些实质性更改。

1998-11-12:一些 ioctl 的读/写方向定义错误。

1998-11-14:V4L2_PIX_FMT_RGB24 更改为 V4L2_PIX_FMT_BGR24V4L2_PIX_FMT_RGB32 更改为 V4L2_PIX_FMT_BGR32。现在可以使用 VIDIOC_G_CTRLVIDIOC_S_CTRL ioctl 以及以 V4L2_CID_AUDIO 开头的名称访问音频控件。由于 V4L2_MAJOR 定义在 videodev.h 中只使用了一次,因此将其从 videodev.h 中删除。YUV422YUV411 平面图像格式被添加。

1998-11-28:一些 ioctl 符号发生了变化。添加了编解码器和视频输出设备的接口。

1999-01-14:添加了原始 VBI 捕获接口。

1999-01-19:删除了 VIDIOC_NEXTBUF ioctl。

6.2.2. V4L2 版本 0.16 1999-01-31

1999-01-27:现在只有一个 QBUF ioctl,VIDIOC_QWBUF 和 VIDIOC_QRBUF 已被删除。 VIDIOC_QBUF 采用 v4l2_buffer 作为参数。添加了数字变焦(裁剪)控件。

6.2.3. V4L2 版本 0.18 1999-03-16

在 videodev.c 中添加了 v4l 到 V4L2 ioctl 兼容性层。驱动程序编写人员,这将更改您实现 ioctl 处理程序的方式。请参阅驱动程序编写指南。添加了一些控制 ID 代码。

6.2.4. V4L2 版本 0.19 1999-06-05

1999-03-18:在将 v4l2_queryctrl 对象传递给驱动程序之前,请填写其类别和 catname 字段。需要在示例驱动程序中对 VIDIOC_QUERYCTRL 处理程序进行少量更改。

1999-03-31:更好地兼容 v4l 内存捕获 ioctl。需要更改驱动程序才能完全支持新的兼容性功能,请参阅驱动程序编写指南和 v4l2cap.c。添加了新的控制 ID:V4L2_CID_HFLIP、_VFLIP。将 V4L2_PIX_FMT_YUV422P 更改为 _YUV422P,并将 _YUV411P 更改为 _YUV411P。

1999-04-04:添加了一些更多的控制 ID。

1999-04-07:添加了按钮控制类型。

1999-05-02:修复了 videodev.h 中的一个拼写错误,并添加了 V4L2_CTRL_FLAG_GRAYED(后来为 V4L2_CTRL_FLAG_GRABBED)标志。

1999-05-20:VIDIOC_G_CTRL 的定义错误,导致此 ioctl 发生故障。

1999-06-05:更改了 V4L2_CID_WHITENESS 的值。

6.2.5. V4L2 版本 0.20 (1999-09-10)

版本 0.20 引入了许多与 0.19 及更早版本不向后兼容的更改。这些更改的目的是简化 API,同时使其更具可扩展性并遵循常见的 Linux 驱动程序 API 约定。

  1. 修复了 V4L2_FMT_FLAG 符号中的一些拼写错误。更改了 struct v4l2_clip,以与 v4l 兼容。(1999-08-30)

  2. 添加了 V4L2_TUNER_SUB_LANG1。(1999-09-05)

  3. 所有使用整数参数的 ioctl() 命令现在都采用指向整数的指针。在有意义的地方,ioctl 将返回参数指向的整数中的实际新值,这是 V4L2 API 中的一个常见约定。受影响的 ioctl 是:VIDIOC_PREVIEW、VIDIOC_STREAMON、VIDIOC_STREAMOFF、VIDIOC_S_FREQ、VIDIOC_S_INPUT、VIDIOC_S_OUTPUT、VIDIOC_S_EFFECT。例如

    err = ioctl (fd, VIDIOC_XXX, V4L2_XXX);
    

    变为

    int a = V4L2_XXX; err = ioctl(fd, VIDIOC_XXX, &a);
    
  4. 所有不同的 get- 和 set-format 命令都被合并为一个 VIDIOC_G_FMTVIDIOC_S_FMT ioctl,它们采用联合类型和一个类型字段来选择联合成员作为参数。目的是通过消除几个 ioctl 并允许新的和驱动程序私有数据流而无需添加新的 ioctl 来简化 API。

    此更改使以下 ioctl 过时:VIDIOC_S_INFMTVIDIOC_G_INFMTVIDIOC_S_OUTFMTVIDIOC_G_OUTFMTVIDIOC_S_VBIFMTVIDIOC_G_VBIFMT。图像格式 struct v4l2_format 被重命名为 struct v4l2_pix_format,而 struct v4l2_format 现在是所有格式协商的包络结构。

  5. 与上述更改类似,VIDIOC_G_PARMVIDIOC_S_PARM ioctl 与 VIDIOC_G_OUTPARMVIDIOC_S_OUTPARM 合并。 新的 struct v4l2_streamparm 中的 type 字段选择相应的联合成员。

    此更改使 VIDIOC_G_OUTPARMVIDIOC_S_OUTPARM ioctl 过时。

  6. 简化了控制枚举,引入了两个新的控制标志,并删除了一个。 catname 字段被 group 字段替换。

    驱动程序现在可以使用 V4L2_CTRL_FLAG_DISABLEDV4L2_CTRL_FLAG_GRABBED 分别标记不受支持和暂时不可用的控件。group 名称表示可能比 category 更窄的分类。换句话说,一个类别中可能存在多个组。组内的控件通常会绘制在组框内。不同类别中的控件可能有更大的分隔,甚至可能出现在单独的窗口中。

  7. struct v4l2_buffer 中的 timestamp 已更改为 64 位整数,其中包含帧的采样或输出时间(以纳秒为单位)。此外,时间戳将采用绝对系统时间,而不是从流开始时从零开始。时间戳的数据类型名称为 stamp_t,定义为有符号的 64 位整数。输出设备不应在时间戳字段中的时间到达之前发送缓冲区。我想效仿 SGI 的做法,采用像他们的 UST(未调整的系统时间)这样的多媒体时间戳系统。请参阅 http://web.archive.org/web/*/http://reality.sgi.com /cpirazzi_engr/lg/time/intro.html。UST 使用 64 位有符号整数(而不是 struct timeval)的时间戳,单位为纳秒。UST 时钟在系统启动时从零开始,并连续均匀地运行。UST 大约需要 292 年才会溢出。无法设置 UST 时钟。常规的 Linux 日时钟可以定期更改,如果将其用于为多媒体流加时间戳,则会引发错误。真正的 UST 风格的时钟将需要在内核中进行一些尚不存在的支持。但是,为了预期,我将把时间戳字段更改为 64 位整数,并且我将更改 v4l2_masterclock_gettime() 函数(仅由驱动程序使用)以返回 64 位整数。

  8. struct v4l2_buffer 中添加了一个 sequence 字段。sequence 字段计算捕获的帧数,输出设备会忽略它。当捕获驱动程序丢弃一帧时,该帧的序列号将被跳过。

6.2.6. V4L2 版本 0.20 的增量更改

1999-12-23:在 struct v4l2_vbi_format 中,reserved1 字段变为 offset。以前,驱动程序需要清除 reserved1 字段。

2000-01-13:添加了 V4L2_FMT_FLAG_NOT_INTERLACED 标志。

2000-07-31:为了与原始 videodev.h 文件兼容,videodev.h 现在包含了 linux/poll.h 头文件。

2000-11-20:添加了 V4L2_TYPE_VBI_OUTPUTV4L2_PIX_FMT_Y41P

2000-11-25:添加了 V4L2_TYPE_VBI_INPUT

2000-12-04:修复了符号名称中的几个拼写错误。

2001-01-18:为了避免命名空间冲突,videodev.h 头文件中定义的 fourcc 宏已重命名为 v4l2_fourcc

2001-01-25:修复了 Linux 2.4.0 中的 videodev.h 文件与 videodevX 补丁中包含的 videodev.h 文件之间可能存在的驱动程序级别兼容性问题。在 Linux 2.4.0 上使用早期版本的 videodevX 的用户应重新编译其 V4L 和 V4L2 驱动程序。

2001-01-26:修复了 videodevX 补丁中的 videodev.h 文件与应用了 devfs 补丁的 Linux 2.2.x 中的 videodev.h 文件之间可能存在的内核级别不兼容问题。

2001-03-02:某些通过只读参数定义但在两个方向上传递数据的 V4L ioctl 不能通过向后兼容层正确工作。[解决方案?]

2001-04-13:添加了大端 16 位 RGB 格式。

2001-09-17:添加了新的 YUV 格式和 VIDIOC_G_FREQUENCYVIDIOC_S_FREQUENCY ioctl。(旧的 VIDIOC_G_FREQVIDIOC_S_FREQ ioctl 没有考虑多个调谐器。)

2000-09-18:添加了 V4L2_BUF_TYPE_VBI。由于 VIDIOC_G_FMTVIDIOC_S_FMT ioctl 现在可能会在 struct v4l2_fmt type 字段不包含 V4L2_BUF_TYPE_VBI 时失败,这可能会破坏兼容性。在 struct v4l2_vbi_format 的文档中,offset 字段中含糊不清的短语“上升沿”已更改为“前导边”。

6.2.7. V4L2 版本 0.20 2000-11-23

原始 VBI 接口进行了一些更改。

  1. V4L2 API 规范中添加了阐明行编号方案的图示。start[0] 和 start[1] 字段不再从零开始计算行号。理由:a) 之前的定义不明确。b) start[] 值是序数。c) 没有必要发明新的行编号方案。我们现在使用 ITU-R 定义的行号,就是这样。兼容性:将起始值加 1。依赖于先前语义的应用程序可能无法正常运行。

  2. “count[0] > 0 且 count[1] > 0”的限制已放宽为“(count[0] + count[1]) > 0”。理由:驱动程序可能会以扫描线粒度分配资源,并且某些数据服务仅在第一个字段上传输。评论说两个 count 值通常会相等,这是具有误导性和毫无意义的,并且已被删除。此更改破坏了与早期版本的兼容性:驱动程序可能会返回 EINVAL,应用程序可能无法正常运行。

  3. 驱动程序再次允许返回如先前所建议的负(未知)起始值。为什么删除此功能尚不清楚。此更改可能会破坏与依赖于起始值为正值的应用程序的兼容性。澄清了 VIDIOC_S_FMT ioctl 使用 EBUSYEINVAL 错误代码的情况。EBUSY 错误代码最终被记录下来,并且 reserved2 字段之前仅在 videodev.h 头文件中提及。

  4. 添加了新的缓冲区类型 V4L2_TYPE_VBI_INPUTV4L2_TYPE_VBI_OUTPUT。前者是旧 V4L2_TYPE_VBI 的别名,后者在 videodev.h 文件中缺失。

6.2.8. V4L2 版本 0.20 2002-07-25

添加了切片 VBI 接口提案。

6.2.9. Linux 2.5.46 中的 V4L2,2002-10

在 2002 年 10 月至 11 月左右,在宣布 Linux 2.5 的功能冻结之前,根据 V4L2 0.20 的经验,对 API 进行了修订。这个未命名的版本最终合并到了 Linux 2.5.46 中。

  1. 相关设备 中指定的那样,驱动程序必须使相关设备功能在所有次要设备编号下都可用。

  2. open() 函数需要访问模式 O_RDWR,而与设备类型无关。所有与应用程序交换数据的 V4L2 驱动程序都必须支持 O_NONBLOCK 标志。O_NOIO 标志,即与无意义的 O_TRUNC 别名的 V4L2 符号,用于指示没有数据交换的访问(面板应用程序),已被删除。驱动程序必须保持“面板模式”,直到应用程序尝试启动数据交换为止,请参阅 打开和关闭设备

  3. struct v4l2_capability 发生了巨大变化。请注意,结构的尺寸也发生了变化,这在 ioctl 请求代码中进行了编码,因此较旧的 V4L2 设备将使用 EINVAL 错误代码响应新的 ioctl VIDIOC_QUERYCAP ioctl。

    新增了用于标识驱动程序的字段,一个新的 RDS 设备功能 V4L2_CAP_RDS_CAPTUREV4L2_CAP_AUDIO 标志表示设备是否具有任何音频连接器,另一个 I/O 功能 V4L2_CAP_ASYNCIO 可以被标记。为了响应这些更改,type 字段变成了一个位集,并被合并到 flags 字段中。V4L2_FLAG_TUNER 重命名为 V4L2_CAP_TUNERV4L2_CAP_VIDEO_OVERLAY 取代了 V4L2_FLAG_PREVIEW,而 V4L2_CAP_VBI_CAPTUREV4L2_CAP_VBI_OUTPUT 取代了 V4L2_FLAG_DATA_SERVICEV4L2_FLAG_READV4L2_FLAG_WRITE 被合并到 V4L2_CAP_READWRITE 中。

    移除了冗余字段 inputsoutputsaudios。这些属性可以按照视频输入和输出音频输入和输出中所述的方式确定。

    移除了有些不稳定且因此几乎没用的字段 maxwidthmaxheightminwidthminheightmaxframerate。此信息可按照数据格式视频标准中所述的方式获得。

    移除了 V4L2_FLAG_SELECT。我们认为 select() 函数非常重要,所有与应用程序交换数据的 V4L2 驱动程序都必须支持它。移除了冗余的 V4L2_FLAG_MONOCHROME 标志,此信息可按照数据格式中所述的方式获得。

  4. struct v4l2_input 中,assoc_audio 字段和 capability 字段及其唯一标志 V4L2_INPUT_CAP_AUDIO 被新的 audioset 字段取代。这个字段不是将一个视频输入链接到一个音频输入,而是报告此视频输入与之组合的所有音频输入。

    新字段包括 tuner(反转了以前从调谐器到视频输入的链接)、stdstatus

    相应地,struct v4l2_output 失去了 capabilityassoc_audio 字段。取而代之的是增加了 audiosetmodulatorstd

  5. 为了与其他结构保持一致,struct v4l2_audio 字段 audio 被重命名为 index。添加了一个新的功能标志 V4L2_AUDCAP_STEREO,以指示相关的音频输入是否支持立体声。V4L2_AUDCAP_EFFECTS 和相应的 V4L2_AUDMODE 标志被移除。这可以使用控件轻松实现。(然而,同样的情况也适用于仍然存在的 AVL。)

    同样为了保持一致性,struct v4l2_audioout 字段 audio 被重命名为 index

  6. struct v4l2_tuner 中的 input 字段被 index 字段取代,允许具有多个调谐器的设备。视频输入和调谐器之间的链接现在被反转,输入指向它们的调谐器。std 子结构变成了一个简单的集合(稍后会详细介绍),并被移动到 struct v4l2_input 中。添加了一个 type 字段。

    相应地,在 struct v4l2_modulator 中,outputindex 字段取代。

    struct v4l2_frequency 中,port 字段被一个 tuner 字段取代,该字段包含相应的调谐器或调制器索引号。添加了一个调谐器 type 字段,并且 reserved 字段变得更大,以便将来进行扩展(特别是卫星调谐器)。

  7. 放弃了完全透明的视频标准的想法。经验表明,应用程序必须能够处理超出向用户显示菜单的视频标准。应用程序现在可以通过 v4l2_std_idvideodev2.h 头文件中定义的符号来引用标准,而不是使用 ioctl 枚举支持的标准。有关详细信息,请参见视频标准VIDIOC_G_STDVIDIOC_S_STD 现在将指向此类型的指针作为参数。ioctl VIDIOC_QUERYSTD, VIDIOC_SUBDEV_QUERYSTD 被添加用于自动检测接收到的标准(如果硬件具有此功能)。在 struct v4l2_standard 中,为 ioctl VIDIOC_ENUMSTD, VIDIOC_SUBDEV_ENUMSTD 添加了一个 index 字段。添加了一个名为 idv4l2_std_id 字段作为机器可读的标识符,同时也取代了 transmission 字段。具有误导性的 framerate 字段被重命名为 frameperiod。现在已过时的 colorstandard 信息(最初用于区分标准的变体)被移除。

    结构体 v4l2_enumstd 不再存在。ioctl VIDIOC_ENUMSTD, VIDIOC_SUBDEV_ENUMSTD 现在直接接受指向 struct v4l2_standard 的指针。特定视频输入或输出支持哪些标准的信息移动到分别名为 stdstruct v4l2_inputstruct v4l2_output 字段中。

  8. 结构体 v4l2_queryctrl 字段 categorygroup 没有流行起来和/或没有按预期实现,因此被移除。

  9. 添加了 VIDIOC_TRY_FMT ioctl,用于协商数据格式,类似于 VIDIOC_S_FMT,但无需编程硬件,也与正在进行的 I/O 无关。

    struct v4l2_format 中,fmt 联合体被扩展为包含 struct v4l2_window。现在可以使用 VIDIOC_G_FMTVIDIOC_S_FMTVIDIOC_TRY_FMT ioctl 进行所有图像格式协商。用于准备视频叠加的 VIDIOC_G_WINVIDIOC_S_WIN ioctl 已被移除。type 字段更改为 enum v4l2_buf_type 类型,缓冲区类型名称更改如下。

    旧的定义

    enum v4l2_buf_type

    V4L2_BUF_TYPE_CAPTURE

    V4L2_BUF_TYPE_VIDEO_CAPTURE

    V4L2_BUF_TYPE_CODECIN

    此处省略

    V4L2_BUF_TYPE_CODECOUT

    此处省略

    V4L2_BUF_TYPE_EFFECTSIN

    此处省略

    V4L2_BUF_TYPE_EFFECTSIN2

    此处省略

    V4L2_BUF_TYPE_EFFECTSOUT

    此处省略

    V4L2_BUF_TYPE_VIDEOOUT

    V4L2_BUF_TYPE_VIDEO_OUTPUT

    -

    V4L2_BUF_TYPE_VIDEO_OVERLAY

    -

    V4L2_BUF_TYPE_VBI_CAPTURE

    -

    V4L2_BUF_TYPE_VBI_OUTPUT

    -

    V4L2_BUF_TYPE_SLICED_VBI_CAPTURE

    -

    V4L2_BUF_TYPE_SLICED_VBI_OUTPUT

    V4L2_BUF_TYPE_PRIVATE_BASE

    V4L2_BUF_TYPE_PRIVATE (但这已被弃用)

  10. struct v4l2_fmtdesc 中,添加了一个名为 typeenum v4l2_buf_type 字段,与 struct v4l2_format 中的一样。VIDIOC_ENUM_FBUFFMT ioctl 已不再需要,并被移除。这些调用可以使用类型为 V4L2_BUF_TYPE_VIDEO_OVERLAYioctl VIDIOC_ENUM_FMT 代替。

  11. struct v4l2_pix_format 中,移除了 depth 字段,假定应用程序通过其四字符代码识别格式,已经知道颜色深度,而其他应用程序则不关心它。同样的理由导致移除了 V4L2_FMT_FLAG_COMPRESSED 标志。移除了 V4L2_FMT_FLAG_SWCONVECOMPRESSED 标志,因为不应该在内核空间中转换图像。应该提供用户库的转换函数作为替代。V4L2_FMT_FLAG_BYTESPERLINE 标志是冗余的。应用程序可以将 bytesperline 字段设置为零以获取合理的默认值。由于其余标志也被替换,因此移除了 flags 字段本身。

    隔行扫描标志被新添加的 field 字段中的 enum v4l2_field 值所取代。

    旧标志

    enum v4l2_field

    V4L2_FMT_FLAG_NOT_INTERLACED

    ?

    V4L2_FMT_FLAG_INTERLACED = V4L2_FMT_FLAG_COMBINED

    V4L2_FIELD_INTERLACED

    V4L2_FMT_FLAG_TOPFIELD = V4L2_FMT_FLAG_ODDFIELD

    V4L2_FIELD_TOP

    V4L2_FMT_FLAG_BOTFIELD = V4L2_FMT_FLAG_EVENFIELD

    V4L2_FIELD_BOTTOM

    -

    V4L2_FIELD_SEQ_TB

    -

    V4L2_FIELD_SEQ_BT

    -

    V4L2_FIELD_ALTERNATE

    色彩空间标志被新添加的 colorspace 字段中的 enum v4l2_colorspace 值所取代,其中 V4L2_COLORSPACE_SMPTE170MV4L2_COLORSPACE_BT878V4L2_COLORSPACE_470_SYSTEM_MV4L2_COLORSPACE_470_SYSTEM_BG 替代 V4L2_FMT_CS_601YUV

  12. struct v4l2_requestbuffers 中,type 字段被正确定义为 enum v4l2_buf_type。缓冲区类型如上所述进行了更改。添加了一个新的 memory 字段,其类型为 enum v4l2_memory,用于区分使用驱动程序或应用程序分配的缓冲区的 I/O 方法。有关详细信息,请参见 输入/输出

  13. struct v4l2_buffer 中,type 字段被正确定义为 enum v4l2_buf_type。缓冲区类型如上所述进行了更改。添加了一个类型为 enum v4l2_fieldfield 字段,以指示缓冲区是否包含顶部或底部场。移除了旧的字段标志。由于没有按计划将未调整的系统时钟添加到内核中,timestamp 字段从类型 stamp_t(一个表示纳秒采样时间的无符号 64 位整数)改回 struct timeval。随着第二种内存映射方法的添加,offset 字段移入联合体 m,并添加了一个类型为 enum v4l2_memory 的新 memory 字段,以区分 I/O 方法。有关详细信息,请参见 输入/输出

    V4L 兼容层使用了 V4L2_BUF_REQ_CONTIG 标志,对此代码进行更改后,不再需要它。V4L2_BUF_ATTR_DEVICEMEM 标志将指示缓冲区是否确实分配在设备内存而不是 DMA 可用的系统内存中。它几乎没用,因此被删除。

  14. struct v4l2_framebuffer 中,base[3] 数组期望在屏幕外视频内存中进行双缓冲和三缓冲,但是没有定义同步机制,因此被单个指针所取代。移除了 V4L2_FBUF_CAP_SCALEUPV4L2_FBUF_CAP_SCALEDOWN 标志。应用程序可以使用新的裁剪和缩放接口更准确地确定此功能。V4L2_FBUF_CAP_CLIPPING 标志被 V4L2_FBUF_CAP_LIST_CLIPPINGV4L2_FBUF_CAP_BITMAP_CLIPPING 所取代。

  15. struct v4l2_clip 中,xywidthheight 字段移入 c 子结构中,该子结构类型为 struct v4l2_rectxy 字段被重命名为 lefttop,即相对于上下文相关原点的偏移量。

  16. struct v4l2_window 中,xywidthheight 字段像上面一样移动到了 w 子结构中。添加了一个类型为 enum v4l2_fieldfield 字段,用于区分场和帧(隔行)叠加。

  17. 数字变焦接口,包括结构体 v4l2_zoomcap,结构体 v4l2_zoomV4L2_ZOOM_NONCAPV4L2_ZOOM_WHILESTREAMING 被新的裁剪和缩放接口取代。之前未使用的 struct v4l2_cropcapstruct v4l2_crop 被重新定义用于此目的。有关详细信息,请参阅 图像裁剪、插入和缩放 -- CROP API

  18. struct v4l2_vbi_format 中,SAMPLE_FORMAT 字段现在包含一个四字符代码,用于标识视频图像格式,V4L2_PIX_FMT_GREY 取代了 V4L2_VBI_SF_UBYTE 定义。reserved 字段被扩展了。

  19. struct v4l2_captureparm 中,timeperframe 字段的类型从 unsigned long 更改为 struct v4l2_fract。这允许精确表达 NTSC-M 帧率 30000 / 1001 的倍数。添加了一个新的字段 readbuffers,用于控制读取 I/O 模式下的驱动程序行为。

    struct v4l2_outputparm 进行了类似的更改。

  20. 结构体 v4l2_performanceVIDIOC_G_PERF ioctl 被删除。除非使用 读/写 I/O 方法(无论如何它都是受限的),否则应用程序已经可以获得此信息。

  21. 旧 V4L2 文档中从 RGB 到 YCbCr 色彩空间的转换示例不准确,这已在 图像格式 中得到纠正。

6.2.10. V4L2 2003-06-19

  1. 为无线电设备添加了一个新的功能标志 V4L2_CAP_RADIO。在此更改之前,无线电设备将仅通过具有一个类型字段读取为 V4L2_TUNER_RADIO 的调谐器来标识。

  2. 添加了一个可选的驱动程序访问优先级机制,有关详细信息,请参见 应用程序优先级

  3. 发现音频输入和输出接口不完整。

    以前,VIDIOC_G_AUDIO ioctl 会枚举可用的音频输入。一个用于确定当前音频输入的 ioctl(如果多个音频输入与当前视频输入组合)不存在。因此,VIDIOC_G_AUDIO 被重命名为 VIDIOC_G_AUDIO_OLD,此 ioctl 在 Kernel 2.6.39 中被删除。ioctl VIDIOC_ENUMAUDIO ioctl 被添加来枚举音频输入,而 VIDIOC_G_AUDIO 现在报告当前的音频输入。

    VIDIOC_G_AUDOUTVIDIOC_ENUMAUDOUT 进行了相同的更改。

    在进一步的更新之前,“videodev” 模块将在旧的和新的 ioctl 之间自动转换,但是驱动程序和应用程序必须更新才能成功再次编译。

  4. ioctl VIDIOC_OVERLAY ioctl 被错误地定义为读写参数。它被更改为只写,而读写版本被重命名为 VIDIOC_OVERLAY_OLD。旧的 ioctl 在 Kernel 2.6.39 中被删除。在进一步的更新之前,“videodev” 内核模块将自动转换为新版本,因此必须重新编译驱动程序,但不需要重新编译应用程序。

  5. 视频叠加接口 错误地声明裁剪矩形定义了可以看到视频的区域。正确的是,裁剪矩形定义了显示视频的区域,因此可以看到图形表面。

  6. VIDIOC_S_PARMVIDIOC_S_CTRL ioctl 被定义为只写参数,与其他修改其参数的 ioctl 不一致。它们被更改为读写,同时在只写版本上添加了 _OLD 后缀。旧的 ioctl 在 Kernel 2.6.39 中被删除。假设参数恒定的驱动程序和应用程序需要更新。

6.2.11. V4L2 2003-11-05

  1. RGB 格式 中,以下像素格式从 Bill Dirks 的 V4L2 规范中错误地传输。以下描述是指内存中的字节,按升序地址排列。

    符号

    在 0.5 版本之前的本文档中

    已更正

    V4L2_PIX_FMT_RGB24

    B、G、R

    R、G、B

    V4L2_PIX_FMT_BGR24

    R、G、B

    B、G、R

    V4L2_PIX_FMT_RGB32

    B、G、R、X

    R、G、B、X

    V4L2_PIX_FMT_BGR32

    R、G、B、X

    B、G、R、X

    V4L2_PIX_FMT_BGR24 示例始终正确。

    图像属性 中,V4L VIDEO_PALETTE_RGB24VIDEO_PALETTE_RGB32 格式到 V4L2 像素格式的映射也相应地进行了更正。

  2. 与上述修复无关,驱动程序可能仍然以不同的方式解释某些 V4L2 RGB 像素格式。这些问题尚未解决,有关详细信息,请参见 RGB 格式

6.2.12. Linux 2.6.6 中的 V4L2,2004-05-09

  1. ioctl VIDIOC_CROPCAP ioctl 被错误地定义为只读参数。它现在被定义为读写 ioctl,而只读版本被重命名为 VIDIOC_CROPCAP_OLD。旧的 ioctl 在 Kernel 2.6.39 中被删除。

6.2.13. Linux 2.6.8 中的 V4L2

  1. 一个新的字段 input (以前的 reserved[0])被添加到 struct v4l2_buffer 中。此字段的目的是在视频捕获过程中逐步在视频输入(例如摄像头)之间切换。必须使用新的 V4L2_BUF_FLAG_INPUT 标志启用此功能。flags 字段不再是只读的。

6.2.14. V4L2 规范勘误 2004-08-01

  1. V4L2 open() 函数的返回值被错误地记录了。

  2. 音频输出 ioctl 以 -AUDOUT 结尾,而不是 -AUDIOOUT。

  3. 在当前音频输入示例中,VIDIOC_G_AUDIO ioctl 采用了错误的参数。

  4. ioctl VIDIOC_QBUF、VIDIOC_DQBUFVIDIOC_DQBUF ioctl 的文档中没有提及 struct v4l2_buffer memory 字段。示例中也缺少它。另外,在 VIDIOC_DQBUF 页面上,EIO 错误代码没有记录。

6.2.15. Linux 2.6.14 中的 V4L2

  1. 添加了一个新的切片 VBI 接口。它记录在 切片 VBI 数据接口 中,并取代了 V4L2 规范 0.8 中首次提出的接口。

6.2.16. Linux 2.6.15 中的 V4L2

  1. 添加了 ioctl VIDIOC_LOG_STATUS ioctl。

  2. 定义了新的视频标准 V4L2_STD_NTSC_443V4L2_STD_SECAM_LCV4L2_STD_SECAM_DK(一组 SECAM D、K 和 K1)和 V4L2_STD_ATSC(一组 V4L2_STD_ATSC_8_VSBV4L2_STD_ATSC_16_VSB)。请注意,V4L2_STD_525_60 集现在包括 V4L2_STD_NTSC_443。另请参阅 typedef v4l2_std_id

  3. VIDIOC_G_COMPVIDIOC_S_COMP ioctl 分别被重命名为 VIDIOC_G_MPEGCOMPVIDIOC_S_MPEGCOMP。它们的参数被替换为一个 v4l2_mpeg_compression 结构体指针。(VIDIOC_G_MPEGCOMPVIDIOC_S_MPEGCOMP ioctl 在 Linux 2.6.25 中被移除。)

6.2.17. V4L2 规范勘误 2005-11-27

视频捕获示例中的捕获示例调用了 VIDIOC_S_CROP ioctl,但没有检查是否支持裁剪。在视频标准中的视频标准选择示例中,VIDIOC_S_STD 调用使用了错误的参数类型。

6.2.18. V4L2 规范勘误 2006-01-10

  1. struct v4l2_input 中的 V4L2_IN_ST_COLOR_KILL 标志不仅指示颜色抑制器是否启用,还指示它是否处于活动状态。(颜色抑制器在检测到视频信号中没有颜色时禁用颜色解码,以提高图像质量。)

  2. VIDIOC_S_PARM 是一个读写 ioctl,而不是其参考页面上所述的只写 ioctl。如上所述,该 ioctl 在 2003 年发生了更改。

6.2.19. V4L2 规范勘误 2006-02-03

  1. struct v4l2_captureparmstruct v4l2_outputparm 中,timeperframe 字段给出的时间单位是秒,而不是微秒。

6.2.20. V4L2 规范勘误 2006-02-04

  1. struct v4l2_window 中的 clips 字段必须指向一个 struct v4l2_clip 数组,而不是一个链表,因为驱动程序会忽略 struct v4l2_clipnext 指针。

6.2.21. Linux 2.6.17 中的 V4L2

  1. 添加了新的视频标准宏:V4L2_STD_NTSC_M_KR (NTSC M 韩国),以及集合 V4L2_STD_MNV4L2_STD_BV4L2_STD_GHV4L2_STD_DKV4L2_STD_NTSCV4L2_STD_SECAM 集合现在分别包含 V4L2_STD_NTSC_M_KRV4L2_STD_SECAM_LC

  2. 定义了一个新的 V4L2_TUNER_MODE_LANG1_LANG2,用于录制双语节目的两种语言。现在不建议为此目的使用 V4L2_TUNER_MODE_STEREO。有关详细信息,请参阅 VIDIOC_G_TUNER 部分。

6.2.22. V4L2 规范勘误 2006-09-23(草案 0.15)

  1. 在多个地方,切片 VBI 接口的 V4L2_BUF_TYPE_SLICED_VBI_CAPTUREV4L2_BUF_TYPE_SLICED_VBI_OUTPUT 没有与其他缓冲区类型一起提及。

  2. VIDIOC_G_AUDIO 中,明确了 struct v4l2_audiomode 字段是一个标志字段。

  3. ioctl VIDIOC_QUERYCAP 没有提及切片 VBI 和无线电功能标志。

  4. VIDIOC_G_FREQUENCY 中,明确了应用程序必须在调用 VIDIOC_S_FREQUENCY 之前初始化 struct v4l2_frequencytype 字段。

  5. struct v4l2_requestbuffers 中的 reserved 数组有 2 个元素,而不是 32 个。

  6. 视频输出接口原始 VBI 数据接口中,从未流行的设备文件名 /dev/vout 被替换为 /dev/video

  7. 在 Linux 2.6.15 中,VBI 设备次要编号的可能范围从 224-239 扩展到 224-255。因此,现在可以使用设备文件名 /dev/vbi0/dev/vbi31

6.2.23. Linux 2.6.18 中的 V4L2

  1. 添加了新的 ioctl VIDIOC_G_EXT_CTRLSVIDIOC_S_EXT_CTRLSVIDIOC_TRY_EXT_CTRLS,以及使用 ioctls VIDIOC_QUERYCTRL、VIDIOC_QUERY_EXT_CTRL 和 VIDIOC_QUERYMENU 跳过不支持的控件的标志,新的控件类型 V4L2_CTRL_TYPE_INTEGER64V4L2_CTRL_TYPE_CTRL_CLASSenum v4l2_ctrl_type),以及新的控件标志 V4L2_CTRL_FLAG_READ_ONLYV4L2_CTRL_FLAG_UPDATEV4L2_CTRL_FLAG_INACTIVEV4L2_CTRL_FLAG_SLIDER控件标志)。有关详细信息,请参阅 扩展控件 API

6.2.24. Linux 2.6.19 中的 V4L2

  1. struct v4l2_sliced_vbi_cap 中,添加了一个缓冲区类型字段,替换了保留字段。请注意,在枚举类型的大小与整数类型的大小不同的体系结构上,结构的大小发生了变化。VIDIOC_G_SLICED_VBI_CAP ioctl 从只读重新定义为读写。应用程序现在必须初始化类型字段并清除保留字段。这些更改可能会破坏与旧驱动程序和应用程序的兼容性

  2. 添加了 ioctl ioctl VIDIOC_ENUM_FRAMESIZESioctl VIDIOC_ENUM_FRAMEINTERVALS

  3. 添加了一种新的像素格式 V4L2_PIX_FMT_RGB444RGB 格式)。

6.2.25. V4L2 规范勘误 2006-10-12(草案 0.17)

  1. V4L2_PIX_FMT_HM12保留图像格式)是一种 YUV 4:2:0 格式,而不是 4:2:2 格式。

6.2.26. Linux 2.6.21 中的 V4L2

  1. videodev2.h 头文件现在在 GNU 通用公共许可证第二版或更高版本,以及 3 条款 BSD 风格许可证下获得双重许可。

6.2.27. Linux 2.6.22 中的 V4L2

  1. 添加了两个新的场序 V4L2_FIELD_INTERLACED_TBV4L2_FIELD_INTERLACED_BT。有关详细信息,请参阅 enum v4l2_field

  2. 在视频叠加接口中添加了三种新的具有全局或直接或反转局部 alpha 值的剪切/混合方法。有关详细信息,请参阅 VIDIOC_G_FBUFVIDIOC_S_FBUF ioctl 的描述。

    一个新的 global_alpha 字段被添加到 struct v4l2_window 中,扩展了该结构。这可能会破坏直接使用 struct v4l2_window 的应用程序的兼容性。然而,VIDIOC_G/S/TRY_FMT ioctl,它接受一个指向 struct v4l2_format 父结构体的指针,该结构体在末尾有填充字节,则不受影响。

  3. struct v4l2_window 中的 chromakey 字段的格式从 “主机字节序 RGB32” 更改为与帧缓冲区格式相同的像素值。这可能会破坏现有应用程序的兼容性。目前尚不清楚是否有驱动程序支持 “主机字节序 RGB32” 格式。

6.2.28. Linux 2.6.24 中的 V4L2

  1. 添加了像素格式 V4L2_PIX_FMT_PAL8V4L2_PIX_FMT_YUV444V4L2_PIX_FMT_YUV555V4L2_PIX_FMT_YUV565V4L2_PIX_FMT_YUV32

6.2.29. Linux 2.6.25 中的 V4L2

  1. 添加了像素格式 V4L2_PIX_FMT_Y16V4L2_PIX_FMT_SBGGR16

  2. 添加了新的控制 V4L2_CID_POWER_LINE_FREQUENCYV4L2_CID_HUE_AUTOV4L2_CID_WHITE_BALANCE_TEMPERATUREV4L2_CID_SHARPNESSV4L2_CID_BACKLIGHT_COMPENSATION。控制 V4L2_CID_BLACK_LEVELV4L2_CID_WHITENESSV4L2_CID_HCENTERV4L2_CID_VCENTER 已被弃用。

  3. 添加了一个 相机控制类,包含新的控制 V4L2_CID_EXPOSURE_AUTOV4L2_CID_EXPOSURE_ABSOLUTEV4L2_CID_EXPOSURE_AUTO_PRIORITYV4L2_CID_PAN_RELATIVEV4L2_CID_TILT_RELATIVEV4L2_CID_PAN_RESETV4L2_CID_TILT_RESETV4L2_CID_PAN_ABSOLUTEV4L2_CID_TILT_ABSOLUTEV4L2_CID_FOCUS_ABSOLUTEV4L2_CID_FOCUS_RELATIVEV4L2_CID_FOCUS_AUTO

  4. 在 Linux 2.6.18 中被 扩展控制 接口取代的 VIDIOC_G_MPEGCOMPVIDIOC_S_MPEGCOMP ioctl,最终从 videodev2.h 头文件中删除。

6.2.30. Linux 2.6.26 中的 V4L2

  1. 添加了像素格式 V4L2_PIX_FMT_Y16V4L2_PIX_FMT_SBGGR16

  2. 添加了用户控制 V4L2_CID_CHROMA_AGCV4L2_CID_COLOR_KILLER

6.2.31. Linux 2.6.27 中的 V4L2

  1. 添加了 ioctl VIDIOC_S_HW_FREQ_SEEK ioctl 和 V4L2_CAP_HW_FREQ_SEEK 功能。

  2. 添加了像素格式 V4L2_PIX_FMT_YVYUV4L2_PIX_FMT_PCA501V4L2_PIX_FMT_PCA505V4L2_PIX_FMT_PCA508V4L2_PIX_FMT_PCA561V4L2_PIX_FMT_SGBRG8V4L2_PIX_FMT_PAC207V4L2_PIX_FMT_PJPG

6.2.32. Linux 2.6.28 中的 V4L2

  1. 添加了 V4L2_MPEG_AUDIO_ENCODING_AACV4L2_MPEG_AUDIO_ENCODING_AC3 MPEG 音频编码。

  2. 添加了 V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC MPEG 视频编码。

  3. 添加了像素格式 V4L2_PIX_FMT_SGRBG10V4L2_PIX_FMT_SGRBG10DPCM8

6.2.33. Linux 2.6.29 中的 V4L2

  1. VIDIOC_G_CHIP_IDENT ioctl 被重命名为 VIDIOC_G_CHIP_IDENT_OLD,并且引入了 VIDIOC_DBG_G_CHIP_IDENT 来替代它。旧的结构体 v4l2_chip_ident 被重命名为结构体 v4l2_chip_ident_old

  2. 添加了像素格式 V4L2_PIX_FMT_VYUYV4L2_PIX_FMT_NV16V4L2_PIX_FMT_NV61

  3. 添加了相机控制 V4L2_CID_ZOOM_ABSOLUTEV4L2_CID_ZOOM_RELATIVEV4L2_CID_ZOOM_CONTINUOUSV4L2_CID_PRIVACY

6.2.34. Linux 2.6.30 中的 V4L2

  1. 添加了新的控制标志 V4L2_CTRL_FLAG_WRITE_ONLY

  2. 添加了新的控制 V4L2_CID_COLORFX

6.2.35. Linux 2.6.32 中的 V4L2

  1. 为了更容易比较 V4L2 API 和内核版本,现在 V4L2 API 使用 Linux 内核版本编号进行编号。

  2. 最终确定了 RDS 捕获 API。有关详细信息,请参阅 RDS 接口

  3. 为调制器和 RDS 编码器添加了新的功能。

  4. 添加了 libv4l API 的描述。

  5. 通过新的类型 V4L2_CTRL_TYPE_STRING 添加了对字符串控制的支持。

  6. 添加了 V4L2_CID_BAND_STOP_FILTER 文档。

  7. 添加了 FM 调制器 (FM TX) 扩展控制类:V4L2_CTRL_CLASS_FM_TX 及其控制 ID。

  8. 添加了 FM 接收器 (FM RX) 扩展控制类:V4L2_CTRL_CLASS_FM_RX 及其控制 ID。

  9. 添加了遥控器章节,描述了媒体设备的默认遥控器映射。

6.2.36. Linux 2.6.33 中的 V4L2

  1. 为了支持 HDTV 接收器和发射器,添加了对数字视频时序的支持。

6.2.37. Linux 2.6.34 中的 V4L2

  1. 相机控制类添加了 V4L2_CID_IRIS_ABSOLUTEV4L2_CID_IRIS_RELATIVE 控制。

6.2.38. Linux 2.6.37 中的 V4L2

  1. 删除了 vtx(图文电视/文字电视)API。此 API 不再使用,并且没有硬件来验证该 API。也没有发现任何使用它的用户空间应用程序。它最初计划在 2.6.35 中删除。

6.2.39. Linux 2.6.39 中的 V4L2

  1. 删除了旧的 VIDIOC_*_OLD 符号和 V4L1 支持。

  2. 添加了多平面 API。不影响当前驱动程序和应用程序的兼容性。有关详细信息,请参阅 多平面 API

6.2.40. Linux 3.1 中的 V4L2

  1. VIDIOC_QUERYCAP 现在返回每个子系统的版本,而不是每个驱动程序的版本。

    标准化了无效 ioctl 的错误代码。

    添加了 V4L2_CTRL_TYPE_BITMASK。

6.2.41. Linux 3.2 中的 V4L2

  1. 添加了 V4L2_CTRL_FLAG_VOLATILE,以向用户空间发出易失性控制的信号。

  2. 添加了选择 API,以扩展对裁剪和合成的控制。不影响当前驱动程序和应用程序的兼容性。有关详细信息,请参阅 选择 API

6.2.42. Linux 3.3 中的 V4L2

  1. 用户控制类添加了 V4L2_CID_ALPHA_COMPONENT 控制。

  2. 在 struct v4l2_capabilities 中添加了 device_caps 字段,并添加了新的 V4L2_CAP_DEVICE_CAPS 功能。

6.2.43. Linux 3.4 中的 V4L2

  1. 添加了 JPEG 压缩控制类

  2. 扩展了 DV Timings API:ioctl VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGSioctl VIDIOC_QUERY_DV_TIMINGSioctl VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP

6.2.44. Linux 3.5 中的 V4L2

  1. 添加了整数菜单,新类型为 V4L2_CTRL_TYPE_INTEGER_MENU。

  2. 为 V4L2 子设备接口添加了选择 API:ioctl VIDIOC_SUBDEV_G_SELECTION, VIDIOC_SUBDEV_S_SELECTIONVIDIOC_SUBDEV_S_SELECTION

  3. V4L2_CID_COLORFX 控制添加了 V4L2_COLORFX_ANTIQUEV4L2_COLORFX_ART_FREEZEV4L2_COLORFX_AQUAV4L2_COLORFX_SILHOUETTEV4L2_COLORFX_SOLARIZATIONV4L2_COLORFX_VIVIDV4L2_COLORFX_ARBITRARY_CBCR 菜单项。

  4. 添加了 V4L2_CID_COLORFX_CBCR 控制。

  5. 添加了相机控制 V4L2_CID_AUTO_EXPOSURE_BIASV4L2_CID_AUTO_N_PRESET_WHITE_BALANCEV4L2_CID_IMAGE_STABILIZATIONV4L2_CID_ISO_SENSITIVITYV4L2_CID_ISO_SENSITIVITY_AUTOV4L2_CID_EXPOSURE_METERINGV4L2_CID_SCENE_MODEV4L2_CID_3A_LOCKV4L2_CID_AUTO_FOCUS_STARTV4L2_CID_AUTO_FOCUS_STOPV4L2_CID_AUTO_FOCUS_STATUSV4L2_CID_AUTO_FOCUS_RANGE

6.2.45. Linux 3.6 中的 V4L2

  1. struct v4l2_buffer 中的 input 替换为 reserved2,并删除了 V4L2_BUF_FLAG_INPUT

  2. 添加了 V4L2_CAP_VIDEO_M2M 和 V4L2_CAP_VIDEO_M2M_MPLANE 功能。

  3. 添加了对频带枚举的支持:ioctl VIDIOC_ENUM_FREQ_BANDS

6.2.46. Linux 3.9 中的 V4L2

  1. struct v4l2_bufferflags 字段中添加了时间戳类型。请参阅 缓冲区标志

  2. 添加了 V4L2_EVENT_CTRL_CH_RANGE 控制事件更改标志。请参阅 控制更改

6.2.47. Linux 3.10 中的 V4L2

  1. 删除了过时且未使用的 DV_PRESET ioctl VIDIOC_G_DV_PRESET、VIDIOC_S_DV_PRESET、VIDIOC_QUERY_DV_PRESET 和 VIDIOC_ENUM_DV_PRESET。删除了相关的 v4l2_input/output 功能标志 V4L2_IN_CAP_PRESETS 和 V4L2_OUT_CAP_PRESETS。

  2. 添加了新的调试 ioctl ioctl VIDIOC_DBG_G_CHIP_INFO

6.2.48. Linux 3.11 中的 V4L2

  1. 删除了过时的 VIDIOC_DBG_G_CHIP_IDENT ioctl。

6.2.49. Linux 3.14 中的 V4L2

  1. struct v4l2_rect 中,widthheight 字段的类型从 _s32 更改为 _u32。

6.2.50. Linux 3.15 中的 V4L2

  1. 添加了软件定义无线电 (SDR) 接口。

6.2.51. Linux 3.16 中的 V4L2

  1. 添加了事件 V4L2_EVENT_SOURCE_CHANGE。

6.2.52. Linux 3.17 中的 V4L2

  1. 扩展了 struct v4l2_pix_format。添加了格式标志。

  2. 添加了复合控制类型和 VIDIOC_QUERY_EXT_CTRL

6.2.53. Linux 3.18 中的 V4L2

  1. 添加了 V4L2_CID_PAN_SPEEDV4L2_CID_TILT_SPEED 相机控制。

6.2.54. Linux 3.19 中的 V4L2

  1. 重写了色彩空间章节,为 struct v4l2_pix_formatstruct v4l2_pix_format_mplanestruct v4l2_mbus_framefmt 添加了新的 enum v4l2_ycbcr_encodingenum v4l2_quantization 字段。

6.2.55. Linux 4.4 中的 V4L2

  1. V4L2_TUNER_ADC 重命名为 V4L2_TUNER_SDR。现在不建议使用 V4L2_TUNER_ADC

  2. 添加了 V4L2_CID_RF_TUNER_RF_GAIN RF 调谐器控制。

  3. 为软件定义无线电 (SDR) 接口添加了发射器支持。

6.2.56. V4L2 与其他 Linux 多媒体 API 的关系

6.2.56.1. X 视频扩展

X 视频扩展(缩写为 XVideo 或仅为 Xv)是 X Window 系统的一个扩展,例如由 XFree86 项目实现。它的范围与 V4L2 类似,是一个用于 X 客户端的视频捕获和输出设备的 API。Xv 允许应用程序在窗口中显示实时视频,将窗口内容发送到电视输出,以及在 XPixmaps 中捕获或输出静止图像[1]。通过它们的实现,XFree86 使该扩展在许多操作系统和架构上可用。

由于驱动程序嵌入到 X 服务器中,Xv 比 V4L2 视频叠加接口 具有许多优势。驱动程序可以轻松确定叠加目标,即用于破坏性叠加的可见图形内存或屏幕外缓冲区。它可以为非破坏性叠加、缩放或颜色键控编程 RAMDAC,或者为视频捕获硬件的剪切功能编程,始终与绘图操作或窗口移动或更改其堆叠顺序同步。

为了结合 Xv 和 V4L 的优势,XFree86 和 XOrg 中存在一个特殊的 Xv 驱动程序,它只是对它找到的任何具有叠加功能的 Video4Linux 设备进行编程。要启用它,/etc/X11/XF86Config 必须包含以下行

Section "Module"
    Load "v4l"
EndSection

截至 XFree86 4.2,此驱动程序仍然只支持 V4L ioctl,但它应该可以通过 V4L2 向后兼容层与所有 V4L2 设备正常工作。由于 V4L2 允许多次打开,因此在 X 客户端请求视频叠加时可以捕获视频(如果 V4L2 驱动程序支持)。关于同时捕获和叠加的限制在 视频叠加接口 中讨论。

与 V4L2 只有轻微关系的是,XFree86 扩展了 Xv,以支持硬件 YUV 到 RGB 转换和缩放,从而加快视频播放速度,并添加了一个连接到 MPEG-2 解码硬件的接口。此 API 对于显示使用 V4L2 设备捕获的图像很有用。

6.2.56.2. 数字视频

V4L2 不支持数字地面、有线或卫星广播。存在一个旨在处理数字接收器的独立项目。您可以在 https://linuxtv.org 找到其主页。Linux DVB API 与 V4L2 API 没有关联,只是混合硬件的驱动程序可能同时支持两者。

6.2.56.3. 音频接口

[待办 - OSS/ALSA]

6.2.57. 实验性 API 元素

以下 V4L2 API 元素目前处于实验阶段,未来可能会发生变化。

6.2.58. 过时的 API 元素

以下 V4L2 API 元素已被新的接口取代,不应在新驱动程序中实现。