gst: Fix various Since markers
[platform/upstream/gstreamer.git] / gst / gstelement.h
index 43a064b..4ebfd09 100644 (file)
  *
  * 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.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 
 #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,24 +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/gstindex.h>
-#include <gst/gstindexfactory.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))
@@ -86,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 {
@@ -96,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.
  */
@@ -129,8 +129,6 @@ typedef enum {
  * @elem: a #GstElement to return the target state for.
  *
  * This macro returns the target #GstState of the element.
- *
- * Since: 0.10.13
  */
 #define GST_STATE_TARGET(elem)          (GST_ELEMENT_CAST(elem)->target_state)
 
@@ -179,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
- *     before setting them to PLAYING. This means that it is only alowed to
+ *   * 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_WRONG_STATE.
- *   </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
@@ -310,16 +250,18 @@ 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;
 
 /**
  * GstElementFlags:
- * @GST_ELEMENT_FLAG_UNPARENTING: Child is being removed from the parent bin.
- *  gst_bin_remove() on a child already being removed immediately returns FALSE
  * @GST_ELEMENT_FLAG_LOCKED_STATE: ignore state changes from parent
  * @GST_ELEMENT_FLAG_SINK: the element is a sink
- * @GST_ELEMENT_FLAG_SOURCE: the element is a source. Since 0.10.31
+ * @GST_ELEMENT_FLAG_SOURCE: the element is a source.
  * @GST_ELEMENT_FLAG_PROVIDE_CLOCK: the element can provide a clock
  * @GST_ELEMENT_FLAG_REQUIRE_CLOCK: the element requires a clock
  * @GST_ELEMENT_FLAG_INDEXABLE: the element can use an index
@@ -329,15 +271,14 @@ typedef enum /*< flags=0 >*/
  */
 typedef enum
 {
-  GST_ELEMENT_FLAG_UNPARENTING    = (GST_OBJECT_FLAG_LAST << 0),
-  GST_ELEMENT_FLAG_LOCKED_STATE   = (GST_OBJECT_FLAG_LAST << 1),
-  GST_ELEMENT_FLAG_SINK           = (GST_OBJECT_FLAG_LAST << 2),
-  GST_ELEMENT_FLAG_SOURCE         = (GST_OBJECT_FLAG_LAST << 3),
-  GST_ELEMENT_FLAG_PROVIDE_CLOCK  = (GST_OBJECT_FLAG_LAST << 4),
-  GST_ELEMENT_FLAG_REQUIRE_CLOCK  = (GST_OBJECT_FLAG_LAST << 5),
-  GST_ELEMENT_FLAG_INDEXABLE      = (GST_OBJECT_FLAG_LAST << 6),
+  GST_ELEMENT_FLAG_LOCKED_STATE   = (GST_OBJECT_FLAG_LAST << 0),
+  GST_ELEMENT_FLAG_SINK           = (GST_OBJECT_FLAG_LAST << 1),
+  GST_ELEMENT_FLAG_SOURCE         = (GST_OBJECT_FLAG_LAST << 2),
+  GST_ELEMENT_FLAG_PROVIDE_CLOCK  = (GST_OBJECT_FLAG_LAST << 3),
+  GST_ELEMENT_FLAG_REQUIRE_CLOCK  = (GST_OBJECT_FLAG_LAST << 4),
+  GST_ELEMENT_FLAG_INDEXABLE      = (GST_OBJECT_FLAG_LAST << 5),
   /* padding */
-  GST_ELEMENT_FLAG_LAST           = (GST_OBJECT_FLAG_LAST << 16)
+  GST_ELEMENT_FLAG_LAST           = (GST_OBJECT_FLAG_LAST << 10)
 } GstElementFlags;
 
 /**
@@ -353,8 +294,9 @@ typedef enum
  * GST_ELEMENT_NAME:
  * @elem: A #GstElement to query
  *
- * Gets the name of this element. Use only in core as this is not
- * ABI-compatible. Others use gst_element_get_name()
+ * Gets the name of this element. This is not thread-safe by default
+ * (i.e. you will have to make sure the object lock is taken yourself).
+ * If in doubt use gst_element_get_name() instead.
  */
 #define GST_ELEMENT_NAME(elem)                  (GST_OBJECT_NAME(elem))
 
@@ -362,7 +304,9 @@ typedef enum
  * GST_ELEMENT_PARENT:
  * @elem: A #GstElement to query
  *
- * Get the parent object of this element.
+ * Get the parent object of this element. This is not thread-safe by default
+ * (i.e. you will have to make sure the object lock is taken yourself).
+ * If in doubt use gst_object_get_parent() instead.
  */
 #define GST_ELEMENT_PARENT(elem)                (GST_ELEMENT_CAST(GST_OBJECT_PARENT(elem)))
 
@@ -370,7 +314,9 @@ typedef enum
  * GST_ELEMENT_BUS:
  * @elem: A #GstElement to query
  *
- * Get the message bus of this element.
+ * Get the message bus of this element. This is not thread-safe by default
+ * (i.e. you will have to make sure the object lock is taken yourself).
+ * If in doubt use gst_element_get_bus() instead.
  */
 #define GST_ELEMENT_BUS(elem)                   (GST_ELEMENT_CAST(elem)->bus)
 
@@ -378,7 +324,9 @@ typedef enum
  * GST_ELEMENT_CLOCK:
  * @elem: A #GstElement to query
  *
- * Get the clock of this element
+ * Get the clock of this element.This is not thread-safe by default
+ * (i.e. you will have to make sure it is safe yourself).
+ * If in doubt use gst_element_get_clock() instead.
  */
 #define GST_ELEMENT_CLOCK(elem)                 (GST_ELEMENT_CAST(elem)->clock)
 
@@ -396,11 +344,65 @@ typedef enum
  *
  * This macro returns the start_time of the @elem. The start_time is the
  * running_time of the pipeline when the element went to PAUSED.
- *
- * Since: 0.10.24
  */
 #define GST_ELEMENT_START_TIME(elem)            (GST_ELEMENT_CAST(elem)->start_time)
 
+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:
+ * @el:     the element that generates the error
+ * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #gstreamer-GstGError)
+ * @code:   error code defined for that domain (see #gstreamer-GstGError)
+ * @text:   the message to display (format string and args enclosed in
+            parentheses)
+ * @debug:  debugging information for the message (format string and args
+            enclosed in parentheses)
+ * @args:   optional name, type, value triplets, which will be stored
+ *          in the associated GstStructure. NULL terminator required.
+ *          Must be enclosed within parentheses.
+ *
+ * Utility function that elements can use in case they encountered a fatal
+ * data processing error. The pipeline will post an error message and the
+ * application will be requested to stop further media processing.
+ *
+ * Since: 1.10
+ */
+#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;                       \
+  if (__txt)                                                            \
+    GST_WARNING_OBJECT (el, "error: %s", __txt);                        \
+  if (__dbg)                                                            \
+    GST_WARNING_OBJECT (el, "error: %s", __dbg);                        \
+  gst_element_message_full_with_details (GST_ELEMENT(el),               \
+    GST_MESSAGE_ERROR, GST_ ## domain ## _ERROR,                        \
+      GST_ ## domain ## _ERROR_ ## code, __txt, __dbg, __FILE__,        \
+      GST_FUNCTION, __LINE__, GST_ELEMENT_MESSAGE_MAKE_DETAILS(args));  \
+} G_STMT_END
+
 /**
  * GST_ELEMENT_ERROR:
  * @el:     the element that generates the error
@@ -415,7 +417,7 @@ typedef enum
  * 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)                \
+#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;                       \
@@ -423,9 +425,43 @@ G_STMT_START {                                                          \
     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__);                    \
+  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:
+ * @el:     the element that generates the warning
+ * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #gstreamer-GstGError)
+ * @code:   error code defined for that domain (see #gstreamer-GstGError)
+ * @text:   the message to display (format string and args enclosed in
+            parentheses)
+ * @debug:  debugging information for the message (format string and args
+            enclosed in parentheses)
+ * @args:   optional name, type, value triplets, which will be stored
+ *          in the associated GstStructure. NULL terminator required.
+ *          Must be enclosed within parentheses.
+ *
+ * Utility function that elements can use in case they encountered a non-fatal
+ * data processing problem. The pipeline will post a warning message and the
+ * application will be informed.
+ *
+ * Since: 1.10
+ */
+#define GST_ELEMENT_WARNING_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;                       \
+  if (__txt)                                                            \
+    GST_WARNING_OBJECT (el, "warning: %s", __txt);                      \
+  if (__dbg)                                                            \
+    GST_WARNING_OBJECT (el, "warning: %s", __dbg);                      \
+  gst_element_message_full_with_details (GST_ELEMENT(el),               \
+    GST_MESSAGE_WARNING, GST_ ## domain ## _ERROR,                      \
+    GST_ ## domain ## _ERROR_ ## code, __txt, __dbg, __FILE__,          \
+    GST_FUNCTION, __LINE__, GST_ELEMENT_MESSAGE_MAKE_DETAILS(args));    \
 } G_STMT_END
 
 /**
@@ -450,13 +486,14 @@ G_STMT_START {                                                          \
     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__);                      \
+  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:
+ * GST_ELEMENT_INFO_WITH_DETAILS:
  * @el:     the element that generates the information
  * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #gstreamer-GstGError)
  * @code:   error code defined for that domain (see #gstreamer-GstGError)
@@ -464,13 +501,47 @@ 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
+ *          in the associated GstStructure. NULL terminator required.
+ *          Must be enclosed within parentheses.
  *
  * Utility function that elements can use in case they want to inform
  * the application of something noteworthy that is not an error.
  * The pipeline will post a info message and the
  * application will be informed.
+ * Optional name, type, value triplets may be supplied, and will be stored
+ * in the associated GstStructure. NULL terminator required.
+ *
+ * Since: 1.10
+ */
+#define GST_ELEMENT_INFO_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;                       \
+  if (__txt)                                                            \
+    GST_INFO_OBJECT (el, "info: %s", __txt);                            \
+  if (__dbg)                                                            \
+    GST_INFO_OBJECT (el, "info: %s", __dbg);                            \
+  gst_element_message_full_with_details (GST_ELEMENT(el),               \
+    GST_MESSAGE_INFO, GST_ ## domain ## _ERROR,                         \
+    GST_ ## domain ## _ERROR_ ## code, __txt, __dbg, __FILE__,          \
+    GST_FUNCTION, __LINE__, GST_ELEMENT_MESSAGE_MAKE_DETAILS(args));    \
+} G_STMT_END
+
+/**
+ * GST_ELEMENT_INFO:
+ * @el:     the element that generates the information
+ * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #gstreamer-GstGError)
+ * @code:   error code defined for that domain (see #gstreamer-GstGError)
+ * @text:   the message to display (format string and args enclosed in
+            parentheses)
+ * @debug:  debugging information for the message (format string and args
+            enclosed in parentheses)
  *
- * Since: 0.10.12
+ * Utility function that elements can use in case they want to inform
+ * the application of something noteworthy that is not an error.
+ * The pipeline will post a info message and the
+ * application will be informed.
  */
 #define GST_ELEMENT_INFO(el, domain, code, text, debug)                 \
 G_STMT_START {                                                          \
@@ -480,9 +551,10 @@ G_STMT_START {                                                          \
     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__);                      \
+  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 */
@@ -501,17 +573,15 @@ G_STMT_START {                                                          \
  *
  * Get the conditional used to signal the completion of a state change.
  */
-#define GST_STATE_GET_COND(elem)               (GST_ELEMENT_CAST(elem)->state_cond)
+#define GST_STATE_GET_COND(elem)               (&GST_ELEMENT_CAST(elem)->state_cond)
 
-#define GST_STATE_LOCK(elem)                   g_static_rec_mutex_lock(GST_STATE_GET_LOCK(elem))
-#define GST_STATE_TRYLOCK(elem)                g_static_rec_mutex_trylock(GST_STATE_GET_LOCK(elem))
-#define GST_STATE_UNLOCK(elem)                 g_static_rec_mutex_unlock(GST_STATE_GET_LOCK(elem))
-#define GST_STATE_UNLOCK_FULL(elem)            g_static_rec_mutex_unlock_full(GST_STATE_GET_LOCK(elem))
-#define GST_STATE_LOCK_FULL(elem,t)            g_static_rec_mutex_lock_full(GST_STATE_GET_LOCK(elem), t)
+#define GST_STATE_LOCK(elem)                   g_rec_mutex_lock(GST_STATE_GET_LOCK(elem))
+#define GST_STATE_TRYLOCK(elem)                g_rec_mutex_trylock(GST_STATE_GET_LOCK(elem))
+#define GST_STATE_UNLOCK(elem)                 g_rec_mutex_unlock(GST_STATE_GET_LOCK(elem))
 #define GST_STATE_WAIT(elem)                   g_cond_wait (GST_STATE_GET_COND (elem), \
                                                         GST_OBJECT_GET_LOCK (elem))
-#define GST_STATE_TIMED_WAIT(elem, timeval)    g_cond_timed_wait (GST_STATE_GET_COND (elem), \
-                                                        GST_OBJECT_GET_LOCK (elem), timeval)
+#define GST_STATE_WAIT_UNTIL(elem, end_time)   g_cond_wait_until (GST_STATE_GET_COND (elem), \
+                                                        GST_OBJECT_GET_LOCK (elem), end_time)
 #define GST_STATE_SIGNAL(elem)                 g_cond_signal (GST_STATE_GET_COND (elem));
 #define GST_STATE_BROADCAST(elem)              g_cond_broadcast (GST_STATE_GET_COND (elem));
 
