• 沒有找到結果。

第四章 VLC 解多工器與解碼器模組

4.1 解多工器模組

4.1.2 取得四字元

第三章中我們知道 VLC 是利用 module_Need()函數來尋找適合的模組,並將適合的 候選模組用linked list 的方式串聯起來,並依照各候選模組能力值的高低依序測試是否 符合開啟條件。尋找不同能力的模組會有不同的開啟條件,在這小節我們會介紹解碼器 模組的開啟條件〝四字元〞。

四字元是在解多工器模組判斷好影像和聲音的編碼格式後,就會設定四字元來表 示影像和聲音的編碼格式。所以在 module_Need()函數尋找適合解碼器模組時,只要利 用四字元的比較就可以很快的判斷出是否為適合的解碼器模組。

在ps.c 解多工器模組中必須要有 header 中資訊才能得知 PS 中 video stream 和 audio stream 類型和 payload 編碼格式等等資訊,依據這些 header 資訊去判斷四字元。因此 ps.c

39

解多工器模組在進行解多工器模組時,會一層一層去解析MPEG-2 PS 的 header;首先會 先解析pack header,然後在解析 System header;而 System header 中的 stream id 代表著 audio stream 和 video stream 的類型,其中 stream id 的值若在 oxCo~oxDF 間其 payload 為audio stream,若在 oxEo~oxEF 間 payload video stream。

接下來會對pack 中的 PES pack 進行解析,每個 PES pack 中的 PES payload 為 video stream 或 audio stream 資料。若當 PES pack 資料類型為 PSM(program stream map)時,那 麼在解析此PES pack 就能確認 video payload 和 audio payload 的編碼格式;因為 PSM 中 紀錄了許多不同的stream id 和編碼格式的對應關係;然而不同的 stream id 就會對應不同 的編碼格式,假設PSM 中 stream id=0xE0 所對應的編碼格式為 mpeg-2 video codec 的話,

那麼只要是PES header 中的 stream id 為 0xE0,就可以判定此 PES 中的 payload 是一個 編碼為mpeg-2 video 的 video stream。所以當 ps.c 模組在解析 MPEG-2 PS 時,就是藉由 PSM 中不同 stream id 所對應不同的編碼格式來判斷 video birstream 和 audio birstream 的 編碼格式,然後ps_track_fill()函數就能依據 stream id 和其對應的編碼格式來判斷四字元。

ps_track_fill()函數會依據 video bitstream 和 audio bitstream 的編碼格式和 stream id 來設定相對應的四字元。假設在stream id=0xE0 和對應的編碼格式為 0x1b 時,就會判 定此payload 為 video stream 且編碼格式為 H.264,並設定四字元〝h264〞、資料型態 VIDEO_ES,如圖 4.6 所示。然後就會用結構 es_format_t 來儲存所判斷的結果,用其結 構成員i_cat 儲存是影像或聲音格式,成員 i_codec 則是用來儲存設定的四字元,如圖 4.7 所示。之後在判斷解碼器模組的開啟條件函數就是用型態結構 es_format_t 中的成員 來取得四字元的資訊來進一步的來判斷是否為適合的解碼器模組。

40

圖4.6 ps_track_fill()函數部份程式

static inline void es_format_Init( es_format_t *fmt,int i_cat, vlc_fourcc_t i_codec )

{ fmt->i_cat = i_cat;

fmt->i_codec = i_codec;

}

圖4.7 es_format_Init()函數部份程式

在設定完四字元後所有 MPEG-2 header 中的影像和聲音的 stream id 以及編碼格式 和四字元等等資訊都會存在型態ps_track_t 結構中,如圖 4.8 所示。然後會呼叫圖 4.1 所示的資料輸出模組中的pf_add 所指向的 EsOutAdd()函數並經過層層的呼叫來找到解 碼器模組,在尋找適合的解碼器模組時module_Need()函數就會由 ps _ track_t 結構中的 四字元來對每個解碼器模組中所定義的四字元進行比對來找出適合的影像和聲音解碼

儲存結果