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的插件加载原理与过程的分析。

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院