@@ -537,12 +607,13 @@ G_STMT_START {                                                          \
  * 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
+ * @pads: (element-type Gst.Pad): list of pads
  * @numsrcpads: number of source pads of the element.
- * @srcpads: list of source pads
+ * @srcpads: (element-type Gst.Pad): list of source pads
  * @numsinkpads: number of sink pads of the element.
- * @sinkpads: list of sink pads
+ * @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.
  */
@@ -551,10 +622,10 @@ struct _GstElement
   GstObject             object;
 
   /*< public >*/ /* with LOCK */
-  GStaticRecMutex       state_lock;
+  GRecMutex             state_lock;
 
   /* element state */
-  GCond                *state_cond;
+  GCond                 state_cond;
   guint32               state_cookie;
   GstState              target_state;
   GstState              current_state;
@@ -579,8 +650,11 @@ struct _GstElement
   GList                *sinkpads;
   guint32               pads_cookie;
 
+  /* with object LOCK */
+  GList                *contexts;
+
   /*< private >*/
-  gpointer _gst_reserved[GST_PADDING];
+  gpointer _gst_reserved[GST_PADDING-1];
 };
 
 /**
@@ -599,11 +673,12 @@ struct _GstElement
  * @set_bus: set a #GstBus on the element
  * @provide_clock: gets the #GstClock provided by the element
  * @set_clock: set the #GstClock on the element
- * @get_index: set a #GstIndex on the element
- * @set_index: get the #GstIndex of an element
  * @send_event: send a #GstEvent to the element
  * @query: perform a #GstQuery on the element
  * @state_changed: called immediately after a new state was set.
+ * @post_message: called when a message is posted on the element. Chain up to
+ *                the parent class' handler to have it posted on the bus.
+ * @set_context: set a #GstContext on the element
  *
  * GStreamer element class. Override the vmethods to implement the element
  * functionality.
@@ -634,8 +709,10 @@ struct _GstElementClass
   /* virtual methods for subclasses */
 
   /* request/release pads */
