gstpad: Probes that return HANDLED can reset the data info field
[platform/upstream/gstreamer.git] / gst / gstpad.h
index 5f93112..1908398 100644 (file)
@@ -63,6 +63,7 @@ typedef enum {
 
 #include <glib.h>
 
+GST_API
 const gchar   * gst_pad_mode_get_name (GstPadMode mode);
 
 #include <gst/gstobject.h>
@@ -181,9 +182,14 @@ typedef enum {
   GST_FLOW_CUSTOM_ERROR_2 = -102
 } GstFlowReturn;
 
-const gchar*           gst_flow_get_name (GstFlowReturn ret);
-GQuark                           gst_flow_to_quark (GstFlowReturn ret);
-const gchar*          gst_pad_link_get_name (GstPadLinkReturn ret);
+GST_API
+const gchar *         gst_flow_get_name (GstFlowReturn ret);
+
+GST_API
+GQuark                gst_flow_to_quark (GstFlowReturn ret);
+
+GST_API
+const gchar *         gst_pad_link_get_name (GstPadLinkReturn ret);
 
 /**
  * GstPadLinkCheck:
@@ -196,6 +202,8 @@ const gchar*          gst_pad_link_get_name (GstPadLinkReturn ret);
  *   would be unsafe e.g. if one pad has %GST_CAPS_ANY.
  * @GST_PAD_LINK_CHECK_CAPS: Check if the pads are compatible by comparing the
  *   caps returned by gst_pad_query_caps().
+ * @GST_PAD_LINK_CHECK_NO_RECONFIGURE: Disables pushing a reconfigure event when pads are
+ *   linked.
  * @GST_PAD_LINK_CHECK_DEFAULT: The default checks done when linking
  *   pads (i.e. the ones used by gst_pad_link()).
  *
@@ -203,12 +211,10 @@ const gchar*          gst_pad_link_get_name (GstPadLinkReturn ret);
  * and @GST_PAD_LINK_CHECK_TEMPLATE_CAPS are mutually exclusive. If both are
  * specified, expensive but safe @GST_PAD_LINK_CHECK_CAPS are performed.
  *
- * <warning><para>
- * Only disable some of the checks if you are 100% certain you know the link
- * will not fail because of hierarchy/caps compatibility failures. If uncertain,
- * use the default checks (%GST_PAD_LINK_CHECK_DEFAULT) or the regular methods
- * for linking the pads.
- * </para></warning>
+ * > Only disable some of the checks if you are 100% certain you know the link
+ * > will not fail because of hierarchy/caps compatibility failures. If uncertain,
+ * > use the default checks (%GST_PAD_LINK_CHECK_DEFAULT) or the regular methods
+ * > for linking the pads.
  */
 
 typedef enum {
@@ -217,6 +223,11 @@ typedef enum {
   GST_PAD_LINK_CHECK_TEMPLATE_CAPS = 1 << 1,
   GST_PAD_LINK_CHECK_CAPS          = 1 << 2,
 
+
+  /* Not really checks, more like flags
+   * Added here to avoid creating a new gst_pad_link_variant */
+  GST_PAD_LINK_CHECK_NO_RECONFIGURE = 1 << 3,
+
   GST_PAD_LINK_CHECK_DEFAULT       = GST_PAD_LINK_CHECK_HIERARCHY | GST_PAD_LINK_CHECK_CAPS
 } GstPadLinkCheck;
 
@@ -362,6 +373,28 @@ typedef GstFlowReturn              (*GstPadGetRangeFunction)       (GstPad *pad, GstObject *parent
 typedef gboolean               (*GstPadEventFunction)          (GstPad *pad, GstObject *parent,
                                                                  GstEvent *event);
 
+/**
+ * GstPadEventFullFunction:
+ * @pad: the #GstPad to handle the event.
+ * @parent: (allow-none): the parent of @pad. If the #GST_PAD_FLAG_NEED_PARENT
+ *          flag is set, @parent is guaranteed to be not-%NULL and remain valid
+ *          during the execution of this function.
+ * @event: (transfer full): the #GstEvent to handle.
+ *
+ * Function signature to handle an event for the pad.
+ *
+ * This variant is for specific elements that will take into account the
+ * last downstream flow return (from a pad push), in which case they can
+ * return it.
+ *
+ * Returns: %GST_FLOW_OK if the event was handled properly, or any other
+ * #GstFlowReturn dependent on downstream state.
+ *
+ * Since: 1.8
+ */
+typedef GstFlowReturn          (*GstPadEventFullFunction)      (GstPad *pad, GstObject *parent,
+                                                                 GstEvent *event);
+
 
 /* internal links */
 /**
@@ -419,6 +452,9 @@ typedef GstPadLinkReturn    (*GstPadLinkFunction)           (GstPad *pad, GstObject *parent,
  *          during the execution of this function.
  *
  * Function signature to handle a unlinking the pad prom its peer.
+ *
+ * The pad's lock is already held when the unlink function is called, so most
+ * pad functions cannot be called from within the callback.
  */
 typedef void                   (*GstPadUnlinkFunction)         (GstPad *pad, GstObject *parent);
 
@@ -439,7 +475,7 @@ typedef gboolean            (*GstPadForwardFunction)        (GstPad *pad, gpointer user_data);
 /**
  * GstPadProbeType:
  * @GST_PAD_PROBE_TYPE_INVALID: invalid probe type
- * @GST_PAD_PROBE_TYPE_IDLE: probe idle pads and block
+ * @GST_PAD_PROBE_TYPE_IDLE: probe idle pads and block while the callback is called
  * @GST_PAD_PROBE_TYPE_BLOCK: probe and block pads
  * @GST_PAD_PROBE_TYPE_BUFFER: probe buffers
  * @GST_PAD_PROBE_TYPE_BUFFER_LIST: probe buffer lists
@@ -505,18 +541,19 @@ typedef enum
  * @GST_PAD_PROBE_OK: normal probe return value. This leaves the probe in
  *        place, and defers decisions about dropping or passing data to other
  *        probes, if any. If there are no other probes, the default behaviour
- *        for the probe type applies (block for blocking probes, and pass for
- *        non-blocking probes).
+ *        for the probe type applies ('block' for blocking probes,
+ *        and 'pass' for non-blocking probes).
  * @GST_PAD_PROBE_DROP: drop data in data probes. For push mode this means that
  *        the data item is not sent downstream. For pull mode, it means that
- *        the data item is not passed upstream. In both cases, no more probes
- *        are called and #GST_FLOW_OK or %TRUE is returned to the caller.
+ *        the data item is not passed upstream. In both cases, no other probes
+ *        are called for this item and %GST_FLOW_OK or %TRUE is returned to the
+ *        caller.
  * @GST_PAD_PROBE_REMOVE: remove this probe.
  * @GST_PAD_PROBE_PASS: pass the data item in the block probe and block on the
  *        next item.
  * @GST_PAD_PROBE_HANDLED: Data has been handled in the probe and will not be
  *        forwarded further. For events and buffers this is the same behaviour as
- *        @GST_PAD_PROBE_DROP (except that in this case you need to unref the buffer
+ *        %GST_PAD_PROBE_DROP (except that in this case you need to unref the buffer
  *        or event yourself). For queries it will also return %TRUE to the caller.
  *        The probe can also modify the #GstFlowReturn value by using the
  *        #GST_PAD_PROBE_INFO_FLOW_RETURN() accessor.
@@ -578,9 +615,16 @@ struct _GstPadProbeInfo
 #define GST_PAD_PROBE_INFO_OFFSET(d)       ((d)->offset)
 #define GST_PAD_PROBE_INFO_SIZE(d)         ((d)->size)
 
+GST_API
 GstEvent*      gst_pad_probe_info_get_event       (GstPadProbeInfo * info);
+
+GST_API
 GstQuery*      gst_pad_probe_info_get_query       (GstPadProbeInfo * info);
+
+GST_API
 GstBuffer*     gst_pad_probe_info_get_buffer      (GstPadProbeInfo * info);
+
+GST_API
 GstBufferList* gst_pad_probe_info_get_buffer_list (GstPadProbeInfo * info);
 
 /**
@@ -651,7 +695,7 @@ typedef gboolean  (*GstPadStickyEventsForeachFunction) (GstPad *pad, GstEvent **
  * @GST_PAD_FLAG_ACCEPT_TEMPLATE: the default accept-caps handler will use
  *                      the template pad caps instead of query caps to
  *                      compare with the accept caps. Use this in combination
- *                      with %GST_PAD_FLAG_ACCEPT_INTERSECT. (Since 1.6)
+ *                      with %GST_PAD_FLAG_ACCEPT_INTERSECT. (Since: 1.6)
  * @GST_PAD_FLAG_LAST: offset to define more flags
  *
  * Pad state flags
@@ -756,6 +800,7 @@ struct _GstPad {
     gpointer _gst_reserved[GST_PADDING];
     struct {
       GstFlowReturn last_flowret;
+      GstPadEventFullFunction eventfullfunc;
     } abi;
   } ABI;
 };
@@ -881,6 +926,19 @@ struct _GstPadClass {
  */
 #define GST_PAD_EVENTFUNC(pad)         (GST_PAD_CAST(pad)->eventfunc)
 /**
+ * GST_PAD_EVENTFULLFUNC:
+ * @pad: a #GstPad
+ *
+ * Get the #GstPadEventFullFunction from the given @pad, which
+ * is the function that handles events on the pad. You can
+ * use this to set your own event handling function on a pad
+ * after you create it.  If your element derives from a base
+ * class, use the base class's virtual functions instead.
+ *
+ * Since: 1.8
+ */
+#define GST_PAD_EVENTFULLFUNC(pad)     (GST_PAD_CAST(pad)->ABI.abi.eventfullfunc)
+/**
  * GST_PAD_QUERYFUNC:
  * @pad: a #GstPad
  *
@@ -1218,11 +1276,18 @@ struct _GstPadClass {
 #define GST_PAD_BLOCK_SIGNAL(pad)       (g_cond_signal(GST_PAD_BLOCK_GET_COND (pad)))
 #define GST_PAD_BLOCK_BROADCAST(pad)    (g_cond_broadcast(GST_PAD_BLOCK_GET_COND (pad)))
 
+GST_API
 GType                  gst_pad_get_type                        (void);
 
 /* creating pads */
+
+GST_API
 GstPad*                        gst_pad_new                             (const gchar *name, GstPadDirection direction);
+
+GST_API
 GstPad*                        gst_pad_new_from_template               (GstPadTemplate *templ, const gchar *name);
+
+GST_API
 GstPad*                        gst_pad_new_from_static_template        (GstStaticPadTemplate *templ, const gchar *name);
 
 
@@ -1249,63 +1314,100 @@ GstPad*                        gst_pad_new_from_static_template        (GstStaticPadTemplate *templ, const g
  */
 #define gst_pad_get_parent(pad) gst_object_get_parent (GST_OBJECT_CAST (pad))
 
+GST_API
 GstPadDirection                gst_pad_get_direction                   (GstPad *pad);
 
+GST_API
 gboolean               gst_pad_set_active                      (GstPad *pad, gboolean active);
+
+GST_API
 gboolean               gst_pad_is_active                       (GstPad *pad);
+
+GST_API
 gboolean               gst_pad_activate_mode                   (GstPad *pad, GstPadMode mode,
                                                                  gboolean active);
-
+GST_API
 gulong                  gst_pad_add_probe                       (GstPad *pad,
                                                                 GstPadProbeType mask,
                                                                 GstPadProbeCallback callback,
                                                                  gpointer user_data,
                                                                  GDestroyNotify destroy_data);
+GST_API
 void                    gst_pad_remove_probe                    (GstPad *pad, gulong id);
 
+GST_API
 gboolean               gst_pad_is_blocked                      (GstPad *pad);
+
+GST_API
 gboolean               gst_pad_is_blocking                     (GstPad *pad);
 
+GST_API
 void                    gst_pad_mark_reconfigure                (GstPad *pad);
+
+GST_API
 gboolean               gst_pad_needs_reconfigure               (GstPad *pad);
+
+GST_API
 gboolean               gst_pad_check_reconfigure               (GstPad *pad);
 
+GST_API
 void                   gst_pad_set_element_private             (GstPad *pad, gpointer priv);
+
+GST_API
 gpointer               gst_pad_get_element_private             (GstPad *pad);
 
+GST_API
 GstPadTemplate*                gst_pad_get_pad_template                (GstPad *pad);
 
+GST_API
 GstFlowReturn           gst_pad_store_sticky_event              (GstPad *pad, GstEvent *event);
+
+GST_API
 GstEvent*               gst_pad_get_sticky_event                (GstPad *pad, GstEventType event_type,
                                                                  guint idx);
+
+GST_API
 void                    gst_pad_sticky_events_foreach           (GstPad *pad, GstPadStickyEventsForeachFunction foreach_func, gpointer user_data);
 
 /* data passing setup functions */
+
+GST_API
 void                   gst_pad_set_activate_function_full      (GstPad *pad,
                                                                  GstPadActivateFunction activate,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+GST_API
 void                   gst_pad_set_activatemode_function_full  (GstPad *pad,
                                                                  GstPadActivateModeFunction activatemode,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
 /* data passing functions */
+
+GST_API
 void                   gst_pad_set_chain_function_full         (GstPad *pad,
                                                                  GstPadChainFunction chain,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+GST_API
 void                   gst_pad_set_chain_list_function_full    (GstPad *pad,
                                                                  GstPadChainListFunction chainlist,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+GST_API
 void                   gst_pad_set_getrange_function_full      (GstPad *pad,
                                                                  GstPadGetRangeFunction get,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+GST_API
 void                   gst_pad_set_event_function_full         (GstPad *pad,
                                                                  GstPadEventFunction event,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+GST_API
+void                   gst_pad_set_event_full_function_full    (GstPad *pad,
+                                                                 GstPadEventFullFunction event,
+                                                                 gpointer user_data,
+                                                                 GDestroyNotify notify);
 
 #define gst_pad_set_activate_function(p,f)      gst_pad_set_activate_function_full((p),(f),NULL,NULL)
 #define gst_pad_set_activatemode_function(p,f)  gst_pad_set_activatemode_function_full((p),(f),NULL,NULL)
@@ -1313,12 +1415,16 @@ void                    gst_pad_set_event_function_full         (GstPad *pad,
 #define gst_pad_set_chain_list_function(p,f)    gst_pad_set_chain_list_function_full((p),(f),NULL,NULL)
 #define gst_pad_set_getrange_function(p,f)      gst_pad_set_getrange_function_full((p),(f),NULL,NULL)
 #define gst_pad_set_event_function(p,f)         gst_pad_set_event_function_full((p),(f),NULL,NULL)
+#define gst_pad_set_event_full_function(p,f)    gst_pad_set_event_full_function_full((p),(f),NULL,NULL)
 
 /* pad links */
+
+GST_API
 void                   gst_pad_set_link_function_full          (GstPad *pad,
                                                                  GstPadLinkFunction link,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+GST_API
 void                   gst_pad_set_unlink_function_full        (GstPad *pad,
                                                                  GstPadUnlinkFunction unlink,
                                                                  gpointer user_data,
@@ -1327,75 +1433,140 @@ void                   gst_pad_set_unlink_function_full        (GstPad *pad,
 #define gst_pad_set_link_function(p,f)          gst_pad_set_link_function_full((p),(f),NULL,NULL)
 #define gst_pad_set_unlink_function(p,f)        gst_pad_set_unlink_function_full((p),(f),NULL,NULL)
 
+GST_API
 gboolean                gst_pad_can_link                        (GstPad *srcpad, GstPad *sinkpad);
+
+GST_API
 GstPadLinkReturn        gst_pad_link                           (GstPad *srcpad, GstPad *sinkpad);
+
+GST_API
 GstPadLinkReturn        gst_pad_link_full                      (GstPad *srcpad, GstPad *sinkpad, GstPadLinkCheck flags);
+
+GST_API
 gboolean               gst_pad_unlink                          (GstPad *srcpad, GstPad *sinkpad);
+
+GST_API
 gboolean               gst_pad_is_linked                       (GstPad *pad);
 
+GST_API
 GstPad*                        gst_pad_get_peer                        (GstPad *pad);
 
+GST_API
 GstCaps*                gst_pad_get_pad_template_caps          (GstPad *pad);
 
 /* capsnego function for linked/unlinked pads */
+
+GST_API
 GstCaps *              gst_pad_get_current_caps                (GstPad * pad);
+
+GST_API
 gboolean               gst_pad_has_current_caps                (GstPad * pad);
 
 /* capsnego for linked pads */
+
+GST_API
 GstCaps *              gst_pad_get_allowed_caps                (GstPad * pad);
 
 /* pad offsets */
+
+GST_API
 gint64                  gst_pad_get_offset                      (GstPad *pad);
+
+GST_API
 void                    gst_pad_set_offset                      (GstPad *pad, gint64 offset);
 
 /* data passing functions to peer */
+
+GST_API
 GstFlowReturn          gst_pad_push                            (GstPad *pad, GstBuffer *buffer);
+
+GST_API
 GstFlowReturn          gst_pad_push_list                       (GstPad *pad, GstBufferList *list);
+
+GST_API
 GstFlowReturn          gst_pad_pull_range                      (GstPad *pad, guint64 offset, guint size,
                                                                 GstBuffer **buffer);
+GST_API
 gboolean               gst_pad_push_event                      (GstPad *pad, GstEvent *event);
+
+GST_API
 gboolean               gst_pad_event_default                   (GstPad *pad, GstObject *parent,
                                                                  GstEvent *event);
+GST_API
 GstFlowReturn           gst_pad_get_last_flow_return            (GstPad *pad);
 
 /* data passing functions on pad */
+
+GST_API
 GstFlowReturn          gst_pad_chain                           (GstPad *pad, GstBuffer *buffer);
+
+GST_API
 GstFlowReturn          gst_pad_chain_list                      (GstPad *pad, GstBufferList *list);
+
+GST_API
 GstFlowReturn          gst_pad_get_range                       (GstPad *pad, guint64 offset, guint size,
                                                                 GstBuffer **buffer);
+GST_API
 gboolean               gst_pad_send_event                      (GstPad *pad, GstEvent *event);
 
 /* pad tasks */
+
+GST_API
 gboolean               gst_pad_start_task                      (GstPad *pad, GstTaskFunction func,
                                                                 gpointer user_data, GDestroyNotify notify);
+GST_API
 gboolean               gst_pad_pause_task                      (GstPad *pad);
+
+GST_API
 gboolean               gst_pad_stop_task                       (GstPad *pad);
 
+GST_API
+GstTaskState   gst_pad_get_task_state          (GstPad *pad);
+
 /* internal links */
+
+GST_API
 void                    gst_pad_set_iterate_internal_links_function_full (GstPad * pad,
                                                                  GstPadIterIntLinkFunction iterintlink,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+
+GST_API
 GstIterator *           gst_pad_iterate_internal_links          (GstPad * pad);
+
+GST_API
 GstIterator *           gst_pad_iterate_internal_links_default  (GstPad * pad, GstObject *parent);
 
 #define gst_pad_set_iterate_internal_links_function(p,f) gst_pad_set_iterate_internal_links_function_full((p),(f),NULL,NULL)
 
 /* generic query function */
+
+GST_API
 gboolean               gst_pad_query                           (GstPad *pad, GstQuery *query);
+
+GST_API
 gboolean               gst_pad_peer_query                      (GstPad *pad, GstQuery *query);
+
+GST_API
 void                   gst_pad_set_query_function_full         (GstPad *pad, GstPadQueryFunction query,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+GST_API
 gboolean               gst_pad_query_default                   (GstPad *pad, GstObject *parent,
                                                                  GstQuery *query);
 
 #define gst_pad_set_query_function(p,f)   gst_pad_set_query_function_full((p),(f),NULL,NULL)
 
 /* misc helper functions */
+
+GST_API
 gboolean               gst_pad_forward                         (GstPad *pad, GstPadForwardFunction forward,
                                                                 gpointer user_data);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPad, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_PAD_H__ */