7.25. 虚拟视频测试驱动程序 (vivid)

此驱动程序模拟各种类型的 video4linux 硬件:视频采集、视频输出、vbi 采集和输出、元数据采集和输出、无线电接收器和发射器、触摸采集和软件定义无线电接收器。此外,还提供一个简单的帧缓冲设备用于测试采集和输出覆盖。

最多可以创建 64 个 vivid 实例,每个实例最多有 16 个输入和 16 个输出。

每个输入可以是网络摄像头、电视采集设备、S-Video 采集设备或 HDMI 采集设备。每个输出可以是 S-Video 输出设备或 HDMI 输出设备。

这些输入和输出的行为与真实硬件设备的行为完全相同。这允许您将此驱动程序用作应用程序开发的测试输入,因为您可以测试各种功能而无需特殊的硬件。

本文档描述了此驱动程序实现的功能

  • 支持 read()/write()、MMAP、USERPTR 和 DMABUF 流式 I/O。

  • 大量测试模式及其变体

  • 正常工作的亮度、对比度、饱和度和色调控制

  • 支持 alpha 颜色分量

  • 完整的色彩空间支持,包括有限/完整 RGB 范围

  • 存在所有可能的控制类型

  • 支持各种像素宽高比和视频宽高比

  • 错误注入,以测试如果发生错误会发生什么

  • 支持输入和输出的任意组合中的裁剪/合成/缩放

  • 可以模拟高达 4K 的分辨率

  • 支持所有场设置以测试隔行扫描采集

  • 支持所有标准 YUV 和 RGB 格式,包括两种多平面 YUV 格式

  • 原始和切片的 VBI 采集和输出支持

  • 无线电接收器和发射器支持,包括 RDS 支持

  • 软件定义无线电 (SDR) 支持

  • 采集和输出覆盖支持

  • 元数据采集和输出支持

  • 触摸采集支持

这些功能将在下面更详细地描述。

7.25.1. 配置驱动程序

默认情况下,驱动程序将创建一个具有网络摄像头、电视、S-Video 和 HDMI 输入的视频采集设备、具有 S-Video 和 HDMI 输出的视频输出设备、一个 vbi 采集设备、一个 vbi 输出设备、一个无线电接收器设备、一个无线电发射器设备和一个 SDR 设备的单个实例。

