1. 程式人生 > >VLC 模組動態載入邏輯

VLC 模組動態載入邏輯

模組初始化:libvlc_new--->libvlc_InternalInit->module_LoadPlugins

---->AllocateAllPlugins--->AllocatePluginPath--->AllocatePluginDir---->AllocatePluginFile

一、----->module_InitDynamic (src\modules\bank.c)  此介面中完成模組構造

其中:

1,module_Load (plugin.c) 完成庫載入 WINDOWS使用API: LoadLibrary

2,vlc_plugin_cb entry = (vlc_plugin_cb) module_Lookup

(handle, entry_name); (plugin.c)

 查詢模組的建構函式,所有模組為  vlc_entry__版本號 如(vlc_entry__2_2_0b)此介面在模組中是顯示看不見的,是由巨集vlc_module_begin ()、vlc_module_end ()對實現的,展開後才能見到。

WINDOWS使用API:GetProcAddress

3,module_t *module = vlc_plugin_describe (entry);  

   這兒實現了建構函式的呼叫。生成了VLC的模組記憶體module。

  將模組屬性配置完成,模組使用時需要呼叫的介面指標(一般為Open  Close)也放入了模組。

二、------>module_StoreBank (module);  

此介面中將生成模組記憶體關聯模組連結串列  modules  (這是一個全域性變數,通過內部連結串列將所有模組串起來)

模組使用:使用時需要用到modules.c中的幾個介面。

例:input.c     執行緒中

Run---->Init---->InitSout---->Input_resource_RequestSout--->RequestSout

---->sout_NewInstance--->sout_StreamChainNew----->sout_StreamNew中:

p_stream->p_module = module_need( p_stream, "sout stream", p_stream->psz_name, true );

此介面內部呼叫vlc_module_load---->module_load---->generic_start  即呼叫了模組的啟用介面(一般為Open)