Original commit message from CVS:
* check/Makefile.am:
* check/generic/states.c:
* gst/Makefile.am:
* gst/gst.c:
* gst/gst.h:
* gst/gst_private.h:
* gst/gstelementfactory.c:
* gst/gstindex.c:
* gst/gstinfo.c:
* gst/gstplugin.c:
* gst/gstplugin.h:
* gst/gstpluginfeature.c:
* gst/gstpluginfeature.h:
* gst/gstregistry.c:
* gst/gstregistry.h:
* gst/gstregistrypool.c: remove
* gst/gstregistrypool.h: remove
* gst/gsttypefind.c:
* gst/gsttypefindfactory.c:
* gst/gsturi.c:
* tools/Makefile.am:
* tools/gst-compprep.c:
* tools/gst-inspect.c:
* tools/gst-register.c: remove
* tools/gst-xmlinspect.c:
Registry rewrite.  Changes registry from being a file created
by a tool into a simple cache file created automatically by
libgstreamer.  Removed gst-register (because it's no longer
needed).  Remove registry pools, because we only have one
registry implementation (XML).  Fix up other subsystems as
necessary.
This commit is contained in:
David Schleef 2005-09-15 00:13:26 +00:00
parent d587018043
commit a3bac0703c
28 changed files with 671 additions and 1408 deletions

View file

@ -1,3 +1,37 @@
2005-09-14 David Schleef <ds@schleef.org>
* check/Makefile.am:
* check/generic/states.c:
* gst/Makefile.am:
* gst/gst.c:
* gst/gst.h:
* gst/gst_private.h:
* gst/gstelementfactory.c:
* gst/gstindex.c:
* gst/gstinfo.c:
* gst/gstplugin.c:
* gst/gstplugin.h:
* gst/gstpluginfeature.c:
* gst/gstpluginfeature.h:
* gst/gstregistry.c:
* gst/gstregistry.h:
* gst/gstregistrypool.c: remove
* gst/gstregistrypool.h: remove
* gst/gsttypefind.c:
* gst/gsttypefindfactory.c:
* gst/gsturi.c:
* tools/Makefile.am:
* tools/gst-compprep.c:
* tools/gst-inspect.c:
* tools/gst-register.c: remove
* tools/gst-xmlinspect.c:
Registry rewrite. Changes registry from being a file created
by a tool into a simple cache file created automatically by
libgstreamer. Removed gst-register (because it's no longer
needed). Remove registry pools, because we only have one
registry implementation (XML). Fix up other subsystems as
necessary.
2005-09-13 Michael Smith <msmith@fluendo.com>
* gst/gstconfig.h.in:

View file

@ -10,14 +10,10 @@ REGISTRY_ENVIRONMENT = \
TESTS_ENVIRONMENT = \
$(REGISTRY_ENVIRONMENT) \
GST_PLUGIN_PATH_ONLY=yes \
GST_PLUGIN_PATH=$(top_builddir)/gst
GST_PLUGIN_PATH=$(top_builddir)/gst/elements/.libs:$(top_builddir)/gst/indexers/.libs
plugindir = $(libdir)/gstreamer-@GST_MAJORMINOR@
# rebuild gst-register-@GST_MAJORMINOR@ if needed
$(top_builddir)/tools/gst-register-@GST_MAJORMINOR@$(EXEEXT):
cd $(top_builddir)/tools && make
# override to _not_ install the test plugins
install-pluginLTLIBRARIES:
@ -28,10 +24,6 @@ SUPPRESSIONS = $(top_srcdir)/common/gst.supp
clean-local: clean-local-check
$(CHECK_REGISTRY):
$(TESTS_ENVIRONMENT) \
$(top_builddir)/tools/gst-register-@GST_MAJORMINOR@
check_PROGRAMS = \
gst/gst \
gst/gstbin \
@ -60,8 +52,7 @@ check_PROGRAMS = \
gst-libs/controller \
gst-libs/gdp
TESTS = $(top_builddir)/tools/gst-register-@GST_MAJORMINOR@ \
$(check_PROGRAMS)
TESTS = $(check_PROGRAMS)
noinst_HEADERS = gst/capslist.h
@ -94,6 +85,5 @@ TESTS_THREADED = \
gst/gstobject
VALGRIND_TESTS_DISABLE = \
$(top_builddir)/tools/gst-register-@GST_MAJORMINOR@ \
$(TESTS_THREADED) \
$(TESTS_TO_FIX)

View file

