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 毫秒。