gst: Fix various Since markers
[platform/upstream/gstreamer.git] / gst / gstelement.h
index e49b862..4ebfd09 100644 (file)
 #ifndef __GST_ELEMENT_H__
 #define __GST_ELEMENT_H__
 
-/* gstelement.h and gstelementfactory.h include eachother */
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/* gstelement.h and gstelementfactory.h include each other */
 typedef struct _GstElement GstElement;
 typedef struct _GstElementClass GstElementClass;
 
@@ -51,22 +55,6 @@ typedef enum {
   GST_STATE_PLAYING             = 4
 } GstState;
 
-
-#include <gst/gstconfig.h>
-#include <gst/gstobject.h>
-#include <gst/gstpad.h>
-#include <gst/gstbus.h>
-#include <gst/gstclock.h>
-#include <gst/gstelementfactory.h>
-#include <gst/gstplugin.h>
-#include <gst/gstpluginfeature.h>
-#include <gst/gstiterator.h>
-#include <gst/gstmessage.h>
-#include <gst/gstquery.h>
-#include <gst/gsttaglist.h>
-
-G_BEGIN_DECLS
-
 #define GST_TYPE_ELEMENT                (gst_element_get_type ())
 #define GST_IS_ELEMENT(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_ELEMENT))
 #define GST_IS_ELEMENT_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT))
@@ -84,7 +72,7 @@ G_BEGIN_DECLS
  *                               cannot produce data in %GST_STATE_PAUSED.
  *                               This typically happens with live sources.
  *
