7.26. 虚拟视频测试驱动 (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.26.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

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

    • 0:没有请求

    • 1:支持请求

    • 2:需要请求

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

7.26.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.26.2.1. 网络摄像头输入

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

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

7.26.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 Anamorphic”,这将给出全屏压缩变形宽屏视频,需要相应地缩放。

电视“调谐器”支持 44-958 MHz 的频率范围。频道每 6 MHz 提供一次,从 49.25 MHz 开始。对于每个频道,生成的图像在 +/- 0.25 MHz 范围内为彩色,在频道周围 +/- 1 MHz 范围内为灰度。除此之外,它只是噪声。对于 +/- 0.25 MHz,VIDIOC_G_TUNER ioctl 将返回 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.26.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。但是,在内部,EDID 在所有 HDMI 输入之间共享。

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

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

7.26.3. 视频输出

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

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

7.26.3.1. S-Video 输出

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

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

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

7.26.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 获取。

最多有 15 个 HDMI 输出(如果更多,则将减少到 15 个),因为这是 EDID 物理地址的限制。另请参阅 CEC 部分了解更多详细信息。

7.26.4. VBI 捕获

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

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

7.26.5. VBI 输出

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

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

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

7.26.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,包括使用“块 I/O”和“控件”模式。在“控件”模式下,RDS 信息存储在只读控件中。每次更改频率或请求调谐器状态时,都会更新这些控件。块 I/O 方法使用 read() 接口将 RDS 块传递给应用程序进行解码。

对于频道频率周围的 +/- 12.5 kHz,“检测到”RDS 信号,并且频率与有效频率的距离越远,随机引入块 I/O 流中的 RDS 错误就越多,如果您与频道频率相差 +/- 12.5 kHz,则最多占所有块的 50%。所有四个错误都可能以相等的比例发生:标记为“CORRECTED”的块、标记为“ERROR”的块、标记为“INVALID”的块和丢弃的块。

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

接收器支持硬件频率搜索,可以在有界模式、环绕模式或两种模式下进行,这可以通过“无线电硬件搜索模式”控件进行配置。

7.26.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,包括使用“块 I/O”和“控件”模式。在“控件”模式下,使用控件配置传输的 RDS 信息,在“块 I/O”模式下,使用 write() 将块传递给驱动程序。

7.26.8. 软件定义的无线电接收器

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

  • 300 kHz

  • 900 kHz - 2800 kHz

  • 3200 kHz

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

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

7.26.9. 元数据捕获

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

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

7.26.10. 元数据输出

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

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

7.26.11. 触摸捕获

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

7.26.12. 控件

不同的设备支持不同的控件。以下部分将描述每个控件以及哪些设备支持它们。

7.26.12.1. 用户控件 - 测试控件

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

7.26.12.2. 用户控件 - 视频捕获

以下控件是视频捕获特有的。

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

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

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

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

7.26.12.3. 用户控件 - 音频

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

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

7.26.12.4. Vivid 控件

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

7.26.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.26.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.26.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.26.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 捕获设备有效,除了 Disconnect 控件对所有设备有效。

  • 环绕序列号

    测试在 struct v4l2_buffer 中环绕序列号时会发生什么。

  • 环绕时间戳

    测试在 struct v4l2_buffer 中环绕时间戳时会发生什么。

  • 丢弃缓冲区的百分比

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

  • 断开连接

    模拟 USB 断开连接。 设备的行为就像已断开连接一样。 只有在关闭设备节点的所有打开的文件句柄后,设备才会再次“连接”。

  • 注入 V4L2_BUF_FLAG_ERROR

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

  • 注入 VIDIOC_REQBUFS 错误

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

  • 注入 VIDIOC_QBUF 错误

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

  • 注入 VIDIOC_STREAMON 错误

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

  • 注入致命流式错误

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

7.26.12.4.5. VBI 原始捕获控制

  • 隔行 VBI 格式

    如果设置,则原始 VBI 数据将是隔行的,而不是按字段分组提供。

7.26.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.26.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.26.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.26.12.8. 元数据捕获控制

  • 生成 PTS

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

  • 生成 SCR

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

7.26.13. 视频、Sliced VBI 和 HDMI CEC 循环

同一 vivid 驱动程序实例创建的设备以及 vivid 驱动程序的多个实例之间都支持视频循环功能。 vivid 驱动程序支持 S-Video 输出和 S-Video 输入之间的视频和 Sliced 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 输出必须配置为 Sliced VBI。 VBI 捕获端可以配置为原始 VBI 或 Sliced VBI。 请注意,目前仅循环 CC/XDS(60 Hz 格式)和 WSS(50 Hz 格式)VBI 数据。 Teletext VBI 数据未循环。

7.26.14. 无线电和 RDS 循环

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

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

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

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

7.26.15. 裁剪、合成、缩放

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

这允许您测试您的应用程序的所有这些变体。

请注意,Webcam 输入从不支持裁剪、合成或缩放。 这仅适用于 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 允许这样做,但很少有驱动程序实现。

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

如果裁剪、合成和缩放的组合允许,则可以在运行时更改裁剪和合成矩形。

7.26.16. 格式

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

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

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

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

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

7.26.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.26.18. CEC (消费电子控制)

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

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

7.26.19. 一些未来的改进

只是一个提醒,没有特定的顺序

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

  • 添加虚拟子设备

  • 一些支持测试压缩视频

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

  • 添加支持将 Teletext Sliced VBI 输出循环到 VBI 输入

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

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

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

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

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

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

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

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