+  /* FIXME 2.0 harmonize naming with gst_element_request_pad */
   GstPad*               (*request_new_pad)      (GstElement *element, GstPadTemplate *templ,
                                                  const gchar* name, const GstCaps *caps);
+
   void                  (*release_pad)          (GstElement *element, GstPad *pad);
 
   /* state changes */
@@ -653,37 +730,66 @@ struct _GstElementClass
   GstClock*             (*provide_clock)        (GstElement *element);
   gboolean              (*set_clock)            (GstElement *element, GstClock *clock);
 
-  /* index */
-  GstIndex*             (*get_index)            (GstElement *element);
-  void                  (*set_index)            (GstElement *element, GstIndex *index);
-
   /* query functions */
   gboolean              (*send_event)           (GstElement *element, GstEvent *event);
 
   gboolean              (*query)                (GstElement *element, GstQuery *query);
 
+  gboolean              (*post_message)         (GstElement *element, GstMessage *message);
+
+  void                  (*set_context)          (GstElement *element, GstContext *context);
+
   /*< private >*/
-  gpointer _gst_reserved[GST_PADDING];
+  gpointer _gst_reserved[GST_PADDING_LARGE-2];
 };
 
 /* 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 */
@@ -694,10 +800,11 @@ GType                   gst_element_get_type            (void);
  *
  * Returns a copy of the name of @elem.
  * Caller should g_free() the return value after usage.
- * For a nameless element, this returns NULL, which you can safely g_free()
+ * For a nameless element, this returns %NULL, which you can safely g_free()
  * as well.
  *
- * Returns: (transfer full): the name of @elem. g_free() after usage. MT safe.
+ * Returns: (transfer full) (nullable): the name of @elem. g_free()
+ * after usage. MT safe.
  *
  */
 #define                 gst_element_get_name(elem)      gst_object_get_name(GST_OBJECT_CAST(elem))
@@ -731,81 +838,222 @@ 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);
-GstClockTime            gst_element_get_start_time      (GstElement *element);
 
-/* indexes */
-void                    gst_element_set_index           (GstElement *element, GstIndex *index);
-GstIndex*               gst_element_get_index           (GstElement *element);
+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 cur_type, gint64 cur,
+                                                         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(GST_USING_PRINTF_EXTENSION) || !defined(__GNUC__) || (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 3))
+#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,
+                                                         const gchar * function, gint line,
+                                                         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
+
 G_END_DECLS
 
 #endif /* __GST_ELEMENT_H__ */