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_CAPTUREV4L2_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_CAPTUREV4L2_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

service_set

如果在透過VIDIOC_S_FMTVIDIOC_TRY_FMTservice_set為非零,則驅動程式將根據此欄位中指定的服務填充service_lines陣列。例如,如果service_set使用V4L2_SLICED_TELETEXT_B | V4L2_SLICED_WSS_625初始化,則 cx25840 影片解碼器的驅動程式會將兩個欄位[1]的 7-22 行設定為V4L2_SLICED_TELETEXT_B,並將第一個欄位的 23 行設定為V4L2_SLICED_WSS_625。如果service_set設定為零,則將改為使用service_lines的值。

在返回時,驅動程式將此欄位設定為返回的service_lines陣列的所有元素的並集。如果硬體無法同時處理更多服務,則它可能包含比請求的服務更少的服務,甚至可能只有一個服務。如果硬體不支援任何請求的服務,則它可能為空(零)。

__u16

service_lines[2][24]

應用程式使用驅動程式應在相應掃描線上查詢或插入的資料服務集初始化此陣列。根據硬體功能,驅動程式返回請求的集合、子集(可能只是一個服務)或空集。當硬體無法處理同一行上的多個服務時,驅動程式應選擇一個。不能對驅動程式選擇哪個服務做出假設。

資料服務在切片 VBI 服務中定義。陣列索引對映到 ITU-R 行號[2],如下所示

元素

525 行系統

625 行系統

service_lines[0][1]

1

1

service_lines[0][23]

23

23

service_lines[1][1]

264

314

service_lines[1][23]

286

336

驅動程式必須將service_lines [0][0] 和 service_lines[1][0] 設定為零。V4L2_VBI_ITU_525_F1_STARTV4L2_VBI_ITU_525_F2_STARTV4L2_VBI_ITU_625_F1_STARTV4L2_VBI_ITU_625_F2_START 定義方便地為每個 525 或 625 行格式提供每個欄位的起始行號。不要忘記 ITU 行編號從 1 開始,而不是從 0 開始。

__u32

io_size

一次read()write()呼叫傳遞的最大位元組數,以及ioctl VIDIOC_QBUF, VIDIOC_DQBUFVIDIOC_DQBUF ioctl 的緩衝區大小(以位元組為單位)。驅動程式將此欄位設定為v4l2_sliced_vbi_data結構體大小乘以返回的service_lines陣列中的非零元素數(即可能攜帶資料的行數)。

__u32

reserved[2]

此陣列保留供將來擴充套件使用。

應用程式和驅動程式必須將其設定為零。

4.7.3.2. 切片 VBI 服務

符號

參考

通常的行

有效負載

V4L2_SLICED_TELETEXT_B(Teletext 系統 B)

0x0001

ETS 300 706,

ITU BT.653

PAL/SECAM 行 7-22, 320-335(第二個欄位 7-22)

45 位元組 Teletext 資料包的最後 42 個位元組,即沒有時鐘預熱和成幀程式碼,先傳輸 lsb。

V4L2_SLICED_VPS

0x0400

ETS 300 231

PAL 第 16 行

ETS 300 231 圖 9 中的位元組編號 3 到 15,先傳輸 lsb。

V4L2_SLICED_CAPTION_525

0x1000

CEA 608-E

NTSC 第 21, 284 行(第二個欄位 21)

按傳輸順序的兩個位元組,包括奇偶校驗位,先傳輸 lsb。

V4L2_SLICED_WSS_625

0x4000

ITU BT.1119,

EN 300 294

PAL/SECAM 第 23 行

參見下面的V4L2_SLICED_WSS_625 有效負載

V4L2_SLICED_VBI_525

0x1000

適用於 525 行系統的服務集。

V4L2_SLICED_VBI_625

0x4401

適用於 625 行系統的服務集。