可以使用以下模块选项配置实例、设备、视频输入和输出的数量及其类型

  • n_devs

    要创建的驱动程序实例数。默认为 1。最多可以创建 64 个实例。

  • node_types

    每个驱动程序实例应创建哪些设备。每个实例一个十六进制值的数组。默认值为 0xe1d3d。每个值都是一个位掩码,具有以下含义

    • 位 0:视频采集节点

    • 位 2-3:VBI 采集节点:0 = 无,1 = 原始 vbi,2 = 切片 vbi,3 = 两者

    • 位 4:无线电接收器节点

    • 位 5:软件定义无线电接收器节点

    • 位 8:视频输出节点

    • 位 10-11:VBI 输出节点:0 = 无,1 = 原始 vbi,2 = 切片 vbi,3 = 两者

    • 位 12:无线电发射器节点

    • 位 16:用于测试覆盖的帧缓冲

    • 位 17:元数据采集节点

    • 位 18:元数据输出节点

    • 位 19:触摸采集节点

    因此,要创建四个实例,前两个只有一个视频采集设备,后两个只有一个视频输出设备,您可以将这些模块选项传递给 vivid

    n_devs=4 node_types=0x1,0x1,0x100,0x100
    
  • num_inputs

    输入的数量,每个实例一个。默认情况下,为每个视频采集设备创建 4 个输入。最多可以创建 16 个输入,并且必须至少有一个。

  • input_types

    每个实例的输入类型,默认值为 0xe4。这定义了为每个驱动程序实例创建输入时每个输入的类型。这是一个十六进制值,最多有 16 对位,每对位给出类型,位 0-1 映射到输入 0,位 2-3 映射到输入 1,30-31 映射到输入 15。每对位具有以下含义

    • 00:这是一个网络摄像头输入

    • 01:这是一个电视调谐器输入

    • 10:这是一个 S-Video 输入

    • 11:这是一个 HDMI 输入

    因此,要创建一个具有 8 个输入的视频采集设备,其中输入 0 是电视调谐器,输入 1-3 是 S-Video 输入,输入 4-7 是 HDMI 输入,您可以使用以下模块选项

    num_inputs=8 input_types=0xffa9
    
  • num_outputs

    输出的数量,每个实例一个。默认情况下,为每个视频输出设备创建 2 个输出。最多可以创建 16 个输出,并且必须至少有一个。

  • output_types

    每个实例的输出类型,默认值为 0x02。这定义了为每个驱动程序实例创建输出时每个输出的类型。这是一个十六进制值,最多有 16 位,每位给出类型,位 0 映射到输出 0,位 1 映射到输出 1,位 15 映射到输出 15。每位的含义如下

    • 0:这是一个 S-Video 输出

    • 1:这是一个 HDMI 输出

    因此,要创建一个具有 8 个输出的视频输出设备,其中输出 0-3 是 S-Video 输出,输出 4-7 是 HDMI 输出,您可以使用以下模块选项

    num_outputs=8 output_types=0xf0
    
  • vid_cap_nr

    为每个视频采集设备提供所需的 videoX 起始编号。默认值为 -1,它只会取第一个空闲编号。这允许您将采集视频节点映射到特定的 videoX 设备节点。示例

    n_devs=4 vid_cap_nr=2,4,6,8
    

    这将尝试为第一个 vivid 实例的视频采集设备分配 /dev/video2,为下一个分配 video4,直到最后一个实例分配 video8。如果无法成功,则只会取下一个空闲编号。

  • vid_out_nr

    为每个视频输出设备提供所需的 videoX 起始编号。默认值为 -1,它只会取第一个空闲编号。

  • vbi_cap_nr

    为每个 vbi 采集设备提供所需的 vbiX 起始编号。默认值为 -1,它只会取第一个空闲编号。

  • vbi_out_nr

    为每个 vbi 输出设备提供所需的 vbiX 起始编号。默认值为 -1,它只会取第一个空闲编号。

  • radio_rx_nr

    为每个无线电接收器设备提供所需的 radioX 起始编号。默认值为 -1,它只会取第一个空闲编号。

  • radio_tx_nr

    为每个无线电发射器设备提供所需的 radioX 起始编号。默认值为 -1,它只会取第一个空闲编号。

  • sdr_cap_nr

    为每个 SDR 采集设备指定所需的 swradioX 起始编号。默认值为 -1,表示仅使用第一个空闲编号。

  • meta_cap_nr

    为每个元数据采集设备指定所需的 videoX 起始编号。默认值为 -1,表示仅使用第一个空闲编号。

  • meta_out_nr

    为每个元数据输出设备指定所需的 videoX 起始编号。默认值为 -1,表示仅使用第一个空闲编号。

  • touch_cap_nr

    为每个触摸采集设备指定所需的 v4l-touchX 起始编号。默认值为 -1,表示仅使用第一个空闲编号。

  • ccs_cap_mode

    为每个驱动实例指定允许的视频捕获裁剪/合成/缩放组合。视频捕获设备可以具有裁剪、合成和缩放功能的任意组合,这将告诉 vivid 驱动程序应该模拟哪些功能。默认情况下,用户可以通过控件选择此项。

    该值可以是 -1(由用户控制)或一组三位,每一位启用 (1) 或禁用 (0) 一项功能

    • 第 0 位

      启用裁剪支持。裁剪将仅使用传入图片的一部分。

    • 第 1 位

      启用合成支持。合成会将传入图片复制到更大的缓冲区中。

    • 第 2 位

      启用缩放支持。缩放可以缩放传入图片。vivid 驱动程序的缩放器可以将原始大小放大或缩小四倍。缩放器非常简单且低质量。关键在于简单和速度,而非质量。

    请注意,网络摄像头输入会忽略此值:它们会枚举离散的帧大小,这与裁剪、合成或缩放不兼容。

  • ccs_out_mode

    为每个驱动实例指定允许的视频输出裁剪/合成/缩放组合。视频输出设备可以具有裁剪、合成和缩放功能的任意组合,这将告诉 vivid 驱动程序应该模拟哪些功能。默认情况下,用户可以通过控件选择此项。

    该值可以是 -1(由用户控制)或一组三位,每一位启用 (1) 或禁用 (0) 一项功能

    • 第 0 位

      启用裁剪支持。裁剪将仅使用传出缓冲区的一部分。

    • 第 1 位

      启用合成支持。合成会将传入缓冲区复制到更大的图片帧中。

    • 第 2 位

      启用缩放支持。缩放可以缩放传入缓冲区。vivid 驱动程序的缩放器可以将原始大小放大或缩小四倍。缩放器非常简单且低质量。关键在于简单和速度,而非质量。

  • multiplanar

    选择每个设备实例是否支持多平面格式,以及 V4L2 多平面 API。默认情况下,设备实例是单平面的。

    此模块选项可以为每个实例覆盖此默认设置。值如下:

    • 1:这是一个单平面实例。

    • 2:这是一个多平面实例。

  • vivid_debug

    启用驱动程序调试信息

  • no_error_inj

    如果设置此选项,则禁用错误注入控件。为了运行像 v4l2-compliance 这样的工具,需要此选项。像这样的工具会运行所有控件,包括像 “断开连接” 这样的控件,该控件会模拟 USB 断开连接,使设备无法访问,因此 v4l2-compliance 执行的所有测试都会失败。

    在其他情况下,您也可能需要禁用 vivid 的错误注入支持。设置此选项后,用于选择裁剪、合成和缩放行为的控件也会被删除。除非被 ccs_cap_mode 和/或 ccs_out_mode 覆盖,否则默认启用裁剪、合成和缩放。

  • allocators

    内存分配器选择,默认为 0。它指定分配缓冲区的方式。

    • 0:vmalloc

    • 1:dma-contig

  • cache_hints

    指定设备是否应设置队列的用户空间缓存和内存一致性提示功能 (V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS)。仅当使用 MMAP 流式 I/O 时,提示才有效。默认为 0。

    • 0:禁止提示

    • 1:允许提示

  • supports_requests

    指定设备是否应支持请求 API。有三种可能的值,默认为 1

    • 0:无请求

    • 1:支持请求

    • 2:需要请求

总而言之,所有这些模块选项允许您精确自定义驱动程序的行为,并通过各种排列组合测试您的应用程序。它也非常适合模拟尚未可用的硬件,例如,在为新的即将推出的设备开发软件时。

7.25.2. 视频捕获

这可能是最常用的功能。可以通过使用模块选项 num_inputs、input_types 和 ccs_cap_mode(有关详细信息,请参阅“配置驱动程序”)来配置视频捕获设备,但默认情况下会配置四个输入:一个网络摄像头、一个电视调谐器、一个 S-Video 和一个 HDMI 输入,每个输入类型一个。下面将更详细地描述这些输入。

特别注意了新帧可用的速率。抖动将在大约 1 个节拍(这取决于您的内核的 HZ 配置,通常为 1/100、1/250 或 1/1000 秒)左右,但长期行为完全遵循帧率。因此,59.94 Hz 的帧率与 60 Hz 的帧率真正不同。如果帧率超过内核的 HZ 值,则会丢帧,但帧/场序列计数将跟踪这一点,因此每当丢帧时,序列计数都会跳过。

7.25.2.1. 网络摄像头输入

网络摄像头输入支持三种帧大小:320x180、640x360 和 1280x720。它支持每秒 10、15、25、30、50 和 60 帧的设置。哪些可用取决于选择的帧大小:帧大小越大,每秒最大帧数越低。

当您切换到网络摄像头输入时,最初选择的色彩空间将为 sRGB。

7.25.2.2. 电视和 S-Video 输入

