summaryrefslogtreecommitdiff
path: root/gst/gstregistrybinary.c
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2009-01-06 17:58:59 +0000
committerTim-Philipp Müller <tim@centricular.net>2009-01-06 17:58:59 +0000
commit2ae03ba72fa81379c0f059ca4229f70202e0b9bf (patch)
tree004e233acff8a6985101dd6640bec7080b9d40c0 /gst/gstregistrybinary.c
parent15e2bf52141aefdd458e4363be6b2a4710a4e7dd (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.c103
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 */