@ -29,7 +29,8 @@ GST_START_TEST (test_state_changes)
GstElement *element;
GList *features, *f;
features = gst_registry_pool_feature_list (GST_TYPE_ELEMENT_FACTORY);
features = gst_registry_get_feature_list (gst_registry_get_default (),
GST_TYPE_ELEMENT_FACTORY);
for (f = features; f; f = f->next) {
GstPluginFeature *feature = f->data;

View file

@ -28,16 +28,6 @@ else
GST_TRACE_SRC = gsttrace.c
endif
if GST_DISABLE_REGISTRY
GST_REGISTRY_SRC =
SUBDIRS_REGISTRY =
GST_REGISTRY_LA =
else
GST_REGISTRY_SRC = gstregistry.c
SUBDIRS_REGISTRY = registries
GST_REGISTRY_LA = registries/libgstxmlregistry.la
endif
if GST_DISABLE_ENUMTYPES
GST_ENUMTYPES_SRC =
else
@ -64,8 +54,8 @@ else
GST_URI_SRC = gsturi.c
endif
SUBDIRS = $(SUBDIRS_PARSE) $(SUBDIRS_REGISTRY) . base elements $(SUBDIRS_INDEX) $(SUBDIRS_CHECK)
DIST_SUBDIRS = base elements parse registries indexers check
SUBDIRS = $(SUBDIRS_PARSE) . base elements $(SUBDIRS_INDEX) $(SUBDIRS_CHECK)
DIST_SUBDIRS = base elements parse indexers check
# make variables for all generated source and header files to make the
# distinction clear
@ -107,6 +97,8 @@ libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
gstquery.c \
gstqueryutils.c \
gstqueue.c \
gstregistry.c \
gstregistryxml.c \
gststructure.c \
gstsystemclock.c \
gsttaglist.c \
@ -120,8 +112,6 @@ libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
gsturitype.c \
gstutils.c \
gstvalue.c \
$(GST_REGISTRY_SRC) \
gstregistrypool.c \
$(GST_PARSE_SRC) \
$(GSTARCH_SRCS) \
$(GST_LOADSAVE_SRC)
@ -145,10 +135,11 @@ libgstreamer_@GST_MAJORMINOR@_la_CFLAGS = \
-DG_LOG_DOMAIN=g_log_domain_gstreamer \
-DGST_MAJORMINOR=\""$(GST_MAJORMINOR)"\"
libgstreamer_@GST_MAJORMINOR@_la_LIBADD = \
$(GST_LIB_LIBS) $(GST_PARSE_LA) $(GST_REGISTRY_LA)
$(GST_LIB_LIBS) $(GST_PARSE_LA)
libgstreamer_@GST_MAJORMINOR@_la_LDFLAGS = \
@GST_LT_LDFLAGS@ -version-info @GST_LIBVERSION@ \
-export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*
-export-symbols-regex [_]*\(gst_\|Gst\|GST_\).* \
-no-undefined
libgstreamer_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst
@ -198,7 +189,6 @@ gst_headers = \
gstutils.h \
gstvalue.h \
gstregistry.h \
gstregistrypool.h \
gstparse.h \
gstxml.h

175
gst/gst.c
View file

@ -102,10 +102,6 @@
#include "gst.h"
#include "gstqueue.h"
#ifndef GST_DISABLE_REGISTRY
#include "registries/gstxmlregistry.h"
#endif /* GST_DISABLE_REGISTRY */
#include "gstregistrypool.h"
#define GST_CAT_DEFAULT GST_CAT_GST_INIT
@ -114,9 +110,6 @@
#ifndef GST_DISABLE_REGISTRY
gboolean _gst_registry_auto_load = TRUE;
static GstRegistry *_global_registry;
static GstRegistry *_user_registry;
static gboolean _gst_registry_fixed = FALSE;
#endif
static gboolean gst_initialized = FALSE;
@ -165,8 +158,7 @@ enum
ARG_PLUGIN_SPEW,
ARG_PLUGIN_PATH,
ARG_PLUGIN_LOAD,
ARG_SEGTRAP_DISABLE,
ARG_REGISTRY
ARG_SEGTRAP_DISABLE
};
/* debug-spec ::= category-spec [, category-spec]*
@ -308,8 +300,6 @@ gst_init_get_popt_table (void)
ARG_SEGTRAP_DISABLE,
N_("Disable trapping of segmentation faults during plugin loading"),
NULL},
{"gst-registry", NUL, POPT_ARG_STRING | POPT_ARGFLAG_STRIP, NULL,
ARG_REGISTRY, N_("Registry to use"), N_("REGISTRY")},
POPT_TABLEEND
};
static gboolean inited = FALSE;
@ -501,9 +491,8 @@ gst_init_check_with_popt_table (int *argc, char **argv[],
static void
add_path_func (gpointer data, gpointer user_data)
{
GstRegistry *registry = GST_REGISTRY (user_data);
gst_registry_add_path (registry, (gchar *) data);
GST_INFO ("Adding plugin path: \"%s\"", (gchar *) data);
gst_registry_scan_path (gst_registry_get_default (), (gchar *) data);
}
#endif
@ -527,7 +516,7 @@ load_plugin_func (gpointer data, gpointer user_data)
if (plugin) {
GST_INFO ("Loaded plugin: \"%s\"", filename);
gst_registry_pool_add_plugin (plugin);
gst_default_registry_add_plugin (plugin);
} else {
if (err) {
/* Report error to user, and free error */
@ -571,8 +560,6 @@ split_and_iterate (const gchar * stringlist, gchar * separator, GFunc iterator,
static gboolean
init_pre (void)
{
const gchar *plugin_path;
g_type_init ();
if (g_thread_supported ()) {
@ -606,50 +593,6 @@ init_pre (void)
GST_INFO ("Initializing GStreamer Core Library version %s", VERSION);
GST_INFO ("Using library from %s", LIBDIR);
#ifndef GST_DISABLE_REGISTRY
{
gchar *user_reg;
const gchar *homedir;
_global_registry =
gst_xml_registry_new ("global_registry", GLOBAL_REGISTRY_FILE);
#ifdef PLUGINS_USE_BUILDDIR
/* location libgstelements.so */
gst_registry_add_path (_global_registry, PLUGINS_BUILDDIR "/libs/gst");
gst_registry_add_path (_global_registry, PLUGINS_BUILDDIR "/gst/elements");
gst_registry_add_path (_global_registry, PLUGINS_BUILDDIR "/gst/types");
gst_registry_add_path (_global_registry, PLUGINS_BUILDDIR "/gst/autoplug");
gst_registry_add_path (_global_registry, PLUGINS_BUILDDIR "/gst/indexers");
#endif /* PLUGINS_USE_BUILDDIR */
plugin_path = g_getenv ("GST_PLUGIN_PATH");
#ifndef GST_DISABLE_REGISTRY
split_and_iterate (plugin_path, G_SEARCHPATH_SEPARATOR_S, add_path_func,
_global_registry);
#endif /* GST_DISABLE_REGISTRY */
#ifndef PLUGINS_USE_BUILDDIR
/* add the main (installed) library path as the last path
* if GST_PLUGIN_PATH_ONLY not set */
if (g_getenv ("GST_PLUGIN_PATH_ONLY") == NULL) {
gst_registry_add_path (_global_registry, PLUGINS_DIR);
}
#endif
if (g_getenv ("GST_REGISTRY")) {
user_reg = g_strdup (g_getenv ("GST_REGISTRY"));
} else {
homedir = g_get_home_dir ();
user_reg = g_strjoin ("/", homedir, LOCAL_REGISTRY_FILE, NULL);
}
_user_registry = gst_xml_registry_new ("user_registry", user_reg);
g_free (user_reg);
}
#endif /* GST_DISABLE_REGISTRY */
return TRUE;
}
@ -674,7 +617,6 @@ static GstPluginDesc plugin_desc = {
"gstcoreelements",
"core elements of the GStreamer library",
gst_register_core_elements,
NULL,
VERSION,
GST_LICENSE,
PACKAGE,
@ -736,25 +678,66 @@ init_post (void)
_gst_tag_initialize ();
#ifndef GST_DISABLE_REGISTRY
if (!_gst_registry_fixed) {
/* don't override command-line options */
if (g_getenv ("GST_REGISTRY")) {
g_object_set (_global_registry, "location", g_getenv ("GST_REGISTRY"),
NULL);
_gst_registry_fixed = TRUE;
{
char *registry_file;
const char *plugin_path;
GstRegistry *default_registry;
default_registry = gst_registry_get_default ();
registry_file = g_strdup (g_getenv ("GST_REGISTRY"));
if (registry_file == NULL) {
registry_file = g_build_filename (g_get_home_dir (),
".gstreamer-0.9", "registry.xml", NULL);
}
}
gst_registry_xml_read_cache (default_registry, registry_file);
if (!_gst_registry_fixed) {
gst_registry_pool_add (_global_registry, 100);
gst_registry_pool_add (_user_registry, 50);
} else {
plugin_path = g_getenv ("GST_PLUGIN_SYSTEM_PATH");
if (plugin_path == NULL) {
#ifdef PLUGINS_USE_BUILDDIR
/* location libgstelements.so */
gst_registry_scan_path (default_registry,
PLUGINS_BUILDDIR "/gst/elements/.libs");
gst_registry_scan_path (default_registry,
PLUGINS_BUILDDIR "/gst/indexers/.libs");
#else
char *home_plugins;
gst_registry_pool_add (_global_registry, 100);
}
/* add the main (installed) library path */
gst_registry_scan_path (default_registry, PLUGINS_DIR);
if (_gst_registry_auto_load) {
gst_registry_pool_load_all ();
home_plugins = g_build_filename (g_get_home_dir (),
".gstreamer-0.9", "plugins", NULL);
gst_registry_scan_path (default_registry, home_plugins);
g_free (home_plugins);
#endif /* PLUGINS_USE_BUILDDIR */
} else {
char **list;
int i;
/* FIXME this doesn't split paths correctly on windows */
list = g_strsplit (plugin_path, ":", 0);
for (i = 0; list[i]; i++) {
gst_registry_scan_path (default_registry, list[i]);
}
}
plugin_path = g_getenv ("GST_PLUGIN_PATH");
if (plugin_path) {
char **list;
int i;
/* FIXME this doesn't split paths correctly on windows */
list = g_strsplit (plugin_path, ":", 0);
for (i = 0; list[i]; i++) {
gst_registry_scan_path (default_registry, list[i]);
}
}
gst_registry_xml_write_cache (default_registry, registry_file);
_gst_registry_remove_cache_plugins (default_registry);
g_free (registry_file);
}
#endif /* GST_DISABLE_REGISTRY */
@ -776,6 +759,12 @@ init_post (void)
}
#ifndef GST_DISABLE_GST_DEBUG
static gboolean
select_all (GstPlugin * plugin, gpointer user_data)
{
return TRUE;
}
static gint
sort_by_category_name (gconstpointer a, gconstpointer b)
{
@ -786,29 +775,19 @@ static void
gst_debug_help (void)
{
GSList *list, *walk;
GList *list2, *walk2;
GList *list2, *g;
if (!init_post ())
exit (1);
walk2 = list2 = gst_registry_pool_plugin_list ();
while (walk2) {
GstPlugin *plugin = GST_PLUGIN (walk2->data);
list2 = gst_registry_plugin_filter (gst_registry_get_default (),
select_all, FALSE, NULL);
walk2 = g_list_next (walk2);
/* FIXME this is gross. why don't debug have categories PluginFeatures? */
for (g = list2; g; g = g_list_next (g)) {
GstPlugin *plugin = GST_PLUGIN (g->data);
if (!gst_plugin_is_loaded (plugin)) {
#ifndef GST_DISABLE_REGISTRY
if (GST_IS_REGISTRY (plugin->manager)) {
GST_CAT_LOG (GST_CAT_PLUGIN_LOADING, "loading plugin %s",
plugin->desc.name);
if (gst_registry_load_plugin (GST_REGISTRY (plugin->manager),
plugin) != GST_REGISTRY_OK)
GST_CAT_WARNING (GST_CAT_PLUGIN_LOADING, "loading plugin %s failed",
plugin->desc.name);
}
#endif /* GST_DISABLE_REGISTRY */
}
gst_plugin_load (plugin);
}
g_list_free (list2);
@ -896,7 +875,7 @@ init_popt_callback (poptContext context, enum poptCallbackReason reason,
case ARG_PLUGIN_PATH:
#ifndef GST_DISABLE_REGISTRY
split_and_iterate (arg, G_SEARCHPATH_SEPARATOR_S, add_path_func,
_user_registry);
NULL);
#endif /* GST_DISABLE_REGISTRY */
break;
case ARG_PLUGIN_LOAD:
@ -905,12 +884,6 @@ init_popt_callback (poptContext context, enum poptCallbackReason reason,
case ARG_SEGTRAP_DISABLE:
_gst_disable_segtrap = TRUE;
break;
case ARG_REGISTRY:
#ifndef GST_DISABLE_REGISTRY
g_object_set (G_OBJECT (_user_registry), "location", arg, NULL);
_gst_registry_fixed = TRUE;
#endif /* GST_DISABLE_REGISTRY */
break;
default:
g_warning ("option %d not recognized", option->val);
break;

View file

@ -67,7 +67,6 @@
#include <gst/gstparse.h>
#include <gst/gstregistry.h>
#include <gst/gstregistrypool.h>
/* API compatibility stuff */
#include <gst/gstcompat.h>

View file

@ -71,6 +71,7 @@ extern GstDebugCategory *GST_CAT_PARAMS;
extern GstDebugCategory *GST_CAT_CALL_TRACE;
extern GstDebugCategory *GST_CAT_SIGNAL;
extern GstDebugCategory *GST_CAT_PROBE;
extern GstDebugCategory *GST_CAT_REGISTRY;
#else
@ -101,6 +102,7 @@ extern GstDebugCategory *GST_CAT_PROBE;
#define GST_CAT_CALL_TRACE NULL
#define GST_CAT_SIGNAL NULL
#define GST_CAT_PROBE NULL
#define GST_CAT_REGISTRY NULL
#endif

View file

@ -67,12 +67,9 @@
#include "gst_private.h"
#include "gstelement.h"
#include "gstregistrypool.h"
#include "gstinfo.h"
#include "gsturi.h"
#ifndef GST_DISABLE_REGISTRY
#include "registries/gstxmlregistry.h" /* g_critical in gst_element_factory_create */
#endif
#include "gstregistry.h"
GST_DEBUG_CATEGORY_STATIC (element_factory_debug);
#define GST_CAT_DEFAULT element_factory_debug
@ -80,8 +77,6 @@ GST_DEBUG_CATEGORY_STATIC (element_factory_debug);
static void gst_element_factory_class_init (GstElementFactoryClass * klass);
static void gst_element_factory_init (GstElementFactory * factory);
static void gst_element_factory_unload_thyself (GstPluginFeature * feature);
static GstPluginFeatureClass *parent_class = NULL;
/* static guint gst_element_factory_signals[LAST_SIGNAL] = { 0 }; */
@ -126,8 +121,6 @@ gst_element_factory_class_init (GstElementFactoryClass * klass)
parent_class = g_type_class_peek_parent (klass);
gstpluginfeature_class->unload_thyself =
GST_DEBUG_FUNCPTR (gst_element_factory_unload_thyself);
}
static void
gst_element_factory_init (GstElementFactory * factory)
@ -156,7 +149,8 @@ gst_element_factory_find (const gchar * name)
g_return_val_if_fail (name != NULL, NULL);
feature = gst_registry_pool_find_feature (name, GST_TYPE_ELEMENT_FACTORY);
feature = gst_registry_find_feature (gst_registry_get_default (), name,
GST_TYPE_ELEMENT_FACTORY);
if (feature)
return GST_ELEMENT_FACTORY (feature);
@ -265,21 +259,11 @@ gst_element_register (GstPlugin * plugin, const gchar * name, guint rank,
g_return_val_if_fail (name != NULL, FALSE);
g_return_val_if_fail (g_type_is_a (type, GST_TYPE_ELEMENT), FALSE);
factory = gst_element_factory_find (name);
if (!factory) {
factory =
GST_ELEMENT_FACTORY (g_object_new (GST_TYPE_ELEMENT_FACTORY, NULL));
gst_plugin_feature_set_name (GST_PLUGIN_FEATURE (factory), name);
GST_LOG_OBJECT (factory, "Created new elementfactory for type %s",
g_type_name (type));
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
} else {
g_return_val_if_fail (factory->type == 0, FALSE);
gst_element_factory_cleanup (factory);
GST_LOG_OBJECT (factory, "Reuse existing elementfactory for type %s",
g_type_name (type));
}
factory = GST_ELEMENT_FACTORY (g_object_new (GST_TYPE_ELEMENT_FACTORY, NULL));
gst_plugin_feature_set_name (GST_PLUGIN_FEATURE (factory), name);
GST_LOG_OBJECT (factory, "Created new elementfactory for type %s",
g_type_name (type));
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
klass = GST_ELEMENT_CLASS (g_type_class_ref (type));
factory->type = type;
@ -348,8 +332,10 @@ gst_element_factory_create (GstElementFactory * factory, const gchar * name)
g_return_val_if_fail (factory != NULL, NULL);
if (!gst_plugin_feature_ensure_loaded (GST_PLUGIN_FEATURE (factory))) {
GST_INFO ("could not load element factory for element \"%s\"", name);
factory =
GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
(factory)));
if (factory == NULL) {
return NULL;
}
@ -360,19 +346,8 @@ gst_element_factory_create (GstElementFactory * factory, const gchar * name)
GST_INFO ("creating \"%s\"", GST_PLUGIN_FEATURE_NAME (factory));
if (factory->type == 0) {
#ifndef GST_DISABLE_REGISTRY
GstPlugin *plugin = GST_PLUGIN_FEATURE (factory)->manager;
g_critical ("Plugin didn't set object type in feature.");
g_critical
("Factory for `%s' has no type. This probably means the plugin wasn't found because the registry is broken. The plugin GStreamer was looking for is named '%s' and is expected in file '%s'. The registry for this plugin is located at '%s'",
GST_PLUGIN_FEATURE_NAME (factory),
gst_plugin_get_name (plugin), gst_plugin_get_filename (plugin),
GST_IS_XML_REGISTRY (plugin->manager) ? GST_XML_REGISTRY (plugin->
manager)->location : "Unknown");
#else
g_critical ("Factory for `%s' has no type",
GST_PLUGIN_FEATURE_NAME (factory));
#endif
return NULL;
}
@ -608,16 +583,3 @@ gst_element_factory_get_uri_protocols (GstElementFactory * factory)
return factory->uri_protocols;
}
static void
gst_element_factory_unload_thyself (GstPluginFeature * feature)
{
GstElementFactory *factory;
factory = GST_ELEMENT_FACTORY (feature);
if (factory->type) {
g_type_class_unref (g_type_class_peek (factory->type));
factory->type = 0;
}
}

View file

@ -23,9 +23,9 @@
#include "gst_private.h"
#include "gstinfo.h"
#include "gstregistrypool.h"
#include "gstindex.h"
#include "gstmarshal.h"
#include "gstregistry.h"
/* for constructing an entry name */
#include "gstelement.h"
#include "gstpad.h"
@ -959,7 +959,8 @@ gst_index_factory_find (const gchar * name)
GST_DEBUG ("gstindex: find \"%s\"", name);
feature = gst_registry_pool_find_feature (name, GST_TYPE_INDEX_FACTORY);
feature = gst_registry_find_feature (gst_registry_get_default (), name,
GST_TYPE_INDEX_FACTORY);
if (feature)
return GST_INDEX_FACTORY (feature);
@ -982,11 +983,13 @@ gst_index_factory_create (GstIndexFactory * factory)
g_return_val_if_fail (factory != NULL, NULL);
if (gst_plugin_feature_ensure_loaded (GST_PLUGIN_FEATURE (factory))) {
g_return_val_if_fail (factory->type != 0, NULL);
factory =
GST_INDEX_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
(factory)));
if (factory == NULL)
return NULL;
new = GST_INDEX (g_object_new (factory->type, NULL));
}
new = GST_INDEX (g_object_new (factory->type, NULL));
return new;
}

View file

@ -153,6 +153,7 @@ GstDebugCategory *GST_CAT_PARAMS = NULL;
GstDebugCategory *GST_CAT_CALL_TRACE = NULL;
GstDebugCategory *GST_CAT_SIGNAL = NULL;
GstDebugCategory *GST_CAT_PROBE = NULL;
GstDebugCategory *GST_CAT_REGISTRY = NULL;
/* FIXME: export this? */
gboolean
@ -276,6 +277,7 @@ _gst_debug_init (void)
GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, NULL);
GST_CAT_PROBE = _gst_debug_category_new ("GST_PROBE",
GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "pad probes");
GST_CAT_REGISTRY = _gst_debug_category_new ("GST_REGISTRY", 0, "registry");
/* print out the valgrind message if we're in valgrind */

View file

@ -38,9 +38,9 @@
#include "gstplugin.h"
#include "gstversion.h"
#include "gstregistrypool.h"
#include "gstinfo.h"
#include "gstfilter.h"
#include "gstregistry.h"
#define GST_CAT_DEFAULT GST_CAT_PLUGIN_LOADING
@ -74,31 +74,27 @@ static gchar *valid_licenses[] = {
NULL
};
static void gst_plugin_desc_copy (GstPluginDesc * dest,
const GstPluginDesc * src);
static GstPlugin *gst_plugin_register_func (GstPlugin * plugin,
GModule * module, GstPluginDesc * desc);
static void
gst_plugin_desc_copy (GstPluginDesc * dest, const GstPluginDesc * src);
static GstPlugin *
gst_plugin_copy (GstPlugin * plugin)
G_DEFINE_TYPE (GstPlugin, gst_plugin, G_TYPE_OBJECT);
static void
gst_plugin_init (GstPlugin * plugin)
{
return g_memdup (plugin, sizeof (*plugin));
}
GType
gst_plugin_get_type (void)
static void
gst_plugin_class_init (GstPluginClass * klass)
{
static GType plugin_type;
if (plugin_type == 0) {
plugin_type = g_boxed_type_register_static ("GstPlugin",
(GBoxedCopyFunc) gst_plugin_copy, g_free);
}
return plugin_type;
}
GQuark
gst_plugin_error_quark (void)
{
@ -128,11 +124,11 @@ _gst_plugin_register_static (GstPluginDesc * desc)
if (GST_CAT_DEFAULT)
GST_LOG ("attempting to load static plugin \"%s\" now...", desc->name);
plugin = g_new0 (GstPlugin, 1);
plugin = g_object_new (GST_TYPE_PLUGIN, NULL);
if (gst_plugin_register_func (plugin, main_module, desc)) {
if (GST_CAT_DEFAULT)
GST_INFO ("loaded static plugin \"%s\"", desc->name);
gst_registry_pool_add_plugin (plugin);
gst_default_registry_add_plugin (plugin);
}
}
}
@ -181,8 +177,6 @@ static GstPlugin *
gst_plugin_register_func (GstPlugin * plugin, GModule * module,
GstPluginDesc * desc)
{
g_assert (plugin->module == NULL);
if (!gst_plugin_check_version (desc->major_version, desc->minor_version)) {
if (GST_CAT_DEFAULT)
GST_INFO ("plugin \"%s\" has incompatible version, not loading",
@ -209,7 +203,6 @@ gst_plugin_register_func (GstPlugin * plugin, GModule * module,
GST_LOG ("plugin \"%s\" looks good", GST_STR_NULL (plugin->filename));
gst_plugin_desc_copy (&plugin->desc, desc);
plugin->module = module;
if (!((desc->plugin_init) (plugin))) {
if (GST_CAT_DEFAULT)
@ -301,94 +294,6 @@ _gst_plugin_fault_handler_setup (void)
static void _gst_plugin_fault_handler_setup ();
/**
* gst_plugin_check_module:
* @module: GModule handle to check for pluginness
* @error: pointer to a NULL-valued GError
* @pptr: pointer to a gpointer used to return the gst_plugin_desc symbol
* (can be NULL)
*
* Checks if the given module is a GStreamer plugin
*
* Returns: TRUE if the given module is a GStreamer plugin
*/
static gboolean
gst_plugin_check_module (GModule * module, const char *filename,
GError ** error, gpointer * pptr)
{
gpointer ptr;
if (pptr == NULL)
pptr = &ptr;
if (module == NULL) {
GST_DEBUG ("Error loading plugin %s, reason: %s", filename,
g_module_error ());
g_set_error (error, GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_MODULE,
"Error loading plugin %s, reason: %s", filename, g_module_error ());
return FALSE;
}
if (!g_module_symbol (module, "gst_plugin_desc", pptr)) {
GST_DEBUG ("Could not find plugin entry point in \"%s\"", filename);
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE,
"Could not find plugin entry point in \"%s\"", filename);
return FALSE;
}
return TRUE;
}
/**
* gst_plugin_check_file:
* @filename: the plugin filename to check for pluginness
* @error: pointer to a NULL-valued GError
*
* Checks if the given path represents a GStreamer plugin.
*
* Returns: TRUE if the given path is a GStreamer plugin.
*/
gboolean
gst_plugin_check_file (const gchar * filename, GError ** error)
{
GModule *module;
struct stat file_status;
gboolean check;
g_return_val_if_fail (filename != NULL, FALSE);
if (g_module_supported () == FALSE) {
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE, "Dynamic loading not supported");
return FALSE;
}
if (stat (filename, &file_status)) {
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE, "Problem accessing file %s: %s\n", filename,
strerror (errno));
return FALSE;
}
module = g_module_open (filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
if (!module) {
check = FALSE;
goto beach;
}
check = gst_plugin_check_module (module, filename, error, NULL);
g_module_close (module);
beach:
GST_INFO ("file \"%s\" %s look like a gst plugin", filename,
check ? "does" : "doesn't");
return check;
}
/**
* gst_plugin_load_file:
* @filename: the plugin filename to load
@ -403,66 +308,68 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
{
GstPlugin *plugin;
GModule *module;
GstPluginDesc *desc;
gboolean free_plugin;
gboolean ret;
gpointer ptr;
struct stat file_status;
g_return_val_if_fail (filename != NULL, NULL);
plugin = gst_registry_lookup (gst_registry_get_default (), filename);
if (plugin && plugin->module) {
return plugin;
}
GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING, "attempt to load plugin \"%s\"",
filename);
module = g_module_open (filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
/* gst_plugin_check_module handles module == NULL case */
if (!gst_plugin_check_module (module, filename, error, &ptr)) {
if (module != NULL)
g_module_close (module);
if (g_module_supported () == FALSE) {
GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING, "module loading not supported");
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE, "Dynamic loading not supported");
return NULL;
}
desc = (GstPluginDesc *) ptr;
plugin = gst_registry_pool_find_plugin (desc->name);
if (!plugin) {
free_plugin = TRUE;
plugin = g_new0 (GstPlugin, 1);
plugin->filename = g_strdup (filename);
GST_DEBUG ("created new GstPlugin %p for file \"%s\"", plugin, filename);
} else {
free_plugin = FALSE;
if (gst_plugin_is_loaded (plugin)) {
g_module_close (module);
if (plugin->filename && strcmp (plugin->filename, filename) != 0) {
GST_WARNING
("plugin %p from file \"%s\" with same name %s is already "
"loaded, aborting loading of \"%s\"", plugin, plugin->filename,
plugin->desc.name, filename);
g_set_error (error, GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_NAME_MISMATCH,
"plugin %p from file \"%s\" with same name %s is already "
"loaded, aborting loading of \"%s\"", plugin, plugin->filename,
plugin->desc.name, filename);
if (free_plugin)
g_free (plugin);
return NULL;
}
GST_LOG ("Plugin %p for file \"%s\" already loaded, returning it now",
plugin, filename);
return plugin;
}
if (stat (filename, &file_status)) {
GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING, "problem accessing file");
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE, "Problem accessing file %s: %s\n", filename,
strerror (errno));
return NULL;
}
module = g_module_open (filename, G_MODULE_BIND_LOCAL);
if (module == NULL) {
GST_CAT_ERROR (GST_CAT_PLUGIN_LOADING, "module_open failed: %s",
g_module_error ());
g_set_error (error,
GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_MODULE, "Opening module failed");
return NULL;
}
plugin = g_object_new (GST_TYPE_PLUGIN, NULL);
plugin->module = module;
plugin->filename = strdup (filename);
plugin->file_mtime = file_status.st_mtime;
plugin->file_size = file_status.st_size;
ret = g_module_symbol (module, "gst_plugin_desc", &ptr);
if (!ret) {
GST_DEBUG ("Could not find plugin entry point in \"%s\"", filename);
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE,
"Could not find plugin entry point in \"%s\"", filename);
g_object_unref (plugin);
return NULL;
}
plugin->orig_desc = (GstPluginDesc *) ptr;
GST_LOG ("Plugin %p for file \"%s\" prepared, calling entry function...",
plugin, filename);
if (g_module_symbol (module, "plugin_init", &ptr)) {
GST_WARNING
("plugin %p from file \"%s\" exports a symbol named plugin_init\n",
plugin, plugin->filename);
g_set_error (error, GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_NAME_MISMATCH,
"plugin \"%s\" exports a symbol named plugin_init", desc->name);
}
/* this is where we load the actual .so, so let's trap SIGSEGV */
_gst_plugin_fault_handler_setup ();
_gst_plugin_fault_handler_filename = plugin->filename;
@ -470,13 +377,7 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
GST_LOG ("Plugin %p for file \"%s\" prepared, registering...",
plugin, filename);
if (gst_plugin_register_func (plugin, module, desc)) {
/* remove signal handler */
_gst_plugin_fault_handler_restore ();
_gst_plugin_fault_handler_filename = NULL;
GST_INFO ("plugin \"%s\" loaded", plugin->filename);
return plugin;
} else {
if (!gst_plugin_register_func (plugin, module, plugin->orig_desc)) {
/* remove signal handler */
_gst_plugin_fault_handler_restore ();
GST_DEBUG ("gst_plugin_register_func failed for plugin \"%s\"", filename);
@ -486,10 +387,17 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
GST_PLUGIN_ERROR_MODULE,
"gst_plugin_register_func failed for plugin \"%s\"", filename);
g_module_close (module);
if (free_plugin)
g_free (plugin);
return NULL;
}
/* remove signal handler */
_gst_plugin_fault_handler_restore ();
_gst_plugin_fault_handler_filename = NULL;
GST_INFO ("plugin \"%s\" loaded", plugin->filename);
gst_default_registry_add_plugin (plugin);
return plugin;
}
static void
@ -502,7 +410,6 @@ gst_plugin_desc_copy (GstPluginDesc * dest, const GstPluginDesc * src)
g_free (dest->description);
dest->description = g_strdup (src->description);
dest->plugin_init = src->plugin_init;
dest->plugin_exit = src->plugin_exit;
g_free (dest->version);
dest->version = g_strdup (src->version);
g_free (dest->license);
@ -843,6 +750,42 @@ gst_plugin_find_feature (GstPlugin * plugin, const gchar * name, GType type)
if (walk)
result = GST_PLUGIN_FEATURE (walk->data);
g_list_free (walk);
return result;
}
static gboolean
gst_plugin_feature_name_filter (GstPluginFeature * feature, const gchar * name)
{
return !strcmp (name, GST_PLUGIN_FEATURE_NAME (feature));
}
/**
* gst_plugin_find_feature_by_name:
* @plugin: plugin to get the feature from
* @name: The name of the feature to find
*
* Find a feature of the given name in the given plugin.
*
* Returns: a GstPluginFeature or NULL if the feature was not found.
*/
GstPluginFeature *
gst_plugin_find_feature_by_name (GstPlugin * plugin, const gchar * name)
{
GList *walk;
GstPluginFeature *result = NULL;
g_return_val_if_fail (name != NULL, NULL);
walk = gst_filter_run (plugin->features,
(GstFilterFunc) gst_plugin_feature_name_filter, TRUE, (void *) name);
if (walk)
result = GST_PLUGIN_FEATURE (walk->data);
g_list_free (walk);
return result;
}
@ -879,7 +822,7 @@ gst_plugin_add_feature (GstPlugin * plugin, GstPluginFeature * feature)
GST_PLUGIN_FEATURE_NAME (feature));
/* g_object_unref (feature); */
} else {
feature->manager = plugin;
feature->plugin = plugin;
plugin->features = g_list_prepend (plugin->features, feature);
plugin->numfeatures++;
}
@ -902,7 +845,7 @@ gst_plugin_get_feature_list (GstPlugin * plugin)
}
/**
* gst_plugin_load:
* gst_plugin_load_1:
* @name: name of plugin to load
*
* Load the named plugin.
@ -910,12 +853,12 @@ gst_plugin_get_feature_list (GstPlugin * plugin)
* Returns: whether the plugin was loaded or not
*/
gboolean
gst_plugin_load (const gchar * name)
gst_plugin_load_1 (const gchar * name)
{
GstPlugin *plugin;
GError *error = NULL;
plugin = gst_registry_pool_find_plugin (name);
plugin = gst_registry_find_plugin (gst_registry_get_default (), name);
if (plugin) {
plugin = gst_plugin_load_file (plugin->filename, &error);
if (!plugin) {
@ -929,3 +872,26 @@ gst_plugin_load (const gchar * name)
GST_DEBUG ("Could not find %s in registry pool", name);
return FALSE;
}
GstPlugin *
gst_plugin_load (GstPlugin * plugin)
{
GError *error = NULL;
if (gst_plugin_is_loaded (plugin)) {
return plugin;
}
if (!plugin->filename) {
return plugin;
}
plugin = gst_plugin_load_file (plugin->filename, &error);
if (!plugin) {
GST_WARNING ("load_plugin error: %s\n", error->message);
g_error_free (error);
return NULL;
}
return plugin;
}

View file

@ -32,6 +32,10 @@
G_BEGIN_DECLS
typedef struct _GstPlugin GstPlugin;
typedef struct _GstPluginClass GstPluginClass;
typedef struct _GstPluginDesc GstPluginDesc;
GQuark gst_plugin_error_quark (void);
#define GST_PLUGIN_ERROR gst_plugin_error_quark ()
@ -42,15 +46,13 @@ typedef enum
GST_PLUGIN_ERROR_NAME_MISMATCH
} GstPluginError;
#define GST_PLUGIN(plugin) ((GstPlugin *) (plugin))
typedef struct _GstPlugin GstPlugin;
typedef struct _GstPluginDesc GstPluginDesc;
typedef enum
{
GST_PLUGIN_FLAG_CACHED = (1<<0),
} GstPluginFlags;
/* Initialiser function: returns TRUE if plugin initialised successfully */
typedef gboolean (*GstPluginInitFunc) (GstPlugin *plugin);
/* exiting function when plugin is unloaded */
typedef void (*GstPluginExitFunc) (GstPlugin *plugin);
struct _GstPluginDesc {
gint major_version; /* major version of core that plugin was compiled for */
@ -58,7 +60,6 @@ struct _GstPluginDesc {
gchar *name; /* unique name of plugin */
gchar *description; /* description of plugin */
GstPluginInitFunc plugin_init; /* pointer to plugin_init function */
GstPluginExitFunc plugin_exit; /* pointer to plugin_exit function */
gchar *version; /* version of the plugin */
gchar *license; /* effective license of plugin */
gchar *source; /* source module plugin belongs to */
@ -68,19 +69,42 @@ struct _GstPluginDesc {
gpointer _gst_reserved[GST_PADDING];
};
#define GST_TYPE_PLUGIN (gst_plugin_get_type())
#define GST_IS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLUGIN))
#define GST_IS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLUGIN))
#define GST_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLUGIN, GstPluginClass))
#define GST_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLUGIN, GstPlugin))
#define GST_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLUGIN, GstPluginClass))
struct _GstPlugin {
GObject object;
GstPluginDesc desc;
GstPluginDesc *orig_desc;
unsigned int flags;
gchar * filename;
GList * features; /* list of features provided */
gint numfeatures;
gpointer manager; /* managing registry */
GModule * module; /* contains the module if plugin is loaded */
size_t file_size;
time_t file_mtime;
gpointer _gst_reserved[GST_PADDING];
};
struct _GstPluginClass {
GObjectClass object_class;
};
#define GST_PLUGIN_DEFINE(major,minor,name,description,init,version,license,package,origin) \
GST_PLUGIN_EXPORT GstPluginDesc gst_plugin_desc = { \
major, \
@ -88,7 +112,6 @@ GST_PLUGIN_EXPORT GstPluginDesc gst_plugin_desc = { \
name, \
description, \
init, \
NULL, \
version, \
license, \
PACKAGE, \
@ -107,7 +130,6 @@ _gst_plugin_static_init__ ##init (void) \
name, \
description, \
init, \
NULL, \
version, \
license, \
PACKAGE, \
@ -125,8 +147,11 @@ _gst_plugin_static_init__ ##init (void) \
typedef gboolean (*GstPluginFilter) (GstPlugin *plugin,
gpointer user_data);
#define GST_TYPE_PLUGIN (gst_plugin_get_type())
GType gst_plugin_get_type (void);
GstPlugin * gst_plugin_new (void);
void gst_plugin_free (GstPlugin *plugin);
void _gst_plugin_initialize (void);
void _gst_plugin_register_static (GstPluginDesc *desc);
@ -153,15 +178,17 @@ gboolean gst_plugin_name_filter (GstPlugin *plugin, const gchar *name);
GList* gst_plugin_get_feature_list (GstPlugin *plugin);
GstPluginFeature* gst_plugin_find_feature (GstPlugin *plugin, const gchar *name, GType type);
GstPluginFeature* gst_plugin_find_feature_by_name (GstPlugin *plugin, const gchar *name);
gboolean gst_plugin_check_file (const gchar *filename, GError** error);
GstPlugin * gst_plugin_load_file (const gchar *filename, GError** error);
gboolean gst_plugin_unload_plugin (GstPlugin *plugin);
void gst_plugin_add_feature (GstPlugin *plugin, GstPluginFeature *feature);
GstPlugin * gst_plugin_load (GstPlugin *plugin);
/* shortcuts to load from the registry pool */
gboolean gst_plugin_load (const gchar *name);
gboolean gst_plugin_load_1 (const gchar *name);
G_END_DECLS

View file

@ -75,74 +75,47 @@ gst_plugin_feature_class_init (GstPluginFeatureClass * klass)
static void
gst_plugin_feature_init (GstPluginFeature * feature)
{
feature->manager = NULL;
feature->plugin = NULL;
}
/**
* gst_plugin_feature_ensure_loaded:
* gst_plugin_feature_load:
* @feature: the plugin feature to check
*
* Check if the plugin containing the feature is loaded,
* if not, the plugin will be loaded.
*
* Returns: a boolean indicating the feature is loaded.
* Returns: The new feature
*/
gboolean
gst_plugin_feature_ensure_loaded (GstPluginFeature * feature)
GstPluginFeature *
gst_plugin_feature_load (GstPluginFeature * feature)
{
GstPlugin *plugin;
static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
GstPluginFeature *real_feature;
g_return_val_if_fail (feature != NULL, FALSE);
g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), FALSE);
plugin = (GstPlugin *) (feature->manager);
g_static_mutex_lock (&mutex);
if (plugin && !gst_plugin_is_loaded (plugin)) {
#ifndef GST_DISABLE_REGISTRY
if (GST_IS_REGISTRY (plugin->manager)) {
GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING,
"loading plugin %s for feature", plugin->desc.name);
if (gst_registry_load_plugin (GST_REGISTRY (plugin->manager),
plugin) != GST_REGISTRY_OK) {
g_static_mutex_unlock (&mutex);
return FALSE;
}
} else {
g_static_mutex_unlock (&mutex);
return FALSE;
}
#else /* GST_DISABLE_REGISTRY */
g_static_mutex_unlock (&mutex);
return FALSE;
#endif
plugin = gst_plugin_load (feature->plugin);
if (!plugin) {
g_critical ("Failed to load plugin containing feature '%s'.",
GST_PLUGIN_FEATURE_NAME (feature));
return NULL;
}
if (plugin == feature->plugin) {
return feature;
}
g_static_mutex_unlock (&mutex);
return TRUE;
}
real_feature = gst_plugin_find_feature_by_name (plugin, feature->name);
/**
* gst_plugin_feature_unload_thyself:
* @feature: the plugin feature to check
*
* Unload the given feature. This will decrease the refcount
* in the plugin and will eventually unload the plugin
*/
void
gst_plugin_feature_unload_thyself (GstPluginFeature * feature)
{
GstPluginFeatureClass *oclass;
if (real_feature == NULL) {
g_critical
("Loaded plugin containing feature '%s', but feature disappeared.",
feature->name);
return NULL;
}
g_return_if_fail (feature != NULL);
g_return_if_fail (GST_IS_PLUGIN_FEATURE (feature));
oclass = GST_PLUGIN_FEATURE_GET_CLASS (feature);
if (oclass->unload_thyself)
oclass->unload_thyself (feature);
return real_feature;
}
gboolean

View file

@ -55,7 +55,7 @@ struct _GstPluginFeature {
gchar *name;
guint rank;
gpointer manager;
struct _GstPlugin *plugin;
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
@ -64,8 +64,6 @@ struct _GstPluginFeature {
struct _GstPluginFeatureClass {
GObjectClass parent_class;
void (*unload_thyself) (GstPluginFeature *feature);
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
@ -82,8 +80,8 @@ typedef gboolean (*GstPluginFeatureFilter) (GstPluginFeature *featu
/* normal GObject stuff */
GType gst_plugin_feature_get_type (void);
gboolean gst_plugin_feature_ensure_loaded (GstPluginFeature *feature);
void gst_plugin_feature_unload_thyself (GstPluginFeature *feature);
GstPluginFeature *
gst_plugin_feature_load (GstPluginFeature *feature);
gboolean gst_plugin_feature_type_name_filter (GstPluginFeature *feature,
GstTypeNameData *data);

View file

@ -1,6 +1,7 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
* 2005 David A. Schleef <ds@schleef.org>
*
* gstregistry.c: handle registry
*
@ -45,11 +46,66 @@
#include "gstinfo.h"
#include "gstregistry.h"
#include "gstregistrypool.h"
#include "gstmarshal.h"
#include "gstfilter.h"
#define GST_CAT_DEFAULT GST_CAT_GST_INIT
#define GST_CAT_DEFAULT GST_CAT_REGISTRY
/*
* Design:
*
* The GstRegistry object is a list of plugins and some functions
* for dealing with them. Plugins are matched 1-1 with a file on
* disk, and may or may not be loaded at a given time. There may
* be multiple GstRegistry objects, but the "default registry" is
* the only object that has any meaning to the core.
*
* The registry.xml file in 0.9 is actually a cache of plugin
* information. This is unlike previous versions, where the registry
* file was the primary source of plugin information, and was created
* by the gst-register command.
*
* In 0.9, the primary source, at all times, of plugin information
* is each plugin file itself. Thus, if an application wants
* information about a particular plugin, or wants to search for
* a feature that satisfies given criteria, the primary means of
* doing so is to load every plugin and look at the resulting
* information that is gathered in the default registry. Clearly,
* this is a time consuming process, so we cache information in
* the registry.xml file.
*
* On startup, plugins are searched for in the plugin search path.
* This path can be set directly using the GST_PLUGIN_PATH
* environment variable. The registry file is loaded from
* ~/.gstreamer-0.9/registry.xml or the file listed in the
* GST_REGISTRY env var. The only reason to change the registry
* location is for testing.
*
* For each plugin that is found in the plugin search path, there
* could be 3 possibilities for cached information:
* - the cache may not contain information about a given file.
* - the cache may have stale information.
* - the cache may have current information.
* In the first two cases, the plugin is loaded and the cache
* updated. In addition to these cases, the cache may have entries
* for plugins that are not relevant to the current process. These
* are marked as not available to the current process. If the
* cache is updated for whatever reason, it is marked dirty.
*
* A dirty cache is written out at the end of initialization. Each
* entry is checked to make sure the information is minimally valid.
* If not, the entry is simply dropped.
*
* Implementation notes:
*
* The "cache" and "default registry" are different concepts and
* can represent different sets of plugins. For various reasons,
* at init time, the cache is stored in the default registry, and
* plugins not relevant to the current process are marked with the
* GST_PLUGIN_FLAG_CACHED bit. These plugins are removed at the
* end of intitialization.
*
*/
/* Element signals and args */
enum
@ -84,7 +140,7 @@ gst_registry_get_type (void)
};
registry_type = g_type_register_static (G_TYPE_OBJECT, "GstRegistry",
&registry_info, G_TYPE_FLAG_ABSTRACT);
&registry_info, 0);
}
return registry_type;
}
@ -109,117 +165,18 @@ gst_registry_class_init (GstRegistryClass * klass)
static void
gst_registry_init (GstRegistry * registry)
{
registry->priority = 0;
registry->loaded = FALSE;
registry->paths = NULL;
}
/**
* gst_registry_load:
* @registry: the registry to load
*
* Load the given registry
*
* Returns: TRUE on success.
*/
gboolean
gst_registry_load (GstRegistry * registry)
GstRegistry *
gst_registry_get_default (void)
{
GstRegistryClass *rclass;
static GstRegistry *_gst_registry_default;
g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
rclass = GST_REGISTRY_GET_CLASS (registry);
if (rclass->load)
return rclass->load (registry);
return FALSE;
}
/**
* gst_registry_is_loaded:
* @registry: the registry to check
*
* Check if the given registry is loaded
*
* Returns: TRUE if loaded.
*/
gboolean
gst_registry_is_loaded (GstRegistry * registry)
{
g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
return registry->loaded;
}
/**
* gst_registry_save:
* @registry: the registry to save
*
* Save the contents of the given registry
*
* Returns: TRUE on success
*/
gboolean
gst_registry_save (GstRegistry * registry)
{
GstRegistryClass *rclass;
g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
rclass = GST_REGISTRY_GET_CLASS (registry);
if (rclass->save)
return rclass->save (registry);
return FALSE;
}
/**
* gst_registry_rebuild:
* @registry: the registry to rebuild
*
* Rebuild the given registry
*
* Returns: TRUE on success
*/
gboolean
gst_registry_rebuild (GstRegistry * registry)
{
GstRegistryClass *rclass;
g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
rclass = GST_REGISTRY_GET_CLASS (registry);
if (rclass->rebuild)
return rclass->rebuild (registry);
return FALSE;
}
/**
* gst_registry_unload:
* @registry: the registry to unload
*
* Unload the given registry
*
* Returns: TRUE on success
*/
gboolean
gst_registry_unload (GstRegistry * registry)
{
GstRegistryClass *rclass;
g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
rclass = GST_REGISTRY_GET_CLASS (registry);
if (rclass->unload)
return rclass->unload (registry);
return FALSE;
if (!_gst_registry_default) {
_gst_registry_default = g_object_new (GST_TYPE_REGISTRY, NULL);
}
return _gst_registry_default;
}
/**
@ -297,15 +254,18 @@ gst_registry_clear_paths (GstRegistry * registry)
gboolean
gst_registry_add_plugin (GstRegistry * registry, GstPlugin * plugin)
{
GstPlugin *existing_plugin;
g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
if (gst_registry_pool_find_plugin (gst_plugin_get_name (plugin))) {
GST_WARNING_OBJECT (registry, "Not adding plugin %s, "
"because a plugin with same name already exists",
gst_plugin_get_name (plugin));
return FALSE;
existing_plugin = gst_registry_lookup (registry, plugin->filename);
if (existing_plugin) {
GST_DEBUG ("Replacing existing plugin for filename \"%s\"",
plugin->filename);
registry->plugins = g_list_remove (registry->plugins, existing_plugin);
g_object_unref (existing_plugin);
}
plugin->manager = registry;
registry->plugins = g_list_prepend (registry->plugins, plugin);
GST_DEBUG ("emitting plugin-added for filename %s", plugin->filename);
@ -443,77 +403,140 @@ gst_registry_find_feature (GstRegistry * registry, const gchar * name,
}
/**
* gst_registry_load_plugin:
* @registry: the registry to load the plugin from
* @plugin: the plugin to load
*
* Bring the plugin from the registry into memory.
*
* Returns: a value indicating the result
*/
GstRegistryReturn
gst_registry_load_plugin (GstRegistry * registry, GstPlugin * plugin)
GList *
gst_registry_get_feature_list (GstRegistry * registry, GType type)
{
GstRegistryClass *rclass;
/* FIXME */
g_return_val_if_fail (GST_IS_REGISTRY (registry),
GST_REGISTRY_PLUGIN_LOAD_ERROR);
return NULL;
}
rclass = GST_REGISTRY_GET_CLASS (registry);
GList *
gst_registry_get_plugin_list (GstRegistry * registry)
{
return g_list_copy (registry->plugins);
}
if (rclass->load_plugin)
return rclass->load_plugin (registry, plugin);
GstPlugin *
gst_registry_lookup (GstRegistry * registry, const char *filename)
{
GList *g;
GstPlugin *plugin;
return GST_REGISTRY_PLUGIN_LOAD_ERROR;
for (g = registry->plugins; g; g = g_list_next (g)) {
plugin = GST_PLUGIN (g->data);
if (plugin->filename && strcmp (filename, plugin->filename) == 0) {
return plugin;
}
}
return NULL;
}
static void
gst_registry_scan_path_level (GstRegistry * registry, const gchar * path,
int level)
{
GDir *dir;
const gchar *dirent;
gchar *filename;
GstPlugin *plugin;
dir = g_dir_open (path, 0, NULL);
if (!dir)
return;
while ((dirent = g_dir_read_name (dir))) {
filename = g_strjoin ("/", path, dirent, NULL);
GST_DEBUG ("examining file: %s", filename);
if (g_file_test (filename, G_FILE_TEST_IS_DIR)) {
if (level > 0) {
GST_DEBUG ("found directory, recursing");
gst_registry_scan_path_level (registry, filename, level - 1);
} else {
GST_DEBUG ("found directory, but recursion level is too deep");
}
g_free (filename);
continue;
}
if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
GST_DEBUG ("not a regular file, ignoring");
g_free (filename);
continue;
}
if (!g_str_has_suffix (filename, ".so") &&
!g_str_has_suffix (filename, ".dll") &&
!g_str_has_suffix (filename, ".dynlib")) {
GST_DEBUG ("extension is not recognized as module file, ignoring");
g_free (filename);
continue;
}
plugin = gst_registry_lookup (registry, filename);
if (plugin) {
struct stat file_status;
if (stat (filename, &file_status)) {
/* FIXME remove from cache */
g_free (filename);
continue;
}
if (plugin->file_mtime == file_status.st_mtime &&
plugin->file_size == file_status.st_size) {
GST_DEBUG ("file %s cached", filename);
plugin->flags &= ~GST_PLUGIN_FLAG_CACHED;
} else {
GST_DEBUG ("cached info for %s is stale", filename);
GST_DEBUG ("mtime %ld != %ld or size %" G_GSIZE_FORMAT " != %"
G_GSIZE_FORMAT, plugin->file_mtime, file_status.st_mtime,
plugin->file_size, file_status.st_size);
gst_registry_remove_plugin (gst_registry_get_default (), plugin);
gst_plugin_load_file (filename, NULL);
}
} else {
gst_plugin_load_file (filename, NULL);
}
g_free (filename);
}
g_dir_close (dir);
}
/**
* gst_registry_unload_plugin:
* @registry: the registry to unload the plugin from
* @plugin: the plugin to unload
* gst_registry_scan_path:
* @registry: the registry to add the path to
* @path: the path to add to the registry
*
* Unload the plugin from the given registry.
*
* Returns: a value indicating the result
* Add the given path to the registry. The syntax of the
* path is specific to the registry. If the path has already been
* added, do nothing.
*/
GstRegistryReturn
gst_registry_unload_plugin (GstRegistry * registry, GstPlugin * plugin)
void
gst_registry_scan_path (GstRegistry * registry, const gchar * path)
{
GstRegistryClass *rclass;
g_return_val_if_fail (GST_IS_REGISTRY (registry),
GST_REGISTRY_PLUGIN_LOAD_ERROR);
rclass = GST_REGISTRY_GET_CLASS (registry);
if (rclass->unload_plugin)
return rclass->unload_plugin (registry, plugin);
return GST_REGISTRY_PLUGIN_LOAD_ERROR;
gst_registry_scan_path_level (registry, path, 10);
}
/**
* gst_registry_update_plugin:
* @registry: the registry to update
* @plugin: the plugin to update
*
* Update the plugin in the given registry.
*
* Returns: a value indicating the result
*/
GstRegistryReturn
gst_registry_update_plugin (GstRegistry * registry, GstPlugin * plugin)
void
_gst_registry_remove_cache_plugins (GstRegistry * registry)
{
GstRegistryClass *rclass;
GList *g;
GList *g_next;
GstPlugin *plugin;
g_return_val_if_fail (GST_IS_REGISTRY (registry),
GST_REGISTRY_PLUGIN_LOAD_ERROR);
rclass = GST_REGISTRY_GET_CLASS (registry);
if (rclass->update_plugin)
return rclass->update_plugin (registry, plugin);
return GST_REGISTRY_PLUGIN_LOAD_ERROR;
g = registry->plugins;
while (g) {
g_next = g->next;
plugin = g->data;
if (plugin->flags & GST_PLUGIN_FLAG_CACHED) {
registry->plugins = g_list_remove (registry->plugins, plugin);
g_object_unref (plugin);
}
g = g_next;
}
}

View file

@ -26,59 +26,8 @@
#include <gst/gstplugin.h>
#define GLOBAL_REGISTRY_DIR GST_CACHE_DIR
#define GLOBAL_REGISTRY_FILE GLOBAL_REGISTRY_DIR"/registry.xml"
#define GLOBAL_REGISTRY_FILE_TMP GLOBAL_REGISTRY_DIR"/.registry.xml.tmp"
#define LOCAL_REGISTRY_DIR ".gstreamer-"GST_MAJORMINOR
#define LOCAL_REGISTRY_FILE LOCAL_REGISTRY_DIR"/registry.xml"
#define LOCAL_REGISTRY_FILE_TMP LOCAL_REGISTRY_DIR"/.registry.xml.tmp"
/* compatibility for pre-POSIX defines */
#ifdef S_IRUSR
#if defined(_WIN32) && defined(__MINGW32__)
#define REGISTRY_DIR_PERMS (S_ISGID | \
S_IRUSR | S_IWUSR | S_IXUSR)
#else
#define REGISTRY_DIR_PERMS (S_ISGID | \
S_IRUSR | S_IWUSR | S_IXUSR | \
S_IRGRP | S_IXGRP | \
S_IROTH | S_IXOTH)
#endif
#define REGISTRY_TMPFILE_PERMS (S_IRUSR | S_IWUSR)
#if defined(_WIN32) && defined(__MINGW32__)
#define REGISTRY_FILE_PERMS (S_IRUSR | S_IWUSR
#else
#define REGISTRY_FILE_PERMS (S_IRUSR | S_IWUSR | \
S_IRGRP | S_IWGRP | \
S_IROTH | S_IWOTH)
#endif
#else
#define REGISTRY_DIR_PERMS (S_ISGID | \
S_IREAD | S_IWRITE | S_IEXEC)
#define REGISTRY_TMPFILE_PERMS (S_IREAD | S_IWRITE)
#define REGISTRY_FILE_PERMS (S_IREAD | S_IWRITE)
#endif
G_BEGIN_DECLS
typedef enum {
GST_REGISTRY_OK = (0),
GST_REGISTRY_LOAD_ERROR = (1 << 1),
GST_REGISTRY_SAVE_ERROR = (1 << 2),
GST_REGISTRY_PLUGIN_LOAD_ERROR = (1 << 3),
GST_REGISTRY_PLUGIN_SIGNATURE_ERROR = (1 << 4)
} GstRegistryReturn;
typedef enum {
GST_REGISTRY_READABLE = (1 << 1),
GST_REGISTRY_WRITABLE = (1 << 2),
GST_REGISTRY_EXISTS = (1 << 3),
GST_REGISTRY_REMOTE = (1 << 4),
GST_REGISTRY_DELAYED_LOADING = (1 << 5)
} GstRegistryFlags;
#define GST_TYPE_REGISTRY (gst_registry_get_type ())
#define GST_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_REGISTRY, GstRegistry))
#define GST_IS_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_REGISTRY))
@ -92,33 +41,19 @@ typedef struct _GstRegistryClass GstRegistryClass;
struct _GstRegistry {
GObject object;
gint priority;
GstRegistryFlags flags;
gchar *name;
gchar *details;
gboolean loaded;
GList *plugins;
GList *paths;
/* FIXME move elsewhere */
FILE *cache_file;
gpointer _gst_reserved[GST_PADDING];
};
struct _GstRegistryClass {
GObjectClass parent_class;
/* vtable */
gboolean (*load) (GstRegistry *registry);
gboolean (*save) (GstRegistry *registry);
gboolean (*rebuild) (GstRegistry *registry);
gboolean (*unload) (GstRegistry *registry);
GstRegistryReturn (*load_plugin) (GstRegistry *registry, GstPlugin *plugin);
GstRegistryReturn (*unload_plugin) (GstRegistry *registry, GstPlugin *plugin);
GstRegistryReturn (*update_plugin) (GstRegistry *registry, GstPlugin *plugin);
/* signals */
void (*plugin_added) (GstRegistry *registry, GstPlugin *plugin);
@ -129,19 +64,16 @@ struct _GstRegistryClass {
/* normal GObject stuff */
GType gst_registry_get_type (void);
gboolean gst_registry_load (GstRegistry *registry);
gboolean gst_registry_is_loaded (GstRegistry *registry);
gboolean gst_registry_save (GstRegistry *registry);
gboolean gst_registry_rebuild (GstRegistry *registry);
gboolean gst_registry_unload (GstRegistry *registry);
GstRegistry * gst_registry_get_default (void);
void gst_registry_add_path (GstRegistry *registry, const gchar *path);
void gst_registry_scan_path (GstRegistry *registry, const gchar *path);
GList* gst_registry_get_path_list (GstRegistry *registry);
void gst_registry_clear_paths (GstRegistry *registry);
gboolean gst_registry_add_plugin (GstRegistry *registry, GstPlugin *plugin);
void gst_registry_remove_plugin (GstRegistry *registry, GstPlugin *plugin);
GList* gst_registry_get_plugin_list (GstRegistry *registry);
GList* gst_registry_plugin_filter (GstRegistry *registry,
GstPluginFilter filter,
gboolean first,
@ -150,14 +82,35 @@ GList* gst_registry_feature_filter (GstRegistry *registry,
GstPluginFeatureFilter filter,
gboolean first,
gpointer user_data);
GList * gst_registry_get_feature_list (GstRegistry *registry,
GType type);
GstPlugin* gst_registry_find_plugin (GstRegistry *registry, const gchar *name);
GstPluginFeature* gst_registry_find_feature (GstRegistry *registry, const gchar *name, GType type);
GstPlugin * gst_registry_lookup (GstRegistry *registry, const char *filename);
GstRegistryReturn gst_registry_load_plugin (GstRegistry *registry, GstPlugin *plugin);
GstRegistryReturn gst_registry_unload_plugin (GstRegistry *registry, GstPlugin *plugin);
GstRegistryReturn gst_registry_update_plugin (GstRegistry *registry, GstPlugin *plugin);
gboolean gst_registry_xml_read_cache (GstRegistry * registry, const char *location);
gboolean gst_registry_xml_write_cache (GstRegistry * registry, const char *location);
void gst_registry_scan_paths (GstRegistry *registry);
void _gst_registry_remove_cache_plugins (GstRegistry *registry);
#define gst_default_registry_add_plugin(plugin) \
gst_registry_add_plugin (gst_registry_get_default(), plugin)
#define gst_default_registry_add_path(path) \
gst_registry_add_path (gst_registry_get_default(), path)
#define gst_default_registry_get_path_list() \
gst_registry_get_path_list (gst_registry_get_default())
#define gst_default_registry_get_plugin_list() \
gst_registry_get_plugin_list (gst_registry_get_default())
#define gst_default_registry_find_feature(name,type) \
gst_registry_find_feature (gst_registry_get_default(),name,type)
#define gst_default_registry_find_plugin(name) \
gst_registry_find_plugin (gst_registry_get_default(),name)
#define gst_default_registry_feature_filter(filter,first,user_data) \
gst_registry_feature_filter (gst_registry_get_default(),filter,first,user_data)
G_END_DECLS
#endif /* __GST_REGISTRY_H__ */

View file

@ -1,350 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
*
* gstregistry.c: handle registry
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/**
* SECTION:gstregistrypool
* @short_description: Management of a group of #GstRegistry objects
* @see_also: #GstRegistry
*
* The registry pool manages the available registries and plugins in the system.
*/
#include <string.h>
#include "gst_private.h"
#include "gstinfo.h"
#include "gstregistrypool.h"
#include "gstfilter.h"
/* list of registries in the pool */
static GList *_gst_registry_pool = NULL;
/* list of plugins without a registry, like statically linked
* plugins */
static GList *_gst_registry_pool_plugins = NULL;
/**
* gst_registry_pool_list:
*
* Get a list of all registries in the pool
*
* Returns: a Glist of GstRegistries, g_list_free after use.
*/
GList *
gst_registry_pool_list (void)
{
return g_list_copy (_gst_registry_pool);
}
#ifndef GST_DISABLE_REGISTRY
static gint
gst_registry_compare_func (gconstpointer a, gconstpointer b)
{
return GST_REGISTRY (a)->priority - GST_REGISTRY (b)->priority;
}
/**
* gst_registry_pool_add:
* @registry: the registry to add
* @priority: the priority of the registry
*
* Add the registry to the pool with the given priority.
*/
void
gst_registry_pool_add (GstRegistry * registry, guint priority)
{
g_return_if_fail (GST_IS_REGISTRY (registry));
registry->priority = priority;
_gst_registry_pool =
g_list_insert_sorted (_gst_registry_pool, registry,
gst_registry_compare_func);
}
/**
* gst_registry_pool_remove:
* @registry: the registry to remove
*
* Remove the registry from the pool.
*/
void
gst_registry_pool_remove (GstRegistry * registry)
{
g_return_if_fail (GST_IS_REGISTRY (registry));
_gst_registry_pool = g_list_remove (_gst_registry_pool, registry);
}
#endif /* GST_DISABLE_REGISTRY */
/**
* gst_registry_pool_add_plugin:
* @plugin: the plugin to add
*
* Add the plugin to the global pool of plugins.
*/
void
gst_registry_pool_add_plugin (GstPlugin * plugin)
{
_gst_registry_pool_plugins =
g_list_prepend (_gst_registry_pool_plugins, plugin);
}
#ifndef GST_DISABLE_REGISTRY
static void
_registry_load_func (GstRegistry * registry, gpointer user_data)
{
if (!(registry->flags & GST_REGISTRY_DELAYED_LOADING)) {
gst_registry_load (registry);
}
}
#endif /* GST_DISABLE_REGISTRY */
/**
* gst_registry_pool_load_all:
*
* Load all the registries in the pool. Registries with the
* GST_REGISTRY_DELAYED_LOADING will not be loaded.
*/
void
gst_registry_pool_load_all (void)
{
#ifndef GST_DISABLE_REGISTRY
g_list_foreach (_gst_registry_pool, (GFunc) _registry_load_func, NULL);
#endif /* GST_DISABLE_REGISTRY */
}
/**
* gst_registry_pool_plugin_list:
*
* Get a list of all plugins in the pool.
*
* Returns: a newly allocated GList of #GstPlugin.
*/
GList *
gst_registry_pool_plugin_list (void)
{
return gst_registry_pool_plugin_filter (NULL, FALSE, NULL);
}
/**
* gst_registry_pool_plugin_filter:
* @filter: the filter to use
* @first: only return first match
* @user_data: user data passed to the filter function
*
* Runs a filter against all plugins in all registries and returns a GList with
* the results. If the first flag is set, only the first match is
* returned (as a list with a single object).
*
* Returns: a newly allocated GList of #GstPlugin.
*/
GList *
gst_registry_pool_plugin_filter (GstPluginFilter filter, gboolean first,
gpointer user_data)
{
GList *result = NULL;
GList *temp;
#ifndef GST_DISABLE_REGISTRY
GList *walk;
walk = _gst_registry_pool;
while (walk) {
GstRegistry *registry = GST_REGISTRY (walk->data);
temp = gst_registry_plugin_filter (registry, filter, first, user_data);
if (temp && first)
return temp;
result = g_list_concat (result, temp);
walk = g_list_next (walk);
}
#endif /* GST_DISABLE_REGISTRY */
temp =
gst_filter_run (_gst_registry_pool_plugins, (GstFilterFunc) filter, first,
user_data);
result = g_list_concat (result, temp);
return result;
}
/**
* gst_registry_pool_feature_list:
* @type: the type of the features to list.
*
* Get a list of all pluginfeatures of the given type in the pool.
*
* Returns: a newly allocated #GList of #GstPluginFeature.
*/
GList *
gst_registry_pool_feature_list (GType type)
{
GstTypeNameData data;
data.name = NULL;
data.type = type;
return gst_registry_pool_feature_filter (
(GstPluginFeatureFilter) gst_plugin_feature_type_name_filter,
FALSE, &data);
}
/**
* gst_registry_pool_feature_filter:
* @filter: the filter to apply to the feature list
* @first: return the first matching feature
* @user_data: data passed to the filter function
*
* Apply the filter function to all features and return a list
* of those features that satisfy the filter. If the first flag
* is TRUE, only the first match is returned in a GList with
* one element.
*
* Returns: a GList of pluginfeatures, g_list_free after use.
*/
GList *
gst_registry_pool_feature_filter (GstPluginFeatureFilter filter, gboolean first,
gpointer user_data)
{
GList *result = NULL;
GList *temp;
#ifndef GST_DISABLE_REGISTRY
GList *walk;
walk = _gst_registry_pool;
while (walk) {
GstRegistry *registry = GST_REGISTRY (walk->data);
temp = gst_registry_feature_filter (registry, filter, first, user_data);
if (temp && first)
return temp;
result = g_list_concat (result, temp);
walk = g_list_next (walk);
}
#endif /* GST_DISABLE_REGISTRY */
temp =
gst_plugin_list_feature_filter (_gst_registry_pool_plugins, filter, first,
user_data);
result = g_list_concat (result, temp);
return result;
}
/**
* gst_registry_pool_find_plugin:
* @name: the name of the plugin to find
*
* Get the named plugin from the registry pool
*
* Returns: The plugin with the given name or NULL if the plugin
* was not found.
*/
GstPlugin *
gst_registry_pool_find_plugin (const gchar * name)
{
GstPlugin *result = NULL;
GList *walk;
g_return_val_if_fail (name != NULL, NULL);
walk =
gst_registry_pool_plugin_filter ((GstPluginFilter) gst_plugin_name_filter,
TRUE, (gpointer) name);
if (walk)
result = GST_PLUGIN (walk->data);
g_list_free (walk);
return result;
}
/**
* gst_registry_pool_find_feature:
* @name: the name of the pluginfeature to find
* @type: the type of the pluginfeature to find
*
* Get the pluginfeature with the given name and type from the pool of
* registries.
*
* Returns: A pluginfeature with the given name and type or NULL if the feature
* was not found.
*/
GstPluginFeature *
gst_registry_pool_find_feature (const gchar * name, GType type)
{
GstPluginFeature *result = NULL;
GList *walk;
GstTypeNameData data;
g_return_val_if_fail (name != NULL, NULL);
data.type = type;
data.name = name;
walk = gst_registry_pool_feature_filter ((GstPluginFeatureFilter)
gst_plugin_feature_type_name_filter, TRUE, &data);
if (walk)
result = GST_PLUGIN_FEATURE (walk->data);
g_list_free (walk);
return result;
}
/**
* gst_registry_pool_get_prefered:
* @flags: The flags for the prefered registry
*
* Get the prefered registry with the given flags
*
* Returns: The registry with the flags.
*/
GstRegistry *
gst_registry_pool_get_prefered (GstRegistryFlags flags)
{
#ifndef GST_DISABLE_REGISTRY
GList *walk = _gst_registry_pool;
while (walk) {
GstRegistry *registry = GST_REGISTRY (walk->data);
if (registry->flags & flags)
return registry;
walk = g_list_next (walk);
}
#endif /* GST_DISABLE_REGISTRY */
return NULL;
}

View file

@ -1,59 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wim.taymans@chello.be>
*
* gstregistrypool.h: maintain list of registries and plugins
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_REGISTRY_POOL_H__
#define __GST_REGISTRY_POOL_H__
G_BEGIN_DECLS
#include <gst/gstplugin.h>
#include <gst/gstregistry.h>
/* the pool of registries */
GList* gst_registry_pool_list (void);
void gst_registry_pool_add (GstRegistry *registry, guint priority);
void gst_registry_pool_remove (GstRegistry *registry);
void gst_registry_pool_add_plugin (GstPlugin *plugin);
void gst_registry_pool_load_all (void);
/* query the plugins/features */
GList* gst_registry_pool_plugin_filter (GstPluginFilter filter,
gboolean first, gpointer user_data);
GList* gst_registry_pool_feature_filter (GstPluginFeatureFilter filter,
gboolean first, gpointer user_data);
/* some predefined filters */
GList* gst_registry_pool_plugin_list (void);
GList* gst_registry_pool_feature_list (GType type);
GstPlugin* gst_registry_pool_find_plugin (const gchar *name);
GstPluginFeature* gst_registry_pool_find_feature (const gchar *name, GType type);
GstRegistry* gst_registry_pool_get_prefered (GstRegistryFlags flags);
G_END_DECLS
#endif /* __GST_REGISTRY_POOL_H__ */

View file

@ -27,8 +27,8 @@
#include "gst_private.h"
#include "gstinfo.h"
#include "gsttypefind.h"
#include "gstregistry.h"
#include "gsttypefindfactory.h"
#include "gstregistrypool.h"
GST_DEBUG_CATEGORY_EXTERN (gst_type_find_debug);
#define GST_CAT_DEFAULT gst_type_find_debug
@ -63,8 +63,8 @@ gst_type_find_register (GstPlugin * plugin, const gchar * name, guint rank,
GST_INFO ("registering typefind function for %s", name);
factory =
GST_TYPE_FIND_FACTORY (gst_registry_pool_find_feature (name,
GST_TYPE_TYPE_FIND_FACTORY));
GST_TYPE_FIND_FACTORY (gst_registry_find_feature (gst_registry_get_default
(), name, GST_TYPE_TYPE_FIND_FACTORY));
if (!factory) {
factory = g_object_new (GST_TYPE_TYPE_FIND_FACTORY, NULL);
GST_DEBUG_OBJECT (factory, "using new typefind factory for %s", name);

View file

@ -81,7 +81,7 @@
#include "gstinfo.h"
#include "gsttypefind.h"
#include "gsttypefindfactory.h"
#include "gstregistrypool.h"
#include "gstregistry.h"
GST_DEBUG_CATEGORY (gst_type_find_debug);
#define GST_CAT_DEFAULT gst_type_find_debug
@ -92,8 +92,6 @@ static void gst_type_find_factory_init (GTypeInstance * instance,
gpointer g_class);
static void gst_type_find_factory_dispose (GObject * object);
static void gst_type_find_factory_unload_thyself (GstPluginFeature * feature);
static void gst_type_find_load_plugin (GstTypeFind * find, gpointer data);
static GstPluginFeatureClass *parent_class = NULL;
@ -128,16 +126,11 @@ gst_type_find_factory_get_type (void)
static void
gst_type_find_factory_class_init (gpointer g_class, gpointer class_data)
{
GstPluginFeatureClass *gstpluginfeature_class =
GST_PLUGIN_FEATURE_CLASS (g_class);
GObjectClass *object_class = G_OBJECT_CLASS (g_class);
parent_class = g_type_class_peek_parent (g_class);
object_class->dispose = gst_type_find_factory_dispose;
gstpluginfeature_class->unload_thyself =
GST_DEBUG_FUNCPTR (gst_type_find_factory_unload_thyself);
}
static void
gst_type_find_factory_init (GTypeInstance * instance, gpointer g_class)
@ -162,14 +155,6 @@ gst_type_find_factory_dispose (GObject * object)
}
}
static void
gst_type_find_factory_unload_thyself (GstPluginFeature * feature)
{
GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (feature);
factory->function = gst_type_find_load_plugin;
factory->user_data = factory;
}
static void
gst_type_find_load_plugin (GstTypeFind * find, gpointer data)
{
GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (data);
@ -177,7 +162,10 @@ gst_type_find_load_plugin (GstTypeFind * find, gpointer data)
GST_DEBUG_OBJECT (factory, "need to load typefind function %s",
GST_PLUGIN_FEATURE_NAME (factory));
if (gst_plugin_feature_ensure_loaded (GST_PLUGIN_FEATURE (factory))) {
factory =
GST_TYPE_FIND_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
(factory)));
if (factory) {
if (factory->function == gst_type_find_load_plugin) {
/* looks like we didn't get a real typefind function */
g_warning ("could not load valid typefind function for feature '%s'\n",
@ -200,7 +188,8 @@ gst_type_find_load_plugin (GstTypeFind * find, gpointer data)
GList *
gst_type_find_factory_get_list (void)
{
return gst_registry_pool_feature_list (GST_TYPE_TYPE_FIND_FACTORY);
return gst_registry_get_feature_list (gst_registry_get_default (),
GST_TYPE_TYPE_FIND_FACTORY);
}
/**

View file

@ -35,8 +35,8 @@
#include "gst_private.h"
#include "gsturi.h"
#include "gstinfo.h"
#include "gstregistrypool.h"
#include "gstmarshal.h"
#include "gstregistry.h"
#include <string.h>
@ -474,8 +474,8 @@ gst_element_make_from_uri (const GstURIType type, const gchar * uri,
entry.type = type;
entry.protocol = gst_uri_get_protocol (uri);
possibilities =
gst_registry_pool_feature_filter (search_by_entry, FALSE, &entry);
possibilities = gst_registry_feature_filter (gst_registry_get_default (),
search_by_entry, FALSE, &entry);
g_free (entry.protocol);
if (!possibilities) {

View file

@ -10,14 +10,10 @@ REGISTRY_ENVIRONMENT = \
TESTS_ENVIRONMENT = \
$(REGISTRY_ENVIRONMENT) \
GST_PLUGIN_PATH_ONLY=yes \
GST_PLUGIN_PATH=$(top_builddir)/gst
GST_PLUGIN_PATH=$(top_builddir)/gst/elements/.libs:$(top_builddir)/gst/indexers/.libs
plugindir = $(libdir)/gstreamer-@GST_MAJORMINOR@
# rebuild gst-register-@GST_MAJORMINOR@ if needed
$(top_builddir)/tools/gst-register-@GST_MAJORMINOR@$(EXEEXT):
cd $(top_builddir)/tools && make
# override to _not_ install the test plugins
install-pluginLTLIBRARIES:
@ -28,10 +24,6 @@ SUPPRESSIONS = $(top_srcdir)/common/gst.supp
clean-local: clean-local-check
$(CHECK_REGISTRY):
$(TESTS_ENVIRONMENT) \
$(top_builddir)/tools/gst-register-@GST_MAJORMINOR@
check_PROGRAMS = \
gst/gst \
gst/gstbin \
@ -60,8 +52,7 @@ check_PROGRAMS = \
gst-libs/controller \
gst-libs/gdp
TESTS = $(top_builddir)/tools/gst-register-@GST_MAJORMINOR@ \
$(check_PROGRAMS)
TESTS = $(check_PROGRAMS)
noinst_HEADERS = gst/capslist.h
@ -94,6 +85,5 @@ TESTS_THREADED = \
gst/gstobject
VALGRIND_TESTS_DISABLE = \
$(top_builddir)/tools/gst-register-@GST_MAJORMINOR@ \
$(TESTS_THREADED) \
$(TESTS_TO_FIX)

View file

@ -29,7 +29,8 @@ GST_START_TEST (test_state_changes)
GstElement *element;
GList *features, *f;
features = gst_registry_pool_feature_list (GST_TYPE_ELEMENT_FACTORY);
features = gst_registry_get_feature_list (gst_registry_get_default (),
GST_TYPE_ELEMENT_FACTORY);
for (f = features; f; f = f->next) {
GstPluginFeature *feature = f->data;

View file

@ -1,11 +1,4 @@
### assemble a list of programs we want to build and install
if GST_DISABLE_REGISTRY
GST_REGISTRY_SRC =
GST_REGISTRY_SRC_V =
else
GST_REGISTRY_SRC = gst-register
GST_REGISTRY_SRC_V = gst-register-@GST_MAJORMINOR@
endif
if GST_DISABLE_LOADSAVE
GST_LOADSAVE_SRC =
@ -34,17 +27,11 @@ GST_OTHER_SRC_V = \
### so all of the programs we want to build
bin_PROGRAMS = \
$(GST_REGISTRY_SRC) $(GST_REGISTRY_SRC_V) \
$(GST_LOADSAVE_SRC) $(GST_LOADSAVE_SRC_V) \
$(GST_OTHER_SRC) $(GST_OTHER_SRC_V)
bin_SCRIPTS = gst-feedback-@GST_MAJORMINOR@
# make sure each versioned tool has the right source file and flags
if !GST_DISABLE_REGISTRY
gst_register_@GST_MAJORMINOR@_SOURCES = gst-register.c
gst_register_@GST_MAJORMINOR@_CFLAGS = $(GST_OBJ_CFLAGS)
gst_register_@GST_MAJORMINOR@_LDFLAGS = $(GST_OBJ_LIBS)
endif
if !GST_DISABLE_LOADSAVE
gst_complete_@GST_MAJORMINOR@_SOURCES = gst-complete.c
gst_complete_@GST_MAJORMINOR@_CFLAGS = $(GST_OBJ_CFLAGS)
@ -77,9 +64,6 @@ gst-feedback-@GST_MAJORMINOR@: gst-feedback-m.m
chmod +x $@
# make sure each unversioned tool comes from gst-run.c
if !GST_DISABLE_REGISTRY
gst_register_SOURCES = gst-run.c
endif
if !GST_DISABLE_LOADSAVE
gst_complete_SOURCES = gst-run.c
gst_compprep_SOURCES = gst-run.c
@ -99,12 +83,6 @@ LDADD = $(GLIB_ONLY_LIBS) $(POPT_LIBS)
AM_CPPFLAGS = $(GLIB_ONLY_CFLAGS) $(POPT_CFLAGS)
### man pages we want to install
if GST_DISABLE_REGISTRY
GST_REGISTRY_MAN=
else
GST_REGISTRY_MAN = gst-register-@GST_MAJORMINOR@.1
endif
if GST_DISABLE_LOADSAVE
GST_LOADSAVE_MAN=
else
@ -122,7 +100,7 @@ GST_OTHER_MAN = \
gst-typefind-@GST_MAJORMINOR@.1 \
gst-xmlinspect-@GST_MAJORMINOR@.1
manpages = $(GST_REGISTRY_MAN) $(GST_LOADSAVE_MAN) $(GST_OTHER_MAN)
manpages = $(GST_LOADSAVE_MAN) $(GST_OTHER_MAN)
CLEANFILES = $(manpages) $(bin_SCRIPTS)
man_MANS = $(manpages)
@ -138,7 +116,6 @@ EXTRA_DIST = \
gst-inspect.1.in \
gst-launch.1.in \
gst-md5sum.1.in \
gst-register.1.in \
gst-typefind.1.in \
gst-xmlinspect.1.in \
gst-xmllaunch.1.in \
@ -152,7 +129,6 @@ EXTRA_DIST = \
-e s,gst-inspect,gst-inspect-@GST_MAJORMINOR@,g \
-e s,gst-launch,gst-launch-@GST_MAJORMINOR@,g \
-e s,gst-md5sum,gst-md5sum-@GST_MAJORMINOR@,g \
-e s,gst-register,gst-register-@GST_MAJORMINOR@,g \
-e s,gst-typefind,gst-typefind-@GST_MAJORMINOR@,g \
-e s,gst-xmlinspect,gst-xmlinspect-@GST_MAJORMINOR@,g \
-e s,gst-xmllaunch,gst-xmllaunch-@GST_MAJORMINOR@,g \

View file

@ -26,7 +26,7 @@ main (int argc, char *argv[])
{
xmlDocPtr doc;
xmlNodePtr factorynode, padnode, argnode, optionnode;
GList *plugins, *features, *padtemplates;
GList *element_factories, *padtemplates, *g;
const GList *pads;
GstElement *element;
GstPad *pad;
@ -44,93 +44,80 @@ main (int argc, char *argv[])
doc->xmlRootNode = xmlNewDocNode (doc, NULL,
(xmlChar *) "GST-CompletionRegistry", NULL);
plugins = g_list_copy (gst_registry_pool_plugin_list ());
while (plugins) {
GstPlugin *plugin;
element_factories =
gst_registry_get_feature_list (gst_registry_get_default (),
GST_TYPE_ELEMENT_FACTORY);
for (g = element_factories; g; g = g_list_next (g)) {
GstElementFactory *factory;
plugin = (GstPlugin *) (plugins->data);
plugins = g_list_next (plugins);
factory = GST_ELEMENT_FACTORY (g->data);
features = g_list_copy (gst_plugin_get_feature_list (plugin));
while (features) {
GstPluginFeature *feature;
GstElementFactory *factory;
factorynode = xmlNewChild (doc->xmlRootNode, NULL, (xmlChar *) "element",
NULL);
xmlNewChild (factorynode, NULL, (xmlChar *) "name",
(xmlChar *) GST_PLUGIN_FEATURE_NAME (factory));
feature = GST_PLUGIN_FEATURE (features->data);
features = g_list_next (features);
element = gst_element_factory_create (factory, NULL);
GST_DEBUG ("adding factory %s", GST_PLUGIN_FEATURE_NAME (factory));
if (element == NULL) {
GST_ERROR ("couldn't construct element from factory %s\n",
gst_object_get_name (GST_OBJECT (factory)));
return 1;
}
if (!GST_IS_ELEMENT_FACTORY (feature))
continue;
/* write out the padtemplates */
padtemplates = factory->staticpadtemplates;
while (padtemplates) {
padtemplate = (GstStaticPadTemplate *) (padtemplates->data);
padtemplates = g_list_next (padtemplates);
factory = GST_ELEMENT_FACTORY (feature);
if (padtemplate->direction == GST_PAD_SRC)
padnode =
xmlNewChild (factorynode, NULL, (xmlChar *) "srcpadtemplate",
(xmlChar *) padtemplate->name_template);
else if (padtemplate->direction == GST_PAD_SINK)
padnode =
xmlNewChild (factorynode, NULL, (xmlChar *) "sinkpadtemplate",
(xmlChar *) padtemplate->name_template);
}
factorynode = xmlNewChild (doc->xmlRootNode, NULL, (xmlChar *) "element",
NULL);
xmlNewChild (factorynode, NULL, (xmlChar *) "name",
(xmlChar *) GST_PLUGIN_FEATURE_NAME (factory));
pads = element->pads;
while (pads) {
pad = (GstPad *) (pads->data);
pads = g_list_next (pads);
element = gst_element_factory_create (factory, NULL);
GST_DEBUG ("adding factory %s", GST_PLUGIN_FEATURE_NAME (factory));
if (element == NULL) {
GST_ERROR ("couldn't construct element from factory %s\n",
gst_object_get_name (GST_OBJECT (factory)));
return 1;
}
if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC)
padnode = xmlNewChild (factorynode, NULL, (xmlChar *) "srcpad",
(xmlChar *) GST_PAD_NAME (pad));
else if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK)
padnode = xmlNewChild (factorynode, NULL, (xmlChar *) "sinkpad",
(xmlChar *) GST_PAD_NAME (pad));
}
/* write out the padtemplates */
padtemplates = factory->staticpadtemplates;
while (padtemplates) {
padtemplate = (GstStaticPadTemplate *) (padtemplates->data);
padtemplates = g_list_next (padtemplates);
/* write out the args */
property_specs =
g_object_class_list_properties (G_OBJECT_GET_CLASS (element),
&num_properties);
for (i = 0; i < num_properties; i++) {
GParamSpec *param = property_specs[i];
if (padtemplate->direction == GST_PAD_SRC)
padnode =
xmlNewChild (factorynode, NULL, (xmlChar *) "srcpadtemplate",
(xmlChar *) padtemplate->name_template);
else if (padtemplate->direction == GST_PAD_SINK)
padnode =
xmlNewChild (factorynode, NULL, (xmlChar *) "sinkpadtemplate",
(xmlChar *) padtemplate->name_template);
}
argnode = xmlNewChild (factorynode, NULL, (xmlChar *) "argument",
(xmlChar *) param->name);
if (param->value_type == GST_TYPE_URI) {
xmlNewChild (argnode, NULL, (xmlChar *) "filename", NULL);
} else if (G_IS_PARAM_SPEC_ENUM (param) == G_TYPE_ENUM) {
GEnumValue *values;
gint j;
pads = element->pads;
while (pads) {
pad = (GstPad *) (pads->data);
pads = g_list_next (pads);
values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values;
for (j = 0; values[j].value_name; j++) {
gchar *value = g_strdup_printf ("%d", values[j].value);
if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC)
padnode = xmlNewChild (factorynode, NULL, (xmlChar *) "srcpad",
(xmlChar *) GST_PAD_NAME (pad));
else if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK)
padnode = xmlNewChild (factorynode, NULL, (xmlChar *) "sinkpad",
(xmlChar *) GST_PAD_NAME (pad));
}
/* write out the args */
property_specs =
g_object_class_list_properties (G_OBJECT_GET_CLASS (element),
&num_properties);
for (i = 0; i < num_properties; i++) {
GParamSpec *param = property_specs[i];
argnode = xmlNewChild (factorynode, NULL, (xmlChar *) "argument",
(xmlChar *) param->name);
if (param->value_type == GST_TYPE_URI) {
xmlNewChild (argnode, NULL, (xmlChar *) "filename", NULL);
} else if (G_IS_PARAM_SPEC_ENUM (param) == G_TYPE_ENUM) {
GEnumValue *values;
gint j;
values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values;
for (j = 0; values[j].value_name; j++) {
gchar *value = g_strdup_printf ("%d", values[j].value);
optionnode = xmlNewChild (argnode, NULL, (xmlChar *) "option",
(xmlChar *) value);
xmlNewChild (optionnode, NULL, (xmlChar *) "value_nick",
(xmlChar *) values[j].value_nick);
g_free (value);
}
optionnode = xmlNewChild (argnode, NULL, (xmlChar *) "option",
(xmlChar *) value);
xmlNewChild (optionnode, NULL, (xmlChar *) "value_nick",
(xmlChar *) values[j].value_nick);
g_free (value);
}
}
g_free (property_specs);

View file

@ -827,7 +827,7 @@ print_element_list (gboolean print_all)
{
GList *plugins;
plugins = gst_registry_pool_plugin_list ();
plugins = gst_default_registry_get_plugin_list ();
while (plugins) {
GList *features;
GstPlugin *plugin;
@ -990,21 +990,22 @@ print_element_features (const gchar * element_name)
/* FIXME implement other pretty print function for these */
#ifndef GST_DISABLE_INDEX
feature = gst_registry_pool_find_feature (element_name,
feature = gst_default_registry_find_feature (element_name,
GST_TYPE_INDEX_FACTORY);
if (feature) {
n_print ("%s: an index\n", element_name);
return 0;
}
#endif
feature = gst_registry_pool_find_feature (element_name,
feature = gst_default_registry_find_feature (element_name,
GST_TYPE_TYPE_FIND_FACTORY);
if (feature) {
n_print ("%s: a typefind function\n", element_name);
return 0;
}
#ifndef GST_DISABLE_URI
feature = gst_registry_pool_find_feature (element_name, GST_TYPE_URI_HANDLER);
feature = gst_default_registry_find_feature (element_name,
GST_TYPE_URI_HANDLER);
if (feature) {
n_print ("%s: an uri handler\n", element_name);
return 0;
@ -1020,6 +1021,10 @@ print_element_info (GstElementFactory * factory, gboolean print_names)
GstElement *element;
gint maxlevel = 0;
factory =
GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
(factory)));
element = gst_element_factory_create (factory, NULL);
if (!element) {
g_print ("couldn't construct element for some reason\n");
@ -1032,8 +1037,8 @@ print_element_info (GstElementFactory * factory, gboolean print_names)
_name = "";
print_factory_details_info (factory);
if (GST_PLUGIN_FEATURE (factory)->manager) {
GstPlugin *plugin = (GstPlugin *) GST_PLUGIN_FEATURE (factory)->manager;
if (GST_PLUGIN_FEATURE (factory)->plugin) {
GstPlugin *plugin = (GstPlugin *) GST_PLUGIN_FEATURE (factory)->plugin;
print_plugin_info (plugin);
}
@ -1100,7 +1105,7 @@ main (int argc, char *argv[])
/* otherwise check if it's a plugin */
if (retval) {
plugin = gst_registry_pool_find_plugin (arg);
plugin = gst_default_registry_find_plugin (arg);
/* if there is such a plugin, print out info */
if (plugin) {

View file

@ -1,172 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
*
* gst-register.c: Plugin subsystem for loading elements, types, and libs
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <gst/gst.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <string.h>
#include <errno.h>
#include <locale.h>
#include "gst/gst-i18n-app.h"
static gint num_features = 0;
static gint num_plugins = 0;
static void
plugin_added_func (GstRegistry * registry, GstPlugin * plugin,
gpointer user_data)
{
g_print (_("Added plugin %s with %d %s.\n"), plugin->desc.name,
plugin->numfeatures,
ngettext ("feature", "features", plugin->numfeatures));
num_features += plugin->numfeatures;
num_plugins++;
}
static void
spawn_all_in_dir (const char *dirname)
{
char *argv[2] = { NULL, NULL };
GDir *dir;
const char *file;
/* g_print("spawning all in %s\n", dirname); */
dir = g_dir_open (dirname, 0, NULL);
if (dir == NULL)
return;
while ((file = g_dir_read_name (dir))) {
argv[0] = g_build_filename (dirname, file, NULL);
g_print ("running %s\n", argv[0]);
g_spawn_sync (NULL, argv, NULL, G_SPAWN_FILE_AND_ARGV_ZERO, NULL, NULL,
NULL, NULL, NULL, NULL);
g_free (argv[0]);
}
g_dir_close (dir);
}
int
main (int argc, char *argv[])
{
GList *registries;
GList *path_spill = NULL; /* used for path spill from failing registries */
#ifdef GETTEXT_PACKAGE
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
#endif
/* Init gst */
_gst_registry_auto_load = FALSE;
gst_init (&argc, &argv);
registries = gst_registry_pool_list ();
registries = g_list_reverse (registries);
while (registries) {
GstRegistry *registry = GST_REGISTRY (registries->data);
GList *dir_list;
GList *iter;
char *dir;
if (path_spill) {
GList *iter;
/* add spilled paths to this registry;
* since they're spilled they probably weren't loaded correctly
* so we should give a lower priority registry the chance to do them */
for (iter = path_spill; iter; iter = iter->next) {
g_print (_("Added path %s to %s \n"),
(const char *) iter->data, registry->name);
gst_registry_add_path (registry, (const gchar *) iter->data);
}
g_list_free (path_spill);
path_spill = NULL;
}
g_signal_connect (G_OBJECT (registry), "plugin_added",
G_CALLBACK (plugin_added_func), NULL);
if (registry->flags & GST_REGISTRY_WRITABLE) {
char *location;
g_object_get (registry, "location", &location, NULL);
g_print (_("Rebuilding %s (%s) ...\n"), registry->name, location);
g_free (location);
gst_registry_rebuild (registry);
gst_registry_save (registry);
} else {
g_print (_("Trying to load %s ...\n"), registry->name);
if (!gst_registry_load (registry)) {
g_print (_("Error loading %s\n"), registry->name);
/* move over paths from this registry to the next one */
path_spill = g_list_concat (path_spill,
gst_registry_get_path_list (registry));
/* this assertion triggers for a non-readable/writable user registry,
* see #148283 */
/* g_assert (path_spill != NULL); */
}
/* also move over paths if the registry wasn't writable
* FIXME: we should check if the paths that were loaded from this
registry get removed from the path_list so we only try to
spill paths that could not be registered */
/* Until that is done, don't spill paths when registry is not writable
(e.g. case of user running gst-register and sysreg not writable) */
/*
path_spill = g_list_concat (path_spill,
gst_registry_get_path_list (registry));
*/
}
dir_list = gst_registry_get_path_list (registry);
for (iter = dir_list; iter; iter = iter->next) {
dir =
g_build_filename ((const char *) iter->data, "register-scripts",
NULL);
spawn_all_in_dir (dir);
g_free (dir);
}
g_list_free (dir_list);
registries = g_list_next (registries);
}
g_print (_("Loaded %d plugins with %d %s.\n"), num_plugins, num_features,
ngettext ("feature", "features", num_features));
return (0);
}

View file

@ -612,7 +612,7 @@ print_element_list (void)
{
GList *plugins;
plugins = gst_registry_pool_plugin_list ();
plugins = gst_default_registry_get_plugin_list ();
while (plugins) {
GList *features;
GstPlugin *plugin;
@ -796,21 +796,21 @@ main (int argc, char *argv[])
/* FIXME implement other pretty print function for these */
#ifndef GST_DISABLE_INDEX
feature = gst_registry_pool_find_feature (argv[1],
feature = gst_default_registry_find_feature (argv[1],
GST_TYPE_INDEX_FACTORY);
if (feature) {
g_print ("%s: an index\n", argv[1]);
return 0;
}
#endif
feature = gst_registry_pool_find_feature (argv[1],
feature = gst_default_registry_find_feature (argv[1],
GST_TYPE_TYPE_FIND_FACTORY);
if (feature) {
g_print ("%s: a type find function\n", argv[1]);
return 0;
}
#ifndef GST_DISABLE_URI
feature = gst_registry_pool_find_feature (argv[1],
feature = gst_default_registry_find_feature (argv[1],
GST_TYPE_URI_HANDLER);
if (feature) {
g_print ("%s: an uri handler\n", argv[1]);
@ -825,7 +825,7 @@ main (int argc, char *argv[])
}
/* otherwise assume it's a plugin */
plugin = gst_registry_pool_find_plugin (argv[1]);
plugin = gst_default_registry_find_plugin (argv[1]);
/* if there is such a plugin, print out info */