summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst/Makefile.am2
-rw-r--r--gst/gst.h1
-rw-r--r--gst/gstbin.c2
-rw-r--r--gst/gstcompat.h11
-rw-r--r--gst/gstelement.c93
-rw-r--r--gst/gstelement.h37
-rw-r--r--gst/gstelementdetails.h69
-rw-r--r--gst/gstelementfactory.c131
-rw-r--r--gst/gstelementfactory.h80
-rw-r--r--gst/gstelementmetadata.h77
-rw-r--r--gst/gstpipeline.c2
-rw-r--r--gst/gstregistrychunks.c25
-rw-r--r--tests/check/gst/struct_x86_64.h1
-rw-r--r--tools/gst-inspect.c12
-rw-r--r--tools/gst-xmlinspect.c17
15 files changed, 177 insertions, 383 deletions
diff --git a/gst/Makefile.am b/gst/Makefile.am
index 9d0c7520a..ab47dcac3 100644
--- a/gst/Makefile.am
+++ b/gst/Makefile.am
@@ -198,7 +198,7 @@ noinst_HEADERS = \
glib-compat-private.h \
gst-i18n-lib.h \
gst-i18n-app.h \
- gstelementdetails.h \
+ gstelementmetadata.h \
gstpluginloader.h \
gstquark.h \
gstregistrybinary.h \
diff --git a/gst/gst.h b/gst/gst.h
index 9f91ca946..ed19746da 100644
--- a/gst/gst.h
+++ b/gst/gst.h
@@ -40,6 +40,7 @@
#include <gst/gstdatetime.h>
#include <gst/gstdebugutils.h>
#include <gst/gstelement.h>
+#include <gst/gstelementmetadata.h>
#include <gst/gsterror.h>
#include <gst/gstevent.h>
#include <gst/gstghostpad.h>
diff --git a/gst/gstbin.c b/gst/gstbin.c
index c6a8b1396..8ae9cb9c2 100644
--- a/gst/gstbin.c
+++ b/gst/gstbin.c
@@ -311,7 +311,7 @@ gst_bin_base_init (gpointer g_class)
{
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_set_details_simple (gstelement_class, "Generic bin",
+ gst_element_class_set_metadata (gstelement_class, "Generic bin",
"Generic/Bin",
"Simple container object",
"Erik Walthinsen <omega@cse.ogi.edu>,"
diff --git a/gst/gstcompat.h b/gst/gstcompat.h
index cf2d89848..d1877d55a 100644
--- a/gst/gstcompat.h
+++ b/gst/gstcompat.h
@@ -34,6 +34,17 @@
G_BEGIN_DECLS
+/* added to ease the transition to 0.11 */
+#define gst_element_class_set_details_simple gst_element_class_set_metadata
+
+#define gst_element_factory_get_longname(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_LONGNAME)
+#define gst_element_factory_get_klass(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_KLASS)
+#define gst_element_factory_get_description(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_DESCRIPTION)
+#define gst_element_factory_get_author(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_AUTHOR)
+#define gst_element_factory_get_documentation_uri(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_DOC_URI)
+#define gst_element_factory_get_icon_name(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_ICON_NAME)
+
+
#ifndef GST_DISABLE_DEPRECATED
#endif /* not GST_DISABLE_DEPRECATED */
diff --git a/gst/gstelement.c b/gst/gstelement.c
index 4e894c5d8..8064dad3f 100644
--- a/gst/gstelement.c
+++ b/gst/gstelement.c
@@ -82,7 +82,7 @@
#include <gobject/gvaluecollector.h>
#include "gstelement.h"
-#include "gstelementdetails.h"
+#include "gstelementmetadata.h"
#include "gstenumtypes.h"
#include "gstbus.h"
#include "gstmarshal.h"
@@ -233,7 +233,7 @@ gst_element_base_class_init (gpointer g_class)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- /* FIXME 0.11: Copy the element details and instead of clearing the
+ /* FIXME 0.11: Instead of clearing the
* pad template list copy the list and increase the refcount of
* the pad templates by one.
*
@@ -242,8 +242,7 @@ gst_element_base_class_init (gpointer g_class)
* of doing things.
* See http://bugzilla.gnome.org/show_bug.cgi?id=491501
*/
- memset (&element_class->details, 0, sizeof (GstElementDetails));
- element_class->meta_data = NULL;
+ element_class->metadata = gst_structure_empty_new ("metadata");
element_class->padtemplates = NULL;
/* set the factory, see gst_element_register() */
@@ -261,11 +260,8 @@ gst_element_base_class_finalize (gpointer g_class)
g_list_foreach (klass->padtemplates, (GFunc) gst_object_unref, NULL);
g_list_free (klass->padtemplates);
- __gst_element_details_clear (&klass->details);
- if (klass->meta_data) {
- gst_structure_free (klass->meta_data);
- klass->meta_data = NULL;
- }
+
+ gst_structure_free (klass->metadata);
}
static void
@@ -1158,60 +1154,29 @@ gst_element_class_add_pad_template (GstElementClass * klass,
klass->numpadtemplates++;
}
-static void
-gst_element_class_add_meta_data (GstElementClass * klass,
- const gchar * key, const gchar * value)
-{
- if (!klass->meta_data) {
- /* FIXME: use a quark for "metadata" */
- klass->meta_data = gst_structure_empty_new ("metadata");
- }
-
- gst_structure_set ((GstStructure *) klass->meta_data,
- key, G_TYPE_STRING, value, NULL);
-}
-
-/**
- * gst_element_class_set_documentation_uri:
- * @klass: class to set details for
- * @uri: uri of element documentation
- *
- * Set uri pointing to user documentation. Applications can use this to show
- * help for e.g. effects to users.
- *
- * Since: 0.10.31
- */
-void
-gst_element_class_set_documentation_uri (GstElementClass * klass,
- const gchar * uri)
-{
- g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
-
- gst_element_class_add_meta_data (klass, "doc-uri", uri);
-}
-
/**
- * gst_element_class_set_icon_name:
- * @klass: class to set details for
- * @name: name of an icon
+ * gst_element_class_add_metadata:
+ * @klass: class to set metadata for
+ * @key: the key to set
+ * @value: the value to set
*
- * Elements that bridge to certain other products can include an icon of that
- * used product. Application can show the icon in menus/selectors to help
- * identifying specific elements.
- *
- * Since: 0.10.31
+ * Set @key with @value as metadata in @klass.
*/
void
-gst_element_class_set_icon_name (GstElementClass * klass, const gchar * name)
+gst_element_class_add_metadata (GstElementClass * klass,
+ const gchar * key, const gchar * value)
{
g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+ g_return_if_fail (key != NULL);
+ g_return_if_fail (value != NULL);
- gst_element_class_add_meta_data (klass, "icon-name", name);
+ gst_structure_set ((GstStructure *) klass->metadata,
+ key, G_TYPE_STRING, value, NULL);
}
/**
- * gst_element_class_set_details_simple:
- * @klass: class to set details for
+ * gst_element_class_set_metadata:
+ * @klass: class to set metadata for
* @longname: The long English name of the element. E.g. "File Sink"
* @classification: String describing the type of element, as an unordered list
* separated with slashes ('/'). See draft-klass.txt of the design docs
@@ -1219,29 +1184,23 @@ gst_element_class_set_icon_name (GstElementClass * klass, const gchar * name)
* @description: Sentence describing the purpose of the element.
* E.g: "Write stream to a file"
* @author: Name and contact details of the author(s). Use \n to separate
- * multiple author details. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
+ * multiple author metadata. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
*
- * Sets the detailed information for a #GstElementClass. Simpler version of
- * gst_element_class_set_details() that generates less linker overhead.
+ * Sets the detailed information for a #GstElementClass.
* <note>This function is for use in _base_init functions only.</note>
- *
- * The detail parameter strings are copied into the #GstElementDetails for
- * the element class.
- *
- * Since: 0.10.14
*/
void
-gst_element_class_set_details_simple (GstElementClass * klass,
+gst_element_class_set_metadata (GstElementClass * klass,
const gchar * longname, const gchar * classification,
const gchar * description, const gchar * author)
{
- const GstElementDetails details =
- GST_ELEMENT_DETAILS ((gchar *) longname, (gchar *) classification,
- (gchar *) description, (gchar *) author);
-
g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
- __gst_element_details_copy (&klass->details, &details);
+ gst_structure_set ((GstStructure *) klass->metadata,
+ GST_ELEMENT_METADATA_LONGNAME, G_TYPE_STRING, longname,
+ GST_ELEMENT_METADATA_KLASS, G_TYPE_STRING, classification,
+ GST_ELEMENT_METADATA_DESCRIPTION, G_TYPE_STRING, description,
+ GST_ELEMENT_METADATA_AUTHOR, G_TYPE_STRING, author, NULL);
}
/**
diff --git a/gst/gstelement.h b/gst/gstelement.h
index 867a63843..1cdff866b 100644
--- a/gst/gstelement.h
+++ b/gst/gstelement.h
@@ -131,7 +131,7 @@ typedef enum {
*
* Since: 0.10.13
*/
-#define GST_STATE_TARGET(elem) (GST_ELEMENT_CAST(elem)->abidata.ABI.target_state)
+#define GST_STATE_TARGET(elem) (GST_ELEMENT_CAST(elem)->target_state)
/**
* GST_STATE_RETURN:
@@ -391,7 +391,7 @@ typedef enum
*
* Since: 0.10.24
*/
-#define GST_ELEMENT_START_TIME(elem) (GST_ELEMENT_CAST(elem)->abidata.ABI.start_time)
+#define GST_ELEMENT_START_TIME(elem) (GST_ELEMENT_CAST(elem)->start_time)
/**
* GST_ELEMENT_ERROR:
@@ -513,6 +513,7 @@ G_STMT_START { \
* @state_cond: Used to signal completion of a state change
* @state_cookie: Used to detect concurrent execution of
* gst_element_set_state() and gst_element_get_state()
+ * @target_state: the target state of an element as set by the application
* @current_state: the current state of an element
* @next_state: the next state of an element, can be #GST_STATE_VOID_PENDING if
* the element is in the correct state.
@@ -526,6 +527,7 @@ G_STMT_START { \
* @base_time: the time of the clock right before the element is set to
* PLAYING. Subtracting @base_time from the current clock time in the PLAYING
* state will yield the running_time against the clock.
+ * @start_time: the running_time of the last PAUSED state
* @numpads: number of pads of the element, includes both source and sink pads.
* @pads: list of pads
* @numsrcpads: number of source pads of the element.
@@ -546,6 +548,7 @@ struct _GstElement
/* element state */
GCond *state_cond;
guint32 state_cookie;
+ GstState target_state;
GstState current_state;
GstState next_state;
GstState pending_state;
@@ -556,6 +559,7 @@ struct _GstElement
/* allocated clock */
GstClock *clock;
GstClockTimeDiff base_time; /* NULL/READY: 0 - PAUSED: current time - PLAYING: difference to clock */
+ GstClockTime start_time;
/* element pads, these lists can only be iterated while holding
* the LOCK or checking the cookie after each LOCK. */
@@ -568,22 +572,13 @@ struct _GstElement
guint32 pads_cookie;
/*< private >*/
- union {
- struct {
- /* state set by application */
- GstState target_state;
- /* running time of the last PAUSED state */
- GstClockTime start_time;
- } ABI;
- /* adding + 0 to mark ABI change to be undone later */
- gpointer _gst_reserved[GST_PADDING + 0];
- } abidata;
+ gpointer _gst_reserved[GST_PADDING];
};
/**
* GstElementClass:
* @parent_class: the parent class structure
- * @details: #GstElementDetails for elements of this class
+ * @metadata: metadata for elements of this class
* @elementfactory: the #GstElementFactory that creates these elements
* @padtemplates: a #GList of #GstPadTemplate
* @numpadtemplates: the number of padtemplates
@@ -610,9 +605,8 @@ struct _GstElementClass
GstObjectClass parent_class;
/*< public >*/
- /* the element details */
- /* FIXME-0.11: deprecate this in favour of meta_data */
- GstElementDetails details;
+ /* the element metadata */
+ gpointer metadata;
/* factory that the element was created from */
GstElementFactory *elementfactory;
@@ -659,10 +653,8 @@ struct _GstElementClass
gboolean (*query) (GstElement *element, GstQuery *query);
/*< private >*/
- /* FIXME-0.11: move up and replace details */
- gpointer meta_data;
- gpointer _gst_reserved[GST_PADDING-1];
+ gpointer _gst_reserved[GST_PADDING];
};
/* element class pad templates */
@@ -671,13 +663,14 @@ GstPadTemplate* gst_element_class_get_pad_template (GstElementClass
GList* gst_element_class_get_pad_template_list (GstElementClass *element_class);
/* element class meta data */
-void gst_element_class_set_documentation_uri (GstElementClass * klass, const gchar *uri);
-void gst_element_class_set_icon_name (GstElementClass * klass, const gchar *name);
-void gst_element_class_set_details_simple (GstElementClass *klass,
+void gst_element_class_set_metadata (GstElementClass *klass,
const gchar *longname,
const gchar *classification,
const gchar *description,
const gchar *author);
+void gst_element_class_add_metadata (GstElementClass * klass,
+ const gchar * key, const gchar * value);
+
/* element instance */
GType gst_element_get_type (void);
diff --git a/gst/gstelementdetails.h b/gst/gstelementdetails.h
deleted file mode 100644
index b59878a89..000000000
--- a/gst/gstelementdetails.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000,2004 Wim Taymans <wim@fluendo.com>
- *
- * gstelement.h: Header for GstElement
- *
- * 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_ELEMENT_DETAILS_H__
-#define __GST_ELEMENT_DETAILS_H__
-
-G_BEGIN_DECLS
-
-static inline void
-__gst_element_details_clear (GstElementDetails * dp)
-{
- g_free (dp->longname);
- g_free (dp->klass);
- g_free (dp->description);
- g_free (dp->author);
- memset (dp, 0, sizeof (GstElementDetails));
-}
-
-#define VALIDATE_SET(__dest, __src, __entry) \
-G_STMT_START { \
- if (g_utf8_validate (__src->__entry, -1, NULL)) { \
- __dest->__entry = g_strdup (__src->__entry); \
- } else { \
- g_warning ("Invalid UTF-8 in " G_STRINGIFY (__entry) ": %s", \
- __src->__entry); \
- __dest->__entry = g_strdup ("[ERROR: invalid UTF-8]"); \
- } \
-} G_STMT_END
-
-static inline void
-__gst_element_details_set (GstElementDetails * dest,
- const GstElementDetails * src)
-{
- VALIDATE_SET (dest, src, longname);
- VALIDATE_SET (dest, src, klass);
- VALIDATE_SET (dest, src, description);
- VALIDATE_SET (dest, src, author);
-}
-
-static inline void
-__gst_element_details_copy (GstElementDetails * dest,
- const GstElementDetails * src)
-{
- __gst_element_details_clear (dest);
- __gst_element_details_set (dest, src);
-}
-
-G_END_DECLS
-
-#endif /* __GST_ELEMENT_DETAILS_H__ */
diff --git a/gst/gstelementfactory.c b/gst/gstelementfactory.c
index 6e197f3a7..9147ff42b 100644
--- a/gst/gstelementfactory.c
+++ b/gst/gstelementfactory.c
@@ -60,7 +60,7 @@
#include "gst_private.h"
#include "gstelement.h"
-#include "gstelementdetails.h"
+#include "gstelementmetadata.h"
#include "gstinfo.h"
#include "gsturi.h"
#include "gstregistry.h"
@@ -150,10 +150,9 @@ gst_element_factory_cleanup (GstElementFactory * factory)
{
GList *item;
- __gst_element_details_clear (&factory->details);
- if (factory->meta_data) {
- gst_structure_free ((GstStructure *) factory->meta_data);
- factory->meta_data = NULL;
+ if (factory->metadata) {
+ gst_structure_free ((GstStructure *) factory->metadata);
+ factory->metadata = NULL;
}
if (factory->type) {
factory->type = G_TYPE_INVALID;
@@ -247,17 +246,16 @@ gst_element_register (GstPlugin * plugin, const gchar * name, guint rank,
/* provide info needed during class structure setup */
g_type_set_qdata (type, _gst_elementclass_factory, factory);
klass = GST_ELEMENT_CLASS (g_type_class_ref (type));
+#if 0
+ /* FIXME */
if ((klass->details.longname == NULL) ||
(klass->details.klass == NULL) || (klass->details.author == NULL))
goto detailserror;
+#endif
factory->type = type;
- __gst_element_details_copy (&factory->details, &klass->details);
- if (klass->meta_data) {
- factory->meta_data = gst_structure_copy ((GstStructure *) klass->meta_data);
- } else {
- factory->meta_data = NULL;
- }
+ factory->metadata = gst_structure_copy ((GstStructure *) klass->metadata);
+
for (item = klass->padtemplates; item; item = item->next) {
GstPadTemplate *templ = item->data;
GstStaticPadTemplate *newt;
@@ -324,6 +322,7 @@ urierror:
return FALSE;
}
+#if 0
detailserror:
{
GST_WARNING_OBJECT (factory,
@@ -331,6 +330,7 @@ detailserror:
gst_element_factory_cleanup (factory);
return FALSE;
}
+#endif
}
/**
@@ -498,113 +498,11 @@ gst_element_factory_get_element_type (GstElementFactory * factory)
return factory->type;
}
-/**
- * gst_element_factory_get_longname:
- * @factory: a #GstElementFactory
- *
- * Gets the longname for this factory
- *
- * Returns: the longname
- */
-G_CONST_RETURN gchar *
-gst_element_factory_get_longname (GstElementFactory * factory)
-{
- g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
-
- return factory->details.longname;
-}
-
-/**
- * gst_element_factory_get_klass:
- * @factory: a #GstElementFactory
- *
- * Gets the class for this factory.
- *
- * Returns: the class
- */
-G_CONST_RETURN gchar *
-gst_element_factory_get_klass (GstElementFactory * factory)
-{
- g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
-
- return factory->details.klass;
-}
-
-/**
- * gst_element_factory_get_description:
- * @factory: a #GstElementFactory
- *
- * Gets the description for this factory.
- *
- * Returns: the description
- */
-G_CONST_RETURN gchar *
-gst_element_factory_get_description (GstElementFactory * factory)
-{
- g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
-
- return factory->details.description;
-}
-
-/**
- * gst_element_factory_get_author:
- * @factory: a #GstElementFactory
- *
- * Gets the author for this factory.
- *
- * Returns: the author
- */
G_CONST_RETURN gchar *
-gst_element_factory_get_author (GstElementFactory * factory)
-{
- g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
-
- return factory->details.author;
-}
-
-static G_CONST_RETURN gchar *
-gst_element_factory_get_meta_data (GstElementFactory * factory,
+gst_element_factory_get_metadata (GstElementFactory * factory,
const gchar * key)
{
- if (!factory->meta_data)
- return NULL;
-
- /* FIXME: do we want to support other types? */
- return gst_structure_get_string ((GstStructure *) factory->meta_data, key);
-}
-
-/**
- * gst_element_factory_get_documentation_uri:
- * @factory: a #GstElementFactory
- *
- * Gets documentation uri for this factory if set.
- *
- * Since: 0.10.31
- *
- * Returns: the documentation uri
- */
-G_CONST_RETURN gchar *
-gst_element_factory_get_documentation_uri (GstElementFactory * factory)
-{
- g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
- return gst_element_factory_get_meta_data (factory, "doc-uri");
-}
-
-/**
- * gst_element_factory_get_documentation_uri:
- * @factory: a #GstElementFactory
- *
- * Gets icon name for this factory if set.
- *
- * Since: 0.10.31
- *
- * Returns: the icon name
- */
-G_CONST_RETURN gchar *
-gst_element_factory_get_icon_name (GstElementFactory * factory)
-{
- g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
- return gst_element_factory_get_meta_data (factory, "icon-name");
+ return gst_structure_get_string ((GstStructure *) factory->metadata, key);
}
/**
@@ -749,7 +647,8 @@ gst_element_factory_list_is_type (GstElementFactory * factory,
gboolean res = FALSE;
const gchar *klass;
- klass = gst_element_factory_get_klass (factory);
+ klass =
+ gst_element_factory_get_metadata (factory, GST_ELEMENT_METADATA_KLASS);
/* Filter by element type first, as soon as it matches
* one type, we skip all other tests */
diff --git a/gst/gstelementfactory.h b/gst/gstelementfactory.h
index 859b232f6..e784b1c50 100644
--- a/gst/gstelementfactory.h
+++ b/gst/gstelementfactory.h
@@ -36,68 +36,6 @@ typedef struct _GstElementFactoryClass GstElementFactoryClass;
G_BEGIN_DECLS
-/* FIXME 0.11: Move GstElementDetails into a private header and use it internally
- * in GstElementFactory, GstElementClass and the registry
- */
-
-typedef struct _GstElementDetails GstElementDetails;
-
-/**
- * GstElementDetails:
- * @longname: long, english name
- * @klass: string describing the type of element, as an unordered list
- * separated with slashes ('/'). See draft-klass.txt of the design docs
- * for more details and common types
- * @description: what the element is about
- * @author: who wrote this thing?
- *
- * This struct defines the public information about a #GstElement. It contains
- * meta-data about the element that is mostly for the benefit of editors.
- *
- * The @klass member can be used by applications to filter elements based
- * on functionality.
- */
-/* FIXME: need translatable stuff in here (how handle in registry)?
- * can't we use _N("long name") in element implementations and use _(longname)
- * in gst_element_factory_get_longname()
- */
-struct _GstElementDetails
-{
- /*< public > */
- gchar *longname;
- gchar *klass;
- gchar *description;
- gchar *author;
-
- /*< private >*/
- gpointer _gst_reserved[GST_PADDING];
-};
-
-/**
- * GST_ELEMENT_DETAILS:
- * @longname: long, english name
- * @klass: string describing the type of element, as an unordered list
- * separated with slashes ('/'). See draft-klass.txt of the design docs
- * for more details and common types
- * @description: what the element is about
- * @author: who wrote this element
- *
- * Macro to initialize #GstElementDetails.
- */
-#define GST_ELEMENT_DETAILS(longname,klass,description,author) \
- { longname, klass, description, author, {NULL} }
-
-/**
- * GST_IS_ELEMENT_DETAILS:
- * @details: the #GstElementDetails to check
- *
- * Tests if element details are initialized.
- */
-/* FIXME: what about adding '&& (*__gst_reserved==NULL)' */
-#define GST_IS_ELEMENT_DETAILS(details) ( \
- (details) && ((details)->longname != NULL) && ((details)->klass != NULL) \
- && ((details)->description != NULL) && ((details)->author != NULL))
-
#define GST_TYPE_ELEMENT_FACTORY (gst_element_factory_get_type())
#define GST_ELEMENT_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ELEMENT_FACTORY,\
GstElementFactory))
@@ -117,8 +55,7 @@ struct _GstElementFactory {
GType type; /* unique GType of element or 0 if not loaded */
- /* FIXME-0.11: deprecate this in favour of meta_data */
- GstElementDetails details;
+ gpointer metadata;
GList * staticpadtemplates; /* GstStaticPadTemplate list */
guint numpadtemplates;
@@ -130,9 +67,7 @@ struct _GstElementFactory {
GList * interfaces; /* interface type names this element implements */
/*< private >*/
- /* FIXME-0.11: move up and replace details */
- gpointer meta_data;
- gpointer _gst_reserved[GST_PADDING - 1];
+ gpointer _gst_reserved[GST_PADDING];
};
struct _GstElementFactoryClass {
@@ -146,16 +81,15 @@ GType gst_element_factory_get_type (void);
GstElementFactory * gst_element_factory_find (const gchar *name);
GType gst_element_factory_get_element_type (GstElementFactory *factory);
-G_CONST_RETURN gchar * gst_element_factory_get_longname (GstElementFactory *factory);
-G_CONST_RETURN gchar * gst_element_factory_get_klass (GstElementFactory *factory);
-G_CONST_RETURN gchar * gst_element_factory_get_description (GstElementFactory *factory);
-G_CONST_RETURN gchar * gst_element_factory_get_author (GstElementFactory *factory);
-G_CONST_RETURN gchar * gst_element_factory_get_documentation_uri (GstElementFactory *factory);
-G_CONST_RETURN gchar * gst_element_factory_get_icon_name (GstElementFactory *factory);
+
+G_CONST_RETURN gchar * gst_element_factory_get_metadata (GstElementFactory *factoryi, const gchar *key);
+
guint gst_element_factory_get_num_pad_templates (GstElementFactory *factory);
G_CONST_RETURN GList * gst_element_factory_get_static_pad_templates (GstElementFactory *factory);
+
gint gst_element_factory_get_uri_type (GstElementFactory *factory);
gchar ** gst_element_factory_get_uri_protocols (GstElementFactory *factory);
+
gboolean gst_element_factory_has_interface (GstElementFactory *factory,
const gchar *interfacename);
diff --git a/gst/gstelementmetadata.h b/gst/gstelementmetadata.h
new file mode 100644
index 000000000..6c331d90f
--- /dev/null
+++ b/gst/gstelementmetadata.h
@@ -0,0 +1,77 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000,2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstelementmetadata.h: Metadata for GstElement classes
+ *
+ * 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_ELEMENT_METADATA_H__
+#define __GST_ELEMENT_METADATA_H__
+
+G_BEGIN_DECLS
+
+/**
+ * GST_ELEMENT_METADATA_LONGNAME:
+ *
+ * The long English name of the element. E.g. "File Sink"
+ */
+#define GST_ELEMENT_METADATA_LONGNAME "long-name"
+/**
+ * GST_ELEMENT_METADATA_KLASS:
+ *
+ * String describing the type of element, as an unordered list
+ * separated with slashes ('/'). See draft-klass.txt of the design docs
+ * for more details and common types. E.g: "Sink/File"
+ */
+#define GST_ELEMENT_METADATA_KLASS "klass"
+
+/**
+ * GST_ELEMENT_METADATA_DESCRIPTION:
+ *
+ * Sentence describing the purpose of the element.
+ * E.g: "Write stream to a file"
+ */
+#define GST_ELEMENT_METADATA_DESCRIPTION "description"
+/**
+ * GST_ELEMENT_METADATA_AUTHOR:
+ *
+ * Name and contact details of the author(s). Use \n to separate
+ * multiple author details.
+ * E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
+ */
+#define GST_ELEMENT_METADATA_AUTHOR "author"
+
+/**
+ * GST_ELEMENT_METADATA_DOC_URI:
+ *
+ * Set uri pointing to user documentation. Applications can use this to show
+ * help for e.g. effects to users.
+ */
+#define GST_ELEMENT_METADATA_DOC_URI "doc-uri"
+/**
+ * GST_ELEMENT_METADATA_ICON_NAME:
+ *
+ * Elements that bridge to certain other products can include an icon of that
+ * used product. Application can show the icon in menus/selectors to help
+ * identifying specific elements.
+ */
+#define GST_ELEMENT_METADATA_ICON_NAME "icon-name"
+
+G_END_DECLS
+
+#endif /* __GST_ELEMENT_METADATA_H__ */
diff --git a/gst/gstpipeline.c b/gst/gstpipeline.c
index 3e0bfe6b5..016d8e2e9 100644
--- a/gst/gstpipeline.c
+++ b/gst/gstpipeline.c
@@ -153,7 +153,7 @@ gst_pipeline_base_init (gpointer g_class)
{
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_set_details_simple (gstelement_class, "Pipeline object",
+ gst_element_class_set_metadata (gstelement_class, "Pipeline object",
"Generic/Bin",
"Complete pipeline object",
"Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com>");
diff --git a/gst/gstregistrychunks.c b/gst/gstregistrychunks.c
index b34dcfa4c..aae958f11 100644
--- a/gst/gstregistrychunks.c
+++ b/gst/gstregistrychunks.c
@@ -284,17 +284,9 @@ gst_registry_chunks_save_feature (GList ** list, GstPluginFeature * feature)
}
}
- /* pack element factory strings */
- gst_registry_chunks_save_const_string (list, factory->details.author);
- gst_registry_chunks_save_const_string (list, factory->details.description);
- gst_registry_chunks_save_const_string (list, factory->details.klass);
- gst_registry_chunks_save_const_string (list, factory->details.longname);
- if (factory->meta_data) {
- gst_registry_chunks_save_string (list,
- gst_structure_to_string (factory->meta_data));
- } else {
- gst_registry_chunks_save_const_string (list, "");
- }
+ /* pack element metadata strings */
+ gst_registry_chunks_save_string (list,
+ gst_structure_to_string (factory->metadata));
} else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
GstRegistryChunkTypeFindFactory *tff;
GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (feature);
@@ -585,21 +577,16 @@ gst_registry_chunks_load_feature (GstRegistry * registry, gchar ** in,
/* unpack element factory strings */
unpack_string_nocopy (*in, meta_data_str, end, fail);
if (meta_data_str && *meta_data_str) {
- factory->meta_data = gst_structure_from_string (meta_data_str, NULL);
- if (!factory->meta_data) {
+ factory->metadata = gst_structure_from_string (meta_data_str, NULL);
+ if (!factory->metadata) {
GST_ERROR
("Error when trying to deserialize structure for metadata '%s'",
meta_data_str);
goto fail;
}
}
- unpack_string (*in, factory->details.longname, end, fail);
- unpack_string (*in, factory->details.klass, end, fail);
- unpack_string (*in, factory->details.description, end, fail);
- unpack_string (*in, factory->details.author, end, fail);
n = ef->npadtemplates;
- GST_DEBUG ("Element factory : '%s' with npadtemplates=%d",
- factory->details.longname, n);
+ GST_DEBUG ("Element factory : npadtemplates=%d", n);
/* load pad templates */
for (i = 0; i < n; i++) {
diff --git a/tests/check/gst/struct_x86_64.h b/tests/check/gst/struct_x86_64.h
index 4bb20fa9e..c9bcca272 100644
--- a/tests/check/gst/struct_x86_64.h
+++ b/tests/check/gst/struct_x86_64.h
@@ -14,7 +14,6 @@ static GstCheckABIStruct list[] = {
{"GstElementClass", sizeof (GstElementClass), 488} ,
{"GstElementFactory", sizeof (GstElementFactory), 280} ,
{"GstElementFactoryClass", sizeof (GstElementFactoryClass), 304} ,
- {"GstElementDetails", sizeof (GstElementDetails), 64} ,
{"GstEvent", sizeof (GstEvent), 64} ,
{"GstEventClass", sizeof (GstEventClass), 64} ,
{"GstFormatDefinition", sizeof (GstFormatDefinition), 32} ,
diff --git a/tools/gst-inspect.c b/tools/gst-inspect.c
index 75d39c0cf..e9393143a 100644
--- a/tools/gst-inspect.c
+++ b/tools/gst-inspect.c
@@ -199,7 +199,7 @@ get_rank_name (char *s, gint rank)
}
static gboolean
-print_factory_details_meta_data (GQuark field_id, const GValue * value,
+print_factory_details_metadata (GQuark field_id, const GValue * value,
gpointer user_data)
{
gchar *val = g_strdup_value_contents (value);
@@ -218,17 +218,11 @@ print_factory_details_info (GstElementFactory * factory)
char s[20];
n_print ("Factory Details:\n");
- n_print (" Long name:\t%s\n", factory->details.longname);
- n_print (" Class:\t%s\n", factory->details.klass);
- n_print (" Description:\t%s\n", factory->details.description);
- n_print (" Author(s):\t%s\n", factory->details.author);
n_print (" Rank:\t\t%s (%d)\n",
get_rank_name (s, GST_PLUGIN_FEATURE (factory)->rank),
GST_PLUGIN_FEATURE (factory)->rank);
- if (factory->meta_data != NULL) {
- gst_structure_foreach ((GstStructure *) factory->meta_data,
- print_factory_details_meta_data, NULL);
- }
+ gst_structure_foreach ((GstStructure *) factory->metadata,
+ print_factory_details_metadata, NULL);
n_print ("\n");
}
diff --git a/tools/gst-xmlinspect.c b/tools/gst-xmlinspect.c
index 81a3faf55..5f32dabb8 100644
--- a/tools/gst-xmlinspect.c
+++ b/tools/gst-xmlinspect.c
@@ -434,6 +434,17 @@ print_element_signals (GstElement * element, gint pfx)
}
}
+static gboolean
+put_factory_metadata (GQuark field_id, const GValue * value, gpointer user_data)
+{
+ const gchar *key = g_quark_to_string (field_id);
+ const gchar *val = g_value_get_string (value);
+
+ PUT_ESCAPED (2, key, val);
+
+ return TRUE;
+}
+
static gint
print_element_info (GstElementFactory * factory)
{
@@ -457,10 +468,8 @@ print_element_info (GstElementFactory * factory)
gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
PUT_START_TAG (1, "details");
- PUT_ESCAPED (2, "long-name", factory->details.longname);
- PUT_ESCAPED (2, "class", factory->details.klass);
- PUT_ESCAPED (2, "description", factory->details.description);
- PUT_ESCAPED (2, "authors", factory->details.author);
+ gst_structure_foreach ((GstStructure *) factory->metadata,
+ put_factory_metadata, NULL);
PUT_END_TAG (1, "details");
output_hierarchy (G_OBJECT_TYPE (element), 0, &maxlevel);