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架構可以在多種不同場...