第四章 尋找合適模組機制
4.3 尋找合適解多工器模組程序
我們在第三章時有提到,呼叫module_Need()來尋找合適的解多工器模組時,
並且傳入的psz_capability 字串必須為"demux2",也就是 VLC 需要具有"demux2"
能力的模組。而經過第一階段的比對檢查之後,會從所有的2 百多個模組當中,
篩選出具有"demux2"能力的模組,然後在第二階段開始就進到模組內的起始函 數,測試此模組是否為合適的解多工器模組。因此接下來我們實際以MPEG-2 PS(program stream)/TS(transport stream 這兩種影音檔案格式為例子,說明 VLC 如 何找到合適的解多工器模組來解析這兩種影音檔案格式。
4.3.1 尋找合適的 MPEG-2 PS 解多工器模組
如下圖4.10 所示,一個 MPEG-2 PS 是由許多 pack 組合而成的,每個 pack 都是由一個pack header 加上多個 PES packet 所形成的,而每個 pack header 都是 由一列固定的起始碼開始,起始碼是一串特殊的編碼值,其可以區分出資料流的 每層架構;而pack header 是由 pack_start_code:
0x000001BA 開始的。
. . .
start code 01 SCR program
mux rate ... PES 1 . . . PES n 0x000001b9(如下圖 4.11),只要 buffer 內的長度沒有小於 4 個 bytes 並且 buffer 前 面4 個 bytes 符合的比對條件,那麼 VLC 就會確認讀取資料的影音包裝格式為
4.3.1 尋找合適的 MPEG-2 TS 解多工器模組
如下圖4.12 所示,一個 MPEG-2 TS 是由許多 TS packet 組合而成的,而 TS packet 是由長度固定為 184 bytes 的 PES 再加上 4 bytes 的 TS header 所組成,共 188 bytes,依據 ISO13818-1 中所定義,TS header 是由 8 bits 的 sync_byte (0x47) 所開始的。
TS
he ade r TS payload TS he ade r
sync byte
(0x47) PID ... PES 1
TS payload
0 4 188(bytes)
<---- fixed length ---->
...
0 4 188(bytes)
... ...
TS packet
圖4.12:MPEG-2 TS
而同樣地,在VLC 解多工器模組當中,有一個 ts module 是用來解析 MPEG-2 TS 影音包裝格式。在 ts module 起始函數內一開始會先確認 buffer 內的長度不能 小於TS_PACKET_SIZE_MAX(定義為 204)個 bytes,然後在 buffer 內的前 204 個 bytes 中必須找到一個 TS sync_byte 0x47,並記錄這個 sync_byte 在 buffer 內的位 置為i_sync;並且再確認 buffer 長度不能小於 i_peek=TS_PACKET_SIZE_MAX* 3 + i_sync + 1,最後就是要在 buffer 內位置 i_sync 之後,每隔 188 bytes 連續比對 到3 個 TS sync_byte 0x47(下圖 4.13),只要符合上面所說的條件,那麼 vlc 就會判 定輸入檔案的影音包裝格式為transport stream,並且選擇 ts module 為合適的解多 工器模組。
在影音資料前面 204 個 bytes 之內,能夠比對到 第一個 sync byte 0x47
從比對到的第一個 sync byte 之後,每隔 188byte 要能夠連續比 對到 3 個 sync byte
圖4.13:ts module 起始函數部分程式碼
由上面所舉例的兩種影音格式來看,可以了解到VLC 尋找一個合適的解多工 器模組的方法,就是依據每種解多工器模組的起始函數內的比對條件,來確定此 影音包裝格式為何;若符合某個解多工器模組的起始函數內的比對條件,那麼也 就代表選擇了此模組為合適的解多工器模組,因此,VLC 才能使用此模組來解多 工所讀取的影音資料。