gstreamer外掛程式工作原理與流程分析

2021-10-12 16:29:17 字數 1754 閱讀 9817

gstreamer plugins的工作同所有的基於外掛程式的程式的工作原理類似,本質上都是通過讀取動態庫實現的,只需要每個動態庫都實現某乙個特定的介面就可以了,比如 xx_init等,gstreamer統一使用 plugin_init。 裡面會有個像登錄檔一樣的資料結構會儲存所有的外掛程式的資訊。

(1)在應用程式啟動時,會呼叫gst_init--->gst_init_check。gst_init_check函式將用於初始化gstreamer函式庫,建立內部的路徑列表,註冊內建元件以及載入標準plugins(外掛程式)。

(2)在gst_init_check函式中將呼叫init_post函式,它將設定日誌處理器函式,初始化gst_format,並為gst_object註冊一系列型別等等。在init_post函式中還將呼叫gst_update_registry函式,強制gstreamer對它的plugin所在路徑進行重新掃瞄,並且更新預設的plugin registry(登記處,註冊處)。讀取註冊庫(處)資訊是通過呼叫ensure_current_registry來實現的。首先,它會逐個去先後讀取系統環境變數gst_registry,gst_registry_update以及gst_registry_fork。其次,在讀取完這些環境變數後,程式將知道是否要更新registry。最後,呼叫scan_and_update_registry函式,監測registry的變化並且最終更新registtry快取。

(3)在上面提到的scan_and_update_registry函式中,將會去讀取gst_plugin_path環境變數。在讀取完環境變數後,將先呼叫gst_registry_remove_cache_plugins清除過時的plugin訊息,然後呼叫gst_registry_binary_write_cache更新registry cache。

對於大部分gstreamer應用程式來說,執行到第三步驟後基本就可以認為是結束了。隨後,所有的plugin載入,都是使用者觸發而進行動態載入的。(danny更正:2012-07-26)

而對於沒有定義gst_disable_option_parsing巨集的應用程式來說,繼續執行4和5步,以預先載入一些靜態的外掛程式。

(4)以上第(2)第(3)步結束後,也就是ensure_current_registry函式呼叫返回到gst_update_registry函式中。

if (preload_plugins) {

g_slist_foreach (preload_plugins, load_plugin_func, null);//遍歷gst_plugin_path目錄,依次開啟動態庫

(5)在load_plugin_func函式中將會去呼叫gst_plugin_load_file函式;該函式將依次呼叫g_module_open,g_module_symbol,gst_plugin_register_func,gst_default_registry_add_plugin函式。其中gst_plugin_register_func函式裡將指定並呼叫進入每乙個外掛程式的入口函式plugin_init。

程式自己實現的每乙個plugin,都需要在***.c檔案中定義plugin_init函式和巨集gst_plugin_define。巨集gst_plugin_define用於定義乙個plugin的入口點和元資料。同時,它用於輸出(export)乙個plugin,這樣它就就可以被其他應用程式使用。

我們看乙個實際的例子:

至此,我們完成了gstreamer的外掛程式載入原理與過程的分析。

gstreamer外掛程式工作原理與流程分析

gstreamer plugins的工作同所有的基於外掛程式的程式的工作原理類似,本質上都是通過讀取動態庫實現的,只需要每個動態庫都實現某乙個特定的介面就可以了,比如xx init等,gstreamer統一使用plugin init。裡面會有個像登錄檔一樣的資料結構會儲存所有的外掛程式的資訊。1 在...

gstreamer外掛程式工作原理與流程分析

gstreamer plugins的工作同所有的基於外掛程式的程式的工作原理類似,本質上都是通過讀取動態庫實現的,只需要每個動態庫都實現某乙個特定的介面就可以了,比如xx init等,gstreamer統一使用plugin init。裡面會有個像登錄檔一樣的資料結構會儲存所有的外掛程式的資訊。1 在...

rygel和gstreamer呼叫外掛程式的問題

今天晚上實在不行了,問了一下老手,告訴我要用sudo env path path make install 命令安裝,試了一下,果然有用。但是這個是什麼原因呢,不懂呀,不懂就查,可惜沒怎麼查到。安裝我自己的想法就是一來是配置環境變數的時候直接ptah 路徑了,沒有加上 path所以才要在安裝的時候加...