registry: allow plugins to cache extra data in registry. Fixes #570233

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.
This commit is contained in:
Stefan Kost 2009-06-07 23:46:54 +03:00
parent 55577a48ea
commit ed88db818b
7 changed files with 69 additions and 1 deletions

View 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

View 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);

View 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:

View 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);

View 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 */

View 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:

View 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