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
。现在可以使用以 V4L2_CID_AUDIO
开头的名称,通过 VIDIOC_G_CTRL 和 VIDIOC_S_CTRL ioctl 访问音频控制。V4L2_MAJOR
定义从 videodev.h
中移除,因为它只在 videodev
内核模块中使用了一次。添加了 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 对象的 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 约定。
修复了
V4L2_FMT_FLAG
符号中的一些错别字。为了与 v4l 兼容,更改了struct v4l2_clip
。(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);
所有不同的获取和设置格式命令都被合并到单个 VIDIOC_G_FMT 和 VIDIOC_S_FMT ioctl 中,它们接受一个联合体和一个选择联合体成员的类型字段作为参数。目的是通过消除多个 ioctl 来简化 API,并允许新的和驱动私有的数据流,而无需添加新的 ioctl。
此更改废弃了以下 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
更窄的分类。换句话说,一个类别中可能有多个组。一个组内的控件通常会绘制在一个组框内。不同类别的控件可能会有更大的间隔,甚至可能出现在单独的窗口中。结构体
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 位整数。结构体
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
。这可能会破坏兼容性,因为如果结构体 v4l2_fmt
的 type
字段不包含 V4L2_BUF_TYPE_VBI
,则 VIDIOC_G_FMT 和 VIDIOC_S_FMT ioctl 现在可能会失败。在 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 定义的行号。兼容性:将起始值加一。依赖于先前语义的应用程序可能无法正常运行。限制“count[0] > 0 且 count[1] > 0”已放宽为“(count[0] + count[1]) > 0”。理由:驱动程序可以按扫描行粒度分配资源,并且某些数据服务仅在第一个字段上传输。关于两个
count
值通常会相等的注释具有误导性且毫无意义,已被删除。此更改破坏了与早期版本的兼容性:驱动程序可能返回EINVAL
,应用程序可能无法正常运行。驱动程序再次被允许返回负(未知)的起始值,如之前所提议。此功能为何被删除尚不清楚。此更改可能破坏依赖于起始值为正数的应用程序的兼容性。澄清了 VIDIOC_S_FMT ioctl 中
EBUSY
和EINVAL
错误代码的使用。EBUSY
错误代码最终被文档化,以及此前只在videodev.h
头文件中提及的reserved2
字段。添加了新的缓冲区类型
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 宣布功能冻结之前,API 经过修订,借鉴了 V4L2 0.20 的经验。这个未命名的版本最终合并到 Linux 2.5.46 中。
如 相关设备 中所述,驱动程序必须在所有次设备号下提供相关设备功能。
open()
函数要求访问模式为O_RDWR
,无论设备类型如何。所有与应用程序交换数据的 V4L2 驱动程序都必须支持O_NONBLOCK
标志。用于指示无数据交换(面板应用程序)访问的O_NOIO
标志(一个将无意义的O_TRUNC
别名化的 V4L2 符号)已被移除。驱动程序必须保持在“面板模式”,直到应用程序尝试启动数据交换,请参阅 打开和关闭设备。结构体
v4l2_capability
发生了巨大变化。请注意,结构体的大小也发生了变化,这编码在 ioctl 请求代码中,因此旧的 V4L2 设备将对新的 ioctl VIDIOC_QUERYCAP ioctl 返回EINVAL
错误代码。新增了用于识别驱动程序的字段,一个新的 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
的指针。特定视频输入或输出所支持标准的信息已分别移至struct v4l2_input
和struct v4l2_output
中名为std
的字段。结构体 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
。缓冲区类型如上所述发生了变化。添加了一个类型为 enum v4l2_memory 的新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 方法。详情请参阅 输入/输出。V4L2_BUF_REQ_CONTIG
标志曾被 V4L 兼容层使用,但在代码更改后不再需要。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
字段已移至类型为struct v4l2_rect
的c
子结构体中。x
和y
字段已重命名为left
和top
,即相对于上下文相关原点的偏移量。在
struct v4l2_window
中,x
、y
、width
和height
字段已如上所述移至w
子结构体中。添加了一个类型为enum v4l2_field
的field
字段,以区分场和帧(隔行)叠加。数字变焦接口,包括 struct
v4l2_zoomcap
、structv4l2_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. V4L2 in Linux 2.6.6, 2004-05-09¶
ioctl VIDIOC_CROPCAP ioctl 被错误地定义为只读参数。它现在被定义为读写 ioctl,而只读版本被重命名为
VIDIOC_CROPCAP_OLD
。旧的 ioctl 在 Kernel 2.6.39 中被移除。
6.2.13. V4L2 in Linux 2.6.8¶
struct v4l2_buffer
中添加了一个新字段input
(以前是reserved[0]
)。此字段的目的是在视频捕获过程中与视频输入(例如摄像机)交替。必须使用新的V4L2_BUF_FLAG_INPUT
标志启用此功能。flags
字段不再是只读的。
6.2.14. V4L2 spec erratum 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. V4L2 in Linux 2.6.14¶
添加了一个新的切片 VBI 接口。它在 切片 VBI 数据接口 中有所记载,并取代了 V4L2 规范 0.8 中首次提出的接口。
6.2.16. V4L2 in Linux 2.6.15¶
添加了 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
。它们的参数被 structv4l2_mpeg_compression
指针取代。(VIDIOC_G_MPEGCOMP
和VIDIOC_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¶
struct v4l2_input
中的V4L2_IN_ST_COLOR_KILL
标志不仅指示颜色杀手是否启用,还指示它是否处于活动状态。(颜色杀手在检测到视频信号中没有颜色时禁用颜色解码以提高图像质量。)VIDIOC_S_PARM 是一个读写 ioctl,而不是其参考页面上所述的只写 ioctl。此 ioctl 已在 2003 年更改,如上所述。
6.2.19. V4L2 spec erratum 2006-02-03¶
在
struct v4l2_captureparm
和struct v4l2_outputparm
中,timeperframe
字段表示时间以秒为单位,而不是微秒。
6.2.20. V4L2 spec erratum 2006-02-04¶
struct v4l2_window
中的clips
字段必须指向struct v4l2_clip
的数组,而不是链表,因为驱动程序会忽略struct v4l2_clip
的next
指针。
6.2.21. V4L2 in Linux 2.6.17¶
添加了新的视频标准宏:
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
中,添加了一个缓冲区类型字段,替换了一个保留字段。请注意,在enum
类型大小与int
类型大小不同的架构上,该结构的大小已发生变化。VIDIOC_G_SLICED_VBI_CAP ioctl 从只读重新定义为读写。应用程序现在必须初始化type
字段并清除保留字段。这些更改可能会 破坏 与旧版驱动程序和应用程序的 兼容性。添加了 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 通用公共许可证第二版或更高版本,以及三条款 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 的描述。
struct v4l2_window
中添加了一个新的global_alpha
字段,扩展了该结构。这可能会**破坏**直接使用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
。VIDIOC_G_MPEGCOMP
和VIDIOC_S_MPEGCOMP
ioctl 命令在 Linux 2.6.18 中已被扩展控制接口取代,最终从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
取代它。旧的struct v4l2_chip_ident
已重命名为struct 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¶
重写了颜色空间章节,在
struct v4l2_pix_format
、struct v4l2_pix_format_mplane
和struct v4l2_mbus_framefmt
中添加了新的enum v4l2_ycbcr_encoding
和enum v4l2_quantization
字段。
6.2.55. Linux 4.4 中的 V4L2¶
将
V4L2_TUNER_ADC
重命名为V4L2_TUNER_SDR
。V4L2_TUNER_ADC
的使用现已弃用。添加了
V4L2_CID_RF_TUNER_RF_GAIN
射频调谐器控制。为软件定义无线电(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。