7.25. 虛擬無狀態解碼器驅動 (visl)

用於無狀態 uAPI 開發目的的虛擬無狀態解碼器裝置。

該工具的目標是幫助開發和測試使用 V4L2 無狀態 API 來解碼媒體的使用者空間應用程式。

即使沒有硬體可用,或者編解碼器的核心 uAPI 尚未上游化,使用者空間實現也可以使用 visl 來執行解碼迴圈。 這可以在早期階段發現錯誤。

該驅動程式還可以跟蹤提交給它的 V4L2 控制元件的內容。 它還可以透過 debugfs 介面轉儲 vb2 緩衝區的內容。 這在許多方面類似於其他流行的編碼/解碼 API 的可用跟蹤基礎設施,並且可以透過使用另一個(正常工作的)應用程式作為參考來幫助開發使用者空間應用程式。

注意

visl 不執行影片幀的實際解碼。 V4L2 測試模式生成器用於將各種除錯資訊寫入捕獲緩衝區。

7.25.1. 模組引數

  • visl_debug:啟用除錯資訊,透過 dprintk 列印各種除錯訊息。 還控制是否顯示每幀除錯資訊。 預設為關閉。 請注意,啟用此功能可能會導致透過序列埠的效能下降。

  • visl_transtime_ms:模擬處理時間,以毫秒為單位。 降低解碼速度對於除錯可能很有用。

  • visl_dprintk_frame_start,visl_dprintk_frame_nframes:指定啟用 dprintk 的幀範圍。 這僅控制每幀的 dprintk 跟蹤。 請注意,透過序列埠列印大量資料可能會很慢。

  • keep_bitstream_buffers:控制解碼會話後是否保留位元流(即 OUTPUT)緩衝區。 預設為 false,以減少混亂。 使用 GDB 即時除錯客戶端程式時,keep_bitstream_buffers == false 效果很好。

  • bitstream_trace_frame_start,bitstream_trace_nframes:類似於 visl_dprintk_frame_start,visl_dprintk_nframes,但控制透過 debugfs 轉儲緩衝區資料。

  • tpg_verbose:在每個輸出幀上寫入額外資訊,以簡化 API 的除錯。 如果設定為 true,則輸出幀對於給定的輸入是不穩定的,因為某些資訊(如指標或佇列狀態)將被新增到其中。

7.25.2. 此驅動的預設用例是什麼?

該驅動程式可用作比較不同使用者空間實現的一種方式。 這假設針對 visl 執行一個正常工作的客戶端,並且隨後使用 ftrace 和 OUTPUT 緩衝區資料來除錯正在進行的工作實現。

即使實際上沒有進行影片解碼,也可以針對給定輸入的參考使用輸出幀,除非 tpg_verbose 設定為 true。

根據 tpg_verbose 引數值,可以直接從 CAPTURE 緩衝區讀取有關參考幀、其時間戳、OUTPUT 和 CAPTURE 佇列的狀態等資訊。

7.25.3. 支援的編解碼器

支援以下編解碼器

  • FWHT

  • MPEG2

  • VP8

  • VP9

  • H.264

  • HEVC

  • AV1

7.25.4. visl 跟蹤事件

跟蹤事件是按編解碼器定義的,例如

$ ls /sys/kernel/tracing/events/ | grep visl
visl_av1_controls
visl_fwht_controls
visl_h264_controls
visl_hevc_controls
visl_mpeg2_controls
visl_vp8_controls
visl_vp9_controls

例如,為了轉儲 HEVC SPS 資料

$ echo 1 >  /sys/kernel/tracing/events/visl_hevc_controls/v4l2_ctrl_hevc_sps/enable

SPS 資料將被轉儲到跟蹤緩衝區,即

