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_NONCAP
和 O_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_ENUMSTD,VIDIOC_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_BGR24
,V4L2_PIX_FMT_RGB32
更改为 V4L2_PIX_FMT_BGR32
。现在可以使用 VIDIOC_G_CTRL 和 VIDIOC_S_CTRL ioctl 以及以 V4L2_CID_AUDIO
开头的名称访问音频控件。由于 V4L2_MAJOR
定义在 videodev.h
中只使用了一次,因此将其从 videodev.h
中删除。YUV422
和 YUV411
平面图像格式被添加。
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 约定。
修复了
V4L2_FMT_FLAG
符号中的一些拼写错误。更改了struct v4l2_clip
,以与 v4l 兼容。(1999-08-30)添加了
V4L2_TUNER_SUB_LANG1
。(1999-09-05)所有使用整数参数的 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);
所有不同的 get- 和 set-format 命令都被合并为一个 VIDIOC_G_FMT 和 VIDIOC_S_FMT ioctl,它们采用联合类型和一个类型字段来选择联合成员作为参数。目的是通过消除几个 ioctl 并允许新的和驱动程序私有数据流而无需添加新的 ioctl 来简化 API。
此更改使以下 ioctl 过时:
VIDIOC_S_INFMT
、VIDIOC_G_INFMT
、VIDIOC_S_OUTFMT
、VIDIOC_G_OUTFMT
、VIDIOC_S_VBIFMT
和VIDIOC_G_VBIFMT
。图像格式struct v4l2_format
被重命名为struct v4l2_pix_format
,而struct v4l2_format
现在是所有格式协商的包络结构。与上述更改类似,
VIDIOC_G_PARM
和VIDIOC_S_PARM
ioctl 与VIDIOC_G_OUTPARM
和VIDIOC_S_OUTPARM
合并。 新的struct v4l2_streamparm
中的type
字段选择相应的联合成员。此更改使
VIDIOC_G_OUTPARM
和VIDIOC_S_OUTPARM
ioctl 过时。简化了控制枚举,引入了两个新的控制标志,并删除了一个。
catname
字段被group
字段替换。驱动程序现在可以使用
V4L2_CTRL_FLAG_DISABLED
和V4L2_CTRL_FLAG_GRABBED
分别标记不受支持和暂时不可用的控件。group
名称表示可能比category
更窄的分类。换句话说,一个类别中可能存在多个组。组内的控件通常会绘制在组框内。不同类别中的控件可能有更大的分隔,甚至可能出现在单独的窗口中。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 位整数。在
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_OUTPUT
和 V4L2_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_FREQUENCY 和 VIDIOC_S_FREQUENCY ioctl。(旧的 VIDIOC_G_FREQ
和 VIDIOC_S_FREQ
ioctl 没有考虑多个调谐器。)
2000-09-18:添加了 V4L2_BUF_TYPE_VBI
。由于 VIDIOC_G_FMT 和 VIDIOC_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 接口进行了一些更改。
V4L2 API 规范中添加了阐明行编号方案的图示。
start
[0] 和start
[1] 字段不再从零开始计算行号。理由:a) 之前的定义不明确。b)start
[] 值是序数。c) 没有必要发明新的行编号方案。我们现在使用 ITU-R 定义的行号,就是这样。兼容性:将起始值加 1。依赖于先前语义的应用程序可能无法正常运行。“count[0] > 0 且 count[1] > 0”的限制已放宽为“(count[0] + count[1]) > 0”。理由:驱动程序可能会以扫描线粒度分配资源,并且某些数据服务仅在第一个字段上传输。评论说两个
count
值通常会相等,这是具有误导性和毫无意义的,并且已被删除。此更改破坏了与早期版本的兼容性:驱动程序可能会返回EINVAL
,应用程序可能无法正常运行。驱动程序再次允许返回如先前所建议的负(未知)起始值。为什么删除此功能尚不清楚。此更改可能会破坏与依赖于起始值为正值的应用程序的兼容性。澄清了 VIDIOC_S_FMT ioctl 使用
EBUSY
和EINVAL
错误代码的情况。EBUSY
错误代码最终被记录下来,并且reserved2
字段之前仅在videodev.h
头文件中提及。添加了新的缓冲区类型
V4L2_TYPE_VBI_INPUT
和V4L2_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 中。
如 相关设备 中指定的那样,驱动程序必须使相关设备功能在所有次要设备编号下都可用。
open()
函数需要访问模式O_RDWR
,而与设备类型无关。所有与应用程序交换数据的 V4L2 驱动程序都必须支持O_NONBLOCK
标志。O_NOIO
标志,即与无意义的O_TRUNC
别名的 V4L2 符号,用于指示没有数据交换的访问(面板应用程序),已被删除。驱动程序必须保持“面板模式”,直到应用程序尝试启动数据交换为止,请参阅 打开和关闭设备。struct v4l2_capability
发生了巨大变化。请注意,结构的尺寸也发生了变化,这在 ioctl 请求代码中进行了编码,因此较旧的 V4L2 设备将使用EINVAL
错误代码响应新的 ioctl VIDIOC_QUERYCAP ioctl。新增了用于标识驱动程序的字段,一个新的 RDS 设备功能
V4L2_CAP_RDS_CAPTURE
,V4L2_CAP_AUDIO
标志表示设备是否具有任何音频连接器,另一个 I/O 功能 V4L2_CAP_ASYNCIO 可以被标记。为了响应这些更改,type
字段变成了一个位集,并被合并到flags
字段中。V4L2_FLAG_TUNER
重命名为V4L2_CAP_TUNER
,V4L2_CAP_VIDEO_OVERLAY
取代了V4L2_FLAG_PREVIEW
,而V4L2_CAP_VBI_CAPTURE
和V4L2_CAP_VBI_OUTPUT
取代了V4L2_FLAG_DATA_SERVICE
。V4L2_FLAG_READ
和V4L2_FLAG_WRITE
被合并到V4L2_CAP_READWRITE
中。移除了冗余字段
inputs
、outputs
和audios
。这些属性可以按照视频输入和输出和音频输入和输出中所述的方式确定。移除了有些不稳定且因此几乎没用的字段
maxwidth
、maxheight
、minwidth
、minheight
和maxframerate
。此信息可按照数据格式和视频标准中所述的方式获得。移除了
V4L2_FLAG_SELECT
。我们认为select()
函数非常重要,所有与应用程序交换数据的 V4L2 驱动程序都必须支持它。移除了冗余的V4L2_FLAG_MONOCHROME
标志,此信息可按照数据格式中所述的方式获得。在
struct v4l2_input
中,assoc_audio
字段和capability
字段及其唯一标志V4L2_INPUT_CAP_AUDIO
被新的audioset
字段取代。这个字段不是将一个视频输入链接到一个音频输入,而是报告此视频输入与之组合的所有音频输入。新字段包括
tuner
(反转了以前从调谐器到视频输入的链接)、std
和status
。相应地,
struct v4l2_output
失去了capability
和assoc_audio
字段。取而代之的是增加了audioset
、modulator
和std
。为了与其他结构保持一致,
struct v4l2_audio
字段audio
被重命名为index
。添加了一个新的功能标志V4L2_AUDCAP_STEREO
,以指示相关的音频输入是否支持立体声。V4L2_AUDCAP_EFFECTS
和相应的V4L2_AUDMODE
标志被移除。这可以使用控件轻松实现。(然而,同样的情况也适用于仍然存在的 AVL。)同样为了保持一致性,
struct v4l2_audioout
字段audio
被重命名为index
。struct v4l2_tuner
中的input
字段被index
字段取代,允许具有多个调谐器的设备。视频输入和调谐器之间的链接现在被反转,输入指向它们的调谐器。std
子结构变成了一个简单的集合(稍后会详细介绍),并被移动到struct v4l2_input
中。添加了一个type
字段。相应地,在
struct v4l2_modulator
中,output
被index
字段取代。在
struct v4l2_frequency
中,port
字段被一个tuner
字段取代,该字段包含相应的调谐器或调制器索引号。添加了一个调谐器type
字段,并且reserved
字段变得更大,以便将来进行扩展(特别是卫星调谐器)。放弃了完全透明的视频标准的想法。经验表明,应用程序必须能够处理超出向用户显示菜单的视频标准。应用程序现在可以通过 v4l2_std_id 和
videodev2.h
头文件中定义的符号来引用标准,而不是使用 ioctl 枚举支持的标准。有关详细信息,请参见视频标准。VIDIOC_G_STD 和 VIDIOC_S_STD 现在将指向此类型的指针作为参数。ioctl VIDIOC_QUERYSTD, VIDIOC_SUBDEV_QUERYSTD 被添加用于自动检测接收到的标准(如果硬件具有此功能)。在struct v4l2_standard
中,为 ioctl VIDIOC_ENUMSTD, VIDIOC_SUBDEV_ENUMSTD 添加了一个index
字段。添加了一个名为id
的 v4l2_std_id 字段作为机器可读的标识符,同时也取代了transmission
字段。具有误导性的framerate
字段被重命名为frameperiod
。现在已过时的colorstandard
信息(最初用于区分标准的变体)被移除。结构体
v4l2_enumstd
不再存在。ioctl VIDIOC_ENUMSTD, VIDIOC_SUBDEV_ENUMSTD 现在直接接受指向struct v4l2_standard
的指针。特定视频输入或输出支持哪些标准的信息移动到分别名为std
的struct v4l2_input
和struct v4l2_output
字段中。结构体 v4l2_queryctrl 字段
category
和group
没有流行起来和/或没有按预期实现,因此被移除。添加了 VIDIOC_TRY_FMT ioctl,用于协商数据格式,类似于 VIDIOC_S_FMT,但无需编程硬件,也与正在进行的 I/O 无关。
在
struct v4l2_format
中,fmt
联合体被扩展为包含struct v4l2_window
。现在可以使用VIDIOC_G_FMT
、VIDIOC_S_FMT
和VIDIOC_TRY_FMT
ioctl 进行所有图像格式协商。用于准备视频叠加的VIDIOC_G_WIN
和VIDIOC_S_WIN
ioctl 已被移除。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
(但这已被弃用)在
struct v4l2_fmtdesc
中,添加了一个名为type
的enum v4l2_buf_type
字段,与struct v4l2_format
中的一样。VIDIOC_ENUM_FBUFFMT
ioctl 已不再需要,并被移除。这些调用可以使用类型为V4L2_BUF_TYPE_VIDEO_OVERLAY
的 ioctl VIDIOC_ENUM_FMT 代替。在
struct v4l2_pix_format
中,移除了depth
字段,假定应用程序通过其四字符代码识别格式,已经知道颜色深度,而其他应用程序则不关心它。同样的理由导致移除了V4L2_FMT_FLAG_COMPRESSED
标志。移除了V4L2_FMT_FLAG_SWCONVECOMPRESSED
标志,因为不应该在内核空间中转换图像。应该提供用户库的转换函数作为替代。V4L2_FMT_FLAG_BYTESPERLINE
标志是冗余的。应用程序可以将bytesperline
字段设置为零以获取合理的默认值。由于其余标志也被替换,因此移除了flags
字段本身。隔行扫描标志被新添加的
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_SMPTE170M
、V4L2_COLORSPACE_BT878
、V4L2_COLORSPACE_470_SYSTEM_M
或V4L2_COLORSPACE_470_SYSTEM_BG
替代V4L2_FMT_CS_601YUV
。在
struct v4l2_requestbuffers
中,type
字段被正确定义为enum v4l2_buf_type
。缓冲区类型如上所述进行了更改。添加了一个新的memory
字段,其类型为 enum v4l2_memory,用于区分使用驱动程序或应用程序分配的缓冲区的 I/O 方法。有关详细信息,请参见 输入/输出。在
struct v4l2_buffer
中,type
字段被正确定义为enum v4l2_buf_type
。缓冲区类型如上所述进行了更改。添加了一个类型为enum v4l2_field
的field
字段,以指示缓冲区是否包含顶部或底部场。移除了旧的字段标志。由于没有按计划将未调整的系统时钟添加到内核中,timestamp
字段从类型 stamp_t(一个表示纳秒采样时间的无符号 64 位整数)改回 struct timeval。随着第二种内存映射方法的添加,offset
字段移入联合体m
,并添加了一个类型为 enum v4l2_memory 的新memory
字段,以区分 I/O 方法。有关详细信息,请参见 输入/输出。V4L 兼容层使用了
V4L2_BUF_REQ_CONTIG
标志,对此代码进行更改后,不再需要它。V4L2_BUF_ATTR_DEVICEMEM
标志将指示缓冲区是否确实分配在设备内存而不是 DMA 可用的系统内存中。它几乎没用,因此被删除。在
struct v4l2_framebuffer
中,base[3]
数组期望在屏幕外视频内存中进行双缓冲和三缓冲,但是没有定义同步机制,因此被单个指针所取代。移除了V4L2_FBUF_CAP_SCALEUP
和V4L2_FBUF_CAP_SCALEDOWN
标志。应用程序可以使用新的裁剪和缩放接口更准确地确定此功能。V4L2_FBUF_CAP_CLIPPING
标志被V4L2_FBUF_CAP_LIST_CLIPPING
和V4L2_FBUF_CAP_BITMAP_CLIPPING
所取代。在
struct v4l2_clip
中,x
、y
、width
和height
字段移入c
子结构中,该子结构类型为struct v4l2_rect
。x
和y
字段被重命名为left
和top
,即相对于上下文相关原点的偏移量。在
struct v4l2_window
中,x
、y
、width
和height
字段像上面一样移动到了w
子结构中。添加了一个类型为enum v4l2_field
的field
字段,用于区分场和帧(隔行)叠加。数字变焦接口,包括结构体
v4l2_zoomcap
,结构体v4l2_zoom
,V4L2_ZOOM_NONCAP
和V4L2_ZOOM_WHILESTREAMING
被新的裁剪和缩放接口取代。之前未使用的struct v4l2_cropcap
和struct v4l2_crop
被重新定义用于此目的。有关详细信息,请参阅 图像裁剪、插入和缩放 -- CROP API。在
struct v4l2_vbi_format
中,SAMPLE_FORMAT
字段现在包含一个四字符代码,用于标识视频图像格式,V4L2_PIX_FMT_GREY
取代了V4L2_VBI_SF_UBYTE
定义。reserved
字段被扩展了。在
struct v4l2_captureparm
中,timeperframe
字段的类型从 unsigned long 更改为struct v4l2_fract
。这允许精确表达 NTSC-M 帧率 30000 / 1001 的倍数。添加了一个新的字段readbuffers
,用于控制读取 I/O 模式下的驱动程序行为。对
struct v4l2_outputparm
进行了类似的更改。结构体
v4l2_performance
和VIDIOC_G_PERF
ioctl 被删除。除非使用 读/写 I/O 方法(无论如何它都是受限的),否则应用程序已经可以获得此信息。旧 V4L2 文档中从 RGB 到 YCbCr 色彩空间的转换示例不准确,这已在 图像格式 中得到纠正。
6.2.10. V4L2 2003-06-19¶
为无线电设备添加了一个新的功能标志
V4L2_CAP_RADIO
。在此更改之前,无线电设备将仅通过具有一个类型字段读取为V4L2_TUNER_RADIO
的调谐器来标识。添加了一个可选的驱动程序访问优先级机制,有关详细信息,请参见 应用程序优先级。
发现音频输入和输出接口不完整。
以前,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_AUDOUT 和 VIDIOC_ENUMAUDOUT 进行了相同的更改。
在进一步的更新之前,“videodev” 模块将在旧的和新的 ioctl 之间自动转换,但是驱动程序和应用程序必须更新才能成功再次编译。
ioctl VIDIOC_OVERLAY ioctl 被错误地定义为读写参数。它被更改为只写,而读写版本被重命名为
VIDIOC_OVERLAY_OLD
。旧的 ioctl 在 Kernel 2.6.39 中被删除。在进一步的更新之前,“videodev” 内核模块将自动转换为新版本,因此必须重新编译驱动程序,但不需要重新编译应用程序。视频叠加接口 错误地声明裁剪矩形定义了可以看到视频的区域。正确的是,裁剪矩形定义了不显示视频的区域,因此可以看到图形表面。
VIDIOC_S_PARM 和 VIDIOC_S_CTRL ioctl 被定义为只写参数,与其他修改其参数的 ioctl 不一致。它们被更改为读写,同时在只写版本上添加了
_OLD
后缀。旧的 ioctl 在 Kernel 2.6.39 中被删除。假设参数恒定的驱动程序和应用程序需要更新。
6.2.11. V4L2 2003-11-05¶
在 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_RGB24
和VIDEO_PALETTE_RGB32
格式到 V4L2 像素格式的映射也相应地进行了更正。与上述修复无关,驱动程序可能仍然以不同的方式解释某些 V4L2 RGB 像素格式。这些问题尚未解决,有关详细信息,请参见 RGB 格式。
6.2.12. Linux 2.6.6 中的 V4L2,2004-05-09¶
ioctl VIDIOC_CROPCAP ioctl 被错误地定义为只读参数。它现在被定义为读写 ioctl,而只读版本被重命名为
VIDIOC_CROPCAP_OLD
。旧的 ioctl 在 Kernel 2.6.39 中被删除。
6.2.13. Linux 2.6.8 中的 V4L2¶
一个新的字段
input
(以前的reserved[0]
)被添加到struct v4l2_buffer
中。此字段的目的是在视频捕获过程中逐步在视频输入(例如摄像头)之间切换。必须使用新的V4L2_BUF_FLAG_INPUT
标志启用此功能。flags
字段不再是只读的。
6.2.14. V4L2 规范勘误 2004-08-01¶
V4L2 open() 函数的返回值被错误地记录了。
音频输出 ioctl 以 -AUDOUT 结尾,而不是 -AUDIOOUT。
在当前音频输入示例中,
VIDIOC_G_AUDIO
ioctl 采用了错误的参数。ioctl VIDIOC_QBUF、VIDIOC_DQBUF 和 VIDIOC_DQBUF ioctl 的文档中没有提及
struct v4l2_buffer
memory
字段。示例中也缺少它。另外,在VIDIOC_DQBUF
页面上,EIO
错误代码没有记录。
6.2.15. Linux 2.6.14 中的 V4L2¶
添加了一个新的切片 VBI 接口。它记录在 切片 VBI 数据接口 中,并取代了 V4L2 规范 0.8 中首次提出的接口。
6.2.16. Linux 2.6.15 中的 V4L2¶
添加了 ioctl VIDIOC_LOG_STATUS ioctl。
定义了新的视频标准
V4L2_STD_NTSC_443
、V4L2_STD_SECAM_LC
、V4L2_STD_SECAM_DK
(一组 SECAM D、K 和 K1)和V4L2_STD_ATSC
(一组V4L2_STD_ATSC_8_VSB
和V4L2_STD_ATSC_16_VSB
)。请注意,V4L2_STD_525_60
集现在包括V4L2_STD_NTSC_443
。另请参阅 typedef v4l2_std_id。VIDIOC_G_COMP
和VIDIOC_S_COMP
ioctl 分别被重命名为VIDIOC_G_MPEGCOMP
和VIDIOC_S_MPEGCOMP
。它们的参数被替换为一个v4l2_mpeg_compression
结构体指针。(VIDIOC_G_MPEGCOMP
和VIDIOC_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¶
struct v4l2_input
中的V4L2_IN_ST_COLOR_KILL
标志不仅指示颜色抑制器是否启用,还指示它是否处于活动状态。(颜色抑制器在检测到视频信号中没有颜色时禁用颜色解码,以提高图像质量。)VIDIOC_S_PARM 是一个读写 ioctl,而不是其参考页面上所述的只写 ioctl。如上所述,该 ioctl 在 2003 年发生了更改。
6.2.19. V4L2 规范勘误 2006-02-03¶
在
struct v4l2_captureparm
和struct v4l2_outputparm
中,timeperframe
字段给出的时间单位是秒,而不是微秒。
6.2.20. V4L2 规范勘误 2006-02-04¶
struct v4l2_window
中的clips
字段必须指向一个struct v4l2_clip
数组,而不是一个链表,因为驱动程序会忽略struct v4l2_clip
的next
指针。
6.2.21. Linux 2.6.17 中的 V4L2¶
添加了新的视频标准宏:
V4L2_STD_NTSC_M_KR
(NTSC M 韩国),以及集合V4L2_STD_MN
、V4L2_STD_B
、V4L2_STD_GH
和V4L2_STD_DK
。V4L2_STD_NTSC
和V4L2_STD_SECAM
集合现在分别包含V4L2_STD_NTSC_M_KR
和V4L2_STD_SECAM_LC
。定义了一个新的
V4L2_TUNER_MODE_LANG1_LANG2
,用于录制双语节目的两种语言。现在不建议为此目的使用V4L2_TUNER_MODE_STEREO
。有关详细信息,请参阅 VIDIOC_G_TUNER 部分。
6.2.22. V4L2 规范勘误 2006-09-23(草案 0.15)¶
在多个地方,切片 VBI 接口的
V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
和V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
没有与其他缓冲区类型一起提及。在 VIDIOC_G_AUDIO 中,明确了
struct v4l2_audio
的mode
字段是一个标志字段。ioctl VIDIOC_QUERYCAP 没有提及切片 VBI 和无线电功能标志。
在 VIDIOC_G_FREQUENCY 中,明确了应用程序必须在调用 VIDIOC_S_FREQUENCY 之前初始化
struct v4l2_frequency
的type
字段。struct v4l2_requestbuffers
中的reserved
数组有 2 个元素,而不是 32 个。在视频输出接口 和 原始 VBI 数据接口中,从未流行的设备文件名
/dev/vout
被替换为/dev/video
。在 Linux 2.6.15 中,VBI 设备次要编号的可能范围从 224-239 扩展到 224-255。因此,现在可以使用设备文件名
/dev/vbi0
到/dev/vbi31
。
6.2.23. Linux 2.6.18 中的 V4L2¶
添加了新的 ioctl VIDIOC_G_EXT_CTRLS、VIDIOC_S_EXT_CTRLS 和 VIDIOC_TRY_EXT_CTRLS,以及使用 ioctls VIDIOC_QUERYCTRL、VIDIOC_QUERY_EXT_CTRL 和 VIDIOC_QUERYMENU 跳过不支持的控件的标志,新的控件类型
V4L2_CTRL_TYPE_INTEGER64
和V4L2_CTRL_TYPE_CTRL_CLASS
(enum v4l2_ctrl_type
),以及新的控件标志V4L2_CTRL_FLAG_READ_ONLY
、V4L2_CTRL_FLAG_UPDATE
、V4L2_CTRL_FLAG_INACTIVE
和V4L2_CTRL_FLAG_SLIDER
(控件标志)。有关详细信息,请参阅 扩展控件 API。
6.2.24. Linux 2.6.19 中的 V4L2¶
在
struct v4l2_sliced_vbi_cap
中,添加了一个缓冲区类型字段,替换了保留字段。请注意,在枚举类型的大小与整数类型的大小不同的体系结构上,结构的大小发生了变化。VIDIOC_G_SLICED_VBI_CAP ioctl 从只读重新定义为读写。应用程序现在必须初始化类型字段并清除保留字段。这些更改可能会破坏与旧驱动程序和应用程序的兼容性。添加了 ioctl ioctl VIDIOC_ENUM_FRAMESIZES 和 ioctl VIDIOC_ENUM_FRAMEINTERVALS。
添加了一种新的像素格式
V4L2_PIX_FMT_RGB444
(RGB 格式)。
6.2.25. V4L2 规范勘误 2006-10-12(草案 0.17)¶
V4L2_PIX_FMT_HM12
(保留图像格式)是一种 YUV 4:2:0 格式,而不是 4:2:2 格式。
6.2.26. Linux 2.6.21 中的 V4L2¶
videodev2.h
头文件现在在 GNU 通用公共许可证第二版或更高版本,以及 3 条款 BSD 风格许可证下获得双重许可。
6.2.27. Linux 2.6.22 中的 V4L2¶
添加了两个新的场序
V4L2_FIELD_INTERLACED_TB
和V4L2_FIELD_INTERLACED_BT
。有关详细信息,请参阅enum v4l2_field
。在视频叠加接口中添加了三种新的具有全局或直接或反转局部 alpha 值的剪切/混合方法。有关详细信息,请参阅 VIDIOC_G_FBUF 和 VIDIOC_S_FBUF ioctl 的描述。
一个新的
global_alpha
字段被添加到struct v4l2_window
中,扩展了该结构。这可能会破坏直接使用struct v4l2_window
的应用程序的兼容性。然而,VIDIOC_G/S/TRY_FMT ioctl,它接受一个指向struct v4l2_format
父结构体的指针,该结构体在末尾有填充字节,则不受影响。struct v4l2_window
中的chromakey
字段的格式从 “主机字节序 RGB32” 更改为与帧缓冲区格式相同的像素值。这可能会破坏现有应用程序的兼容性。目前尚不清楚是否有驱动程序支持 “主机字节序 RGB32” 格式。
6.2.28. Linux 2.6.24 中的 V4L2¶
添加了像素格式
V4L2_PIX_FMT_PAL8
、V4L2_PIX_FMT_YUV444
、V4L2_PIX_FMT_YUV555
、V4L2_PIX_FMT_YUV565
和V4L2_PIX_FMT_YUV32
。
6.2.29. Linux 2.6.25 中的 V4L2¶
添加了像素格式 V4L2_PIX_FMT_Y16 和 V4L2_PIX_FMT_SBGGR16。
添加了新的控制
V4L2_CID_POWER_LINE_FREQUENCY
、V4L2_CID_HUE_AUTO
、V4L2_CID_WHITE_BALANCE_TEMPERATURE
、V4L2_CID_SHARPNESS
和V4L2_CID_BACKLIGHT_COMPENSATION
。控制V4L2_CID_BLACK_LEVEL
、V4L2_CID_WHITENESS
、V4L2_CID_HCENTER
和V4L2_CID_VCENTER
已被弃用。添加了一个 相机控制类,包含新的控制
V4L2_CID_EXPOSURE_AUTO
、V4L2_CID_EXPOSURE_ABSOLUTE
、V4L2_CID_EXPOSURE_AUTO_PRIORITY
、V4L2_CID_PAN_RELATIVE
、V4L2_CID_TILT_RELATIVE
、V4L2_CID_PAN_RESET
、V4L2_CID_TILT_RESET
、V4L2_CID_PAN_ABSOLUTE
、V4L2_CID_TILT_ABSOLUTE
、V4L2_CID_FOCUS_ABSOLUTE
、V4L2_CID_FOCUS_RELATIVE
和V4L2_CID_FOCUS_AUTO
。在 Linux 2.6.18 中被 扩展控制 接口取代的
VIDIOC_G_MPEGCOMP
和VIDIOC_S_MPEGCOMP
ioctl,最终从videodev2.h
头文件中删除。
6.2.30. Linux 2.6.26 中的 V4L2¶
添加了像素格式
V4L2_PIX_FMT_Y16
和V4L2_PIX_FMT_SBGGR16
。添加了用户控制
V4L2_CID_CHROMA_AGC
和V4L2_CID_COLOR_KILLER
。
6.2.31. Linux 2.6.27 中的 V4L2¶
添加了 ioctl VIDIOC_S_HW_FREQ_SEEK ioctl 和
V4L2_CAP_HW_FREQ_SEEK
功能。添加了像素格式
V4L2_PIX_FMT_YVYU
、V4L2_PIX_FMT_PCA501
、V4L2_PIX_FMT_PCA505
、V4L2_PIX_FMT_PCA508
、V4L2_PIX_FMT_PCA561
、V4L2_PIX_FMT_SGBRG8
、V4L2_PIX_FMT_PAC207
和V4L2_PIX_FMT_PJPG
。
6.2.32. Linux 2.6.28 中的 V4L2¶
添加了
V4L2_MPEG_AUDIO_ENCODING_AAC
和V4L2_MPEG_AUDIO_ENCODING_AC3
MPEG 音频编码。添加了
V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC
MPEG 视频编码。添加了像素格式
V4L2_PIX_FMT_SGRBG10
和V4L2_PIX_FMT_SGRBG10DPCM8
。
6.2.33. Linux 2.6.29 中的 V4L2¶
VIDIOC_G_CHIP_IDENT
ioctl 被重命名为VIDIOC_G_CHIP_IDENT_OLD
,并且引入了VIDIOC_DBG_G_CHIP_IDENT
来替代它。旧的结构体v4l2_chip_ident
被重命名为结构体v4l2_chip_ident_old
。添加了像素格式
V4L2_PIX_FMT_VYUY
、V4L2_PIX_FMT_NV16
和V4L2_PIX_FMT_NV61
。添加了相机控制
V4L2_CID_ZOOM_ABSOLUTE
、V4L2_CID_ZOOM_RELATIVE
、V4L2_CID_ZOOM_CONTINUOUS
和V4L2_CID_PRIVACY
。
6.2.34. Linux 2.6.30 中的 V4L2¶
添加了新的控制标志
V4L2_CTRL_FLAG_WRITE_ONLY
。添加了新的控制
V4L2_CID_COLORFX
。
6.2.35. Linux 2.6.32 中的 V4L2¶
为了更容易比较 V4L2 API 和内核版本,现在 V4L2 API 使用 Linux 内核版本编号进行编号。
最终确定了 RDS 捕获 API。有关详细信息,请参阅 RDS 接口。
为调制器和 RDS 编码器添加了新的功能。
添加了 libv4l API 的描述。
通过新的类型
V4L2_CTRL_TYPE_STRING
添加了对字符串控制的支持。添加了
V4L2_CID_BAND_STOP_FILTER
文档。添加了 FM 调制器 (FM TX) 扩展控制类:
V4L2_CTRL_CLASS_FM_TX
及其控制 ID。添加了 FM 接收器 (FM RX) 扩展控制类:
V4L2_CTRL_CLASS_FM_RX
及其控制 ID。添加了遥控器章节,描述了媒体设备的默认遥控器映射。
6.2.36. Linux 2.6.33 中的 V4L2¶
为了支持 HDTV 接收器和发射器,添加了对数字视频时序的支持。
6.2.37. Linux 2.6.34 中的 V4L2¶
为相机控制类添加了
V4L2_CID_IRIS_ABSOLUTE
和V4L2_CID_IRIS_RELATIVE
控制。
6.2.38. Linux 2.6.37 中的 V4L2¶
删除了 vtx(图文电视/文字电视)API。此 API 不再使用,并且没有硬件来验证该 API。也没有发现任何使用它的用户空间应用程序。它最初计划在 2.6.35 中删除。
6.2.39. Linux 2.6.39 中的 V4L2¶
删除了旧的 VIDIOC_*_OLD 符号和 V4L1 支持。
添加了多平面 API。不影响当前驱动程序和应用程序的兼容性。有关详细信息,请参阅 多平面 API。
6.2.40. Linux 3.1 中的 V4L2¶
VIDIOC_QUERYCAP 现在返回每个子系统的版本,而不是每个驱动程序的版本。
标准化了无效 ioctl 的错误代码。
添加了 V4L2_CTRL_TYPE_BITMASK。
6.2.41. Linux 3.2 中的 V4L2¶
添加了 V4L2_CTRL_FLAG_VOLATILE,以向用户空间发出易失性控制的信号。
添加了选择 API,以扩展对裁剪和合成的控制。不影响当前驱动程序和应用程序的兼容性。有关详细信息,请参阅 选择 API。
6.2.42. Linux 3.3 中的 V4L2¶
为用户控制类添加了
V4L2_CID_ALPHA_COMPONENT
控制。在 struct v4l2_capabilities 中添加了 device_caps 字段,并添加了新的 V4L2_CAP_DEVICE_CAPS 功能。
6.2.43. Linux 3.4 中的 V4L2¶
6.2.44. Linux 3.5 中的 V4L2¶
添加了整数菜单,新类型为 V4L2_CTRL_TYPE_INTEGER_MENU。
为 V4L2 子设备接口添加了选择 API:ioctl VIDIOC_SUBDEV_G_SELECTION, VIDIOC_SUBDEV_S_SELECTION 和 VIDIOC_SUBDEV_S_SELECTION。
为
V4L2_CID_COLORFX
控制添加了V4L2_COLORFX_ANTIQUE
、V4L2_COLORFX_ART_FREEZE
、V4L2_COLORFX_AQUA
、V4L2_COLORFX_SILHOUETTE
、V4L2_COLORFX_SOLARIZATION
、V4L2_COLORFX_VIVID
和V4L2_COLORFX_ARBITRARY_CBCR
菜单项。添加了
V4L2_CID_COLORFX_CBCR
控制。添加了相机控制
V4L2_CID_AUTO_EXPOSURE_BIAS
、V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE
、V4L2_CID_IMAGE_STABILIZATION
、V4L2_CID_ISO_SENSITIVITY
、V4L2_CID_ISO_SENSITIVITY_AUTO
、V4L2_CID_EXPOSURE_METERING
、V4L2_CID_SCENE_MODE
、V4L2_CID_3A_LOCK
、V4L2_CID_AUTO_FOCUS_START
、V4L2_CID_AUTO_FOCUS_STOP
、V4L2_CID_AUTO_FOCUS_STATUS
和V4L2_CID_AUTO_FOCUS_RANGE
。
6.2.45. Linux 3.6 中的 V4L2¶
将
struct v4l2_buffer
中的input
替换为reserved2
,并删除了V4L2_BUF_FLAG_INPUT
。添加了 V4L2_CAP_VIDEO_M2M 和 V4L2_CAP_VIDEO_M2M_MPLANE 功能。
添加了对频带枚举的支持:ioctl VIDIOC_ENUM_FREQ_BANDS。
6.2.46. Linux 3.9 中的 V4L2¶
在
struct v4l2_buffer
的flags
字段中添加了时间戳类型。请参阅 缓冲区标志。添加了
V4L2_EVENT_CTRL_CH_RANGE
控制事件更改标志。请参阅 控制更改。
6.2.47. Linux 3.10 中的 V4L2¶
删除了过时且未使用的 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。
添加了新的调试 ioctl ioctl VIDIOC_DBG_G_CHIP_INFO。
6.2.48. Linux 3.11 中的 V4L2¶
删除了过时的
VIDIOC_DBG_G_CHIP_IDENT
ioctl。
6.2.49. Linux 3.14 中的 V4L2¶
在
struct v4l2_rect
中,width
和height
字段的类型从 _s32 更改为 _u32。
6.2.50. Linux 3.15 中的 V4L2¶
添加了软件定义无线电 (SDR) 接口。
6.2.51. Linux 3.16 中的 V4L2¶
添加了事件 V4L2_EVENT_SOURCE_CHANGE。
6.2.52. Linux 3.17 中的 V4L2¶
扩展了
struct v4l2_pix_format
。添加了格式标志。添加了复合控制类型和 VIDIOC_QUERY_EXT_CTRL。
6.2.53. Linux 3.18 中的 V4L2¶
添加了
V4L2_CID_PAN_SPEED
和V4L2_CID_TILT_SPEED
相机控制。
6.2.54. Linux 3.19 中的 V4L2¶
6.2.55. Linux 4.4 中的 V4L2¶
将
V4L2_TUNER_ADC
重命名为V4L2_TUNER_SDR
。现在不建议使用V4L2_TUNER_ADC
。添加了
V4L2_CID_RF_TUNER_RF_GAIN
RF 调谐器控制。为软件定义无线电 (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 元素已被新的接口取代,不应在新驱动程序中实现。
VIDIOC_G_MPEGCOMP
和VIDIOC_S_MPEGCOMP
ioctl。请使用扩展控件,扩展控件 API。VIDIOC_G_DV_PRESET、VIDIOC_S_DV_PRESET、VIDIOC_ENUM_DV_PRESETS 和 VIDIOC_QUERY_DV_PRESET ioctl。请使用 DV 时序 API (数字视频 (DV) 时序)。
VIDIOC_SUBDEV_G_CROP
和VIDIOC_SUBDEV_S_CROP
ioctl。请使用VIDIOC_SUBDEV_G_SELECTION
和VIDIOC_SUBDEV_S_SELECTION
,ioctl VIDIOC_SUBDEV_G_SELECTION, VIDIOC_SUBDEV_S_SELECTION。