gsttrashstack.c \
gsttype.c \
$(GST_TYPEFIND_SRC) \
+ gsturi.c \
gstutils.c \
gstregistry.c \
$(GST_PARSE_SRC) \
gsttrashstack.h \
gsttype.h \
gsttypefind.h \
+ gsturi.h \
gstutils.h \
gstregistry.h \
gstparse.h \
if (otherpad != NULL)
return gst_pad_get_allowed_caps (otherpad);
+
return NULL;
}
gst_autoplug_factory_get_type ();
#endif
gst_index_factory_get_type ();
+ gst_uri_handler_get_type ();
plugin_path = g_getenv ("GST_PLUGIN_PATH");
#include <gst/gstcaps.h>
#include <gst/gstprops.h>
#include <gst/gstplugin.h>
+#include <gst/gsturi.h>
#include <gst/gstutils.h>
#include <gst/gsttrace.h>
#include <gst/gstxml.h>
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;
}
/**
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * 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;
+}
+
+
+
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * 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 <glib.h>
+#include <gst/gstelement.h>
+#include <gst/gstpluginfeature.h>
+
+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__ */
#include <gst/gsttype.h>
#include <gst/gstscheduler.h>
#include <gst/gstautoplug.h>
+#include <gst/gsturi.h>
#include "gstxmlregistry.h"
}
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)
{
}
if (feature) {
xmlregistry->current_feature = feature;
+
if (GST_IS_ELEMENT_FACTORY (feature)) {
GstElementFactory *factory = GST_ELEMENT_FACTORY (feature);
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");
}
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;
}