电视和 S-Video 输入之间的唯一区别是电视具有调谐器。否则它们的行为相同。

这些输入也支持音频输入:一个电视和一个线路输入。它们都支持所有电视标准。如果查询标准,则 Vivid 控件“标准信号模式”和“标准”将确定结果是什么。

这些输入支持字段设置的所有组合。已特别注意忠实地再现不同电视标准的场处理方式。当生成水平移动图像时,这一点尤其明显,因此使用隔行扫描格式的时间效果变得清晰可见。对于 50 Hz 标准,顶部场是最旧的,底部场是时间上最新的。对于 60 Hz 标准,则相反:底部场是最旧的,顶部场是时间上最新的。

当您在 V4L2_FIELD_ALTERNATE 模式下开始捕获时,第一个缓冲区将包含 50 Hz 标准的顶部场和 60 Hz 标准的底部场。这也是捕获硬件的工作方式。

最后,对于 PAL/SECAM 标准,顶线的前一半包含噪声。这模拟通常放置在那里的宽屏信号。

当您切换到电视或 S-Video 输入时,最初选择的色彩空间将为 SMPTE-170M。

像素宽高比将取决于电视标准。可以通过“标准宽高比”Vivid 控件选择视频宽高比。选项为“4x3”、“16x9”(这将提供信箱式宽屏视频)和“16x9 变形”(这将提供全屏压缩的变形宽屏视频,需要相应地缩放)。

电视“调谐器”支持 44-958 MHz 的频率范围。频道每 6 MHz 提供一次,从 49.25 MHz 开始。对于每个频道,生成的图像在周围 +/- 0.25 MHz 的范围内是彩色的,在频道周围 +/- 1 MHz 的范围内是灰度的。除此之外,就只有噪声了。VIDIOC_G_TUNER ioctl 将返回 +/- 0.25 MHz 为 100% 的信号强度,+/- 1 MHz 为 50% 的信号强度。它还将返回正确的 afc 值,以显示频率是太低还是太高。

返回的音频子通道在有效频道频率周围 +/- 1 MHz 的范围内为 MONO。当频率在频道的 +/- 0.25 MHz 范围内时,它将返回 MONO、STEREO、MONO | SAP(对于 NTSC)或 LANG1 | LANG2(对于其他),或者 STEREO | SAP。

返回哪个取决于选择的频道,每个下一个有效频道都会循环浏览可能的音频子通道组合。这使您可以通过仅切换频道来测试各种组合。

最后,对于这些输入,v4l2_timecode 结构将填充到出队的 v4l2_buffer 结构中。

7.25.2.3. HDMI 输入

HDMI 输入支持所有 CEA-861 和 DMT 时序,包括逐行扫描和隔行扫描,像素时钟频率在 25 到 600 MHz 之间。隔行扫描格式的场模式始终为 V4L2_FIELD_ALTERNATE。对于 HDMI,场顺序始终是顶部场优先,并且当您开始捕获隔行扫描格式时,您将首先接收到顶部场。

当您切换到 HDMI 输入或选择 HDMI 时序时,最初选择的色彩空间基于格式分辨率:对于小于或等于 720x576 的分辨率,色彩空间设置为 SMPTE-170M,对于其他分辨率,则设置为 REC-709(CEA-861 时序)或 sRGB(VESA DMT 时序)。

像素宽高比将取决于 HDMI 时序:对于 720x480,它设置为 NTSC 电视标准,对于 720x576,它设置为 PAL 电视标准,对于所有其他时序,则返回 1:1 的像素宽高比。

可以通过“DV 时序宽高比”Vivid 控件选择视频宽高比。选项为“源宽度 x 高度”(仅使用与所选格式相同的比率)、“4x3”或“16x9”,这两个选项都可能导致柱状或信箱式视频。

对于 HDMI 输入,可以设置 EDID。默认情况下,提供了一个简单的 EDID。您只能为 HDMI 输入设置 EDID。但是,在内部,所有 HDMI 输入之间共享 EDID。

除了物理地址之外,没有对 EDID 数据进行解释。有关更多详细信息,请参阅 CEC 部分。

最多有 15 个 HDMI 输入(如果有更多,则会减少到 15 个),因为这是 EDID 物理地址的限制。

7.25.3. 视频输出

可以通过使用模块选项 num_outputs、output_types 和 ccs_out_mode(有关详细信息,请参阅“配置驱动程序”)来配置视频输出设备,但默认情况下会配置两个输出:一个 S-Video 和一个 HDMI 输入,每个输出类型一个。下面将更详细地描述这些输出。

与视频捕获一样,帧率在长期来看也是精确的。

7.25.3.1. S-Video 输出

此输出也支持音频输出:“线路输出 1”和“线路输出 2”。S-Video 输出支持所有电视标准。

此输出支持字段设置的所有组合。

当您切换到电视或 S-Video 输入时,最初选择的色彩空间将为 SMPTE-170M。

7.25.3.2. HDMI 输出

HDMI 输出支持所有 CEA-861 和 DMT 时序,包括逐行扫描和隔行扫描,像素时钟频率在 25 到 600 MHz 之间。隔行扫描格式的场模式始终为 V4L2_FIELD_ALTERNATE。

当您切换到 HDMI 输出或选择 HDMI 时序时,初始选择的色彩空间基于格式分辨率:对于小于或等于 720x576 的分辨率,色彩空间设置为 SMPTE-170M;对于其他分辨率,色彩空间设置为 REC-709 (CEA-861 时序) 或 sRGB (VESA DMT 时序)。

像素宽高比将取决于 HDMI 时序:对于 720x480,它设置为 NTSC 电视标准,对于 720x576,它设置为 PAL 电视标准,对于所有其他时序,则返回 1:1 的像素宽高比。

HDMI 输出具有有效的 EDID,可以通过 VIDIOC_G_EDID 获取。

由于 EDID 物理地址的限制,最多有 15 个 HDMI 输出(如果超过 15 个,则会减少到 15 个)。有关更多详细信息,请参阅 CEC 部分。

