gstreamer插件工作原理与流程分析
来源:互联网 发布:合肥淘宝兼职 编辑:程序博客网 时间:2024/05/24 01:49
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的插件加载原理与过程的分析。
- gstreamer插件工作原理与流程分析
- gstreamer插件工作原理与流程分析 .
- gstreamer插件工作原理与流程分析
- gstreamer插件工作原理与流程分析
- gstreamer插件工作原理与流程分析
- Gstreamer工作原理分析
- (转)Gstreamer工作原理分析
- Gstreamer动态插件的实现与原理
- gstreamer教程系列之动态插件的实现与原理
- servlet工作原理与流程
- Struts2工作原理与Struts2工作流程
- Gstreamer的playbin2 插件分析
- struts2核心工作流程与原理
- 传智播客 struts1.x 工作原理与流程
- struts2核心工作流程与原理
- struts2核心工作流程与原理
- struts2核心工作流程与原理
- struts2核心工作流程与原理
- Oracle Merge into详细介绍
- dex文件分析-8
- HBase Master 解析
- java collection 之用法,登陆注册功能的实现
- boost库之property tree库,解析JSON、XML、INI等
- gstreamer插件工作原理与流程分析
- CodeForces 556A
- adfs
- NSMutableString 可变字符串
- shell调试选项
- Unity5的AssetBundle的一点使用心得
- Snail—UI学习之UITableView之自定义UITableViewCell
- 趣味数组(一)
- Android5.0 Framework框架源码剖析声明