當應用程式嘗試在沒有事先進行格式協商的情況下,在切換影片標準(可能會使協商的 VBI 引數失效)之後,以及在切換影片輸入(可能會作為副作用更改影片標準)之後讀取或寫入資料時,驅動程式可能會返回EINVAL錯誤程式碼。當應用程式嘗試在 i/o 正在進行時(在ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFFVIDIOC_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

id

來自切片 VBI 服務的標誌,用於標識此資料包中的資料型別。只能設定一個位。當捕獲的資料包的id為零時,資料包為空,其他欄位的內容未定義。應用程式應忽略空資料包。當用於輸出的資料包的id為零時,data欄位的內容未定義,並且驅動程式必須不再在請求的fieldline上插入資料。

__u32

field

此資料是從哪個影片欄位捕獲的,或者應插入到哪個影片欄位。 0表示第一個欄位,1表示第二個欄位。

__u32

line

此資料是從哪個欄位(相對於幀)行號捕獲的,或者應插入到哪個欄位(相對於幀)行號。有關有效值,請參見圖 4.2. ITU-R 525 行編號 (M/NTSC 和 M/PAL)圖 4.3. ITU-R 625 行編號。如果硬體無法可靠地識別掃描線,則切片 VBI 捕獲裝置可以將所有資料包的行號設定為0。欄位編號必須始終有效。

__u32

reserved

此欄位保留供將來擴充套件使用。應用程式和驅動程式必須將其設定為零。

__u8

data[48]

資料包有效負載。有關每種資料型別傳遞的內容和位元組數,請參見切片 VBI 服務。此陣列末尾的填充位元組的內容未定義,驅動程式和應用程式應忽略它們。

資料包始終按升序行號順序傳遞,沒有重複的行號。當應用程式違反此規則時,write()函式和ioctl VIDIOC_QBUF, VIDIOC_DQBUF ioctl 必須返回EINVAL錯誤程式碼。當應用程式傳遞不正確的欄位或行號,或者尚未與VIDIOC_G_FMTVIDIOC_S_FMT ioctl 協商的fieldlineid組合時,它們也必須返回 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

magic[4]

來自結構體 v4l2_mpeg_vbi_fmt_ivtv magic 欄位的幻數的“幻數”常量,指示這是一個有效的切片 VBI 資料有效負載,並且還指示要用於有效負載資料的匿名聯合的哪個成員,itv0ITV0

union {

(anonymous)

結構體v4l2_mpeg_vbi_itv0

itv0

切片 VBI 資料有效負載的主要形式,包含 1 到 35 行切片 VBI 資料。有效負載的這種形式提供了行掩碼,指示提供了哪些 VBI 行。

結構體v4l2_mpeg_vbi_ITV0

ITV0

當存在 36 行切片 VBI 資料時使用的切片 VBI 資料有效負載的另一種形式。有效負載的這種形式不提供行掩碼;隱式設定所有有效的行掩碼位。

}

4.7.5.4. 結構體 v4l2_mpeg_vbi_fmt_ivtv magic 欄位的幻數

已定義符號

描述

V4L2_MPEG_VBI_IVTV_MAGIC0

“itv0”

指示結構體v4l2_mpeg_vbi_fmt_ivtv中的聯合的itv0成員有效。

V4L2_MPEG_VBI_IVTV_MAGIC1

“ITV0”

指示結構體 v4l2_mpeg_vbi_fmt_ivtv 中聯合體的 ITV0 成員有效,並且存在 36 行切片 VBI 資料。

型別 v4l2_mpeg_vbi_itv0
型別 v4l2_mpeg_vbi_ITV0

4.7.5.5. 結構體 v4l2_mpeg_vbi_itv0 和 v4l2_mpeg_vbi_ITV0

__le32

linemask[2]

位掩碼,指示存在的 VBI 服務行。 這些 linemask 值以小端位元組順序儲存在 MPEG 流中。 下面給出了一些參考 linemask 位位置及其對應的 VBI 行號和影片場。 b0 表示 linemask 值的最低有效位

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

結構體 v4l2_mpeg_vbi_itv0_line

line[35]

這是一個可變長度陣列,儲存 1 到 35 行的切片 VBI 資料。 存在的切片 VBI 資料行對應於 linemask 陣列中設定的位,從 linemask[0] 的 b0linemask[0] 的 b31,以及從 linemask[1] 的 b0linemask[1] 的 b3line[0] 對應於在 linemask 陣列中找到的第一個設定位, line[1] 對應於在 linemask 陣列中找到的第二個設定位,依此類推。 如果沒有設定 linemask 陣列位,則 line[0] 可能包含一行未指定的資料,應用程式應忽略該資料。

4.7.5.6. 結構體 v4l2_mpeg_vbi_ITV0

結構體 v4l2_mpeg_vbi_itv0_line

line[36]

一個 36 行切片 VBI 資料的固定長度陣列。 line[0] 到 line[17] 對應於第一場的第 6 行到第 23 行。 line[18] 到 line[35] 對應於第二場的第 6 行到第 23 行。

型別 v4l2_mpeg_vbi_itv0_line

4.7.5.7. 結構體 v4l2_mpeg_vbi_itv0_line

__u8

id

來自 結構體 v4l2_mpeg_vbi_itv0_line id 欄位的行識別符號常量 的行識別符號值,指示儲存在此行上的切片 VBI 資料的型別。

__u8

data[42]

該行的切片 VBI 資料。

4.7.5.8. 結構體 v4l2_mpeg_vbi_itv0_line id 欄位的行識別符號

已定義符號

描述

V4L2_MPEG_VBI_IVTV_TELETEXT_B

1

有關行有效負載的描述,請參閱 切片 VBI 服務

V4L2_MPEG_VBI_IVTV_CAPTION_525

4

有關行有效負載的描述,請參閱 切片 VBI 服務

V4L2_MPEG_VBI_IVTV_WSS_625

5

有關行有效負載的描述,請參閱 切片 VBI 服務

V4L2_MPEG_VBI_IVTV_VPS

7

有關行有效負載的描述,請參閱 切片 VBI 服務