7.25.4. VBI 捕获

VBI 捕获设备有三种类型:仅支持原始(未解码)VBI 的设备、仅支持切片(解码)VBI 的设备以及两者都支持的设备。这由 node_types 模块选项确定。在所有情况下,驱动程序都会生成有效的 VBI 数据:对于 60 Hz 标准,它会生成隐藏字幕和 XDS 数据。隐藏字幕流将每秒在 “Hello world!” 和 “Closed captions test” 之间交替。XDS 流将每分钟提供当前时间。对于 50 Hz 标准,它将生成基于实际视频宽高比控制设置的宽屏信号和图文电视页面 100-159,每帧一页。

VBI 设备仅适用于 S-Video 和 TV 输入,如果当前输入是网络摄像头或 HDMI,它将返回错误。

7.25.5. VBI 输出

VBI 输出设备有三种类型:仅支持原始(未解码)VBI 的设备、仅支持切片(解码)VBI 的设备以及两者都支持的设备。这由 node_types 模块选项确定。

切片 VBI 输出支持 50 Hz 标准的宽屏信号和图文电视信号,以及 60 Hz 标准的隐藏字幕 + XDS。

VBI 设备仅适用于 S-Video 输出,如果当前输出是 HDMI,它将返回错误。

7.25.6. 无线电接收器

无线电接收器模拟 FM/AM/SW 接收器。FM 波段也支持 RDS。频率范围是

  • FM:64 MHz - 108 MHz

  • AM:520 kHz - 1710 kHz

  • SW:2300 kHz - 26.1 MHz

对于 FM,每 1 MHz 模拟一个有效频道,对于 AM 和 SW,每 100 kHz 模拟一个有效频道。信号强度随着频率与有效频率的距离增加而降低,直到在距离理想频率 +/- 50 kHz(FM)或 5 kHz (AM/SW) 时变为 0%。驱动程序加载时的初始频率设置为 95 MHz。

FM 接收器也支持 RDS,使用 ‘Block I/O’ 和 ‘Controls’ 模式。在 ‘Controls’ 模式下,RDS 信息存储在只读控件中。这些控件会在每次频率更改时或请求调谐器状态时更新。Block I/O 方法使用 read() 接口将 RDS 块传递给应用程序进行解码。

在频道频率周围 +/- 12.5 kHz 的范围内会 ‘检测到’ RDS 信号,并且频率距离有效频率越远,随机引入到块 I/O 流中的 RDS 错误就越多,如果您距离频道频率 +/- 12.5 kHz,则最多会出现所有块的 50%。所有四种错误都会以相等的比例发生:标记为 ‘CORRECTED’ 的块、标记为 ‘ERROR’ 的块、标记为 ‘INVALID’ 的块以及丢弃的块。

生成的 RDS 流包含 0B 组中包含的所有标准字段,以及无线电文本和当前时间。

接收器支持 HW 频率搜索,可以是绑定模式、循环模式或两者兼有,这可以通过 “Radio HW Seek Mode” 控件进行配置。

7.25.7. 无线电发射器

无线电发射器模拟 FM/AM/SW 发射器。FM 波段也支持 RDS。频率范围是

  • FM:64 MHz - 108 MHz

  • AM:520 kHz - 1710 kHz

  • SW:2300 kHz - 26.1 MHz

驱动程序加载时的初始频率为 95.5 MHz。

FM 发射器也支持 RDS,使用 ‘Block I/O’ 和 ‘Controls’ 模式。在 ‘Controls’ 模式下,使用控件配置传输的 RDS 信息,在 ‘Block I/O’ 模式下,使用 write() 将块传递给驱动程序。

7.25.8. 软件定义无线电接收器

SDR 接收器具有 ADC 调谐器的三个频段

  • 300 kHz

  • 900 kHz - 2800 kHz

  • 3200 kHz

RF 调谐器支持 50 MHz - 2000 MHz。

生成的数据包含幅度为 sqrt(2) 的 1 kHz 音调的同相和正交分量。

7.25.9. 元数据捕获

元数据捕获生成 UVC 格式的元数据。PTS 和 SCR 基于在 vivid 控件中设置的值进行传输。

元数据设备仅适用于网络摄像头输入,对于所有其他输入,它将返回错误。

7.25.10. 元数据输出

元数据输出可用于设置亮度、对比度、饱和度和色调。

元数据设备仅适用于网络摄像头输出,对于所有其他输出,它将返回错误。

7.25.11. 触摸捕获

触摸捕获生成触摸模式,模拟单点触控、双点触控、三点触控、从左向右移动、放大、缩小、手掌按压(模拟触摸板上按压的大面积区域)以及模拟 16 个同时的触摸点。

7.25.12. 控件

不同的设备支持不同的控件。以下各节将介绍每个控件以及哪些设备支持它们。

7.25.12.1. 用户控件 - 测试控件

按钮、布尔值、32 位整数、64 位整数、菜单、字符串、位掩码和整数菜单是表示所有可能控件类型的控件。菜单控件和整数菜单控件的菜单列表中都有 ‘孔’,这意味着当调用 VIDIOC_QUERYMENU 时,一个或多个菜单项会返回 EINVAL。这两个菜单控件也都有非零的最小控件值。这些功能允许您检查您的应用程序是否可以正确处理此类情况。每种设备类型都支持这些控件。

7.25.12.2. 用户控件 - 视频捕获

以下控件特定于视频捕获。

亮度、对比度、饱和度和色调控件实际上是有效的并且是标准的。亮度控件有一个特殊功能:每个视频输入都有自己的亮度值,因此更改输入将恢复该输入的亮度。此外,每个视频输入都使用不同的亮度范围(最小和最大控件值)。切换输入会导致发送一个设置了 V4L2_EVENT_CTRL_CH_RANGE 标志的控件事件。这允许您测试可以更改其范围的控件。

