gstreamer插件工作原理与流程分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

gstreamer插件工作原理与流程分析

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,都需要在XXX.c文件中定义plugin_init函数和宏GST_PLUGIN_DEFINE。宏GST_PLUGIN_DEFINE用于定义一个plugin的入口点和元数据。同时,它用于输出(export)一个plugin,这样它就就可以被其他应用程序使用。

我们看一个实际的例子:

至此,我们完成了gstreamer的插件加载原理与过程的分析。

相关文档
最新文档