registry: allow plugins to cache extra data in registry. Fixes #570233
authorStefan Kost <ensonic@users.sf.net>
Sun, 7 Jun 2009 20:46:54 +0000 (23:46 +0300)
committerStefan Kost <ensonic@users.sf.net>
Sun, 7 Jun 2009 20:48:59 +0000 (23:48 +0300)
Add a GstStructure to GstPlugin. Plugins can retieve it in plugin_init and
access the cached info or build the cache and store it there.

docs/gst/gstreamer-sections.txt
gst/gst_private.h
gst/gstplugin.c
gst/gstplugin.h
gst/gstregistrybinary.c
gst/gstregistrybinary.h
win32/common/libgstreamer.def

index 925cb34..048d24f 100644 (file)
@@ -1717,6 +1717,8 @@ gst_plugin_get_source
 gst_plugin_get_version
 gst_plugin_get_module
 gst_plugin_is_loaded
+gst_plugin_get_cache_data
+gst_plugin_set_cache_data
 gst_plugin_name_filter
 gst_plugin_load_file
 gst_plugin_load
index 553f716..ce65f5c 100644 (file)
@@ -68,6 +68,7 @@ typedef struct {
 
 struct _GstPluginPrivate {
   GList *deps;    /* list of GstPluginDep structures */
+  GstStructure *cache_data;
 };
 
 gboolean _priv_plugin_deps_env_vars_changed (GstPlugin * plugin);
index a27ef69..e3eea17 100644 (file)
@@ -137,6 +137,10 @@ gst_plugin_finalize (GObject * object)
   g_list_free (plugin->priv->deps);
   plugin->priv->deps = NULL;
 
+  if (plugin->priv->cache_data) {
+    gst_structure_free (plugin->priv->cache_data);
+  }
+
   G_OBJECT_CLASS (gst_plugin_parent_class)->finalize (object);
 }
 
@@ -853,6 +857,45 @@ gst_plugin_is_loaded (GstPlugin * plugin)
   return (plugin->module != NULL || plugin->filename == NULL);
 }
 
+/**
+ * gst_plugin_get_cache_data:
+ * @plugin: a plugin
+ *
+ * Gets the plugin specific data cache. If it is %NULL there is no cached data
+ * stored. This is the case when the registry is getting rebuild.
+ *
+ * Returns: The cached data as a #GstStructure or %NULL.
+ */
+G_CONST_RETURN GstStructure *
+gst_plugin_get_cache_data (GstPlugin * plugin)
+{
+  g_return_val_if_fail (GST_IS_PLUGIN (plugin), NULL);
+
+  return plugin->priv->cache_data;
+}
+
+/**
+ * gst_plugin_set_cache_data:
+ * @plugin: a plugin
+ * @cache_data: a structure containing the data to cache
+ *
+ * Adds plugin specific data to cache. Passes the ownership of the structure to
+ * the @plugin.
+ *
+ * The cache is flushed every time the registry is rebuild.
+ */
+void
+gst_plugin_set_cache_data (GstPlugin * plugin, GstStructure * cache_data)
+{
+  g_return_if_fail (GST_IS_PLUGIN (plugin));
+  g_return_if_fail (GST_IS_STRUCTURE (cache_data));
+
+  if (plugin->priv->cache_data) {
+    gst_structure_free (plugin->priv->cache_data);
+  }
+  plugin->priv->cache_data = cache_data;
+}
+
 #if 0
 /**
  * gst_plugin_feature_list:
index d77f857..de4a0d7 100644 (file)
@@ -32,6 +32,7 @@
 #include <gmodule.h>
 #include <gst/gstobject.h>
 #include <gst/gstmacros.h>
+#include <gst/gststructure.h>
 
 G_BEGIN_DECLS
 
@@ -345,6 +346,9 @@ G_CONST_RETURN gchar*       gst_plugin_get_license          (GstPlugin *plugin);
 G_CONST_RETURN gchar*  gst_plugin_get_source           (GstPlugin *plugin);
 G_CONST_RETURN gchar*  gst_plugin_get_package          (GstPlugin *plugin);
 G_CONST_RETURN gchar*  gst_plugin_get_origin           (GstPlugin *plugin);
+G_CONST_RETURN GstStructure*   gst_plugin_get_cache_data       (GstPlugin * plugin);
+void           gst_plugin_set_cache_data       (GstPlugin * plugin, GstStructure *cache_data);
+
 GModule *              gst_plugin_get_module           (GstPlugin *plugin);
 gboolean               gst_plugin_is_loaded            (GstPlugin *plugin);
 
index 7e33e49..654354a 100644 (file)
@@ -674,6 +674,14 @@ gst_registry_binary_save_plugin (GList ** list, GstRegistry * registry,
 
   gst_plugin_feature_list_free (plugin_features);
 
+  /* pack cache data */
+  if (plugin->priv->cache_data) {
+    gchar *cache_str = gst_structure_to_string (plugin->priv->cache_data);
+    gst_registry_binary_save_string (list, cache_str);
+  } else {
+    gst_registry_binary_save_const_string (list, "");
+  }
+
   /* pack plugin element strings */
   gst_registry_binary_save_const_string (list, plugin->desc.origin);
   gst_registry_binary_save_const_string (list, plugin->desc.package);
@@ -1111,6 +1119,7 @@ gst_registry_binary_load_plugin (GstRegistry * registry, gchar ** in,
 {
   GstBinaryPluginElement *pe;
   GstPlugin *plugin = NULL;
+  gchar *cache_str = NULL;
   guint i;
 
   align (*in);
@@ -1142,6 +1151,13 @@ gst_registry_binary_load_plugin (GstRegistry * registry, gchar ** in,
   GST_LOG ("  desc.package='%s'", plugin->desc.package);
   GST_LOG ("  desc.origin='%s'", plugin->desc.origin);
 
+  /* unpack cache data */
+  unpack_string (*in, cache_str, end, fail);
+  if (*cache_str) {
+    plugin->priv->cache_data = gst_structure_from_string (cache_str, NULL);
+  }
+  g_free (cache_str);
+
   plugin->basename = g_path_get_basename (plugin->filename);
 
   /* Takes ownership of plugin */
index bcdb8a6..a6ceab2 100644 (file)
@@ -57,7 +57,7 @@
  * This _must_ be updated whenever the registry format changes,
  * we currently use the core version where this change happened.
  */
-#define GST_MAGIC_BINARY_VERSION_STR ("0.10.21.2")
+#define GST_MAGIC_BINARY_VERSION_STR ("0.10.23.1")
 
 /*
  * GST_MAGIC_BINARY_VERSION_LEN:
index 7cb014c..006ad95 100644 (file)
@@ -703,6 +703,7 @@ EXPORTS
        gst_plugin_feature_set_rank
        gst_plugin_feature_type_name_filter
        gst_plugin_flags_get_type
+       gst_plugin_get_cache_data
        gst_plugin_get_description
        gst_plugin_get_filename
        gst_plugin_get_license
@@ -721,6 +722,7 @@ EXPORTS
        gst_plugin_name_filter
        gst_plugin_register_static
        gst_plugin_register_static_full
+       gst_plugin_set_cache_data
        gst_poll_add_fd
        gst_poll_fd_can_read
        gst_poll_fd_can_write