“增益,自动” 和增益控件可用于测试易失性控件:如果设置了 “增益,自动”,则增益控件是易失性的并且会不断变化。如果清除了 “增益,自动”,则增益控件是一个普通控件。

“水平翻转” 和 “垂直翻转” 控件可用于翻转图像。这些控件与 “传感器水平/垂直翻转” Vivid 控件结合使用。

“Alpha 分量” 控件可用于设置包含 alpha 通道的格式的 alpha 分量。

7.25.12.3. 用户控件 - 音频

以下控件特定于视频捕获和输出以及无线电接收器和发射器。

“音量” 和 “静音” 音频控件是此类设备用于控制音量和使音频静音的典型控件。它们在 vivid 驱动程序中实际上不做任何事情。

7.25.12.4. Vivid 控件

这些 vivid 自定义控件控制图像生成、错误注入等。

7.25.12.4.1. 测试模式控件

测试模式控件都特定于视频捕获。

  • 测试模式

    选择要使用的测试模式。使用 CSC 彩条进行色彩空间转换测试:该测试模式中使用的颜色映射到所有色彩空间中的有效颜色。对于其他测试模式,禁用色彩空间转换。

  • OSD 文本模式

    选择是否应显示叠加在测试模式上的文本,如果显示,是否只应显示计数器或完整文本。

  • 水平移动

    选择测试模式是否应向左或向右移动以及移动速度。

  • 垂直移动

    对垂直方向执行相同操作。

  • 显示边框

    在实际图像的边缘显示一个两像素宽的边框,不包括信箱或柱状信箱。

  • 显示正方形

    在图像中间显示一个正方形。如果以正确的像素和图像宽高比校正显示图像,则监视器上正方形的宽度和高度应相同。

  • 在图像中插入 SAV 代码

    向图像添加 SAV(活动视频开始)代码。这可用于检查图像中的此类代码是否会被意外解释而不是被忽略。

  • 在图像中插入 EAV 代码

    对 EAV(活动视频结束)代码执行相同操作。

  • 插入视频保护带

    在图像的左侧添加 4 列带有 HDMI 视频保护带代码的像素。此功能仅适用于 3 或 4 字节 RGB 像素格式。RGB 像素值 0xab/0x55/0xab 实际上等同于每个活动视频行之前的 HDMI 视频保护带代码(请参阅 HDMI 1.3 规范中的 5.2.2.1 节)。要测试视频接收器是否具有正确的 HDMI 视频保护带处理功能,请启用此控制项,然后将图像移动到屏幕的左侧。这将导致视频行以与它们之前的视频保护带具有相同值的多个像素开始。如果接收器只是一直跳过视频保护带值,那么现在将会失效,要么失去同步,要么这些视频行会发生偏移。

7.25.12.4.2. 采集功能选择控制

这些控制项都是视频采集特有的。

  • 传感器水平翻转

    图像水平翻转,并设置 V4L2_IN_ST_HFLIP 输入状态标志。这模拟了例如传感器倒置安装的情况。

  • 传感器垂直翻转

    图像垂直翻转,并设置 V4L2_IN_ST_VFLIP 输入状态标志。这模拟了例如传感器倒置安装的情况。

  • 标准宽高比

    选择用于电视或 S-Video 输入的图像宽高比应为 4x3、16x9 还是变形宽屏。这可能会引入信箱模式。

  • DV 时序宽高比

    选择用于 HDMI 输入的图像宽高比应与源宽度和高度比相同,还是应为 4x3 或 16x9。这可能会引入信箱模式或柱状模式。

  • 时间戳源

    选择何时获取每个缓冲区的时间戳。

  • 色彩空间

    选择生成图像时应使用的色彩空间。这仅在选择 CSC 色彩条测试图案时适用,否则测试图案将保持未转换。这也是您想要的行为,因为 75% 色彩条实际上应该具有 75% 的信号强度,并且不应受色彩空间转换的影响。

    更改色彩空间将导致发送 V4L2_EVENT_SOURCE_CHANGE,因为它模拟了检测到的色彩空间更改。

  • 传递函数

    选择生成图像时应使用的色彩空间传递函数。这仅在选择 CSC 色彩条测试图案时适用,否则测试图案将保持未转换。这也是您想要的行为,因为 75% 色彩条实际上应该具有 75% 的信号强度,并且不应受色彩空间转换的影响。

    更改传递函数将导致发送 V4L2_EVENT_SOURCE_CHANGE,因为它模拟了检测到的色彩空间更改。

  • Y’CbCr 编码

    选择在生成 Y’CbCr 图像时应使用的 Y’CbCr 编码。这仅在格式设置为 Y’CbCr 格式而不是 RGB 格式时适用。

    更改 Y’CbCr 编码将导致发送 V4L2_EVENT_SOURCE_CHANGE,因为它模拟了检测到的色彩空间更改。

  • 量化

    选择在生成测试图案时应使用的 RGB 或 Y’CbCr 编码的量化。

    更改量化将导致发送 V4L2_EVENT_SOURCE_CHANGE,因为它模拟了检测到的色彩空间更改。

  • 有限 RGB 范围 (16-235)

    选择 HDMI 源的 RGB 范围应为有限还是全范围。这与“数字视频‘Rx RGB 量化范围’”控制项相结合,可用于测试当源提供错误的量化范围信息时会发生什么情况。有关更多详细信息,请参阅该控制项的描述。

  • 仅对红色应用 Alpha

    将“Alpha 分量”用户控制项设置的 Alpha 通道仅应用于测试图案的红色。

  • 启用采集裁剪

    启用裁剪支持。只有在 ccs_cap_mode 模块选项设置为默认值 -1 且 no_error_inj 模块选项设置为 0(默认值)时,此控制项才存在。

  • 启用采集合成

    启用合成支持。只有在 ccs_cap_mode 模块选项设置为默认值 -1 且 no_error_inj 模块选项设置为 0(默认值)时,此控制项才存在。

  • 启用采集缩放器

    启用对缩放器的支持(最大 4 倍放大和缩小)。只有在 ccs_cap_mode 模块选项设置为默认值 -1 且 no_error_inj 模块选项设置为 0(默认值)时,此控制项才存在。

  • 最大 EDID 块数

    确定驱动程序支持的 EDID 块数。请注意,vivid 驱动程序实际上并不解释新的 EDID 数据,它只是存储它。它允许最多 256 个 EDID 块,这是标准支持的最大值。

  • 帧的填充百分比

    可用于仅绘制图像的顶部 X 个百分比。由于每个帧都必须由驱动程序绘制,这需要大量的 CPU。对于大型分辨率,这会变得有问题。通过仅绘制部分图像,可以减少此 CPU 负载。

