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。现在可以使用以 V4L2_CID_AUDIO 开头的名称,通过 VIDIOC_G_CTRLVIDIOC_S_CTRL ioctl 访问音频控制。V4L2_MAJOR 定义从 videodev.h 中移除,因为它只在 videodev 内核模块中使用了一次。添加了 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 对象的 category 和 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 符号中的一些错别字。为了与 v4l 兼容,更改了 struct v4l2_clip。(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. 所有不同的获取和设置格式命令都被合并到单个 VIDIOC_G_FMTVIDIOC_S_FMT ioctl 中,它们接受一个联合体和一个选择联合体成员的类型字段作为参数。目的是通过消除多个 ioctl 来简化 API,并允许新的和驱动私有的数据流,而无需添加新的 ioctl。

    此更改废弃了以下 ioctl:VIDIOC_S_INFMT, VIDIOC_G_INFMT, VIDIOC_S_OUTFMT, VIDIOC_G_OUTFMT, VIDIOC_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. 结构体 v4l2_buffertimestamp 字段变更为 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. 结构体 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。这可能会破坏兼容性,因为如果结构体 v4l2_fmttype 字段不包含 V4L2_BUF_TYPE_VBI,则 VIDIOC_G_FMTVIDIOC_S_FMT ioctl 现在可能会失败。在 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 定义的行号。兼容性:将起始值加一。依赖于先前语义的应用程序可能无法正常运行。

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

  3. 驱动程序再次被允许返回负(未知)的起始值,如之前所提议。此功能为何被删除尚不清楚。此更改可能破坏依赖于起始值为正数的应用程序的兼容性。澄清了 VIDIOC_S_FMT ioctl 中 EBUSYEINVAL 错误代码的使用。EBUSY 错误代码最终被文档化,以及此前只在 videodev.h 头文件中提及的 reserved2 字段。

  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 宣布功能冻结之前,API 经过修订,借鉴了 V4L2 0.20 的经验。这个未命名的版本最终合并到 Linux 2.5.46 中。

  1. 相关设备 中所述,驱动程序必须在所有次设备号下提供相关设备功能。

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

  3. 结构体 v4l2_capability 发生了巨大变化。请注意,结构体的大小也发生了变化,这编码在 ioctl 请求代码中,因此旧的 V4L2 设备将对新的 ioctl VIDIOC_QUERYCAP ioctl 返回 EINVAL 错误代码。

    新增了用于识别驱动程序的字段,一个新的 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_PREVIEWV4L2_CAP_VBI_CAPTUREV4L2_CAP_VBI_OUTPUT 替换了 V4L2_FLAG_DATA_SERVICEV4L2_FLAG_READV4L2_FLAG_WRITE 合并到 V4L2_CAP_READWRITE 中。

    冗余字段 inputsoutputsaudios 已被移除。这些属性可以按照 视频输入和输出 以及 音频输入和输出 中的描述来确定。

    相对不稳定且因此几乎无用的字段 maxwidth, maxheight, minwidth, minheight, maxframerate 已被移除。这些信息可参见 数据格式视频标准 中的描述获取。

    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_tunerinput 字段被 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 的指针。特定视频输入或输出所支持标准的信息已分别移至 struct v4l2_inputstruct v4l2_output 中名为 std 的字段。

  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。缓冲区类型如上所述发生了变化。添加了一个类型为 enum v4l2_memory 的新 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 方法。详情请参阅 输入/输出

    V4L2_BUF_REQ_CONTIG 标志曾被 V4L 兼容层使用,但在代码更改后不再需要。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 字段已移至类型为 struct v4l2_rectc 子结构体中。xy 字段已重命名为 lefttop,即相对于上下文相关原点的偏移量。

  16. struct v4l2_window 中,xywidthheight 字段已如上所述移至 w 子结构体中。添加了一个类型为 enum v4l2_fieldfield 字段,以区分场和帧(隔行)叠加。

  17. 数字变焦接口,包括 struct v4l2_zoomcap、struct 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. V4L2 in Linux 2.6.6, 2004-05-09

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

6.2.13. V4L2 in Linux 2.6.8

  1. struct v4l2_buffer 中添加了一个新字段 input(以前是 reserved[0])。此字段的目的是在视频捕获过程中与视频输入(例如摄像机)交替。必须使用新的 V4L2_BUF_FLAG_INPUT 标志启用此功能。flags 字段不再是只读的。

6.2.14. V4L2 spec erratum 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_buffermemory 字段。示例中也缺少它。此外,在 VIDIOC_DQBUF 页面上,EIO 错误代码未被记录。

6.2.15. V4L2 in Linux 2.6.14

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

6.2.16. V4L2 in Linux 2.6.15

  1. 添加了 ioctl VIDIOC_LOG_STATUS ioctl。

  2. 定义了新的视频标准 V4L2_STD_NTSC_443V4L2_STD_SECAM_LCV4L2_STD_SECAM_DK(SECAM D、K 和 K1 的集合)以及 V4L2_STD_ATSCV4L2_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。它们的参数被 struct v4l2_mpeg_compression 指针取代。(VIDIOC_G_MPEGCOMPVIDIOC_S_MPEGCOMP ioctl 在 Linux 2.6.25 中被移除。)

6.2.17. V4L2 spec erratum 2005-11-27

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

6.2.18. V4L2 spec erratum 2006-01-10

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

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

6.2.19. V4L2 spec erratum 2006-02-03

  1. struct v4l2_captureparmstruct v4l2_outputparm 中,timeperframe 字段表示时间以秒为单位,而不是微秒。

6.2.20. V4L2 spec erratum 2006-02-04

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

6.2.21. V4L2 in Linux 2.6.17

  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_frequency 的调谐器 type 字段。

  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_CLASS (enum 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 中,添加了一个缓冲区类型字段,替换了一个保留字段。请注意,在 enum 类型大小与 int 类型大小不同的架构上,该结构的大小已发生变化。VIDIOC_G_SLICED_VBI_CAP ioctl 从只读重新定义为读写。应用程序现在必须初始化 type 字段并清除保留字段。这些更改可能会 破坏 与旧版驱动程序和应用程序的 兼容性

  2. 添加了 ioctl 命令 ioctl VIDIOC_ENUM_FRAMESIZESioctl VIDIOC_ENUM_FRAMEINTERVALS

  3. 添加了新的像素格式 V4L2_PIX_FMT_RGB444 (RGB 格式)。

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 通用公共许可证第二版或更高版本,以及三条款 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 的描述。

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

  3. struct v4l2_windowchromakey 字段的格式从“主机字节序 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. VIDIOC_G_MPEGCOMPVIDIOC_S_MPEGCOMP ioctl 命令在 Linux 2.6.18 中已被扩展控制接口取代,最终从 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 取代它。旧的 struct v4l2_chip_ident 已重命名为 struct 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 时序 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_M2MV4L2_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_PRESETSV4L2_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_SDRV4L2_TUNER_ADC 的使用现已弃用。

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

  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 元素已被新接口取代,不应在新的驱动程序中实现。