vlc內部執行機制以及架構分

2021-07-04 02:19:31 字數 3102 閱讀 5168

vlc

架構剖析

1. videolan簡介

1.1 videolan組成

videolan有以下兩部分組成:

vls:是一種流伺服器,專門用來解決流的各種問題,它也具有一些vlc的特徵。videolan作

為伺服器可以輸出http,rtp,rtsp的流。

1.2 vlc優點

下圖表示出了videolan的解決方案:

2. vlc整體架構分析

2.1 libvlc

inte***ce/:包含與使用者互動的**如按鍵和裝置彈出。

input/:開啟乙個輸入元件,讀包,解析它們並且將被還原的基本流傳遞給解器。

stream_output/:類似audio_output。

misc/:被libvlc其它部分使用的雜項,如執行緒系統,訊息佇列,cpu探測,物件查詢系統,

或者特定平台**。

2.2 vlc

2.3 元件

元件位於modules\子目錄,在執行時被載入。每乙個元件提供不同的特徵適應特定的

檔案的環境。另外,大量的不斷編寫的可移植功能位於audio_output\,vidco_output\和

inte***ce\元件,以支援新的平台(如:beos mae os x)。

元件中的外掛程式被位於src\misc\modules.c和include\modules*.h中的函式動態載入和卸

載。寫元件的api描述如下,共3種:

(l)元件描述巨集:宣告元件具有哪種優先順序的能力(介面,demux2等等),還有gui元件的

實現引數,特定元件的配置變數,快捷方式,子元件等等;

(2)open(vlc_objeet_t*p_object):被vlc呼叫初始化這個元件,它被元件描述巨集賦值給了

結構體module_t中的pf_activate函式指標,被module_need呼叫;

(3)close(vlc_objeet_t*p_object):被vlc呼叫負初始化這個元件,保證消耗open分配的所

有資源。它被元件描述巨集賦值給了結構體module_t中的pf_deactivate函式指標,被

module_unneed呼叫。

用libvlc寫的元件能夠直接被編譯進vlc,因為有的os不支援動態載入**。被靜態

編譯進vlc的元件叫做內建元件。

2.4 執行緒分析

(l)執行緒管理:

vlc的執行緒結構基於pthreads執行緒模型。為了可移植的目的,沒有直接使用pthreads

函式,而是做了一系列類似的包裹函式:vlc_thread_create,vlc_thread_exit,vlc_thread_join,

vlc_mutex_init,vlc_mutex_lock,vlc_mutex_unlock,vlc_mutex_destroy,vlc_cond_init,

vlc_cond_signal,vlc_cond_broadcast,vlc_cond_wait,vlc_cond_destroy和類似結

構:vlc_thread_t,vlc_mutex_t,and vlc_cond_t。

(2)執行緒同步:

vlc輸出的流裡包含時間戳,被傳遞給解碼器,所有有時間戳標記的流也均被記錄,這

當前時間能夠被mdate()函式恢復。乙個執行緒可以被阻塞到mwait(mtime_t date)等到一

個確定的時間才被執行。也可以用msleep(mtime_t delay)休眠一段時間。如果有重要的事情

要處理的話,那麼應該在正常時間到來之前被喚醒(如色度變換)。例如在

modules\codec\mpeg_vldeo\synchro.c中,通常的解碼時間被記錄,保證影象被即時解碼。

3. vlc接**術分析

3.1 vlc執行過程

通過對相關資料和自己的分析,vlc的執行過程如下:

elf(linux下可執行檔案的格式)先被動態載入,然後主線程就變成了介面執行緒並且在

src/inte***ce/inte***ce.c中開始。它執行下列步驟:

1.cpu探測:什麼型號?所有能力(mmx,mmxext,3dnow,altivec等等)

2.訊息介面初始化;

3.命令列選項解析元件

5.倉庫初始化

6.載入所有內建和動態元件

7.開啟介面

8.安裝訊號處理器:sighup,sigint和sigquit(捕獲乙個,忽略後來的並退出)。

9.派生音訊輸出執行緒;

11.主迴圈:事件管理;

下圖表示了這些步驟的執行過程:

vlc的執行過程圖

位址3.2 訊息介面

由於printf()函式不是執行緒安全的,因此在呼叫printf()函式時乙個執行緒的執行將會受到

干擾,當這個執行緒被另乙個函式所呼叫時就會其狀態被破壞而退出程式。所以vlc構造了自

己的執行緒安全的訊息介面。

vlc的執行緒安全的訊息介面有兩種實現方式:如果在config.h裡定義了intf_msg_queue

的話,每乙個類似printf()的函式將會把排隊的訊息放到煉表裡,這個鍊錶將會在事件迴圈

中被執行緒介面用紅色標記的方式列印出來。如果intf_msg_queue沒被定義的話,呼叫線

程將會獲得乙個print lock(用來防止在同一時刻有兩個printf操作被執行)同時直接列印出消

息(預設操作)。

以下為vlc執行緒安全訊息的api:

queuemsg:新增一條訊息到訊息佇列,如果訊息佇列滿了,先列印所有的訊息;

flushmsg:列印所有在訊息佇列裡的訊息,特別的,訊息佇列必須被提前加鎖,因為該

函式不檢查鎖。

printmsg:列印一條訊息到stderr,可以列印彩色訊息。

3.3 命令列選項

vlc用gnu的getopt解析命令列選項。getopt結構定義在src\extras\getopt.h裡。所有

的配置也可以用環境變數改變:呼叫函式main_put*variable和main_get*variable。所

以,.\vlc--height=240和 .\vic_height=240./vlc(這種方式用於所有地方,包括外掛程式)是一樣的。

但是為了執行緒安全的考慮,當第二個執行緒派生了,main_put*variable便不能被使用了。

未完,具體參考位址

Windows程式內部執行機制

2 sdk software development kit 軟體開發包 3 常用控制代碼 視窗控制代碼 hwnd 位圖控制代碼 hbitmap 圖示控制代碼 hicon 選單控制代碼 hmenu 檔案控制代碼 hfile 當前例項控制代碼 hinstance 全域性記憶體物件控制代碼 hgloba...

Windows程式內部執行機制

我們在寫c程式的時候會呼叫各種庫函式來輔助完成某些功能,例如printf,這就是api,windows作業系統提供了1000多種api函式。軟體開發包 software development kit 假如我們要開發呼叫中心,在購買語音卡的同時,廠商就會提供語音卡的sdk開發包,以方便我們對語音卡的...

MySql執行機制原理和架構

主要補充了一些事務隔離級別會帶來的問題以及可以避免什麼問題,還有就是mysql內部優化語法樹的規則。目錄 一 mysql知識普及 二 mysql邏輯架構 三 併發控制和鎖的概念 四 事務 五 mysql儲存引擎及應用方案 mysql是乙個開放源 的關聯式資料庫管理系統。mysql架構可以在多種不同場...