7.25.12.4.3. 输出功能选择控制

这些控制项都是视频输出特有的。

  • 启用输出裁剪

    启用裁剪支持。只有在 ccs_out_mode 模块选项设置为默认值 -1 且 no_error_inj 模块选项设置为 0(默认值)时,此控制项才存在。

  • 启用输出合成

    启用合成支持。只有在 ccs_out_mode 模块选项设置为默认值 -1 且 no_error_inj 模块选项设置为 0(默认值)时,此控制项才存在。

  • 启用输出缩放器

    启用对缩放器的支持(最大 4 倍放大和缩小)。只有在 ccs_out_mode 模块选项设置为默认值 -1 且 no_error_inj 模块选项设置为 0(默认值)时,此控制项才存在。

7.25.12.4.4. 错误注入控制

以下两个控制项仅对视频和 VBI 采集有效。

  • 标准信号模式

    选择 VIDIOC_QUERYSTD 的行为:它应该返回什么?

    更改此控制项将导致发送 V4L2_EVENT_SOURCE_CHANGE,因为它模拟了更改的输入条件(例如,插入或拔出电缆)。

  • 标准

    如果前一个控制项设置为“选定标准”,则选择 VIDIOC_QUERYSTD 应返回的标准。

    更改此控制项将导致发送 V4L2_EVENT_SOURCE_CHANGE,因为它模拟了更改的输入标准。

以下两个控制项仅对视频采集有效。

  • DV 时序信号模式

    选择 VIDIOC_QUERY_DV_TIMINGS 的行为:它应该返回什么?

    更改此控制项将导致发送 V4L2_EVENT_SOURCE_CHANGE,因为它模拟了更改的输入条件(例如,插入或拔出电缆)。

  • DV 时序

    如果前一个控制项设置为“选定 DV 时序”,则选择 VIDIOC_QUERY_DV_TIMINGS 应返回的时序。

    更改此控制项将导致发送 V4L2_EVENT_SOURCE_CHANGE,因为它模拟了更改的输入时序。

以下控制项仅在 no_error_inj 模块选项设置为 0(默认值)时存在。这些控制项对视频和 VBI 采集以及输出流以及 SDR 采集设备有效,除了断开连接控制项,该控制项对所有设备有效。

  • 包装序列号

    测试当您在 struct v4l2_buffer 中包装序列号时会发生什么情况。

  • 包装时间戳

    测试当您在 struct v4l2_buffer 中包装时间戳时会发生什么情况。

  • 丢弃的缓冲区百分比

    设置驱动程序永远不会返回的缓冲区(即,它们被丢弃)的百分比。

  • 断开连接

    模拟 USB 断开连接。设备将表现得好像已断开连接。只有在关闭设备节点的所有打开的文件句柄后,设备才会再次“连接”。

  • 注入 V4L2_BUF_FLAG_ERROR

    按下后,驱动程序返回的下一个帧将设置错误标志(即,该帧被标记为损坏)。

  • 注入 VIDIOC_REQBUFS 错误

    按下后,下一个 REQBUFS 或 CREATE_BUFS ioctl 调用将失败并出现错误。准确地说:videobuf2 queue_setup() 操作将返回 -EINVAL。

  • 注入 VIDIOC_QBUF 错误

    按下后,下一个 VIDIOC_QBUF 或 VIDIOC_PREPARE_BUFFER ioctl 调用将失败并出现错误。准确地说:videobuf2 buf_prepare() 操作将返回 -EINVAL。

  • 注入 VIDIOC_STREAMON 错误

    按下后,下一个 VIDIOC_STREAMON ioctl 调用将失败并出现错误。准确地说:videobuf2 start_streaming() 操作将返回 -EINVAL。

  • 注入致命流错误

    按下后,流核心将被标记为发生了致命错误,恢复的唯一方法是停止流传输。准确地说:将调用 videobuf2 vb2_queue_error() 函数。

7.25.12.4.5. VBI 原始采集控制

  • 隔行扫描 VBI 格式

    如果设置,则原始 VBI 数据将隔行扫描,而不是按场分组提供。

7.25.12.5. 数字视频控制

  • Rx RGB 量化范围

    设置 HDMI 输入的 RGB 量化检测。这与 Vivid 的“有限 RGB 范围 (16-235)”控制项相结合,可用于测试当源提供错误的量化范围信息时会发生什么情况。可以通过选择 HDMI 输入,将此控制项设置为“全范围”或“有限范围”,并在“有限 RGB 范围 (16-235)”控制项中选择相反的范围来测试。如果选择了“灰阶斜坡”测试图案,则效果很容易看到。

  • Tx RGB 量化范围

    设置 HDMI 输出的 RGB 量化检测。目前在 vivid 中没有任何用途,但大多数 HDMI 发射器通常都会有此控制。

  • 传输模式

    设置 HDMI 输出的传输模式为 HDMI 或 DVI-D。这会影响报告的色彩空间,因为 DVI_D 输出将始终使用 sRGB。

7.25.12.6. FM 收音机接收器控制

  • RDS 接收

    设置是否应启用 RDS 接收器。

  • RDS 节目类型

  • RDS PS 名称

  • RDS 无线电文本

  • RDS 交通公告

  • RDS 交通节目

  • RDS 音乐

    这些都是只读控件。如果 RDS Rx I/O 模式设置为“块 I/O”,则它们也会处于非活动状态。如果 RDS Rx I/O 模式设置为“控件”,则这些控件会报告接收到的 RDS 数据。

