1.1.6.23 The Virtual Video Test Driver (vivid)

该驱动程序模拟各种类型的vedio4linux硬件:视频捕获、视频输出、vbi捕获和输出、元数据捕获和输出、无线电接收器和发射器、触摸捕获和软件定义的无线电接收器。此外,还提供了一个简单的帧缓冲设备,用于测试捕获和输出叠加层。
最多可以创建64个vivid实例,每个实例最多具有16个输入和16个输出。每个输入可以是网络摄像头、电视捕获设备、S-Video捕获设备或HDMI捕获设备。每个输出可以是S-Video输出设备或HDMI输出设备。
这些输入和输出的行为与真实硬件设备完全一样。这使您可以将此驱动程序用作应用程序开发的测试输入,因为您可以测试各种功能,而无需特殊硬件。
该文档描述了此驱动程序实现的功能:
• 支持read()/ write()、MMAP、USERPTR和DMABUF流式输入/输出。
• 大量的测试模式及其变化列表
• 工作亮度、对比度、饱和度和色调控件
• 支持alpha颜色分量
• 完整的颜色空间支持,包括有限/完整的RGB范围
• 所有可能的控制类型都存在
• 支持各种像素长宽比和视频长宽比
• 错误注入以测试出现错误时会发生什么
• 可以在任何组合中支持输入和输出的裁剪/合成/缩放
• 可以模拟高达4K的分辨率
• 支持所有标准的YUV和RGB格式,包括两种多平面YUV格式
• 原始和切片的VBI捕获和输出支持
• 电台接收器和发射器支持,包括RDS支持
• 软件定义无线电(SDR)支持
• 捕获和输出叠加支持
• 元数据捕获和输出支持
• 触摸捕获支持
下面将更详细地描述这些功能。
Configuring the driver
该驱动程序默认创建一个实例,具有视频捕获设备(包括网络摄像头、电视、S-Video和HDMI输入)、视频输出设备(包括S-Video和HDMI输出)、一个vbi捕获设备、一个vbi输出设备、一个无线电接收器设备、一个无线电发射器设备和一个SDR设备。
可以使用以下模块选项配置实例数、设备数、视频输入和输出及其类型:
• n_devs:要创建的驱动程序实例数。默认设置为1。最多可以创建64个实例。
• node_types:每个驱动程序实例应创建哪些设备。一个十六进制值数组,每个实例对应一个值。默认值为0x1d3d。每个值都是一个位掩码,含义如下:
- 第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(位0-1),将类型映射到输入1(位2-3) ,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:允许提示
综合考虑所有这些模块选项,您可以精确定制驱动程序行为并测试应用程序的各种排列组合。它还非常适合模拟尚未可用的硬件,例如在开发新设备的软件时。
Video Capture
这可能是最常使用的功能。可以使用模块选项num_inputs、input_types和ccs_cap_mode(有关详细信息,请参见第1节)配置视频捕获设备,但默认情况下配置了四个输入:网络摄像头、电视调谐器、SVideo和HDMI输入,每个输入类型一个输入通道。下面对它们进行了更详细的描述。
特别关注新帧变为可用的速率。抖动将在1个jiffie左右(这取决于内核的HZ配置,通常为1/100、1/250或1/1000秒),但长期行为完全遵循帧率。因此,59.94 Hz的帧率与60 Hz的帧率确实是不同的。如果帧率超过内核的HZ值,则会出现丢帧,但帧序列计数将跟踪到这一点,因此在丢帧时序列计数将跳过。
Webcam Input
网络摄像头输入支持三种帧大小:320x180、640x360和1280x720。它支持每秒10、15、25、30、50和60帧的设置。可用的帧速率取决于所选的帧大小:帧大小越大,最大帧速率就越低。切换到网络摄像头输入时,最初选择的色彩空间将是sRGB。
TV and S-Video Inputs
电视输入与S-Video输入之间唯一的区别是电视输入具有调谐器。否则,它们的行为相同。
这些输入还支持音频输入:一个电视和一个Line-In。它们都支持所有电视标准。如果查询标准,则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的频率范围。从49.25 MHz开始,每6MHz提供一个频道。对于每个频道,生成的图像在其周围+/- 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结构中被填充。
HDMI Input
HDMI输入支持25至600 MHz的像素时钟频率下的所有CEA-861和DMT定时,包括逐行和交替扫描格式。交错格式的场模式始终为V4L2_FIELD_ALTERNATE。对于HDMI输入,场顺序始终是首先顶场,当您开始捕获交错格式时,将首先接收到顶场。
切换到HDMI输入或选择HDMI定时时,最初选择的色彩空间基于格式分辨率:对于分辨率小于或等于720x576的情况,色彩空间设置为SMPTE-170M,对于其他情况,则设置为REC-709(CEA-861定时)或sRGB(VESA DMT定时)。
像素宽高比取决于HDMI定时:对于720x480,它设置为NTSC电视标准,对于720x576,它设置为PAL电视标准,对于其他所有值,返回1:1像素宽高比。
视频宽高比可以通过“DV Timings Aspect Ratio”Vivid控件进行选择。选择是“Source Width x Height”(使用与所选格式相同的比例)、“4x3”或“16x9”,其中任何一种都可能导致有柱形条纹或边框的视频。
对于HDMI输入,可以设置EDID。默认情况下提供简单的EDID。只能为HDMI输入设置EDID。但是,在内部,EDID在所有HDMI输入之间共享。
除物理地址外,EDID数据不进行任何解释。有关更多详细信息,请参见CEC部分。
最多可以有15个HDMI输入(如果有更多,则将减少到15个),因为这是EDID物理地址的限制。
Video Output
视频输出设备可以通过使用模块选项num_outputs、output_types和ccs_out_mode进行配置(有关更详细的信息,请参见第1节),但默认情况下配置了两个输出:一个S-Video和一个HDMI输入,每种输出类型一个。下面将更详细地描述它们。
与视频捕获一样,长期帧速率也是精确的。
S-Video Output
该输出还支持音频输出:“Line-Out 1”和“Line-Out 2”。S-Video输出支持所有电视标准。
此输出支持字段设置的所有组合。
当切换到电视或S-Video输入时,最初选择的色彩空间将为SMPTE-170M。
HDMI Output
HDMI输出支持25至600 MHz像素时钟频率下的所有CEA-861和DMT定时,包括逐行和交替扫描格式。交错格式的场模式始终为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部分。
VBI Capture
VBI捕获设备有三种类型:仅支持原始(未解码)VBI、仅支持切片(已解码)VBI和同时支持两种格式。这是由node_types模块选项确定的。在所有情况下,驱动程序将生成有效的VBI数据:对于60 Hz标准,它将生成Closed Caption和XDS数据。封闭字幕流将每秒钟在“Hello world!”和“Closed captions test”之间交替。XDS流将在每分钟提供当前时间。对于50 Hz标准,它将生成基于实际视频宽高比控制设置和电视信号页码100-159(每帧一个页面)的宽屏信号。
VBI设备仅适用于S-Video和TV输入,如果当前输入为网络摄像头或HDMI,则会返回错误。
VBI Output
VBI输出设备有三种类型:仅支持原始(未解码)VBI、仅支持切片(已解码)VBI和同时支持两种格式。这是由node_types模块选项确定的。
切片VBI输出支持50 Hz标准的宽屏信号和电视信号,支持60 Hz标准的Closed Captioning和XDS。
VBI设备仅适用于S-Video输出,如果当前输出为HDMI,则会返回错误。
Radio Receiver
该无线电接收器模拟了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信息存储在只读控件中。每次更改频率或请求调谐器状态时,这些控件都会更新。块I / O方法使用read()接口将RDS块传递给应用程序进行解码。RDS信号在频道频率的+/- 12.5 kHz范围内“检测”,距离有效频率越远,随机引入块I / O流中的RDS错误就越多,如果您距离频道频率为+/- 12.5 kHz,则高达50%的所有块都可能发生四种错误中的任意一种:标记为“CORRECTED”的块,标记为“ERROR”的块,标记为“INVALID”的块以及被丢弃的块。
生成的RDS流包含所有包含在0B分组中的标准字段,还包括广播文本和当前时间。
接收器支持硬件频率搜索,可在有界模式,循环模式或两者中进行配置,可通过“广播HW搜索模式”控件进行配置。
Radio Transmitter
该无线电发射器模拟了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()将块传递给驱动程序。
Software Defifined Radio Receiver
SDR接收器具有ADC调谐器的三个频带:
• 300 kHz
• 900 kHz-2800 kHz
• 3200 kHz
RF调谐器支持50 MHz-2000 MHz。
生成的数据包含振幅为sqrt(2)的1 kHz音调的同相和正交分量。
Metadata Capture
元数据捕获生成UVC格式的元数据。 PTS和SCR基于vivid控件中设置的值进行传输。
元数据设备仅适用于网络摄像头输入,对于所有其他输入,它将返回一个错误。
Metadata Output
元数据输出可用于设置亮度、对比度、饱和度和色调。
元数据设备仅适用于网络摄像头输出,对于所有其他输出,它将返回一个错误。
Touch Capture
Touch捕获生成模拟单击、双击、三连击、从左到右移动、缩小、放大、手掌按压(模拟在触摸板上按下大面积)以及模拟16个同时触摸点的触摸模式。
Controls
不同设备支持不同的控件。下面的部分将描述每个控件以及支持它们的设备。
User Controls - Test Controls
按钮、布尔、32位整数、64位整数、菜单、字符串、位掩码和整数菜单是表示所有可能的控件类型的控件。 菜单控件和整数菜单控件在其菜单列表中都有“空洞”,这意味着调用VIDIOC_QUERYMENU时,一个或多个菜单项将返回EIN-VAL。 两个菜单控件还具有非零的最小控件值。 这些功能允许您检查您的应用程序是否可以正确处理此类事情。 这些控件适用于每种设备类型。
User Controls - Video Capture
以下控件专用于视频捕获。
亮度、对比度、饱和度和色调控件实际上可以工作并且是标准的。 亮度控件有一个特殊功能:每个视频输入都有自己的亮度值,因此更改输入将恢复该输入的亮度。 此外,每个视频输入使用不同的亮度范围(最小和最大控件值)。 切换输入将导致发送带有V4L2_EVENT_CTRL_CH_RANGE标志设置的控制事件。 这使您可以测试可以更改其范围的控件。
‘增益,自动’和‘增益’控件可用于测试易失性控件:如果设置‘增益,自动’,则增益控件是易失性的,会不断变化。 如果清除‘增益,自动’,则增益控件是正常的控件。
‘水平翻转’和‘垂直翻转’控件可用于翻转图像。 这些控件与‘传感器水平/垂直翻转’ Vivid控件结合使用。
‘Alpha Component’控件可用于为包含alpha通道的格式设置alpha组件。
User Controls - Audio
以下控件专用于视频捕获和输出以及收音机接收器和发射器。
‘音量’和‘静音’音频控件是控制音量和静音音频的此类设备的典型控件。 它们实际上在vivid驱动程序中不起作用。
Vivid Controls
这些vivid自定义控件控制图像生成,错误注入等。
Test Pattern Controls
测试图案控件都是针对视频捕获的。
• 测试图案:选择要使用的测试图案。使用CSC彩条进行颜色空间转换测试:该测试图案中使用的颜色映射到所有颜色空间中的有效颜色。其他测试图案禁用颜色空间转换。
• OSD文本模式:选择是否显示叠加在测试图案上的文本,以及如果显示,则只显示计数器还是完整文本。
• 水平移动:选择测试图案是否应向左或向右移动以及移动速度。
• 垂直移动:同理,为垂直方向选择移动。
• 显示边框:在实际图像的边缘(不包括字母或黑块边距)显示两个像素宽的边框。
• 显示正方形:在图像中央显示一个正方形。如果使用正确的像素和图像纵横比校正显示图像,则监视器上的正方形的宽度和高度应该相同。
• 在图像中插入SAV代码:向图像添加SAV(活动视频开始)代码。这可以用于检查是否意外解释了图像中的这些代码而不是被忽略。
• 在图像中插入EAV代码:对EAV(活动视频结束)代码执行相同的操作。
Capture Feature Selection Controls
这些控件都是针对视频捕获的。
• 摄像头水平翻转:图像水平翻转,设置V4L2_IN_ST_HFLIP输入状态标志。这模拟了传感器倒置的情况。
• 摄像头垂直翻转:图像垂直翻转,设置V4L2_IN_ST_VFLIP输入状态标志。这模拟了传感器倒置的情况。
• 标准纵横比:选择TV或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 Component”用户控件设置的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负载。
Output Feature Selection Controls
这些控件都是特定于视频输出的。
• 启用输出裁剪:启用裁剪支持。仅当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(默认值)时,此控件才存在。
Error Injection Controls
以下两个控件仅适用于视频和VBI捕获。
• 标准信号模式:选择VIDIOC_QUERYSTD的行为:应该返回什么?
更改此控件将导致发送V4L2_EVENT_SOURCE_CHANGE,因为它模拟了改变的输入条件(例如,插入或插出电缆)。
• 标准:选择VIDIOC_QUERYSTD应返回的标准(如果上一个控件设置为“选定标准”)。
更改此控件将导致发送V4L2_EVENT_SOURCE_CHANGE,因为它模拟了改变的输入标准。
以下两个控件仅适用于视频捕获。
• DV定时信号模式:选择VIDIOC_QUERY_DV_TIMINGS的行为:应该返回什么?
更改此控件将导致发送V4L2_EVENT_SOURCE_CHANGE,因为它模拟了改变的输入条件(例如,插入或拔出电缆)。
• DV定时:选择VIDIOC_QUERY_DV_TIMINGS应返回的定时模式(如果上一个控件设置为“选定DV定时”)。
更改此控件将导致发送V4L2_EVENT_SOURCE_CHANGE,因为它模拟了改变的输入定时。
以下控件仅在no_error_inj模块选项设置为0(默认值)时存在。这些控件适用于视频和VBI捕获和输出流以及SDR捕获设备,除了Disconnect控件,它适用于所有设备。
• 包裹序列号:测试在结构体v4l2_buffer中包裹序列号的结果。
• 包裹时间戳:测试在结构体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()函数。
VBI Raw Capture Controls
• 隔行VBI格式:如果设置,则原始VBI数据将是交替的,而不是按场组合的形式提供。
Digital Video Controls
• 接收端RGB量化范围:设置HDMI输入的RGB量化检测。这与Vivid的“有限RGB范围(16-235)”控件相结合,可以用来测试如果源提供了错误的量化范围信息会发生什么。可以通过选择HDMI输入,将此控件设置为完整或有限范围,并在“有限RGB范围(16-235)”控件中选择相反的方式进行测试。如果选择“灰色坡道”测试图案,则效果很容易看到。
• 发送端RGB量化范围:设置HDMI输出的RGB量化检测。在Vivid中当前未用于任何功能,但大多数HDMI发射器通常都会具有此控件。
• 传输模式:将HDMI输出的传输模式设置为HDMI或DVI-D。这会影响报告的colorspace,因为DVI_D输出始终使用sRGB。
• 显示器存在:设置HDMI输出上的“显示器”存在。这会影响tx_edid_present、tx_hotplug和tx_rxsense控件。
FM Radio Receiver Controls
这是关于RDS接收器的一些控制选项:
• RDS接收:设置是否启用RDS接收器。
• RDS节目类型:
• RDS PS名称:
• RDS Radio Text:
• RDS交通广播:
• RDS交通节目:
• RDS音乐:这些都是只读控件。如果RDS Rx I/O模式设置为“块I/O”,那么它们也是无效的。如果RDS Rx I/O模式设置为“控件”,那么这些控件报告接收到的RDS数据。
注意:这个vivid实现相当基本:它们只在设置新频率或获取调谐器状态(VIDIOC_G_TUNER)时更新。
• Radio HW Seek Mode:可以是“Bounded”、“Wrap Around”或“Both”。这决定了VIDIOC_S_HW_FREQ_SEEK是否会被频率范围限定或环绕,或者是否可由用户选择。
• Radio Programmable HW Seek:如果设置,则用户可以提供HW Seek的下限和上限。否则将使用频率范围边界。
• 生成RBDS而不是RDS:如果设置,则生成RBDS(美国版RDS)数据而不是RDS(欧洲风格RDS)。这仅影响PICODE和PTY代码。
• RDS Rx I/O模式:这可以是“块I/O”,其中应用程序必须读取RDS块,或者是“控件”,其中RDS数据由上面提到的RDS控件提供。
FM Radio Modulator Controls
这些控制用于设置FM调制器发送的RDS数据:
• RDS节目ID:
• RDS节目类型:
• RDS PS名称:
• RDS Radio Text:
• RDS立体声:
• RDS人工头部:
• RDS压缩:
• RDS动态PTY:
• RDS交通广播:
• RDS交通节目:
• RDS音乐:这些都是控件,用于设置FM调制器发送的RDS数据。
• RDS Tx I/O模式:这可以是“块I/O”,其中应用程序必须使用write()向驱动程序传递RDS块,或者是“控件”,其中RDS数据由上述RDS控件提供。
Metadata Capture Controls
如果设置了以下选项,则生成的元数据流包含:
• 生成PTS:此选项设置时,生成的元数据流将包含演示时间戳。
• 生成SCR:当设置此选项时,生成的元数据流将包含源时钟信息。
Video, VBI and RDS Looping
vivid驱动程序支持将视频输出、VBI输出和RDS输出循环连接到视频输入、VBI输入和RDS输入。对于视频/VBI循环连接,它会模拟连接了一个电缆在输出和输入连接器之间。因此,视频和VBI循环连接只支持在S-Video和HDMI输入和输出之间进行。对于S-Video,VBI才有效,因为对于HDMI没有意义。
由于无线电是无线的,如果收音机接收器频率接近于发射机频率,则始终发生循环连接。在这种情况下,无线电发射机将“覆盖”模拟无线电电台。
目前,循环连接仅在由同一vivid驱动程序实例创建的设备之间受支持。
Video and Sliced VBI looping
目前启用视频/VBI循环连接的方法相当粗糙。在视频捕获和VBI捕获设备的“Vivid”控制类中提供了一个“循环视频”控件。“循环视频”勾选后,视频循环连接将被启用。启用后,任何S-Video或HDMI输入的视频都将显示静态测试图案,直到视频输出已开始。此时,视频输出将被循环连接到视频输入,前提是:
•输入类型与输出类型匹配。因此,HDMI输入无法从S-Video输出接收视频。
•视频输入的分辨率必须与视频输出的分辨率相匹配。因此,无法将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数据。
Radio & RDS Looping
根据第6节的介绍,无线电接收机模拟电台在常规频率间隔上的工作。根据接收机的频率,计算出信号强度值(这是通过VIDIOC_G_TUNER返回的)。但它还会查看无线电发射机所设置的频率,如果该频率产生的信号强度高于发射机的设置,则将其用作有效站点。这也包括发射机“传输”的RDS数据(如果有)。这些数据被接收方忠实地接收。请注意,在加载驱动程序时,无线电接收机和发射机的频率不相同,因此最初不会进行循环。
Cropping, Composing, Scaling
。这个驱动程序支持任意组合的裁剪、合成和缩放功能。通常可以通过Vivid控件选择支持的功能,但在加载模块时也可以通过ccs_cap_mode和ccs_out_mode模块选项进行硬编码。有关这些模块选项的详细信息,请参见第1节。
这使您可以测试应用程序的所有这些变化。
请注意,网络摄像头输入永远不支持裁剪、合成或缩放。这仅适用于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算法的简单缩放器。它的设计速度和简单性,而不是质量。
如果裁剪、合成和缩放的组合允许,则可以在运行时更改裁剪和合成矩形。
Formats
这个驱动程序支持所有常规的打包和平面4:4:4、4:2:2和4:2:0 YUYV格式,8、16、24和32 RGB打包格式以及各种多平面格式。对于支持它的格式,可以通过“Alpha Component”用户控件设置alpha分量。如果设置了“仅将Alpha应用于红色”,那么alpha分量只用于颜色红色,否则设为0。
驱动程序必须配置支持多平面格式。默认情况下,驱动程序实例是单平面的。这可以通过设置multiplanar模块选项来更改,请参见第1节中有关该选项的更多详细信息。
如果驱动程序实例正在使用多平面格式/API,则第一个单平面格式(YUYV)和多平面NV16M和NV61M格式将具有一个具有128字节非零data_offset的平面。data_offset很少为非零,因此这是测试应用程序的一个有用特性。
视频输出还将遵守应用程序设置的任何data_offset。
Capture Overlay       //捕获覆盖层
注意:捕获覆盖支持的主要目的是测试现有的V4L2捕获覆盖API。实际上,现代硬件更为强大,很少有任何GPU支持这样的覆盖,也基本上不再需要它们。通过在node_types模块选项中设置标志0x10000,vivid驱动程序将创建一个简单的帧缓冲设备,可用于测试此API。是否应该使用此API来编写新的驱动程序值得商榷。
该驱动程序支持具有位图剪切和列表剪切(最多16个矩形)能力的破坏性捕获覆盖。多平面格式不支持覆盖。它还遵守struct v4l2_window字段设置:如果它设置为FIELD_TOP或FIELD_BOTTOM并且捕获设置为FIELD_ALTERNATE,则只会将顶部或底部字段复制到覆盖中。
仅当您同时进行捕获时,覆盖层才能工作。这是vivid的限制,因为它从缓冲区复制到覆盖层,而不是直接填充覆盖层。如果您没有捕获,则没有缓冲区可用于填充。
另外,捕获格式和帧缓冲区的像素格式必须相同,以使覆盖层正常工作。否则,VIDIOC_OVERLAY将返回错误。
为了真正看到发生了什么,您需要创建两个vivid实例:第一个启用帧缓冲区。将第二个实例的捕获覆盖配置为使用第一个的帧缓冲区,然后开始在第二个实例中捕获。对于第一个实例,您设置视频输出的输出覆盖层,打开视频循环和捕获,以查看第二个实例正在写入的混合帧缓冲区覆盖层。此设置需要以下命令:

$ sudo modprobe vivid n_devs=2 node_types=0x10101,0x1
$ v4l2-ctl -d1 --find-fb
/dev/fb1 is the framebuffer associated with base address 0x12800000
$ sudo v4l2-ctl -d2 --set-fbuf fb=1
$ v4l2-ctl -d1 --set-fbuf fb=1
$ v4l2-ctl -d0 --set-fmt-video=pixelformat='AR15'
$ v4l2-ctl -d1 --set-fmt-video-out=pixelformat='AR15'
$ v4l2-ctl -d2 --set-fmt-video=pixelformat='AR15'
$ v4l2-ctl -d0 -i2
$ v4l2-ctl -d2 -i2
$ v4l2-ctl -d2 -c horizontal_movement=4
$ v4l2-ctl -d1 --overlay=1
$ v4l2-ctl -d1 -c loop_video=1
$ v4l2-ctl -d2 --stream-mmap --overlay=1

And from another console:

$ v4l2-ctl -d1 --stream-out-mmap

And yet another console:

$ qv4l2

开始出流。
qv4l2是什么:
qv4l2是一个Linux系统下的视频设备调试和测试工具,它基于Qt界面库开发。qv4l2可以查看摄像头和视频设备的属性,并提供简单的界面来控制和修改这些属性。此外,通过qv4l2还可以进行音视频流的播放和录制测试。
正如您所看到的,这不是那些心志不坚的人可以胜任的……
Output Overlay
注:输出覆盖层主要实现用于测试现有的V4L2输出覆盖API。是否应该为新驱动程序使用此API值得商榷。该驱动程序支持输出覆盖并具有以下功能:
• 位图剪切
• 列表剪辑(最多16个矩形)
• 色度键
• 源色度键
• 全局alpha
• 本地alpha
• 本地反向alpha
对于多平面格式,不支持输出覆盖。此外,捕获格式和帧缓冲区的像素格式必须相同,以使覆盖层正常工作。否则,VIDIOC_OVERLAY将返回错误。
仅当驱动程序被配置为通过在node_types模块选项中设置标志0x10000来创建帧缓冲区时,才支持输出覆盖层。所创建的帧缓冲区的大小为720x576,支持ARGB 1:5:5:5和RGB 5:6:5。
为了看到各种剪辑、色度键或alpha处理能力的效果,您需要打开视频循环,并在捕获端看到结果。剪辑、色度键或alpha处理能力的使用会显著降低视频循环速度,因为每个像素都需要进行大量的检查。
CEC (Consumer Electronics Control)
如果存在HDMI输入,则将创建具有相同数量的输入端口的CEC适配器。这相当于例如具有该数量输入的电视。每个HDMI输出也将创建一个CEC适配器,该适配器连接到相应的输入端口,或者(如果输出多于输入)根本没有连接。换句话说,这相当于将每个输出设备连接到电视的一个输入端口。任何剩余的输出设备都保持未连接状态。
每个输出读取的EDID报告了一个唯一的CEC物理地址,该地址基于输入的EDID的物理地址。因此,如果接收器的EDID具有物理地址A.B.0.0,则每个输出将看到包含物理地址A.B.C.0的EDID,其中C为1到输入数量。如果输出比输入多,则其余输出具有已禁用并报告无效物理地址的CEC适配器。
Some Future Improvements
提醒一下,没有特定的顺序:
• 添加虚拟alsa驱动程序以测试音频
• 添加虚拟子设备和媒体控制器支持
• 支持测试压缩视频
• 添加支持将原始VBI输出循环到原始VBI输入的功能
• 添加支持将电视滑动VBI输出循环到VBI输入的功能
• 循环交替场的视频时修复序列/场编号
• 为视频输出添加V4L2_CID_BG_COLOR支持
• 添加ARGB888叠加支持:更好地测试alpha通道
• 通过传递真正的v4l2_fract来改进tpg代码中的像素方面支持
• 使用每个队列锁和/或每个设备锁以提高吞吐量
• 添加支持从一个具体的输出到另一个具体的输入在vivid实例之间进行循环
• SDR电台应使用与普通无线电接收机相同的“频率”,如果频率与站点频率不匹配,则返回噪声。
• 为RDS生成创建线程,这将有助于特别是对于“控制”RDS Rx I/O模式,因为只读RDS控件可以实时更新。
• 改变EDID应导致热插拔检测仿真发生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值