diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2009-01-06 17:58:59 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2009-01-06 17:58:59 +0000 |
commit | 2ae03ba72fa81379c0f059ca4229f70202e0b9bf (patch) | |
tree | 004e233acff8a6985101dd6640bec7080b9d40c0 /gst/gstregistrybinary.c | |
parent | 15e2bf52141aefdd458e4363be6b2a4710a4e7dd (diff) |
Add API for making a GStreamer plugin 'dependent' on external files, directories or environment variables, so that GS...
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt::
* gst/gst_private.h: (GstPluginDep), (_GstPluginPrivate):
* gst/gstplugin.c: (gst_plugin_init), (gst_plugin_finalize),
(gst_plugin_class_init), (gst_plugin_list_free),
(gst_plugin_ext_dep_get_env_vars_hash),
(_priv_plugin_deps_env_vars_changed),
(gst_plugin_ext_dep_extract_env_vars_paths),
(gst_plugin_ext_dep_get_hash_from_stat_entry),
(gst_plugin_ext_dep_direntry_matches),
(gst_plugin_ext_dep_scan_dir_and_match_names),
(gst_plugin_ext_dep_scan_path_with_filenames),
(gst_plugin_ext_dep_get_stat_hash),
(_priv_plugin_deps_files_changed), (gst_plugin_ext_dep_free),
(gst_plugin_ext_dep_strv_equal), (gst_plugin_ext_dep_equals),
(gst_plugin_add_dependency), (gst_plugin_add_dependency_simple):
* gst/gstplugin.h: (GstPluginPrivate), (GstPluginFlags),
(GST_PLUGIN_DEPENDENCY_FLAG_NONE),
(GST_PLUGIN_DEPENDENCY_FLAG_RECURSE),
(GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY),
(GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX),
(GstPluginDependencyFlags), (GstPluginFilter):
* gst/gstregistry.c: (gst_registry_scan_path_level):
* gst/gstregistrybinary.c: (gst_registry_binary_save_feature),
(gst_registry_binary_save_plugin_dep),
(gst_registry_binary_save_plugin),
(gst_registry_binary_load_feature),
(gst_registry_binary_load_plugin_dep_strv),
(gst_registry_binary_load_plugin_dep),
(gst_registry_binary_load_plugin):
* gst/gstregistrybinary.h: (GST_MAGIC_BINARY_VERSION_STR),
(GstBinaryPluginElement), (_GstBinaryDep), (GstBinaryDep):
* gst/gstregistryxml.c: (gst_registry_xml_save_plugin):
Add API for making a GStreamer plugin 'dependent' on external files,
directories or environment variables, so that GStreamer knows when
it needs to re-load GStreamer plugins that wrap other plugin systems.
Fixes bug #350477.
API: add gst_plugin_add_dependency()
API: add gst_plugin_add_dependency_simple()
Diffstat (limited to 'gst/gstregistrybinary.c')
-rw-r--r-- | gst/gstregistrybinary.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/gst/gstregistrybinary.c b/gst/gstregistrybinary.c index a1a21ef2a6..7c2ecfcf26 100644 --- a/gst/gstregistrybinary.c +++ b/gst/gstregistrybinary.c @@ -554,6 +554,38 @@ fail: return FALSE; } +static gboolean +gst_registry_binary_save_plugin_dep (GList ** list, GstPluginDep * dep) +{ + GstBinaryDep *ed; + GstBinaryChunk *chk; + gchar **s; + + ed = g_new0 (GstBinaryDep, 1); + chk = gst_registry_binary_make_data (ed, sizeof (GstBinaryDep)); + + ed->flags = dep->flags; + ed->n_env_vars = 0; + ed->n_paths = 0; + ed->n_names = 0; + + ed->env_hash = dep->env_hash; + ed->stat_hash = dep->stat_hash; + + for (s = dep->env_vars; s != NULL && *s != NULL; ++s, ++ed->n_env_vars) + gst_registry_binary_save_string (list, *s); + + for (s = dep->paths; s != NULL && *s != NULL; ++s, ++ed->n_paths) + gst_registry_binary_save_string (list, *s); + + for (s = dep->names; s != NULL && *s != NULL; ++s, ++ed->n_names) + gst_registry_binary_save_string (list, *s); + + *list = g_list_prepend (*list, chk); + + GST_LOG ("Saved external plugin dependency"); + return TRUE; +} /* * gst_registry_binary_save_plugin: @@ -575,8 +607,18 @@ gst_registry_binary_save_plugin (GList ** list, GstRegistry * registry, pe->file_size = plugin->file_size; pe->file_mtime = plugin->file_mtime; + pe->n_deps = 0; pe->nfeatures = 0; + /* pack external deps */ + for (walk = plugin->priv->deps; walk != NULL; walk = walk->next) { + if (!gst_registry_binary_save_plugin_dep (list, walk->data)) { + GST_ERROR ("Could not save external plugin dependency, aborting."); + goto fail; + } + ++pe->n_deps; + } + /* pack plugin features */ plugin_features = gst_registry_get_feature_list_by_plugin (registry, plugin->desc.name); @@ -954,6 +996,57 @@ fail: return FALSE; } +static gchar ** +gst_registry_binary_load_plugin_dep_strv (gchar ** in, guint n) +{ + gchar **arr; + + if (n == 0) + return NULL; + + arr = g_new0 (gchar *, n + 1); + while (n > 0) { + unpack_string (*in, arr[n - 1]); + --n; + } + return arr; +} + +static gboolean +gst_registry_binary_load_plugin_dep (GstPlugin * plugin, gchar ** in) +{ + GstPluginDep *dep; + GstBinaryDep *d; + gchar **s; + + align (*in); + GST_LOG_OBJECT (plugin, "Unpacking GstBinaryDep from %p", *in); + unpack_element (*in, d, GstBinaryDep); + + dep = g_new0 (GstPluginDep, 1); + + dep->env_hash = d->env_hash; + dep->stat_hash = d->stat_hash; + + dep->flags = d->flags; + + dep->names = gst_registry_binary_load_plugin_dep_strv (in, d->n_names); + dep->paths = gst_registry_binary_load_plugin_dep_strv (in, d->n_paths); + dep->env_vars = gst_registry_binary_load_plugin_dep_strv (in, d->n_env_vars); + + plugin->priv->deps = g_list_append (plugin->priv->deps, dep); + + GST_DEBUG_OBJECT (plugin, "Loaded external plugin dependency from registry: " + "env_hash: %08x, stat_hash: %08x", dep->env_hash, dep->stat_hash); + for (s = dep->env_vars; s != NULL && *s != NULL; ++s) + GST_LOG_OBJECT (plugin, " evar: %s", *s); + for (s = dep->paths; s != NULL && *s != NULL; ++s) + GST_LOG_OBJECT (plugin, " path: %s", *s); + for (s = dep->names; s != NULL && *s != NULL; ++s) + GST_LOG_OBJECT (plugin, " name: %s", *s); + + return TRUE; +} /* * gst_registry_binary_load_plugin: @@ -1004,6 +1097,8 @@ gst_registry_binary_load_plugin (GstRegistry * registry, gchar ** in) gst_registry_add_plugin (registry, plugin); GST_DEBUG ("Added plugin '%s' plugin with %d features from binary registry", plugin->desc.name, pe->nfeatures); + + /* Load plugin features */ for (i = 0; i < pe->nfeatures; i++) { if (!gst_registry_binary_load_feature (registry, in, plugin->desc.name)) { GST_ERROR ("Error while loading binary feature"); @@ -1011,6 +1106,14 @@ gst_registry_binary_load_plugin (GstRegistry * registry, gchar ** in) } } + /* Load external plugin dependencies */ + for (i = 0; i < pe->n_deps; ++i) { + if (!gst_registry_binary_load_plugin_dep (plugin, in)) { + GST_ERROR_OBJECT (plugin, "Could not read external plugin dependency"); + goto fail; + } + } + return TRUE; /* Errors */ |