注意

vivid 的此实现非常基本:它们仅在您设置新频率或获取调谐器状态 (VIDIOC_G_TUNER) 时更新。

  • 无线电硬件搜索模式

    可以是“有界”、“环绕”或“两者之一”。这确定 VIDIOC_S_HW_FREQ_SEEK 是否受频率范围限制、环绕,或者是否可由用户选择。

  • 无线电可编程硬件搜索

    如果设置,则用户可以提供硬件搜索的下限和上限。否则,将使用频率范围边界。

  • 生成 RBDS 而不是 RDS

    如果设置,则生成 RBDS(美国版本的 RDS)数据而不是 RDS(欧洲风格的 RDS)。这仅影响 PICODE 和 PTY 代码。

  • RDS Rx I/O 模式

    可以是“块 I/O”,其中 RDS 块必须由应用程序 read() 读取,也可以是“控件”,其中 RDS 数据由上述 RDS 控件提供。

7.25.12.7. FM 无线电调制器控制

  • RDS 节目 ID

  • RDS 节目类型

  • RDS PS 名称

  • RDS 无线电文本

  • RDS 立体声

  • RDS 人工头部

  • RDS 压缩

  • RDS 动态 PTY

  • RDS 交通公告

  • RDS 交通节目

  • RDS 音乐

    这些都是设置 FM 调制器传输的 RDS 数据的控件。

  • RDS Tx I/O 模式

    可以是“块 I/O”,其中应用程序必须使用 write() 将 RDS 块传递给驱动程序,也可以是“控件”,其中 RDS 数据由上述 RDS 控件提供。

7.25.12.8. 元数据捕获控制

  • 生成 PTS

    如果设置,则生成的元数据流包含呈现时间戳。

  • 生成 SCR

    如果设置,则生成的元数据流包含源时钟信息。

7.25.13. 视频、切片 VBI 和 HDMI CEC 环回

对于由同一 vivid 驱动程序实例创建的设备以及跨 vivid 驱动程序的多个实例,都支持视频环回功能。 vivid 驱动程序支持 S-Video 输出和 S-Video 输入之间的视频和切片 VBI 数据环回。它还支持 HDMI 输出和 HDMI 输入之间的视频和 HDMI CEC 数据环回。

要启用环回,请设置“HDMI/S-Video XXX-N 连接到”控件,以选择输入是使用测试模式生成器、断开连接还是连接到输出。输入可以连接到来自任何 vivid 实例的输出。输入和输出编号为 XXX-N,其中 XXX 是 vivid 实例编号(请参阅模块选项 n_devs)。如果只有一个 vivid 实例(默认),则 XXX 将为 000。N 是该实例的第 N 个 S-Video/HDMI 输入或输出。如果在没有模块选项的情况下加载 vivid,则可以将 S-Video 000-0 输入连接到 S-Video 000-0 输出,或将 HDMI 000-0 输入连接到 HDMI 000-0 输出。这相当于在物理设备中的输入和输出之间连接或断开电缆。

如果“HDMI/S-Video XXX-N 连接到”控件选择了输出,则视频输出将环回到视频输入,前提是

  • 当前选择的输入与控件名称指示的输入匹配。

  • 在输出连接器的 vivid 实例中,当前选择的输出与控件的值指示的输出匹配。

  • 视频输入的视频分辨率必须与视频输出的分辨率匹配。因此,不可能将 50 Hz (720x576) S-Video 输出环回到 60 Hz (720x480) S-Video 输入,或将 720p60 HDMI 输出环回到 1080p30 输入。

  • 两侧的像素格式必须相同。否则,驱动程序还必须进行像素格式转换,这有点太过了。

  • 两侧的场设置必须相同。原因与上述相同:要求驱动程序从一个场格式转换为另一个场格式会使事情变得过于复杂。这也禁止在输出视频设置为“场交替”时使用“场顶部”或“场底部”进行捕获。虽然这种组合是合法的,但支持它变得过于复杂。双方都必须为“场交替”才能使其工作。另请注意,对于此特定情况,捕获侧 struct v4l2_buffer 中的序列和场计数可能不是 100% 准确的。

  • 不支持场设置 V4L2_FIELD_SEQ_TB/BT。虽然可以实现此功能,但这意味着要正确实现此功能需要做很多工作。由于这些场值很少使用,因此决定暂时不实现此功能。

  • 在输入侧,应配置 S-Video 输入的“标准信号模式”或 HDMI 输入的“DV 定时信号模式”,以便将有效信号传递到视频输入。

如果任何条件无效,则会显示“噪声”测试模式。

帧速率不必匹配,尽管将来可能会更改。

默认情况下,您将看到叠加在环回视频顶部的 OSD 文本。可以通过更改视频捕获设备的“OSD 文本模式”控件来关闭此功能。

为了使 VBI 环回工作,上述所有内容都必须有效,此外,VBI 输出必须配置为切片 VBI。VBI 捕获侧可以配置为原始或切片 VBI。请注意,目前只环回 CC/XDS(60 Hz 格式)和 WSS(50 Hz 格式)VBI 数据。不环回图文电视 VBI 数据。

7.25.14. 无线电和 RDS 环回

vivid 驱动程序支持将 RDS 输出环回到 RDS 输入。

由于无线电是无线的,因此如果无线电接收器的频率接近无线电发射器的频率,则总是会发生此环回。在这种情况下,无线电发射器将“覆盖”模拟的无线电台。

目前仅在由同一 vivid 驱动程序实例创建的设备之间支持 RDS 环回。

如“无线电接收器”部分所述,无线电接收器会以规则的频率间隔模拟电台。根据无线电接收器的频率,计算信号强度值(这由 VIDIOC_G_TUNER 返回)。但是,它也会查看无线电发射器设置的频率,如果该频率产生的信号强度高于无线电发射器的设置,则会像有效电台一样使用该频率。这也包括发射器“传输”的 RDS 数据(如果有)。这将在接收器侧忠实地接收。请注意,当加载驱动程序时,无线电接收器和发射器的频率并不相同,因此最初不会发生环回。

