4.7. 切片 VBI 資料介面¶
VBI 代表垂直消隱間隔,是模擬影片訊號線序列中的一個間隙。在 VBI 期間,不傳輸影像資訊,從而留出一些時間讓陰極射線管電視的電子束返回到螢幕頂部。
切片 VBI 裝置使用硬體來解調 VBI 中傳輸的資料。 V4L2 驅動程式不應透過軟體執行此操作,另請參見原始 VBI 介面。資料作為固定大小的短資料包傳遞,每個資料包覆蓋一條掃描線。每個影片幀的資料包數量是可變的。
切片 VBI 捕獲和輸出裝置透過與原始 VBI 裝置相同的字元特殊檔案訪問。當驅動程式同時支援這兩個介面時,/dev/vbi裝置的預設功能是原始 VBI 捕獲或輸出,並且只有在呼叫如下定義的VIDIOC_S_FMT ioctl 後,切片 VBI 功能才可用。同樣,/dev/video裝置可能支援切片 VBI API,但此處的預設功能是影片捕獲或輸出。如果要透過驅動程式同時支援傳遞原始和切片 VBI 資料,則必須使用不同的檔案描述符。
4.7.1. 查詢功能¶
支援切片 VBI 捕獲或輸出 API 的裝置分別在v4l2_capability結構體的capabilities欄位中設定V4L2_CAP_SLICED_VBI_CAPTURE或V4L2_CAP_SLICED_VBI_OUTPUT標誌,該結構體由ioctl VIDIOC_QUERYCAP ioctl 返回。必須支援至少一種讀取/寫入或流式I/O 方法。切片 VBI 裝置可能具有調諧器或調製器。
4.7.2. 補充功能¶
如果切片 VBI 裝置具有這些功能,則應支援影片輸入或輸出和調諧器或調製器 ioctl,並且可能支援使用者控制元件 ioctl。影片標準 ioctl 提供對程式設計切片 VBI 裝置至關重要的資訊,因此必須支援。
4.7.3. 切片 VBI 格式協商¶
為了找出硬體支援哪些資料服務,應用程式可以呼叫VIDIOC_G_SLICED_VBI_CAP ioctl。所有實現切片 VBI 介面的驅動程式都必須支援此 ioctl。當硬體每個幀可以捕獲或輸出的 VBI 行數,或者硬體可以在給定行上識別的服務數量受到限制時,結果可能與VIDIOC_S_FMT ioctl 的結果不同。例如,在 PAL 第 16 行上,硬體可能能夠查詢 VPS 或 Teletext 訊號,但不能同時查詢兩者。
為了確定當前選擇的服務,應用程式將v4l2_format結構體的type欄位設定為V4L2_BUF_TYPE_SLICED_VBI_CAPTURE或V4L2_BUF_TYPE_SLICED_VBI_OUTPUT,並且VIDIOC_G_FMT ioctl 填充fmt.sliced成員,即v4l2_sliced_vbi_format結構體。
應用程式可以透過初始化或修改fmt.sliced成員並使用指向v4l2_format結構的指標呼叫VIDIOC_S_FMT ioctl 來請求不同的引數。
切片 VBI API 比原始 VBI API 更復雜,因為必須告訴硬體期望在每條掃描線上使用哪種 VBI 服務。並非所有服務都可能受到硬體在所有行上的支援(對於 VBI 輸出尤其如此,其中 Teletext 通常不受支援,而其他服務只能插入到一條特定行中)。但是,在許多情況下,只需將service_set欄位設定為所需的服務,並讓驅動程式根據硬體功能填充service_lines陣列就足夠了。只有在需要更精確的控制時,程式設計師才應顯式設定service_lines陣列。
VIDIOC_S_FMT ioctl 根據硬體功能修改引數。當驅動程式在此點分配資源時,如果所需的資源暫時不可用,則可能會返回EBUSY錯誤程式碼。可能返回EBUSY的其他資源分配點可以是ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF ioctl 和第一個read(),write()和select()呼叫。
-
type v4l2_sliced_vbi_format¶
4.7.3.1. 結構體 v4l2_sliced_vbi_format¶
__u16 |
|
如果在透過VIDIOC_S_FMT或VIDIOC_TRY_FMT時 在返回時,驅動程式將此欄位設定為返回的 |
||
__u16 |
|
應用程式使用驅動程式應在相應掃描線上查詢或插入的資料服務集初始化此陣列。根據硬體功能,驅動程式返回請求的集合、子集(可能只是一個服務)或空集。當硬體無法處理同一行上的多個服務時,驅動程式應選擇一個。不能對驅動程式選擇哪個服務做出假設。 |
||
元素 |
525 行系統 |
625 行系統 |
||
|
1 |
1 |
||
|
23 |
23 |
||
|
264 |
314 |
||
|
286 |
336 |
||
驅動程式必須將 |
||||
__u32 |
|
一次 |
||
__u32 |
|
此陣列保留供將來擴充套件使用。 應用程式和驅動程式必須將其設定為零。 |
||
4.7.3.2. 切片 VBI 服務¶
符號 |
值 |
參考 |
通常的行 |
有效負載 |
|---|---|---|---|---|
|
0x0001 |
PAL/SECAM 行 7-22, 320-335(第二個欄位 7-22) |
45 位元組 Teletext 資料包的最後 42 個位元組,即沒有時鐘預熱和成幀程式碼,先傳輸 lsb。 |
|
|
0x0400 |
PAL 第 16 行 |
ETS 300 231 圖 9 中的位元組編號 3 到 15,先傳輸 lsb。 |
|
|
0x1000 |
NTSC 第 21, 284 行(第二個欄位 21) |
按傳輸順序的兩個位元組,包括奇偶校驗位,先傳輸 lsb。 |
|
|
0x4000 |
PAL/SECAM 第 23 行 |
參見下面的V4L2_SLICED_WSS_625 有效負載。 |
|
|
0x1000 |
適用於 525 行系統的服務集。 |
||
|
0x4401 |
適用於 625 行系統的服務集。 |
||
當應用程式嘗試在沒有事先進行格式協商的情況下,在切換影片標準(可能會使協商的 VBI 引數失效)之後,以及在切換影片輸入(可能會作為副作用更改影片標準)之後讀取或寫入資料時,驅動程式可能會返回EINVAL錯誤程式碼。當應用程式嘗試在 i/o 正在進行時(在ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF和VIDIOC_STREAMOFF呼叫之間,以及在第一次read()或write()呼叫之後)更改格式時,VIDIOC_S_FMT ioctl 可能會返回EBUSY錯誤程式碼。
4.7.3.2.1. V4L2_SLICED_WSS_625 有效負載¶
V4L2_SLICED_WSS_625的有效負載為
位元組
0
1
位
msb
lsb
msb
lsb
7
6
5
4
3
2
1
0
x
x
13
12
11
10
9
8
4.7.4. 讀取和寫入切片 VBI 資料¶
單個read()或write()呼叫必須傳遞屬於一個影片幀的所有資料。即一個或多個元素的v4l2_sliced_vbi_data結構體陣列,總大小不超過io_size位元組。同樣,在流式 I/O 模式下,io_size位元組的一個緩衝區必須包含一個影片幀的資料。未使用v4l2_sliced_vbi_data元素的id必須為零。
-
type v4l2_sliced_vbi_data¶
4.7.4.1. 結構體 v4l2_sliced_vbi_data¶
__u32 |
|
來自切片 VBI 服務的標誌,用於標識此資料包中的資料型別。只能設定一個位。當捕獲的資料包的 |
__u32 |
|
此資料是從哪個影片欄位捕獲的,或者應插入到哪個影片欄位。 |
__u32 |
|
此資料是從哪個欄位(相對於幀)行號捕獲的,或者應插入到哪個欄位(相對於幀)行號。有關有效值,請參見圖 4.2. ITU-R 525 行編號 (M/NTSC 和 M/PAL)和圖 4.3. ITU-R 625 行編號。如果硬體無法可靠地識別掃描線,則切片 VBI 捕獲裝置可以將所有資料包的行號設定為 |
__u32 |
|
此欄位保留供將來擴充套件使用。應用程式和驅動程式必須將其設定為零。 |
__u8 |
|
資料包有效負載。有關每種資料型別傳遞的內容和位元組數,請參見切片 VBI 服務。此陣列末尾的填充位元組的內容未定義,驅動程式和應用程式應忽略它們。 |
資料包始終按升序行號順序傳遞,沒有重複的行號。當應用程式違反此規則時,write()函式和ioctl VIDIOC_QBUF, VIDIOC_DQBUF ioctl 必須返回EINVAL錯誤程式碼。當應用程式傳遞不正確的欄位或行號,或者尚未與VIDIOC_G_FMT或VIDIOC_S_FMT ioctl 協商的field、line和id組合時,它們也必須返回 EINVAL 錯誤程式碼。當行號未知時,驅動程式必須按傳輸順序傳遞資料包。驅動程式可以在資料包陣列中的任何位置插入id設定為零的空資料包。
為了確保同步並與丟幀區分開來,當捕獲的幀不攜帶任何請求的資料服務時,驅動程式必須傳遞一個或多個空資料包。當應用程式未能及時傳遞 VBI 資料以進行輸出時,驅動程式必須再次輸出上一個 VPS 和 WSS 資料包,並停用 Closed Caption 和 Teletext 資料的輸出,或者輸出 Closed Caption 和 Teletext 解碼器忽略的資料。
切片 VBI 裝置可能支援讀/寫和/或流式(記憶體對映和/或使用者指標)I/O。後者具有透過使用緩衝區時間戳同步影片和 VBI 資料的可能性。
4.7.5. MPEG 流中的切片 VBI 資料¶
如果裝置可以生成 MPEG 輸出流,則它可能能夠提供協商的切片 VBI 服務作為嵌入在 MPEG 流中的資料。使用者或應用程式使用V4L2_CID_MPEG_STREAM_VBI_FMT控制元件控制此切片 VBI 資料插入。
如果驅動程式未提供V4L2_CID_MPEG_STREAM_VBI_FMT控制元件,或者僅允許將該控制元件設定為V4L2_MPEG_STREAM_VBI_FMT_NONE,則該裝置無法將切片 VBI 資料嵌入 MPEG 流中。
V4L2_CID_MPEG_STREAM_VBI_FMT控制元件不會隱式地設定裝置驅動程式以捕獲或停止捕獲切片 VBI 資料。該控制元件僅指示將切片 VBI 資料嵌入 MPEG 流中,前提是應用程式已協商捕獲切片 VBI 服務。
也可能存在裝置只能將切片 VBI 資料嵌入某些型別的 MPEG 流中的情況:例如 MPEG-2 PS,但不能嵌入 MPEG-2 TS。在這種情況下,如果請求插入切片 VBI 資料,則切片 VBI 資料將嵌入支援的 MPEG 流型別中,並從裝置不支援插入切片 VBI 資料的 MPEG 流型別中靜默省略。
以下小節指定嵌入式切片 VBI 資料的格式。
4.7.5.1. MPEG 流嵌入式,切片 VBI 資料格式:NONE¶
驅動程式應將V4L2_MPEG_STREAM_VBI_FMT_NONE嵌入式切片 VBI 格式解釋為停止將切片 VBI 資料嵌入 MPEG 流的控制。設定此格式後,裝置和驅動程式都不會在 MPEG 流中插入“空”嵌入式切片 VBI 資料包。未為此格式指定任何 MPEG 流資料結構。
4.7.5.2. MPEG 流嵌入式,切片 VBI 資料格式:IVTV¶
當支援V4L2_MPEG_STREAM_VBI_FMT_IVTV嵌入式切片 VBI 格式時,它指示驅動程式在 MPEG 流的 MPEG-2 Program Pack 中封裝的 MPEG-2 Private Stream 1 PES 資料包中嵌入每個幀最多 36 行切片 VBI 資料。
歷史背景:此格式規範源自ivtv驅動程式使用的自定義嵌入式切片 VBI 資料格式。此格式已在核心原始檔Documentation/userspace-api/media/drivers/cx2341x-uapi.rst中進行了非正式指定。此格式的有效負載的最大大小和其他方面由 CX23415 MPEG 解碼器在提取、解碼和顯示 MPEG 流中嵌入的切片 VBI 資料方面的功能和限制所驅動。
此格式的使用不專用於ivtv驅動程式也不專用於 CX2341x 裝置,因為將切片 VBI 資料包插入 MPEG 流是在驅動程式軟體中實現的。至少cx18驅動程式也以這種格式將切片 VBI 資料插入到 MPEG-2 PS 中。
以下定義指定了設定V4L2_MPEG_STREAM_VBI_FMT_IVTV時包含切片 VBI 資料的 MPEG-2 Private Stream 1 PES 資料包的有效負載。(此處未詳細說明 MPEG-2 Private Stream 1 PES 資料包頭和封裝的 MPEG-2 Program Pack 頭。有關這些資料包頭的詳細資訊,請參閱 MPEG-2 規範。)
包含切片 VBI 資料的 MPEG-2 Private Stream 1 PES 資料包的有效負載由結構體v4l2_mpeg_vbi_fmt_ivtv指定。有效負載的長度可變,具體取決於影片幀中存在的切片 VBI 資料的實際行數。有效負載可以在末尾用未指定的填充位元組填充,以將有效負載的末尾對齊到 4 位元組邊界。有效負載永遠不應超過 1552 位元組(2 個欄位,每個欄位 18 行,每行 43 位元組資料和一個 4 位元組幻數)。
-
type v4l2_mpeg_vbi_fmt_ivtv¶
4.7.5.3. 結構體 v4l2_mpeg_vbi_fmt_ivtv¶
__u8 |
|
來自結構體 v4l2_mpeg_vbi_fmt_ivtv magic 欄位的幻數的“幻數”常量,指示這是一個有效的切片 VBI 資料有效負載,並且還指示要用於有效負載資料的匿名聯合的哪個成員, |
union { |
(anonymous) |
|
|
切片 VBI 資料有效負載的主要形式,包含 1 到 35 行切片 VBI 資料。有效負載的這種形式提供了行掩碼,指示提供了哪些 VBI 行。 |
|
|
當存在 36 行切片 VBI 資料時使用的切片 VBI 資料有效負載的另一種形式。有效負載的這種形式不提供行掩碼;隱式設定所有有效的行掩碼位。 |
|
} |
||
4.7.5.4. 結構體 v4l2_mpeg_vbi_fmt_ivtv magic 欄位的幻數¶
已定義符號 |
值 |
描述 |
|---|---|---|
|
“itv0” |
指示結構體 |
|
“ITV0” |
指示結構體 |
-
型別 v4l2_mpeg_vbi_itv0¶
-
型別 v4l2_mpeg_vbi_ITV0¶
4.7.5.5. 結構體 v4l2_mpeg_vbi_itv0 和 v4l2_mpeg_vbi_ITV0¶
__le32 |
|
位掩碼,指示存在的 VBI 服務行。 這些 linemask[0] b0: line 6 first field
linemask[0] b17: line 23 first field
linemask[0] b18: line 6 second field
linemask[0] b31: line 19 second field
linemask[1] b0: line 20 second field
linemask[1] b3: line 23 second field
linemask[1] b4-b31: unused and set to 0
|
|
這是一個可變長度陣列,儲存 1 到 35 行的切片 VBI 資料。 存在的切片 VBI 資料行對應於 |
4.7.5.6. 結構體 v4l2_mpeg_vbi_ITV0¶
|
一個 36 行切片 VBI 資料的固定長度陣列。 |
-
型別 v4l2_mpeg_vbi_itv0_line¶
4.7.5.7. 結構體 v4l2_mpeg_vbi_itv0_line¶
__u8 |
|
來自 結構體 v4l2_mpeg_vbi_itv0_line id 欄位的行識別符號常量 的行識別符號值,指示儲存在此行上的切片 VBI 資料的型別。 |
__u8 |
|
該行的切片 VBI 資料。 |
4.7.5.8. 結構體 v4l2_mpeg_vbi_itv0_line id 欄位的行識別符號¶
已定義符號 |
值 |
描述 |
|---|---|---|
|
1 |
有關行有效負載的描述,請參閱 切片 VBI 服務。 |
|
4 |
有關行有效負載的描述,請參閱 切片 VBI 服務。 |
|
5 |
有關行有效負載的描述,請參閱 切片 VBI 服務。 |
|
7 |
有關行有效負載的描述,請參閱 切片 VBI 服務。 |