• 沒有找到結果。

解碼器模組解碼流程

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

4.2 解碼器模組解碼流程

圖4.10 decoder_t 結構內部份成員

所以我們可以了解到 VLC 要尋找一個適合的解碼器模組的方法就是藉由解多工器 模組在解析影音資料時的過程中所判斷的video stream 和 audio stream 編碼格式和資料型 態去設定相對應的四字元,然後在module_Need()函數中就會呼叫解碼器模組中開啟測 試函數是否有定義相對應的四字元,若有符合的四字元那麼module_Need()函數就會判 定此解碼器模組為適合的解碼器模組。

4.2 解碼器模組解碼流程

在 module_Need()函數找到適合的影像和聲音解碼器模組後就會產生各自解碼的 thread 並開始進行解碼程序,如圖 4.11 所示此時解多工器模組就會不斷將影音檔案分離 出 video biestream 和 audio bitstream 後會呼叫在 init()函數中所設定好的傳送資料的 es_out_Send()函數,並依據 ps_track_t 結構中的資訊將 video bitstream 和 audio bitstream 放入影像和聲音的FIFO buffer 中。

解碼器模組特性

影像和聲音解碼函數

44

es_out_Send ( p_demux->out, tk->es, p_pkt )

圖 4.11 輸出函數 es_out_Send()參數示意圖

圖 4.12 所示在 decoder thread 下 DecoderThread()函數是進行解碼程序的重要函數,

呼叫時會傳入由 module_Need()函數所找到適合解碼器模組的所有資訊,並會用一個的 結構block_t 來讀取由解多工器模組放入 FIFO buffer 的資訊,然後接著就會進入一個解 碼的主迴圈,我們可以很清楚地看到進入解碼主迴圈後就會呼叫block_FifoGet()函數來 讀取解多工好的audio bitstream 或是 video bitstream 進行並進行解碼程序,然後會將讀 取好資料位址傳給 DecoderDecode()函數中來開始進行解碼程序,若是資料讀取結束後 就會跳出解碼主迴圈並結束解碼程序。

while( !p_dec->b_die && !p_dec->b_error )

{if( ( p_block = block_FifoGet( p_dec->p_owner->p_fifo ) ) == NULL ) {p_dec->b_error = 1;

break;

}

if( DecoderDecode( p_dec, p_block ) != VLC_SUCCESS ) { break;

圖4.12 Decoder thread 中的解碼主迴圈 讀取資料

傳送資料所需資訊

資料位址

將資料傳入

45

其中在 DecoderDecode()函數中所呼叫的解碼函數就是先前 module_Need()函數比 對四字元後找到適合解碼器模組中所定義的解碼函數,也就是說假設今天是開啟一個 MPEG2 的影音資料,那麼在呼叫 module_Need()函數時就會找到 libmpeg2.c 的影像解碼 器模組來對video stream 進行解碼的動作;也就是在判定 libmpeg2.c 模組為適合的影像解 碼 器 模 組 時 就 必 須 將 解 碼 器 模 組 結 構 decode_t 中的解碼 callback functions 指向 libmpeg2.c 解碼器模組中的影像解碼函數,因此在 DecoderDecode()函數中所呼叫的解碼 函數就是呼叫在 libmpeg2.c 解碼器模組中的解碼函數來進行影像解碼程序,如圖 4.13 所示。

if( p_dec->i_object_type ==

VLC_OBJECT_PACKETIZER )

else if( p_dec->fmt_in.i_cat ==

AUDIO_ES )

else if( p_dec->fmt_in.i_cat ==

VIDEO_ES )

Return information

Process of audio decoding

Process of video decoding Process of streaming Start DecoderDecode()

圖4.13 DecoderDecode()函數的解碼架構

46

在 process of video decoding 程序中會有一個迴圈用不斷呼叫解碼的 callback function 函數,如圖4.14 所示。其由 callback function 會指向由 module_Need()函數所找到的影像 解碼器模組中所定義的影像解碼的函數進行解碼程序 。

else while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) ) 圖4.14 影像解碼的 callback function