7.25.15. 裁剪、合成、缩放

该驱动程序支持以任何组合方式进行裁剪、合成和缩放。通常,可以通过 Vivid 控件选择支持哪些功能,但也可以在通过 ccs_cap_mode 和 ccs_out_mode 模块选项加载模块时对其进行硬编码。有关这些模块选项的详细信息,请参见“配置驱动程序”。

这使您可以测试应用程序的所有这些变体。

请注意,网络摄像头输入永远不支持裁剪、合成或缩放。这仅适用于 TV/S-Video/HDMI 输入和输出。原因是网络摄像头(包括此虚拟实现)通常使用 VIDIOC_ENUM_FRAMESIZES 列出其支持的一组离散帧大小。这与裁剪、合成或缩放不兼容。这主要是 V4L2 API 的限制,此处经过仔细重现。

缩放器可以实现的最小和最大分辨率为 16x16 和 (4096 * 4) x (2160 x 4),但它只能按 4 或更小的因子放大或缩小。因此,对于 1280x720 的源分辨率,缩放器可以做的最小值是 320x180,最大值是 5120x2880。您可以使用 qv4l2 测试工具来尝试此操作,您将看到这些依赖关系。

该驱动程序还支持更大的“bytesperline”设置,VIDIOC_S_FMT 允许这样做,但很少有驱动程序实现。

缩放器是一个简单的缩放器,使用粗糙的 Bresenham 算法。它专为速度和简单性而设计,而不是质量。

如果裁剪、合成和缩放的组合允许,则可以动态更改裁剪和合成矩形。

7.25.16. 格式

该驱动程序支持所有常规打包和平面 4:4:4、4:2:2 和 4:2:0 YUYV 格式、8、16、24 和 32 RGB 打包格式以及各种多平面格式。

对于支持的格式,可以通过“Alpha 分量”用户控件设置 Alpha 分量。如果设置了“仅对红色应用 Alpha”,则 alpha 分量仅用于红色,否则设置为 0。

必须配置驱动程序以支持多平面格式。默认情况下,驱动程序实例是单平面的。可以通过设置 multiplanar 模块选项来更改此设置,有关该选项的更多详细信息,请参见“配置驱动程序”。

如果驱动程序实例正在使用多平面格式/API,则第一个单平面格式 (YUYV) 和多平面 NV16M 和 NV61M 格式将具有一个 data_offset 为非零值 128 字节的平面。data_offset 为非零值的情况很少见,因此这是一个用于测试应用程序的有用功能。

视频输出还将遵守应用程序设置的任何 data_offset。

7.25.17. 输出叠加层

注意:主要实现输出叠加层是为了测试现有的 V4L2 输出叠加层 API。是否应将此 API 用于新驱动程序值得怀疑。

此驱动程序支持输出叠加层,并且能够进行

  • 位图裁剪,

  • 列表裁剪(最多 16 个矩形)

  • 色键

  • 源色键

  • 全局 alpha

  • 局部 alpha

  • 局部反向 alpha

多平面格式不支持输出叠加层。此外,为了使叠加层工作,捕获格式的像素格式必须与帧缓冲区的像素格式相同。否则,VIDIOC_OVERLAY 将返回错误。

只有通过在 node_types 模块选项中设置标志 0x10000 来配置驱动程序以创建帧缓冲区时,输出叠加层才能工作。创建的帧缓冲区大小为 720x576,并支持 ARGB 1:5:5:5 和 RGB 5:6:5。

为了查看各种裁剪、色度键控或 Alpha 处理功能的效果,您需要启用视频循环播放,并在捕获端查看结果。使用裁剪、色度键控或 Alpha 处理功能会显著降低视频循环的速度,因为每个像素都需要进行大量检查。

7.25.18. CEC (消费电子控制)

如果存在 HDMI 输入,则会创建一个 CEC 适配器,其输入端口数量与 HDMI 输入端口数量相同。这相当于例如具有该数量输入端口的电视。每个 HDMI 输出也会创建一个 CEC 适配器,该适配器连接到相应的输入端口,或者(如果输出多于输入)则不连接。换句话说,这相当于将每个输出设备连接到电视的输入端口。任何剩余的输出设备保持未连接状态。

每个输出读取的 EDID 报告一个唯一的 CEC 物理地址,该地址基于输入的 EDID 的物理地址。因此,如果接收器的 EDID 的物理地址为 A.B.0.0,则每个输出将看到一个包含物理地址 A.B.C.0 的 EDID,其中 C 为 1 到输入数量。如果输出多于输入,则剩余的输出具有一个被禁用并报告无效物理地址的 CEC 适配器。

7.25.19. 一些未来的改进

只是提醒一下,排名不分先后

  • 添加一个虚拟 alsa 驱动程序来测试音频

  • 添加虚拟子设备

  • 支持一些压缩视频的测试

  • 添加对将原始 VBI 输出循环到原始 VBI 输入的支持

  • 添加对将图文电视切片 VBI 输出循环到 VBI 输入的支持

  • 修复在交替字段的视频循环时序列/字段编号

  • 为视频输出添加对 V4L2_CID_BG_COLOR 的支持

  • 添加 ARGB888 叠加支持:更好地测试 alpha 通道

  • 通过传递一个真实的 v4l2_fract 来改进 tpg 代码中的像素宽高比支持

  • 使用每个队列锁和/或每个设备锁来提高吞吐量

  • SDR 无线电应该为电台使用与普通无线电接收器相同的“频率”,并且如果频率与电台频率不匹配则返回噪声

  • 为 RDS 生成创建一个线程,这将特别有助于“控制”RDS Rx I/O 模式,因为只读 RDS 控制可以实时更新。

  • 更改 EDID 不会在设置 HPD 信号之前等待 100 毫秒。