From 1ee670cff44ef2d0e2c222b490713ebaa42c033d Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 16 Jan 2003 21:22:06 +0000 Subject: [PATCH] Added infrastructure to register URI to element+property mappings Original commit message from CVS: Added infrastructure to register URI to element+property mappings --- gst/Makefile.am | 2 + gst/autoplug/gstspideridentity.c | 1 + gst/gst.c | 1 + gst/gst.h | 1 + gst/gstpad.c | 6 +- gst/gsturi.c | 197 +++++++++++++++++++++++++++++++++++++++ gst/gsturi.h | 71 ++++++++++++++ gst/registries/gstxmlregistry.c | 47 +++++++++- 8 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 gst/gsturi.c create mode 100644 gst/gsturi.h diff --git a/gst/Makefile.am b/gst/Makefile.am index db590ca..7150ff9 100644 --- a/gst/Makefile.am +++ b/gst/Makefile.am @@ -84,6 +84,7 @@ libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \ gsttrashstack.c \ gsttype.c \ $(GST_TYPEFIND_SRC) \ + gsturi.c \ gstutils.c \ gstregistry.c \ $(GST_PARSE_SRC) \ @@ -143,6 +144,7 @@ gst_headers = \ gsttrashstack.h \ gsttype.h \ gsttypefind.h \ + gsturi.h \ gstutils.h \ gstregistry.h \ gstparse.h \ diff --git a/gst/autoplug/gstspideridentity.c b/gst/autoplug/gstspideridentity.c index a250d82..0db36e8 100644 --- a/gst/autoplug/gstspideridentity.c +++ b/gst/autoplug/gstspideridentity.c @@ -251,6 +251,7 @@ gst_spider_identity_getcaps (GstPad *pad, GstCaps *caps) if (otherpad != NULL) return gst_pad_get_allowed_caps (otherpad); + return NULL; } diff --git a/gst/gst.c b/gst/gst.c index 7f1e7a4..59cd908 100644 --- a/gst/gst.c +++ b/gst/gst.c @@ -455,6 +455,7 @@ init_post (void) gst_autoplug_factory_get_type (); #endif gst_index_factory_get_type (); + gst_uri_handler_get_type (); plugin_path = g_getenv ("GST_PLUGIN_PATH"); diff --git a/gst/gst.h b/gst/gst.h index 6c3f8d3..113ef2a 100644 --- a/gst/gst.h +++ b/gst/gst.h @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include diff --git a/gst/gstpad.c b/gst/gstpad.c index eab3fff..57313f9 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -1863,13 +1863,17 @@ gst_pad_get_peer (GstPad *pad) GstCaps* gst_pad_get_allowed_caps (GstPad *pad) { + GstCaps *caps; + g_return_val_if_fail (pad != NULL, NULL); g_return_val_if_fail (GST_IS_PAD (pad), NULL); GST_DEBUG (GST_CAT_PROPERTIES, "get allowed caps of %s:%s", GST_DEBUG_PAD_NAME (pad)); - return gst_caps_copy (GST_RPAD_FILTER (pad)); + caps = gst_caps_copy (GST_RPAD_FILTER (pad)); + + return caps; } /** diff --git a/gst/gsturi.c b/gst/gsturi.c new file mode 100644 index 0000000..eb4dddd --- /dev/null +++ b/gst/gsturi.c @@ -0,0 +1,197 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * + * gsttype.c: Media-type management functions + * + * 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. + */ + +/* TODO: + * probably should set up a hash table for the type id's, since currently + * it's a rather pathetic linear search. Eventually there may be dozens + * of id's, but in reality there are only so many instances of lookup, so + * I'm not overly worried yet... + */ + +#include "gst_private.h" + +#include "gsturi.h" +#include "gstregistry.h" +#include "gstlog.h" + + +static void gst_uri_handler_class_init (GstURIHandlerClass *klass); +static void gst_uri_handler_init (GstURIHandler *factory); + +static GstPluginFeatureClass *parent_class = NULL; +/* static guint gst_uri_handler_signals[LAST_SIGNAL] = { 0 }; */ + +GType +gst_uri_handler_get_type (void) +{ + static GType typefactory_type = 0; + + if (!typefactory_type) { + static const GTypeInfo typefactory_info = { + sizeof (GstURIHandlerClass), + NULL, + NULL, + (GClassInitFunc) gst_uri_handler_class_init, + NULL, + NULL, + sizeof(GstURIHandler), + 0, + (GInstanceInitFunc) gst_uri_handler_init, + NULL + }; + typefactory_type = g_type_register_static (GST_TYPE_PLUGIN_FEATURE, + "GstURIHandler", &typefactory_info, 0); + } + return typefactory_type; +} + +static void +gst_uri_handler_class_init (GstURIHandlerClass *klass) +{ + GObjectClass *gobject_class; + GstObjectClass *gstobject_class; + GstPluginFeatureClass *gstpluginfeature_class; + + gobject_class = (GObjectClass*)klass; + gstobject_class = (GstObjectClass*)klass; + gstpluginfeature_class = (GstPluginFeatureClass*) klass; + + parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE); +} + +static void +gst_uri_handler_init (GstURIHandler *factory) +{ +} + +/** + * gst_uri_handler_new: + * @definition: the definition to use + * + * Creata a new typefactory from the given definition. + * + * Returns: the new typefactory + */ +GstURIHandler* +gst_uri_handler_new (const gchar *name, + const gchar *uri, const gchar *longdesc, + const gchar *element, gchar *property) +{ + GstURIHandler *factory; + + g_return_val_if_fail (name != NULL, NULL); + g_return_val_if_fail (uri != NULL, NULL); + g_return_val_if_fail (element != NULL, NULL); + g_return_val_if_fail (property != NULL, NULL); + + factory = gst_uri_handler_find (name); + + if (!factory) { + factory = GST_URI_HANDLER (g_object_new (GST_TYPE_URI_HANDLER, NULL)); + } + + GST_PLUGIN_FEATURE_NAME (factory) = g_strdup (name); + factory->uri = g_strdup (uri); + factory->longdesc = g_strdup (longdesc); + factory->element = g_strdup (element); + factory->property = g_strdup (property); + + return factory; +} + +/** + * gst_uri_handler_find: + * @name: the name of the typefactory to find + * + * Return the URIHandler with the given name. + * + * Returns: a GstURIHandler with the given name; + */ +GstURIHandler* +gst_uri_handler_find (const gchar *name) +{ + GstPluginFeature *feature; + + g_return_val_if_fail (name != NULL, NULL); + + feature = gst_registry_pool_find_feature (name, GST_TYPE_URI_HANDLER); + if (feature) + return GST_URI_HANDLER (feature); + + return NULL; +} + +GstURIHandler* +gst_uri_handler_find_by_uri (const gchar *uri) +{ + GList *walk, *orig; + GstURIHandler *handler = NULL; + + g_return_val_if_fail (uri != NULL, NULL); + + orig = walk = gst_registry_pool_feature_list (GST_TYPE_URI_HANDLER); + + while (walk) { + handler = GST_URI_HANDLER (walk->data); + + if (g_str_has_prefix (uri, handler->uri)) + break; + + walk = g_list_next (walk); + } + g_list_free (orig); + + return handler; +} + +GstElement* +gst_uri_handler_create (GstURIHandler *factory, const gchar *name) +{ + GstElement *element = NULL; + + g_return_val_if_fail (factory != NULL, NULL); + + element = gst_element_factory_make (factory->element, name); + + return element; +} + +GstElement* +gst_uri_handler_make_by_uri (const gchar *uri, const gchar *name) +{ + GstElement *element = NULL; + GstURIHandler *handler; + + g_return_val_if_fail (uri != NULL, NULL); + + handler = gst_uri_handler_find_by_uri (uri); + if (handler) { + element = gst_uri_handler_create (handler, name); + if (element) { + g_object_set (G_OBJECT (element), handler->property, uri, NULL); + } + } + return element; +} + + + diff --git a/gst/gsturi.h b/gst/gsturi.h new file mode 100644 index 0000000..929e425 --- /dev/null +++ b/gst/gsturi.h @@ -0,0 +1,71 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * + * gstscheduler.h: Header for default scheduler code + * + * 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_URI_H__ +#define __GST_URI_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_URI_HANDLER (gst_uri_handler_get_type ()) +#define GST_URI_HANDLER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_URI_HANDLER, GstURIHandler)) +#define GST_IS_URI_HANDLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_URI_HANDLER)) +#define GST_URI_HANDLER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_URI_HANDLER, GstURIHandlerClass)) +#define GST_IS_URI_HANDLER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_URI_HANDLER)) +#define GST_URI_HANDLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_URI_HANDLER, GstURIHandlerClass)) + +typedef struct _GstURIHandler GstURIHandler; +typedef struct _GstURIHandlerClass GstURIHandlerClass; + +struct _GstURIHandler { + GstPluginFeature feature; + + gchar *uri; /* The uri that is described */ + gchar *longdesc; /* description of the uri */ + gchar *element; /* The element that can handle this uri */ + gchar *property; /* The property on the element to set the uri */ +}; + +struct _GstURIHandlerClass { + GstPluginFeatureClass parent; +}; + +GType gst_uri_handler_get_type (void); + +GstURIHandler* gst_uri_handler_new (const gchar *name, + const gchar *uri, const gchar *longdesc, + const gchar *element, gchar *property); +void gst_uri_handler_destroy (GstURIHandler *factory); + +GstURIHandler* gst_uri_handler_find (const gchar *name); +GstURIHandler* gst_uri_handler_find_by_uri (const gchar *uri); + +GstElement* gst_uri_handler_create (GstURIHandler *factory, const gchar *name); +GstElement* gst_uri_handler_make_by_uri (const gchar *uri, const gchar *name); + +G_END_DECLS + +#endif /* __GST_SCHEDULER_H__ */ diff --git a/gst/registries/gstxmlregistry.c b/gst/registries/gstxmlregistry.c index 8b5337b..0c243e6 100644 --- a/gst/registries/gstxmlregistry.c +++ b/gst/registries/gstxmlregistry.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "gstxmlregistry.h" @@ -770,6 +771,30 @@ gst_xml_registry_parse_index_factory (GMarkupParseContext *context, const gchar } static gboolean +gst_xml_registry_parse_uri_handler (GMarkupParseContext *context, const gchar *tag, const gchar *text, + gsize text_len, GstXMLRegistry *registry, GError **error) +{ + GstURIHandler *handler = GST_URI_HANDLER (registry->current_feature); + + if (!strcmp (tag, "name")) { + registry->current_feature->name = g_strndup (text, text_len); + } + else if (!strcmp (tag, "uri")) { + handler->uri = g_strndup (text, text_len); + } + else if (!strcmp (tag, "longdesc")) { + handler->longdesc = g_strndup (text, text_len); + } + else if (!strcmp (tag, "element")) { + handler->element = g_strndup (text, text_len); + } + else if (!strcmp (tag, "property")) { + handler->property = g_strndup (text, text_len); + } + return TRUE; +} + +static gboolean gst_xml_registry_parse_padtemplate (GMarkupParseContext *context, const gchar *tag, const gchar *text, gsize text_len, GstXMLRegistry *registry, GError **error) { @@ -865,6 +890,7 @@ gst_xml_registry_start_element (GMarkupParseContext *context, } if (feature) { xmlregistry->current_feature = feature; + if (GST_IS_ELEMENT_FACTORY (feature)) { GstElementFactory *factory = GST_ELEMENT_FACTORY (feature); @@ -873,17 +899,24 @@ gst_xml_registry_start_element (GMarkupParseContext *context, factory->padtemplates = NULL; factory->rank = 0; xmlregistry->parser = gst_xml_registry_parse_element_factory; + break; } - else if (GST_IS_TYPE_FACTORY (feature)) + else if (GST_IS_TYPE_FACTORY (feature)) { xmlregistry->parser = gst_xml_registry_parse_type_factory; + } else if (GST_IS_SCHEDULER_FACTORY (feature)) { xmlregistry->parser = gst_xml_registry_parse_scheduler_factory; GST_SCHEDULER_FACTORY (feature)->type = 0; } - else if (GST_IS_AUTOPLUG_FACTORY (feature)) + else if (GST_IS_AUTOPLUG_FACTORY (feature)) { xmlregistry->parser = gst_xml_registry_parse_autoplug_factory; - else if (GST_IS_INDEX_FACTORY (feature)) + } + else if (GST_IS_INDEX_FACTORY (feature)) { xmlregistry->parser = gst_xml_registry_parse_index_factory; + } + else if (GST_IS_URI_HANDLER (feature)) { + xmlregistry->parser = gst_xml_registry_parse_uri_handler; + } else { g_warning ("unkown feature type"); } @@ -1411,6 +1444,14 @@ gst_xml_registry_save_feature (GstXMLRegistry *xmlregistry, GstPluginFeature *fe else if (GST_IS_INDEX_FACTORY (feature)) { PUT_ESCAPED ("longdesc", GST_INDEX_FACTORY (feature)->longdesc); } + else if (GST_IS_URI_HANDLER (feature)) { + GstURIHandler *handler = GST_URI_HANDLER (feature); + + PUT_ESCAPED ("uri", handler->uri); + PUT_ESCAPED ("longdesc", handler->longdesc); + PUT_ESCAPED ("element", handler->element); + PUT_ESCAPED ("property", handler->property); + } return TRUE; } -- 2.7.4