gstreamer插件工作原理与流程分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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的插件加载原理与过程的分析。