$ cat /sys/kernel/tracing/trace
video_parameter_set_id 0
seq_parameter_set_id 0
pic_width_in_luma_samples 1920
pic_height_in_luma_samples 1080
bit_depth_luma_minus8 0
bit_depth_chroma_minus8 0
log2_max_pic_order_cnt_lsb_minus4 4
sps_max_dec_pic_buffering_minus1 6
sps_max_num_reorder_pics 2
sps_max_latency_increase_plus1 0
log2_min_luma_coding_block_size_minus3 0
log2_diff_max_min_luma_coding_block_size 3
log2_min_luma_transform_block_size_minus2 0
log2_diff_max_min_luma_transform_block_size 3
max_transform_hierarchy_depth_inter 2
max_transform_hierarchy_depth_intra 2
pcm_sample_bit_depth_luma_minus1 0
pcm_sample_bit_depth_chroma_minus1 0
log2_min_pcm_luma_coding_block_size_minus3 0
log2_diff_max_min_pcm_luma_coding_block_size 0
num_short_term_ref_pic_sets 0
num_long_term_ref_pics_sps 0
chroma_format_idc 1
sps_max_sub_layers_minus1 0
flags AMP_ENABLED|SAMPLE_ADAPTIVE_OFFSET|TEMPORAL_MVP_ENABLED|STRONG_INTRA_SMOOTHING_ENABLED

7.25.5. 透過 debugfs 轉儲 OUTPUT 緩衝區資料

如果啟用了 VISL_DEBUGFS Kconfig,visl 將根據 bitstream_trace_frame_start 和 bitstream_trace_nframes 的值,使用 OUTPUT 緩衝區資料填充 /sys/kernel/debug/visl/bitstream。 這可以突出顯示錯誤,因為損壞的客戶端可能無法正確填充緩衝區。

為每個已處理的 OUTPUT 緩衝區建立一個檔案。 其名稱包含一個整數,表示緩衝區序列,即

snprintf(name, 32, "bitstream%d", run->src->sequence);

轉儲這些值僅僅是從檔案中讀取的問題,即

對於序列 == 0 的緩衝區

$ xxd /sys/kernel/debug/visl/bitstream/bitstream0
00000000: 2601 af04 d088 bc25 a173 0e41 a4f2 3274  &......%.s.A..2t
00000010: c668 cb28 e775 b4ac f53a ba60 f8fd 3aa1  .h.(.u...:.`..:.
00000020: 46b4 bcfc 506c e227 2372 e5f5 d7ea 579f  F...Pl.'#r....W.
00000030: 6371 5eb5 0eb8 23b5 ca6a 5de5 983a 19e4  cq^...#..j]..:..
00000040: e8c3 4320 b4ba a226 cbc1 4138 3a12 32d6  ..C ...&..A8:.2.
00000050: fef3 247b 3523 4e90 9682 ac8e eb0c a389  ..${5#N.........
00000060: ddd0 6cfc 0187 0e20 7aae b15b 1812 3d33  ..l.... z..[..=3
00000070: e1c5 f425 a83a 00b7 4f18 8127 3c4c aefb  ...%.:..O..'<L..

對於序列 == 1 的緩衝區

$ xxd /sys/kernel/debug/visl/bitstream/bitstream1
00000000: 0201 d021 49e1 0c40 aa11 1449 14a6 01dc  ...!I..@...I....
00000010: 7023 889a c8cd 2cd0 13b4 dab0 e8ca 21fe  p#....,.......!.
00000020: c4c8 ab4c 486e 4e2f b0df 96cc c74e 8dde  ...LHnN/.....N..
00000030: 8ce7 ee36 d880 4095 4d64 30a0 ff4f 0c5e  ...6..@.Md0..O.^
00000040: f16b a6a1 d806 ca2a 0ece a673 7bea 1f37  .k.....*...s{..7
00000050: 370f 5bb9 1dc4 ba21 6434 bc53 0173 cba0  7.[....!d4.S.s..
00000060: dfe6 bc99 01ea b6e0 346b 92b5 c8de 9f5d  ........4k.....]
00000070: e7cc 3484 1769 fef2 a693 a945 2c8b 31da  ..4..i.....E,.1.

等等。

預設情況下,這些檔案在 STREAMOFF 期間被刪除。 這是為了減少混亂。