- * The possible return values from a state change function such as 
+ * The possible return values from a state change function such as
  * gst_element_set_state(). Only @GST_STATE_CHANGE_FAILURE is a real failure.
  */
 typedef enum {
@@ -94,6 +82,20 @@ typedef enum {
   GST_STATE_CHANGE_NO_PREROLL          = 3
 } GstStateChangeReturn;
 
+#include <gst/gstconfig.h>
+#include <gst/gstobject.h>
+#include <gst/gstpad.h>
+#include <gst/gstbus.h>
+#include <gst/gstclock.h>
+#include <gst/gstelementfactory.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+#include <gst/gstiterator.h>
+#include <gst/gstmessage.h>
+#include <gst/gstquery.h>
+#include <gst/gsttaglist.h>
+#include <gst/gstcontext.h>
+
 /* NOTE: this probably should be done with an #ifdef to decide
  * whether to safe-cast or to just do the non-checking cast.
  */
@@ -175,125 +177,67 @@ typedef enum {
 /**
  * GstStateChange:
  * @GST_STATE_CHANGE_NULL_TO_READY    : state change from NULL to READY.
- * <itemizedlist>
- *   <listitem><para>
- *     The element must check if the resources it needs are available. Device
+ *   * The element must check if the resources it needs are available. Device
  *     sinks and -sources typically try to probe the device to constrain their
  *     caps.
- *   </para></listitem>
- *   <listitem><para>
- *     The element opens the device (in case feature need to be probed).
- *   </para></listitem>
- * </itemizedlist>
+ *   * The element opens the device (in case feature need to be probed).
  * @GST_STATE_CHANGE_READY_TO_PAUSED  : state change from READY to PAUSED.
- * <itemizedlist>
- *   <listitem><para>
- *     The element pads are activated in order to receive data in PAUSED.
+ *   * The element pads are activated in order to receive data in PAUSED.
  *     Streaming threads are started.
- *   </para></listitem>
- *   <listitem><para>
- *     Some elements might need to return %GST_STATE_CHANGE_ASYNC and complete
+ *   * Some elements might need to return %GST_STATE_CHANGE_ASYNC and complete
  *     the state change when they have enough information. It is a requirement
  *     for sinks to return %GST_STATE_CHANGE_ASYNC and complete the state change
  *     when they receive the first buffer or %GST_EVENT_EOS (preroll).
  *     Sinks also block the dataflow when in PAUSED.
- *   </para></listitem>
- *   <listitem><para>
- *     A pipeline resets the running_time to 0.
- *   </para></listitem>
- *   <listitem><para>
- *     Live sources return %GST_STATE_CHANGE_NO_PREROLL and don't generate data.
- *   </para></listitem>
- * </itemizedlist>
+ *   * A pipeline resets the running_time to 0.
+ *   * Live sources return %GST_STATE_CHANGE_NO_PREROLL and don't generate data.
  * @GST_STATE_CHANGE_PAUSED_TO_PLAYING: state change from PAUSED to PLAYING.
- * <itemizedlist>
- *   <listitem><para>
- *     Most elements ignore this state change.
- *   </para></listitem>
- *   <listitem><para>
- *     The pipeline selects a #GstClock and distributes this to all the children
+ *   * Most elements ignore this state change.
+ *   * The pipeline selects a #GstClock and distributes this to all the children
  *     before setting them to PLAYING. This means that it is only allowed to
  *     synchronize on the #GstClock in the PLAYING state.
- *   </para></listitem>
- *   <listitem><para>
- *     The pipeline uses the #GstClock and the running_time to calculate the
+ *   * The pipeline uses the #GstClock and the running_time to calculate the
  *     base_time. The base_time is distributed to all children when performing
  *     the state change.
- *   </para></listitem>
- *   <listitem><para>
- *     Sink elements stop blocking on the preroll buffer or event and start
+ *   * Sink elements stop blocking on the preroll buffer or event and start
  *     rendering the data.
- *   </para></listitem>
- *   <listitem><para>
- *     Sinks can post %GST_MESSAGE_EOS in the PLAYING state. It is not allowed
+ *   * Sinks can post %GST_MESSAGE_EOS in the PLAYING state. It is not allowed
  *     to post %GST_MESSAGE_EOS when not in the PLAYING state.
- *   </para></listitem>
- *   <listitem><para>
- *     While streaming in PAUSED or PLAYING elements can create and remove
+ *   * While streaming in PAUSED or PLAYING elements can create and remove
  *     sometimes pads.
- *   </para></listitem>
- *   <listitem><para>
- *     Live sources start generating data and return %GST_STATE_CHANGE_SUCCESS.
- *   </para></listitem>
- * </itemizedlist>
+ *   * Live sources start generating data and return %GST_STATE_CHANGE_SUCCESS.
  * @GST_STATE_CHANGE_PLAYING_TO_PAUSED: state change from PLAYING to PAUSED.
- * <itemizedlist>
- *   <listitem><para>
- *     Most elements ignore this state change.
- *   </para></listitem>
- *   <listitem><para>
- *     The pipeline calculates the running_time based on the last selected
+ *   * Most elements ignore this state change.
+ *   * The pipeline calculates the running_time based on the last selected
  *     #GstClock and the base_time. It stores this information to continue
  *     playback when going back to the PLAYING state.
- *   </para></listitem>
- *   <listitem><para>
- *     Sinks unblock any #GstClock wait calls.
- *   </para></listitem>
- *   <listitem><para>
- *     When a sink does not have a pending buffer to play, it returns
- *     %GST_STATE_CHANGE_ASYNC from this state change and completes the state
+ *   * Sinks unblock any #GstClock wait calls.
+ *   * When a sink does not have a pending buffer to play, it returns
+ *     #GST_STATE_CHANGE_ASYNC from this state change and completes the state
  *     change when it receives a new buffer or an %GST_EVENT_EOS.
- *   </para></listitem>
- *   <listitem><para>
- *     Any queued %GST_MESSAGE_EOS items are removed since they will be reposted
+ *   * Any queued %GST_MESSAGE_EOS items are removed since they will be reposted
  *     when going back to the PLAYING state. The EOS messages are queued in
  *     #GstBin containers.
- *   </para></listitem>
- *   <listitem><para>
- *     Live sources stop generating data and return %GST_STATE_CHANGE_NO_PREROLL.
- *   </para></listitem>
- * </itemizedlist>
+ *   * Live sources stop generating data and return %GST_STATE_CHANGE_NO_PREROLL.
  * @GST_STATE_CHANGE_PAUSED_TO_READY  : state change from PAUSED to READY.
- * <itemizedlist>
- *   <listitem><para>
- *     Sinks unblock any waits in the preroll.
- *   </para></listitem>
- *   <listitem><para>
- *     Elements unblock any waits on devices
- *   </para></listitem>
- *   <listitem><para>
- *     Chain or get_range functions return %GST_FLOW_FLUSHING.
- *   </para></listitem>
- *   <listitem><para>
- *     The element pads are deactivated so that streaming becomes impossible and
+ *   * Sinks unblock any waits in the preroll.
+ *   * Elements unblock any waits on devices
+ *   * Chain or get_range functions return %GST_FLOW_FLUSHING.
+ *   * The element pads are deactivated so that streaming becomes impossible and
  *     all streaming threads are stopped.
- *   </para></listitem>
- *   <listitem><para>
- *     The sink forgets all negotiated formats
- *   </para></listitem>
- *   <listitem><para>
- *     Elements remove all sometimes pads
- *   </para></listitem>
- * </itemizedlist>
+ *   * The sink forgets all negotiated formats
+ *   * Elements remove all sometimes pads
  * @GST_STATE_CHANGE_READY_TO_NULL    : state change from READY to NULL.
- * <itemizedlist>
- *   <listitem><para>
- *     Elements close devices
- *   </para></listitem>
- *   <listitem><para>
- *     Elements reset any internal state.
- *   </para></listitem>
- * </itemizedlist>
+ *   * Elements close devices
+ *   * Elements reset any internal state.
+ * @GST_STATE_CHANGE_NULL_TO_NULL       : state change from NULL to NULL. (Since: 1.14)
+ * @GST_STATE_CHANGE_READY_TO_READY     : state change from READY to READY,
+ * This might happen when going to PAUSED asynchronously failed, in that case
+ * elements should make sure they are in a proper, coherent READY state. (Since: 1.14)
+ * @GST_STATE_CHANGE_PAUSED_TO_PAUSED   : state change from PAUSED to PAUSED.
+ * This might happen when elements were in PLAYING state and 'lost state',
+ * they should make sure to go back to real 'PAUSED' state (prerolling for example). (Since: 1.14)
+ * @GST_STATE_CHANGE_PLAYING_TO_PLAYING : state change from PLAYING to PLAYING. (Since: 1.14)
  *
  * These are the different state changes an element goes through.
  * %GST_STATE_NULL &rArr; %GST_STATE_PLAYING is called an upwards state change
@@ -306,7 +250,11 @@ typedef enum /*< flags=0 >*/
   GST_STATE_CHANGE_PAUSED_TO_PLAYING    = (GST_STATE_PAUSED<<3) | GST_STATE_PLAYING,
   GST_STATE_CHANGE_PLAYING_TO_PAUSED    = (GST_STATE_PLAYING<<3) | GST_STATE_PAUSED,
   GST_STATE_CHANGE_PAUSED_TO_READY      = (GST_STATE_PAUSED<<3) | GST_STATE_READY,
-  GST_STATE_CHANGE_READY_TO_NULL        = (GST_STATE_READY<<3) | GST_STATE_NULL
+  GST_STATE_CHANGE_READY_TO_NULL        = (GST_STATE_READY<<3) | GST_STATE_NULL,
+  GST_STATE_CHANGE_NULL_TO_NULL         = (GST_STATE_NULL<<3) | GST_STATE_NULL,
+  GST_STATE_CHANGE_READY_TO_READY       = (GST_STATE_READY<<3) | GST_STATE_READY,
+  GST_STATE_CHANGE_PAUSED_TO_PAUSED     = (GST_STATE_PAUSED<<3) | GST_STATE_PAUSED,
+  GST_STATE_CHANGE_PLAYING_TO_PLAYING   = (GST_STATE_PLAYING<<3) | GST_STATE_PLAYING
 } GstStateChange;
 
 /**
@@ -399,8 +347,28 @@ typedef enum
  */
 #define GST_ELEMENT_START_TIME(elem)            (GST_ELEMENT_CAST(elem)->start_time)
 
-GstStructure *gst_element_message_details_new(const char *name, ...);
-#define GST_ELEMENT_MESSAGE_MAKE_DETAILS(args) gst_element_message_details_new args
+GST_API
+GstStructure *gst_make_element_message_details (const char *name, ...);
+
+#define GST_ELEMENT_MESSAGE_MAKE_DETAILS(args) gst_make_element_message_details args
+
+/**
+ * GST_ELEMENT_FLOW_ERROR:
+ * @el:           the element that generates the error
+ * @flow_return:  the GstFlowReturn leading to that ERROR message
+ *
+ * Utility function that elements can use in case they encountered a fatal
+ * data processing error due to wrong flow processing.
+ *
+ * Since: 1.10
+ */
+#define GST_ELEMENT_FLOW_ERROR(el,flow_return)  \
+G_STMT_START {                                                          \
+  GST_ELEMENT_ERROR_WITH_DETAILS (el, STREAM, FAILED, \
+      ("Internal data stream error."), \
+      ("streaming stopped, reason %s (%d)", gst_flow_get_name (flow_return), flow_return), \
+      ("flow-return", G_TYPE_INT, flow_return, NULL));\
+} G_STMT_END
 
 /**
  * GST_ELEMENT_ERROR_WITH_DETAILS:
@@ -411,7 +379,7 @@ GstStructure *gst_element_message_details_new(const char *name, ...);
             parentheses)
  * @debug:  debugging information for the message (format string and args
             enclosed in parentheses)
- * @args    optional name, type, value triplets, which will be stored
+ * @args:   optional name, type, value triplets, which will be stored
  *          in the associated GstStructure. NULL terminator required.
  *          Must be enclosed within parentheses.
  *
@@ -421,7 +389,7 @@ GstStructure *gst_element_message_details_new(const char *name, ...);
  *
  * Since: 1.10
  */
-#define GST_ELEMENT_ERROR_WITH_DETAILS(el, domain, code, text, debug, args)  \
+#define GST_ELEMENT_ERROR_WITH_DETAILS(el,domain,code,text,debug,args)  \
 G_STMT_START {                                                          \
   gchar *__txt = _gst_element_error_printf text;                        \
   gchar *__dbg = _gst_element_error_printf debug;                       \
@@ -449,8 +417,19 @@ G_STMT_START {                                                          \
  * data processing error. The pipeline will post an error message and the
  * application will be requested to stop further media processing.
  */
-#define GST_ELEMENT_ERROR(el, domain, code, text, debug)                \
-  GST_ELEMENT_ERROR_WITH_DETAILS(el, domain, code, text, debug, (NULL))
+#define GST_ELEMENT_ERROR(el,domain,code,text,debug)                    \
+G_STMT_START {                                                          \
+  gchar *__txt = _gst_element_error_printf text;                        \
+  gchar *__dbg = _gst_element_error_printf debug;                       \
+  if (__txt)                                                            \
+    GST_WARNING_OBJECT (el, "error: %s", __txt);                        \
+  if (__dbg)                                                            \
+    GST_WARNING_OBJECT (el, "error: %s", __dbg);                        \
+  gst_element_message_full (GST_ELEMENT(el),                            \
+    GST_MESSAGE_ERROR, GST_ ## domain ## _ERROR,                        \
+      GST_ ## domain ## _ERROR_ ## code, __txt, __dbg, __FILE__,        \
+      GST_FUNCTION, __LINE__);                                          \
+} G_STMT_END
 
 /**
  * GST_ELEMENT_WARNING_WITH_DETAILS:
@@ -461,7 +440,7 @@ G_STMT_START {                                                          \
             parentheses)
  * @debug:  debugging information for the message (format string and args
             enclosed in parentheses)
- * @args    optional name, type, value triplets, which will be stored
+ * @args:   optional name, type, value triplets, which will be stored
  *          in the associated GstStructure. NULL terminator required.
  *          Must be enclosed within parentheses.
  *
@@ -500,7 +479,18 @@ G_STMT_START {                                                          \
  * application will be informed.
  */
 #define GST_ELEMENT_WARNING(el, domain, code, text, debug)              \
-  GST_ELEMENT_WARNING_WITH_DETAILS(el, domain, code, text, debug, (NULL))
+G_STMT_START {                                                          \
+  gchar *__txt = _gst_element_error_printf text;                        \
+  gchar *__dbg = _gst_element_error_printf debug;                       \
+  if (__txt)                                                            \
+    GST_WARNING_OBJECT (el, "warning: %s", __txt);                      \
+  if (__dbg)                                                            \
+    GST_WARNING_OBJECT (el, "warning: %s", __dbg);                      \
+  gst_element_message_full (GST_ELEMENT(el),                            \
+    GST_MESSAGE_WARNING, GST_ ## domain ## _ERROR,                      \
+    GST_ ## domain ## _ERROR_ ## code, __txt, __dbg, __FILE__,          \
+    GST_FUNCTION, __LINE__);                                            \
+} G_STMT_END
 
 /**
  * GST_ELEMENT_INFO_WITH_DETAILS:
@@ -511,7 +501,7 @@ G_STMT_START {                                                          \
             parentheses)
  * @debug:  debugging information for the message (format string and args
             enclosed in parentheses)
- * @args    optional name, type, value triplets, which will be stored
+ * @args:   optional name, type, value triplets, which will be stored
  *          in the associated GstStructure. NULL terminator required.
  *          Must be enclosed within parentheses.
  *
@@ -554,7 +544,18 @@ G_STMT_START {                                                          \
  * application will be informed.
  */
 #define GST_ELEMENT_INFO(el, domain, code, text, debug)                 \
-  GST_ELEMENT_INFO_WITH_DETAILS(el, domain, code, text, debug, (NULL))
+G_STMT_START {                                                          \
+  gchar *__txt = _gst_element_error_printf text;                        \
+  gchar *__dbg = _gst_element_error_printf debug;                       \
+  if (__txt)                                                            \
+    GST_INFO_OBJECT (el, "info: %s", __txt);                            \
+  if (__dbg)                                                            \
+    GST_INFO_OBJECT (el, "info: %s", __dbg);                            \
+  gst_element_message_full (GST_ELEMENT(el),                            \
+    GST_MESSAGE_INFO, GST_ ## domain ## _ERROR,                         \
+    GST_ ## domain ## _ERROR_ ## code, __txt, __dbg, __FILE__,          \
+    GST_FUNCTION, __LINE__);                                            \
+} G_STMT_END
 
 /* the state change mutexes and conds */
 /**
@@ -612,6 +613,7 @@ G_STMT_START {                                                          \
  * @numsinkpads: number of sink pads of the element.
  * @sinkpads: (element-type Gst.Pad): list of sink pads
  * @pads_cookie: updated whenever the a pad is added or removed
+ * @contexts: (element-type Gst.Context): list of contexts
  *
  * GStreamer element abstract base class.
  */
@@ -742,33 +744,52 @@ struct _GstElementClass
 };
 
 /* element class pad templates */
+
+GST_API
 void                    gst_element_class_add_pad_template      (GstElementClass *klass, GstPadTemplate *templ);
 
+GST_API
 void                    gst_element_class_add_static_pad_template (GstElementClass *klass, GstStaticPadTemplate *static_templ);
 
+GST_API
+void                    gst_element_class_add_static_pad_template_with_gtype (GstElementClass *klass,
+                                                                              GstStaticPadTemplate *static_templ,
+                                                                              GType pad_type);
+
+GST_API
 GstPadTemplate*         gst_element_class_get_pad_template      (GstElementClass *element_class, const gchar *name);
+
+GST_API
 GList*                  gst_element_class_get_pad_template_list (GstElementClass *element_class);
 
 /* element class meta data */
+
+GST_API
 void                    gst_element_class_set_metadata          (GstElementClass *klass,
                                                                  const gchar     *longname,
                                                                  const gchar     *classification,
                                                                  const gchar     *description,
                                                                  const gchar     *author);
+GST_API
 void                    gst_element_class_set_static_metadata   (GstElementClass *klass,
                                                                  const gchar     *longname,
                                                                  const gchar     *classification,
                                                                  const gchar     *description,
                                                                  const gchar     *author);
+GST_API
 void                    gst_element_class_add_metadata          (GstElementClass * klass,
                                                                  const gchar * key, const gchar * value);
+GST_API
 void                    gst_element_class_add_static_metadata   (GstElementClass * klass,
                                                                  const gchar * key, const gchar * value);
+GST_API
 const gchar *           gst_element_class_get_metadata          (GstElementClass * klass,
                                                                  const gchar * key);
 
 
 /* element instance */
+
+GST_API
 GType                   gst_element_get_type            (void);
 
 /* basic name and parentage stuff from GstObject */
@@ -817,62 +838,145 @@ GType                   gst_element_get_type            (void);
 #define                 gst_element_set_parent(elem,parent)     gst_object_set_parent(GST_OBJECT_CAST(elem),parent)
 
 /* clocking */
+
+GST_API
 GstClock*               gst_element_provide_clock       (GstElement *element);
+
+GST_API
 GstClock*               gst_element_get_clock           (GstElement *element);
+
+GST_API
 gboolean                gst_element_set_clock           (GstElement *element, GstClock *clock);
+
+GST_API
 void                    gst_element_set_base_time       (GstElement *element, GstClockTime time);
+
+GST_API
 GstClockTime            gst_element_get_base_time       (GstElement *element);
+
+GST_API
 void                    gst_element_set_start_time      (GstElement *element, GstClockTime time);
+
+GST_API
 GstClockTime            gst_element_get_start_time      (GstElement *element);
 
 /* bus */
+
+GST_API
 void                    gst_element_set_bus             (GstElement * element, GstBus * bus);
+
+GST_API
 GstBus *                gst_element_get_bus             (GstElement * element);
 
 /* context */
+
+GST_API
 void                    gst_element_set_context         (GstElement * element, GstContext * context);
+
+GST_API
 GList *                 gst_element_get_contexts        (GstElement * element);
+
+GST_API
 GstContext *            gst_element_get_context         (GstElement * element, const gchar * context_type);
+
+GST_API
 GstContext *            gst_element_get_context_unlocked (GstElement * element, const gchar * context_type);
 
 /* pad management */
+
+GST_API
 gboolean                gst_element_add_pad             (GstElement *element, GstPad *pad);
+
+GST_API
 gboolean                gst_element_remove_pad          (GstElement *element, GstPad *pad);
+
+GST_API
 void                    gst_element_no_more_pads        (GstElement *element);
 
+GST_API
 GstPad*                 gst_element_get_static_pad      (GstElement *element, const gchar *name);
+
+GST_API
 GstPad*                 gst_element_get_request_pad     (GstElement *element, const gchar *name);
+
+GST_API
 GstPad*                 gst_element_request_pad         (GstElement *element, GstPadTemplate *templ,
                                                         const gchar * name, const GstCaps *caps);
+GST_API
 void                    gst_element_release_request_pad (GstElement *element, GstPad *pad);
 
+GST_API
 GstIterator *           gst_element_iterate_pads        (GstElement * element);
+
+GST_API
 GstIterator *           gst_element_iterate_src_pads    (GstElement * element);
+
+GST_API
 GstIterator *           gst_element_iterate_sink_pads   (GstElement * element);
 
+/**
+ * GstElementForeachPadFunc:
+ * @element: the #GstElement
+ * @pad: a #GstPad
+ * @user_data: user data passed to the foreach function
+ *
+ * Function called for each pad when using gst_element_foreach_sink_pad(),
+ * gst_element_foreach_src_pad(), or gst_element_foreach_pad().
+ *
+ * Returns: %FALSE to stop iterating pads, %TRUE to continue
+ *
+ * Since: 1.14
+ */
+typedef gboolean (*GstElementForeachPadFunc) (GstElement * element,
+                                              GstPad     * pad,
+                                              gpointer     user_data);
+
+GST_API
+gboolean                gst_element_foreach_sink_pad    (GstElement * element,
+                                                         GstElementForeachPadFunc func,
+                                                         gpointer     user_data);
+GST_API
+gboolean                gst_element_foreach_src_pad     (GstElement * element,
+                                                         GstElementForeachPadFunc func,
+                                                         gpointer     user_data);
+GST_API
+gboolean                gst_element_foreach_pad         (GstElement * element,
+                                                         GstElementForeachPadFunc func,
+                                                         gpointer     user_data);
 /* event/query/format stuff */
+
+GST_API
 gboolean                gst_element_send_event          (GstElement *element, GstEvent *event);
+
+GST_API
 gboolean                gst_element_seek                (GstElement *element, gdouble rate,
                                                          GstFormat format, GstSeekFlags flags,
                                                          GstSeekType start_type, gint64 start,
                                                          GstSeekType stop_type, gint64 stop);
+GST_API
 gboolean                gst_element_query               (GstElement *element, GstQuery *query);
 
 /* messages */
+
+GST_API
 gboolean                gst_element_post_message        (GstElement * element, GstMessage * message);
 
 /* error handling */
 /* gcc versions < 3.3 warn about NULL being passed as format to printf */
 #if (!defined(__GNUC__) || (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 3))
+GST_API
 gchar *                 _gst_element_error_printf       (const gchar *format, ...);
 #else
+GST_API
 gchar *                 _gst_element_error_printf       (const gchar *format, ...) G_GNUC_PRINTF (1, 2);
 #endif
+
+GST_API
 void                    gst_element_message_full        (GstElement * element, GstMessageType type,
                                                          GQuark domain, gint code, gchar * text,
                                                          gchar * debug, const gchar * file,
                                                          const gchar * function, gint line);
-
+GST_API
 void                    gst_element_message_full_with_details (GstElement * element, GstMessageType type,
                                                          GQuark domain, gint code, gchar * text,
                                                          gchar * debug, const gchar * file,
@@ -880,45 +984,72 @@ void                    gst_element_message_full_with_details (GstElement * elem
                                                          GstStructure * structure);
 
 /* state management */
+
+GST_API
 gboolean                gst_element_is_locked_state     (GstElement *element);
+
+GST_API
 gboolean                gst_element_set_locked_state    (GstElement *element, gboolean locked_state);
+
+GST_API
 gboolean                gst_element_sync_state_with_parent (GstElement *element);
 
+GST_API
 GstStateChangeReturn    gst_element_get_state           (GstElement * element,
                                                          GstState * state,
                                                          GstState * pending,
                                                          GstClockTime timeout);
+GST_API
 GstStateChangeReturn    gst_element_set_state           (GstElement *element, GstState state);
 
+GST_API
 void                    gst_element_abort_state         (GstElement * element);
+
+GST_API
 GstStateChangeReturn    gst_element_change_state        (GstElement * element,
                                                          GstStateChange transition);
+
+GST_API
 GstStateChangeReturn    gst_element_continue_state      (GstElement * element,
                                                          GstStateChangeReturn ret);
+GST_API
 void                    gst_element_lost_state          (GstElement * element);
 
+
 typedef void          (*GstElementCallAsyncFunc)        (GstElement * element,
                                                          gpointer     user_data);
-
+GST_API
 void                    gst_element_call_async          (GstElement * element,
                                                          GstElementCallAsyncFunc func, gpointer user_data,
                                                          GDestroyNotify destroy_notify);
 
 /* factory management */
+
+GST_API
 GstElementFactory*      gst_element_get_factory         (GstElement *element);
 
 /* utility functions */
+
+GST_API
 gulong                  gst_element_add_property_notify_watch (GstElement  * element,
                                                                const gchar * property_name,
                                                                gboolean      include_value);
-
+GST_API
 gulong                  gst_element_add_property_deep_notify_watch (GstElement  * element,
                                                                     const gchar * property_name,
                                                                     gboolean      include_value);
-
+GST_API
 void                    gst_element_remove_property_notify_watch (GstElement * element,
                                                                   gulong       watch_id);
 
+GST_API
+GstPadTemplate*         gst_element_get_pad_template           (GstElement *element, const gchar *name);
+
+GST_API
+GList*                  gst_element_get_pad_template_list      (GstElement *element);
+GST_API
+const gchar *           gst_element_get_metadata               (GstElement * element, const gchar * key);
+
 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstElement, gst_object_unref)
 #endif