gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
[platform/upstream/gstreamer.git] / gst / gstpad.c
1 /* GStreamer
2  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3  *                    2000 Wim Taymans <wtay@chello.be>
4  *
5  * gstpad.c: Pads for linking elements together
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22 /**
23  * SECTION:gstpad
24  * @short_description: Object contained by elements that allows links to
25  *                     other elements
26  * @see_also: #GstPadTemplate, #GstElement, #GstEvent
27  *
28  * A #GstElement is linked to other elements via "pads", which are extremely
29  * light-weight generic link points.
30  * After two pads are retrieved from an element with gst_element_get_pad(),
31  * the pads can be link with gst_pad_link(). (For quick links,
32  * you can also use gst_element_link(), which will make the obvious
33  * link for you if it's straightforward.)
34  *
35  * Pads are typically created from a #GstPadTemplate with
36  * gst_pad_new_from_template().
37  *
38  * Pads have #GstCaps attached to it to describe the media type they are
39  * capable of dealing with.  gst_pad_get_caps() and gst_pad_set_caps() are
40  * used to manipulate the caps of the pads.
41  * Pads created from a pad template cannot set capabilities that are
42  * incompatible with the pad template capabilities.
43  *
44  * Pads without pad templates can be created with gst_pad_new(),
45  * which takes a direction and a name as an argument.  If the name is NULL,
46  * then a guaranteed unique name will be assigned to it.
47  *
48  * gst_pad_get_parent() will retrieve the #GstElement that owns the pad.
49  *
50  * A #GstElement creating a pad will typically use the various
51  * gst_pad_set_*_function() calls to register callbacks for various events
52  * on the pads.
53  *
54  * GstElements will use gst_pad_push() and gst_pad_pull_range() to push out
55  * or pull in a buffer.
56  *
57  * To send a #GstEvent on a pad, use gst_pad_send_event() and
58  * gst_pad_push_event().
59  *
60  * Last reviewed on 2006-07-06 (0.10.9)
61  */
62
63 #include "gst_private.h"
64
65 #include "gstpad.h"
66 #include "gstpadtemplate.h"
67 #include "gstenumtypes.h"
68 #include "gstmarshal.h"
69 #include "gstutils.h"
70 #include "gstinfo.h"
71 #include "gsterror.h"
72 #include "gstvalue.h"
73 #include "glib-compat-private.h"
74
75 GST_DEBUG_CATEGORY_STATIC (debug_dataflow);
76 #define GST_CAT_DEFAULT GST_CAT_PADS
77
78 /* Pad signals and args */
79 enum
80 {
81   PAD_LINKED,
82   PAD_UNLINKED,
83   PAD_REQUEST_LINK,
84   PAD_HAVE_DATA,
85   /* FILL ME */
86   LAST_SIGNAL
87 };
88
89 enum
90 {
91   PAD_PROP_0,
92   PAD_PROP_CAPS,
93   PAD_PROP_DIRECTION,
94   PAD_PROP_TEMPLATE,
95   /* FILL ME */
96 };
97
98 static void gst_pad_class_init (GstPadClass * klass);
99 static void gst_pad_init (GstPad * pad);
100 static void gst_pad_dispose (GObject * object);
101 static void gst_pad_finalize (GObject * object);
102 static void gst_pad_set_property (GObject * object, guint prop_id,
103     const GValue * value, GParamSpec * pspec);
104 static void gst_pad_get_property (GObject * object, guint prop_id,
105     GValue * value, GParamSpec * pspec);
106
107 static GstFlowReturn handle_pad_block (GstPad * pad);
108 static GstCaps *gst_pad_get_caps_unlocked (GstPad * pad);
109 static void gst_pad_set_pad_template (GstPad * pad, GstPadTemplate * templ);
110 static gboolean gst_pad_activate_default (GstPad * pad);
111 static gboolean gst_pad_acceptcaps_default (GstPad * pad, GstCaps * caps);
112
113 #ifndef GST_DISABLE_LOADSAVE
114 static xmlNodePtr gst_pad_save_thyself (GstObject * object, xmlNodePtr parent);
115 #endif
116
117 static GstObjectClass *parent_class = NULL;
118 static guint gst_pad_signals[LAST_SIGNAL] = { 0 };
119
120 /* quarks for probe signals */
121 static GQuark buffer_quark;
122 static GQuark event_quark;
123
124 typedef struct
125 {
126   const gint ret;
127   const gchar *name;
128   GQuark quark;
129 } GstFlowQuarks;
130
131 static GstFlowQuarks flow_quarks[] = {
132   {GST_FLOW_CUSTOM_SUCCESS, "custom-success", 0},
133   {GST_FLOW_RESEND, "resend", 0},
134   {GST_FLOW_OK, "ok", 0},
135   {GST_FLOW_NOT_LINKED, "not-linked", 0},
136   {GST_FLOW_WRONG_STATE, "wrong-state", 0},
137   {GST_FLOW_UNEXPECTED, "unexpected", 0},
138   {GST_FLOW_NOT_NEGOTIATED, "not-negotiated", 0},
139   {GST_FLOW_ERROR, "error", 0},
140   {GST_FLOW_NOT_SUPPORTED, "not-supported", 0},
141   {GST_FLOW_CUSTOM_ERROR, "custom-error", 0},
142
143   {0, NULL, 0}
144 };
145
146 /**
147  * gst_flow_get_name:
148  * @ret: a #GstFlowReturn to get the name of.
149  *
150  * Gets a string representing the given flow return.
151  *
152  * Returns: a static string with the name of the flow return.
153  */
154 G_CONST_RETURN gchar *
155 gst_flow_get_name (GstFlowReturn ret)
156 {
157   gint i;
158
159   ret = CLAMP (ret, GST_FLOW_CUSTOM_ERROR, GST_FLOW_CUSTOM_SUCCESS);
160
161   for (i = 0; flow_quarks[i].name; i++) {
162     if (ret == flow_quarks[i].ret)
163       return flow_quarks[i].name;
164   }
165   return "unknown";
166 }
167
168 /**
169  * gst_flow_to_quark:
170  * @ret: a #GstFlowReturn to get the quark of.
171  *
172  * Get the unique quark for the given GstFlowReturn.
173  *
174  * Returns: the quark associated with the flow return or 0 if an
175  * invalid return was specified.
176  */
177 GQuark
178 gst_flow_to_quark (GstFlowReturn ret)
179 {
180   gint i;
181
182   ret = CLAMP (ret, GST_FLOW_CUSTOM_ERROR, GST_FLOW_CUSTOM_SUCCESS);
183
184   for (i = 0; flow_quarks[i].name; i++) {
185     if (ret == flow_quarks[i].ret)
186       return flow_quarks[i].quark;
187   }
188   return 0;
189 }
190
191 GType
192 gst_pad_get_type (void)
193 {
194   static GType gst_pad_type = 0;
195
196   if (G_UNLIKELY (gst_pad_type == 0)) {
197     static const GTypeInfo pad_info = {
198       sizeof (GstPadClass), NULL, NULL,
199       (GClassInitFunc) gst_pad_class_init, NULL, NULL,
200       sizeof (GstPad),
201       0,
202       (GInstanceInitFunc) gst_pad_init, NULL
203     };
204     gint i;
205
206     gst_pad_type = g_type_register_static (GST_TYPE_OBJECT, "GstPad",
207         &pad_info, 0);
208
209     buffer_quark = g_quark_from_static_string ("buffer");
210     event_quark = g_quark_from_static_string ("event");
211
212     for (i = 0; flow_quarks[i].name; i++) {
213       flow_quarks[i].quark = g_quark_from_static_string (flow_quarks[i].name);
214     }
215
216     GST_DEBUG_CATEGORY_INIT (debug_dataflow, "GST_DATAFLOW",
217         GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "dataflow inside pads");
218   }
219   return gst_pad_type;
220 }
221
222 static gboolean
223 _gst_do_pass_data_accumulator (GSignalInvocationHint * ihint,
224     GValue * return_accu, const GValue * handler_return, gpointer dummy)
225 {
226   gboolean ret = g_value_get_boolean (handler_return);
227
228   GST_DEBUG ("accumulated %d", ret);
229   g_value_set_boolean (return_accu, ret);
230
231   return ret;
232 }
233
234 static gboolean
235 default_have_data (GstPad * pad, GstMiniObject * o)
236 {
237   return TRUE;
238 }
239
240 static void
241 gst_pad_class_init (GstPadClass * klass)
242 {
243   GObjectClass *gobject_class;
244   GstObjectClass *gstobject_class;
245
246   gobject_class = G_OBJECT_CLASS (klass);
247   gstobject_class = GST_OBJECT_CLASS (klass);
248
249   parent_class = g_type_class_peek_parent (klass);
250
251   gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_pad_dispose);
252   gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_pad_finalize);
253   gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_pad_set_property);
254   gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_pad_get_property);
255
256   /**
257    * GstPad::linked:
258    * @pad: the pad that emitted the signal
259    * @peer: the peer pad that has been connected
260    *
261    * Signals that a pad has been linked to the peer pad.
262    */
263   gst_pad_signals[PAD_LINKED] =
264       g_signal_new ("linked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
265       G_STRUCT_OFFSET (GstPadClass, linked), NULL, NULL,
266       gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
267   /**
268    * GstPad::unlinked:
269    * @pad: the pad that emitted the signal
270    * @peer: the peer pad that has been disconnected
271    *
272    * Signals that a pad has been unlinked from the peer pad.
273    */
274   gst_pad_signals[PAD_UNLINKED] =
275       g_signal_new ("unlinked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
276       G_STRUCT_OFFSET (GstPadClass, unlinked), NULL, NULL,
277       gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
278   /**
279    * GstPad::request-link:
280    * @pad: the pad that emitted the signal
281    * @peer: the peer pad for which a connection is requested
282    *
283    * Signals that a pad connection has been requested.
284    */
285   gst_pad_signals[PAD_REQUEST_LINK] =
286       g_signal_new ("request-link", G_TYPE_FROM_CLASS (klass),
287       G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstPadClass, request_link), NULL,
288       NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 0);
289
290   /**
291    * GstPad::have-data:
292    * @pad: the pad that emitted the signal
293    * @mini_obj: new data
294    *
295    * Signals that new data is available on the pad. This signal is used
296    * internally for implementing pad probes.
297    * See gst_pad_add_*_probe functions.
298    *
299    * Returns: %TRUE to keep the data, %FALSE to drop it
300    */
301   gst_pad_signals[PAD_HAVE_DATA] =
302       g_signal_new ("have-data", G_TYPE_FROM_CLASS (klass),
303       G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
304       G_STRUCT_OFFSET (GstPadClass, have_data),
305       _gst_do_pass_data_accumulator,
306       NULL, gst_marshal_BOOLEAN__POINTER, G_TYPE_BOOLEAN, 1,
307       GST_TYPE_MINI_OBJECT);
308
309   g_object_class_install_property (gobject_class, PAD_PROP_CAPS,
310       g_param_spec_boxed ("caps", "Caps", "The capabilities of the pad",
311           GST_TYPE_CAPS, G_PARAM_READABLE));
312   g_object_class_install_property (gobject_class, PAD_PROP_DIRECTION,
313       g_param_spec_enum ("direction", "Direction", "The direction of the pad",
314           GST_TYPE_PAD_DIRECTION, GST_PAD_UNKNOWN,
315           G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
316   /* FIXME, Make G_PARAM_CONSTRUCT_ONLY when we fix ghostpads. */
317   g_object_class_install_property (gobject_class, PAD_PROP_TEMPLATE,
318       g_param_spec_object ("template", "Template",
319           "The GstPadTemplate of this pad", GST_TYPE_PAD_TEMPLATE,
320           G_PARAM_READWRITE));
321
322 #ifndef GST_DISABLE_LOADSAVE
323   gstobject_class->save_thyself = GST_DEBUG_FUNCPTR (gst_pad_save_thyself);
324 #endif
325   gstobject_class->path_string_separator = ".";
326
327   klass->have_data = default_have_data;
328 }
329
330 static void
331 gst_pad_init (GstPad * pad)
332 {
333   GST_PAD_DIRECTION (pad) = GST_PAD_UNKNOWN;
334   GST_PAD_PEER (pad) = NULL;
335
336   GST_PAD_CHAINFUNC (pad) = NULL;
337
338   GST_PAD_LINKFUNC (pad) = NULL;
339
340   GST_PAD_CAPS (pad) = NULL;
341   GST_PAD_GETCAPSFUNC (pad) = NULL;
342
343   GST_PAD_ACTIVATEFUNC (pad) = GST_DEBUG_FUNCPTR (gst_pad_activate_default);
344   GST_PAD_EVENTFUNC (pad) = GST_DEBUG_FUNCPTR (gst_pad_event_default);
345   GST_PAD_QUERYTYPEFUNC (pad) =
346       GST_DEBUG_FUNCPTR (gst_pad_get_query_types_default);
347   GST_PAD_QUERYFUNC (pad) = GST_DEBUG_FUNCPTR (gst_pad_query_default);
348   GST_PAD_INTLINKFUNC (pad) =
349       GST_DEBUG_FUNCPTR (gst_pad_get_internal_links_default);
350   GST_PAD_ACCEPTCAPSFUNC (pad) = GST_DEBUG_FUNCPTR (gst_pad_acceptcaps_default);
351
352   pad->do_buffer_signals = 0;
353   pad->do_event_signals = 0;
354
355   /* FIXME, should be set flushing initially, see #339326 */
356   GST_PAD_UNSET_FLUSHING (pad);
357
358   pad->preroll_lock = g_mutex_new ();
359   pad->preroll_cond = g_cond_new ();
360
361   pad->stream_rec_lock = g_new (GStaticRecMutex, 1);
362   g_static_rec_mutex_init (pad->stream_rec_lock);
363
364   pad->block_cond = g_cond_new ();
365 }
366
367 static void
368 gst_pad_dispose (GObject * object)
369 {
370   GstPad *pad = GST_PAD (object);
371
372   GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, pad, "dispose");
373
374   /* we don't hold a ref to the peer so we can just set the
375    * peer to NULL. */
376   GST_PAD_PEER (pad) = NULL;
377
378   /* clear the caps */
379   gst_caps_replace (&GST_PAD_CAPS (pad), NULL);
380
381   gst_pad_set_pad_template (pad, NULL);
382
383   G_OBJECT_CLASS (parent_class)->dispose (object);
384 }
385
386 static void
387 gst_pad_finalize (GObject * object)
388 {
389   GstPad *pad = GST_PAD (object);
390   GstTask *task;
391
392   /* in case the task is still around, clean it up */
393   if ((task = GST_PAD_TASK (pad))) {
394     gst_task_join (task);
395     GST_PAD_TASK (pad) = NULL;
396     gst_object_unref (task);
397   }
398
399   if (pad->stream_rec_lock) {
400     g_static_rec_mutex_free (pad->stream_rec_lock);
401     g_free (pad->stream_rec_lock);
402     pad->stream_rec_lock = NULL;
403   }
404   if (pad->preroll_lock) {
405     g_mutex_free (pad->preroll_lock);
406     g_cond_free (pad->preroll_cond);
407     pad->preroll_lock = NULL;
408     pad->preroll_cond = NULL;
409   }
410   if (pad->block_cond) {
411     g_cond_free (pad->block_cond);
412     pad->block_cond = NULL;
413   }
414
415   G_OBJECT_CLASS (parent_class)->finalize (object);
416 }
417
418 static void
419 gst_pad_set_property (GObject * object, guint prop_id,
420     const GValue * value, GParamSpec * pspec)
421 {
422   g_return_if_fail (GST_IS_PAD (object));
423
424   switch (prop_id) {
425     case PAD_PROP_DIRECTION:
426       GST_PAD_DIRECTION (object) = g_value_get_enum (value);
427       break;
428     case PAD_PROP_TEMPLATE:
429       gst_pad_set_pad_template (GST_PAD_CAST (object),
430           (GstPadTemplate *) g_value_get_object (value));
431       break;
432     default:
433       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
434       break;
435   }
436 }
437
438 static void
439 gst_pad_get_property (GObject * object, guint prop_id,
440     GValue * value, GParamSpec * pspec)
441 {
442   g_return_if_fail (GST_IS_PAD (object));
443
444   switch (prop_id) {
445     case PAD_PROP_CAPS:
446       GST_OBJECT_LOCK (object);
447       g_value_set_boxed (value, GST_PAD_CAPS (object));
448       GST_OBJECT_UNLOCK (object);
449       break;
450     case PAD_PROP_DIRECTION:
451       g_value_set_enum (value, GST_PAD_DIRECTION (object));
452       break;
453     case PAD_PROP_TEMPLATE:
454       g_value_set_object (value, GST_PAD_PAD_TEMPLATE (object));
455       break;
456     default:
457       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
458       break;
459   }
460 }
461
462 /**
463  * gst_pad_new:
464  * @name: the name of the new pad.
465  * @direction: the #GstPadDirection of the pad.
466  *
467  * Creates a new pad with the given name in the given direction.
468  * If name is NULL, a guaranteed unique name (across all pads)
469  * will be assigned.
470  * This function makes a copy of the name so you can safely free the name.
471  *
472  * Returns: a new #GstPad, or NULL in case of an error.
473  *
474  * MT safe.
475  */
476 GstPad *
477 gst_pad_new (const gchar * name, GstPadDirection direction)
478 {
479   return g_object_new (GST_TYPE_PAD,
480       "name", name, "direction", direction, NULL);
481 }
482
483 /**
484  * gst_pad_new_from_template:
485  * @templ: the pad template to use
486  * @name: the name of the element
487  *
488  * Creates a new pad with the given name from the given template.
489  * If name is NULL, a guaranteed unique name (across all pads)
490  * will be assigned.
491  * This function makes a copy of the name so you can safely free the name.
492  *
493  * Returns: a new #GstPad, or NULL in case of an error.
494  */
495 GstPad *
496 gst_pad_new_from_template (GstPadTemplate * templ, const gchar * name)
497 {
498   g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
499
500   return g_object_new (GST_TYPE_PAD,
501       "name", name, "direction", templ->direction, "template", templ, NULL);
502 }
503
504 /**
505  * gst_pad_new_from_static_template:
506  * @templ: the #GstStaticPadTemplate to use
507  * @name: the name of the element
508  *
509  * Creates a new pad with the given name from the given static template.
510  * If name is NULL, a guaranteed unique name (across all pads)
511  * will be assigned.
512  * This function makes a copy of the name so you can safely free the name.
513  *
514  * Returns: a new #GstPad, or NULL in case of an error.
515  */
516 GstPad *
517 gst_pad_new_from_static_template (GstStaticPadTemplate * templ,
518     const gchar * name)
519 {
520   GstPad *pad;
521   GstPadTemplate *template;
522
523   template = gst_static_pad_template_get (templ);
524   pad = gst_pad_new_from_template (template, name);
525   gst_object_unref (template);
526   return pad;
527 }
528
529 /**
530  * gst_pad_get_direction:
531  * @pad: a #GstPad to get the direction of.
532  *
533  * Gets the direction of the pad. The direction of the pad is
534  * decided at construction time so this function does not take
535  * the LOCK.
536  *
537  * Returns: the #GstPadDirection of the pad.
538  *
539  * MT safe.
540  */
541 GstPadDirection
542 gst_pad_get_direction (GstPad * pad)
543 {
544   GstPadDirection result;
545
546   /* PAD_UNKNOWN is a little silly but we need some sort of
547    * error return value */
548   g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_UNKNOWN);
549
550   GST_OBJECT_LOCK (pad);
551   result = GST_PAD_DIRECTION (pad);
552   GST_OBJECT_UNLOCK (pad);
553
554   return result;
555 }
556
557 static gboolean
558 gst_pad_activate_default (GstPad * pad)
559 {
560   return gst_pad_activate_push (pad, TRUE);
561 }
562
563 static void
564 pre_activate (GstPad * pad, GstActivateMode new_mode)
565 {
566   switch (new_mode) {
567     case GST_ACTIVATE_PUSH:
568     case GST_ACTIVATE_PULL:
569       GST_OBJECT_LOCK (pad);
570       GST_DEBUG_OBJECT (pad, "setting ACTIVATE_MODE %d, unset flushing",
571           new_mode);
572       GST_PAD_UNSET_FLUSHING (pad);
573       GST_PAD_ACTIVATE_MODE (pad) = new_mode;
574       GST_OBJECT_UNLOCK (pad);
575       break;
576     case GST_ACTIVATE_NONE:
577       GST_OBJECT_LOCK (pad);
578       GST_DEBUG_OBJECT (pad, "setting ACTIVATE_MODE NONE, set flushing",
579           new_mode);
580       GST_PAD_SET_FLUSHING (pad);
581       /* unlock blocked pads so element can resume and stop */
582       GST_PAD_BLOCK_SIGNAL (pad);
583       GST_OBJECT_UNLOCK (pad);
584       break;
585   }
586 }
587
588 static void
589 post_activate (GstPad * pad, GstActivateMode new_mode)
590 {
591   switch (new_mode) {
592     case GST_ACTIVATE_PUSH:
593     case GST_ACTIVATE_PULL:
594       /* nop */
595       break;
596     case GST_ACTIVATE_NONE:
597       /* ensures that streaming stops */
598       GST_PAD_STREAM_LOCK (pad);
599       /* while we're at it set activation mode */
600       GST_OBJECT_LOCK (pad);
601       GST_DEBUG_OBJECT (pad, "setting ACTIVATE_MODE %d", new_mode);
602       GST_PAD_ACTIVATE_MODE (pad) = new_mode;
603       GST_OBJECT_UNLOCK (pad);
604       GST_PAD_STREAM_UNLOCK (pad);
605       break;
606   }
607 }
608
609 /**
610  * gst_pad_set_active:
611  * @pad: the #GstPad to activate or deactivate.
612  * @active: whether or not the pad should be active.
613  *
614  * Activates or deactivates the given pad.
615  * Normally called from within core state change functions.
616  *
617  * If @active, makes sure the pad is active. If it is already active, either in
618  * push or pull mode, just return. Otherwise dispatches to the pad's activate
619  * function to perform the actual activation.
620  *
621  * If not @active, checks the pad's current mode and calls
622  * gst_pad_activate_push() or gst_pad_activate_pull(), as appropriate, with a
623  * FALSE argument.
624  *
625  * Returns: #TRUE if the operation was successful.
626  *
627  * MT safe.
628  */
629 gboolean
630 gst_pad_set_active (GstPad * pad, gboolean active)
631 {
632   GstActivateMode old;
633   gboolean ret = FALSE;
634
635   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
636
637   GST_OBJECT_LOCK (pad);
638   old = GST_PAD_ACTIVATE_MODE (pad);
639   GST_OBJECT_UNLOCK (pad);
640
641   if (active) {
642     switch (old) {
643       case GST_ACTIVATE_PUSH:
644       case GST_ACTIVATE_PULL:
645         ret = TRUE;
646         break;
647       case GST_ACTIVATE_NONE:
648         ret = (GST_PAD_ACTIVATEFUNC (pad)) (pad);
649         break;
650     }
651   } else {
652     switch (old) {
653       case GST_ACTIVATE_PUSH:
654         ret = gst_pad_activate_push (pad, FALSE);
655         break;
656       case GST_ACTIVATE_PULL:
657         ret = gst_pad_activate_pull (pad, FALSE);
658         break;
659       case GST_ACTIVATE_NONE:
660         ret = TRUE;
661         break;
662     }
663   }
664
665   if (!active && !ret) {
666     GST_OBJECT_LOCK (pad);
667     g_critical ("Failed to deactivate pad %s:%s, very bad",
668         GST_DEBUG_PAD_NAME (pad));
669     GST_OBJECT_UNLOCK (pad);
670   }
671
672   return ret;
673 }
674
675 /**
676  * gst_pad_activate_pull:
677  * @pad: the #GstPad to activate or deactivate.
678  * @active: whether or not the pad should be active.
679  *
680  * Activates or deactivates the given pad in pull mode via dispatching to the
681  * pad's activatepullfunc. For use from within pad activation functions only.
682  * When called on sink pads, will first proxy the call to the peer pad, which is
683  * expected to activate its internally linked pads from within its activate_pull
684  * function.
685  *
686  * If you don't know what this is, you probably don't want to call it.
687  *
688  * Returns: TRUE if the operation was successful.
689  *
690  * MT safe.
691  */
692 gboolean
693 gst_pad_activate_pull (GstPad * pad, gboolean active)
694 {
695   GstActivateMode old, new;
696   GstPad *peer;
697
698   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
699
700   GST_OBJECT_LOCK (pad);
701   old = GST_PAD_ACTIVATE_MODE (pad);
702   GST_OBJECT_UNLOCK (pad);
703
704   if (active) {
705     switch (old) {
706       case GST_ACTIVATE_PULL:
707         goto was_ok;
708       case GST_ACTIVATE_PUSH:
709         /* pad was activate in the wrong direction, deactivate it
710          * and reactivate it in pull mode */
711         if (G_UNLIKELY (!gst_pad_activate_push (pad, FALSE)))
712           goto deactivate_failed;
713         /* fallthrough, pad is deactivated now. */
714       case GST_ACTIVATE_NONE:
715         break;
716     }
717   } else {
718     switch (old) {
719       case GST_ACTIVATE_NONE:
720         goto was_ok;
721       case GST_ACTIVATE_PUSH:
722         /* pad was activated in the other direction, deactivate it
723          * in push mode, this should not happen... */
724         if (G_UNLIKELY (!gst_pad_activate_push (pad, FALSE)))
725           goto deactivate_failed;
726         /* everything is fine now */
727         goto was_ok;
728       case GST_ACTIVATE_PULL:
729         break;
730     }
731   }
732
733   if (gst_pad_get_direction (pad) == GST_PAD_SINK) {
734     if ((peer = gst_pad_get_peer (pad))) {
735       if (G_UNLIKELY (!gst_pad_activate_pull (peer, active)))
736         goto peer_failed;
737       gst_object_unref (peer);
738     }
739   } else {
740     if (G_UNLIKELY (GST_PAD_GETRANGEFUNC (pad) == NULL))
741       goto failure;             /* Can't activate pull on a src without a 
742                                    getrange function */
743   }
744
745   new = active ? GST_ACTIVATE_PULL : GST_ACTIVATE_NONE;
746   pre_activate (pad, new);
747
748   if (GST_PAD_ACTIVATEPULLFUNC (pad)) {
749     if (G_UNLIKELY (!GST_PAD_ACTIVATEPULLFUNC (pad) (pad, active)))
750       goto failure;
751   } else {
752     /* can happen for sinks of passthrough elements */
753   }
754
755   post_activate (pad, new);
756
757   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "%s in pull mode",
758       active ? "activated" : "deactivated");
759
760   return TRUE;
761
762 was_ok:
763   {
764     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "already %s in pull mode",
765         active ? "activated" : "deactivated");
766     return TRUE;
767   }
768 deactivate_failed:
769   {
770     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
771         "failed to %s in switch to pull from mode %d",
772         (active ? "activate" : "deactivate"), old);
773     return FALSE;
774   }
775 peer_failed:
776   {
777     GST_OBJECT_LOCK (peer);
778     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
779         "activate_pull on peer (%s:%s) failed", GST_DEBUG_PAD_NAME (peer));
780     GST_OBJECT_UNLOCK (peer);
781     gst_object_unref (peer);
782     return FALSE;
783   }
784 failure:
785   {
786     GST_CAT_INFO_OBJECT (GST_CAT_PADS, pad, "failed to %s in pull mode",
787         active ? "activate" : "deactivate");
788     pre_activate (pad, GST_ACTIVATE_NONE);
789     post_activate (pad, GST_ACTIVATE_NONE);
790     return FALSE;
791   }
792 }
793
794 /**
795  * gst_pad_activate_push:
796  * @pad: the #GstPad to activate or deactivate.
797  * @active: whether the pad should be active or not.
798  *
799  * Activates or deactivates the given pad in push mode via dispatching to the
800  * pad's activatepushfunc. For use from within pad activation functions only.
801  *
802  * If you don't know what this is, you probably don't want to call it.
803  *
804  * Returns: %TRUE if the operation was successful.
805  *
806  * MT safe.
807  */
808 gboolean
809 gst_pad_activate_push (GstPad * pad, gboolean active)
810 {
811   GstActivateMode old, new;
812
813   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
814   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "trying to set %s in push mode",
815       active ? "activated" : "deactivated");
816
817   GST_OBJECT_LOCK (pad);
818   old = GST_PAD_ACTIVATE_MODE (pad);
819   GST_OBJECT_UNLOCK (pad);
820
821   if (active) {
822     switch (old) {
823       case GST_ACTIVATE_PUSH:
824         goto was_ok;
825       case GST_ACTIVATE_PULL:
826         /* pad was activate in the wrong direction, deactivate it
827          * an reactivate it in push mode */
828         if (G_UNLIKELY (!gst_pad_activate_pull (pad, FALSE)))
829           goto deactivate_failed;
830         /* fallthrough, pad is deactivated now. */
831       case GST_ACTIVATE_NONE:
832         break;
833     }
834   } else {
835     switch (old) {
836       case GST_ACTIVATE_NONE:
837         goto was_ok;
838       case GST_ACTIVATE_PULL:
839         /* pad was activated in the other direction, deactivate it
840          * in pull mode, this should not happen... */
841         if (G_UNLIKELY (!gst_pad_activate_pull (pad, FALSE)))
842           goto deactivate_failed;
843         /* everything is fine now */
844         goto was_ok;
845       case GST_ACTIVATE_PUSH:
846         break;
847     }
848   }
849
850   new = active ? GST_ACTIVATE_PUSH : GST_ACTIVATE_NONE;
851   pre_activate (pad, new);
852
853   if (GST_PAD_ACTIVATEPUSHFUNC (pad)) {
854     if (G_UNLIKELY (!GST_PAD_ACTIVATEPUSHFUNC (pad) (pad, active))) {
855       goto failure;
856     }
857   } else {
858     /* quite ok, element relies on state change func to prepare itself */
859   }
860
861   post_activate (pad, new);
862
863   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "%s in push mode",
864       active ? "activated" : "deactivated");
865   return TRUE;
866
867 was_ok:
868   {
869     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "already %s in push mode",
870         active ? "activated" : "deactivated");
871     return TRUE;
872   }
873 deactivate_failed:
874   {
875     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
876         "failed to %s in switch to push from mode %d",
877         (active ? "activate" : "deactivate"), old);
878     return FALSE;
879   }
880 failure:
881   {
882     GST_CAT_INFO_OBJECT (GST_CAT_PADS, pad, "failed to %s in push mode",
883         active ? "activate" : "deactivate");
884     pre_activate (pad, GST_ACTIVATE_NONE);
885     post_activate (pad, GST_ACTIVATE_NONE);
886     return FALSE;
887   }
888 }
889
890 /**
891  * gst_pad_is_active:
892  * @pad: the #GstPad to query
893  *
894  * Query if a pad is active
895  *
896  * Returns: TRUE if the pad is active.
897  *
898  * MT safe.
899  */
900 gboolean
901 gst_pad_is_active (GstPad * pad)
902 {
903   gboolean result = FALSE;
904
905   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
906
907   GST_OBJECT_LOCK (pad);
908   result = GST_PAD_MODE_ACTIVATE (GST_PAD_ACTIVATE_MODE (pad));
909   GST_OBJECT_UNLOCK (pad);
910
911   return result;
912 }
913
914 /**
915  * gst_pad_set_blocked_async:
916  * @pad: the #GstPad to block or unblock
917  * @blocked: boolean indicating whether the pad should be blocked or unblocked
918  * @callback: #GstPadBlockCallback that will be called when the
919  *            operation succeeds
920  * @user_data: user data passed to the callback
921  *
922  * Blocks or unblocks the dataflow on a pad. The provided callback
923  * is called when the operation succeeds; this happens right before the next
924  * attempt at pushing a buffer on the pad.
925  *
926  * This can take a while as the pad can only become blocked when real dataflow
927  * is happening.
928  * When the pipeline is stalled, for example in PAUSED, this can
929  * take an indeterminate amount of time.
930  * You can pass NULL as the callback to make this call block. Be careful with
931  * this blocking call as it might not return for reasons stated above.
932  *
933  * Returns: TRUE if the pad could be blocked. This function can fail
934  *   if wrong parameters were passed or the pad was already in the
935  *   requested state.
936  *
937  * MT safe.
938  */
939 gboolean
940 gst_pad_set_blocked_async (GstPad * pad, gboolean blocked,
941     GstPadBlockCallback callback, gpointer user_data)
942 {
943   gboolean was_blocked = FALSE;
944
945   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
946
947   GST_OBJECT_LOCK (pad);
948
949   was_blocked = GST_PAD_IS_BLOCKED (pad);
950
951   if (G_UNLIKELY (was_blocked == blocked))
952     goto had_right_state;
953
954   if (blocked) {
955     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "blocking pad");
956
957     GST_OBJECT_FLAG_SET (pad, GST_PAD_BLOCKED);
958     pad->block_callback = callback;
959     pad->block_data = user_data;
960     if (!callback) {
961       GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "waiting for block");
962       GST_PAD_BLOCK_WAIT (pad);
963       GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "blocked");
964     }
965   } else {
966     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "unblocking pad");
967
968     GST_OBJECT_FLAG_UNSET (pad, GST_PAD_BLOCKED);
969
970     pad->block_callback = callback;
971     pad->block_data = user_data;
972
973     if (callback) {
974       GST_PAD_BLOCK_SIGNAL (pad);
975     } else {
976       GST_PAD_BLOCK_SIGNAL (pad);
977       GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "waiting for unblock");
978       GST_PAD_BLOCK_WAIT (pad);
979       GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "unblocked");
980     }
981   }
982   GST_OBJECT_UNLOCK (pad);
983
984   return TRUE;
985
986 had_right_state:
987   {
988     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
989         "pad was in right state (%d)", was_blocked);
990     GST_OBJECT_UNLOCK (pad);
991
992     return FALSE;
993   }
994 }
995
996 /**
997  * gst_pad_set_blocked:
998  * @pad: the #GstPad to block or unblock
999  * @blocked: boolean indicating we should block or unblock
1000  *
1001  * Blocks or unblocks the dataflow on a pad. This function is
1002  * a shortcut for gst_pad_set_blocked_async() with a NULL
1003  * callback.
1004  *
1005  * Returns: TRUE if the pad could be blocked. This function can fail
1006  *   wrong parameters were passed or the pad was already in the
1007  *   requested state.
1008  *
1009  * MT safe.
1010  */
1011 gboolean
1012 gst_pad_set_blocked (GstPad * pad, gboolean blocked)
1013 {
1014   return gst_pad_set_blocked_async (pad, blocked, NULL, NULL);
1015 }
1016
1017 /**
1018  * gst_pad_is_blocked:
1019  * @pad: the #GstPad to query
1020  *
1021  * Checks if the pad is blocked or not. This function returns the
1022  * last requested state of the pad. It is not certain that the pad
1023  * is actually blocked at this point.
1024  *
1025  * Returns: TRUE if the pad is blocked.
1026  *
1027  * MT safe.
1028  */
1029 gboolean
1030 gst_pad_is_blocked (GstPad * pad)
1031 {
1032   gboolean result = FALSE;
1033
1034   g_return_val_if_fail (GST_IS_PAD (pad), result);
1035
1036   GST_OBJECT_LOCK (pad);
1037   result = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKED);
1038   GST_OBJECT_UNLOCK (pad);
1039
1040   return result;
1041 }
1042
1043 /**
1044  * gst_pad_set_activate_function:
1045  * @pad: a #GstPad.
1046  * @activate: the #GstPadActivateFunction to set.
1047  *
1048  * Sets the given activate function for @pad. The activate function will
1049  * dispatch to gst_pad_activate_push() or gst_pad_activate_pull() to perform
1050  * the actual activation. Only makes sense to set on sink pads.
1051  *
1052  * Call this function if your sink pad can start a pull-based task.
1053  */
1054 void
1055 gst_pad_set_activate_function (GstPad * pad, GstPadActivateFunction activate)
1056 {
1057   g_return_if_fail (GST_IS_PAD (pad));
1058
1059   GST_PAD_ACTIVATEFUNC (pad) = activate;
1060   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "activatefunc set to %s",
1061       GST_DEBUG_FUNCPTR_NAME (activate));
1062 }
1063
1064 /**
1065  * gst_pad_set_activatepull_function:
1066  * @pad: a #GstPad.
1067  * @activatepull: the #GstPadActivateModeFunction to set.
1068  *
1069  * Sets the given activate_pull function for the pad. An activate_pull function
1070  * prepares the element and any upstream connections for pulling. See XXX
1071  * part-activation.txt for details.
1072  */
1073 void
1074 gst_pad_set_activatepull_function (GstPad * pad,
1075     GstPadActivateModeFunction activatepull)
1076 {
1077   g_return_if_fail (GST_IS_PAD (pad));
1078
1079   GST_PAD_ACTIVATEPULLFUNC (pad) = activatepull;
1080   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "activatepullfunc set to %s",
1081       GST_DEBUG_FUNCPTR_NAME (activatepull));
1082 }
1083
1084 /**
1085  * gst_pad_set_activatepush_function:
1086  * @pad: a #GstPad.
1087  * @activatepush: the #GstPadActivateModeFunction to set.
1088  *
1089  * Sets the given activate_push function for the pad. An activate_push function
1090  * prepares the element for pushing. See XXX part-activation.txt for details.
1091  */
1092 void
1093 gst_pad_set_activatepush_function (GstPad * pad,
1094     GstPadActivateModeFunction activatepush)
1095 {
1096   g_return_if_fail (GST_IS_PAD (pad));
1097
1098   GST_PAD_ACTIVATEPUSHFUNC (pad) = activatepush;
1099   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "activatepushfunc set to %s",
1100       GST_DEBUG_FUNCPTR_NAME (activatepush));
1101 }
1102
1103 /**
1104  * gst_pad_set_chain_function:
1105  * @pad: a sink #GstPad.
1106  * @chain: the #GstPadChainFunction to set.
1107  *
1108  * Sets the given chain function for the pad. The chain function is called to
1109  * process a #GstBuffer input buffer. see #GstPadChainFunction for more details.
1110  */
1111 void
1112 gst_pad_set_chain_function (GstPad * pad, GstPadChainFunction chain)
1113 {
1114   g_return_if_fail (GST_IS_PAD (pad));
1115   g_return_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SINK);
1116
1117   GST_PAD_CHAINFUNC (pad) = chain;
1118   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "chainfunc set to %s",
1119       GST_DEBUG_FUNCPTR_NAME (chain));
1120 }
1121
1122 /**
1123  * gst_pad_set_getrange_function:
1124  * @pad: a source #GstPad.
1125  * @get: the #GstPadGetRangeFunction to set.
1126  *
1127  * Sets the given getrange function for the pad. The getrange function is called to
1128  * produce a new #GstBuffer to start the processing pipeline. see
1129  * #GstPadGetRangeFunction for a description of the getrange function.
1130  */
1131 void
1132 gst_pad_set_getrange_function (GstPad * pad, GstPadGetRangeFunction get)
1133 {
1134   g_return_if_fail (GST_IS_PAD (pad));
1135   g_return_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SRC);
1136
1137   GST_PAD_GETRANGEFUNC (pad) = get;
1138
1139   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "getrangefunc set to %s",
1140       GST_DEBUG_FUNCPTR_NAME (get));
1141 }
1142
1143 /**
1144  * gst_pad_set_checkgetrange_function:
1145  * @pad: a source #GstPad.
1146  * @check: the #GstPadCheckGetRangeFunction to set.
1147  *
1148  * Sets the given checkgetrange function for the pad. Implement this function on
1149  * a pad if you dynamically support getrange based scheduling on the pad.
1150  */
1151 void
1152 gst_pad_set_checkgetrange_function (GstPad * pad,
1153     GstPadCheckGetRangeFunction check)
1154 {
1155   g_return_if_fail (GST_IS_PAD (pad));
1156   g_return_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SRC);
1157
1158   GST_PAD_CHECKGETRANGEFUNC (pad) = check;
1159
1160   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "checkgetrangefunc set to %s",
1161       GST_DEBUG_FUNCPTR_NAME (check));
1162 }
1163
1164 /**
1165  * gst_pad_set_event_function:
1166  * @pad: a source #GstPad.
1167  * @event: the #GstPadEventFunction to set.
1168  *
1169  * Sets the given event handler for the pad.
1170  */
1171 void
1172 gst_pad_set_event_function (GstPad * pad, GstPadEventFunction event)
1173 {
1174   g_return_if_fail (GST_IS_PAD (pad));
1175
1176   GST_PAD_EVENTFUNC (pad) = event;
1177
1178   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "eventfunc for set to %s",
1179       GST_DEBUG_FUNCPTR_NAME (event));
1180 }
1181
1182 /**
1183  * gst_pad_set_query_function:
1184  * @pad: a #GstPad of either direction.
1185  * @query: the #GstPadQueryFunction to set.
1186  *
1187  * Set the given query function for the pad.
1188  */
1189 void
1190 gst_pad_set_query_function (GstPad * pad, GstPadQueryFunction query)
1191 {
1192   g_return_if_fail (GST_IS_PAD (pad));
1193
1194   GST_PAD_QUERYFUNC (pad) = query;
1195
1196   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "queryfunc set to %s",
1197       GST_DEBUG_FUNCPTR_NAME (query));
1198 }
1199
1200 /**
1201  * gst_pad_set_query_type_function:
1202  * @pad: a #GstPad of either direction.
1203  * @type_func: the #GstPadQueryTypeFunction to set.
1204  *
1205  * Set the given query type function for the pad.
1206  */
1207 void
1208 gst_pad_set_query_type_function (GstPad * pad,
1209     GstPadQueryTypeFunction type_func)
1210 {
1211   g_return_if_fail (GST_IS_PAD (pad));
1212
1213   GST_PAD_QUERYTYPEFUNC (pad) = type_func;
1214
1215   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "querytypefunc set to %s",
1216       GST_DEBUG_FUNCPTR_NAME (type_func));
1217 }
1218
1219 /**
1220  * gst_pad_get_query_types:
1221  * @pad: a #GstPad.
1222  *
1223  * Get an array of supported queries that can be performed
1224  * on this pad.
1225  *
1226  * Returns: a zero-terminated array of #GstQueryType.
1227  */
1228 const GstQueryType *
1229 gst_pad_get_query_types (GstPad * pad)
1230 {
1231   GstPadQueryTypeFunction func;
1232
1233   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1234
1235   if (G_UNLIKELY ((func = GST_PAD_QUERYTYPEFUNC (pad)) == NULL))
1236     goto no_func;
1237
1238   return func (pad);
1239
1240 no_func:
1241   {
1242     return NULL;
1243   }
1244 }
1245
1246 static gboolean
1247 gst_pad_get_query_types_dispatcher (GstPad * pad, const GstQueryType ** data)
1248 {
1249   *data = gst_pad_get_query_types (pad);
1250
1251   return TRUE;
1252 }
1253
1254 /**
1255  * gst_pad_get_query_types_default:
1256  * @pad: a #GstPad.
1257  *
1258  * Invoke the default dispatcher for the query types on
1259  * the pad.
1260  *
1261  * Returns: an zero-terminated array of #GstQueryType, or NULL if none of the
1262  * internally-linked pads has a query types function.
1263  */
1264 const GstQueryType *
1265 gst_pad_get_query_types_default (GstPad * pad)
1266 {
1267   GstQueryType *result = NULL;
1268
1269   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1270
1271   gst_pad_dispatcher (pad, (GstPadDispatcherFunction)
1272       gst_pad_get_query_types_dispatcher, &result);
1273
1274   return result;
1275 }
1276
1277 /**
1278  * gst_pad_set_internal_link_function:
1279  * @pad: a #GstPad of either direction.
1280  * @intlink: the #GstPadIntLinkFunction to set.
1281  *
1282  * Sets the given internal link function for the pad.
1283  */
1284 void
1285 gst_pad_set_internal_link_function (GstPad * pad, GstPadIntLinkFunction intlink)
1286 {
1287   g_return_if_fail (GST_IS_PAD (pad));
1288
1289   GST_PAD_INTLINKFUNC (pad) = intlink;
1290   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "internal link set to %s",
1291       GST_DEBUG_FUNCPTR_NAME (intlink));
1292 }
1293
1294 /**
1295  * gst_pad_set_link_function:
1296  * @pad: a #GstPad.
1297  * @link: the #GstPadLinkFunction to set.
1298  *
1299  * Sets the given link function for the pad. It will be called when
1300  * the pad is linked with another pad.
1301  *
1302  * The return value #GST_PAD_LINK_OK should be used when the connection can be
1303  * made.
1304  *
1305  * The return value #GST_PAD_LINK_REFUSED should be used when the connection
1306  * cannot be made for some reason.
1307  *
1308  * If @link is installed on a source pad, it should call the #GstPadLinkFunction
1309  * of the peer sink pad, if present.
1310  */
1311 void
1312 gst_pad_set_link_function (GstPad * pad, GstPadLinkFunction link)
1313 {
1314   g_return_if_fail (GST_IS_PAD (pad));
1315
1316   GST_PAD_LINKFUNC (pad) = link;
1317   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "linkfunc set to %s",
1318       GST_DEBUG_FUNCPTR_NAME (link));
1319 }
1320
1321 /**
1322  * gst_pad_set_unlink_function:
1323  * @pad: a #GstPad.
1324  * @unlink: the #GstPadUnlinkFunction to set.
1325  *
1326  * Sets the given unlink function for the pad. It will be called
1327  * when the pad is unlinked.
1328  */
1329 void
1330 gst_pad_set_unlink_function (GstPad * pad, GstPadUnlinkFunction unlink)
1331 {
1332   g_return_if_fail (GST_IS_PAD (pad));
1333
1334   GST_PAD_UNLINKFUNC (pad) = unlink;
1335   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "unlinkfunc set to %s",
1336       GST_DEBUG_FUNCPTR_NAME (unlink));
1337 }
1338
1339 /**
1340  * gst_pad_set_getcaps_function:
1341  * @pad: a #GstPad.
1342  * @getcaps: the #GstPadGetCapsFunction to set.
1343  *
1344  * Sets the given getcaps function for the pad. @getcaps should return the
1345  * allowable caps for a pad in the context of the element's state, its link to
1346  * other elements, and the devices or files it has opened. These caps must be a
1347  * subset of the pad template caps. In the NULL state with no links, @getcaps
1348  * should ideally return the same caps as the pad template. In rare
1349  * circumstances, an object property can affect the caps returned by @getcaps,
1350  * but this is discouraged.
1351  *
1352  * You do not need to call this function if @pad's allowed caps are always the
1353  * same as the pad template caps. This can only be true if the padtemplate
1354  * has fixed simple caps.
1355  *
1356  * For most filters, the caps returned by @getcaps is directly affected by the
1357  * allowed caps on other pads. For demuxers and decoders, the caps returned by
1358  * the srcpad's getcaps function is directly related to the stream data. Again,
1359  * @getcaps should return the most specific caps it reasonably can, since this
1360  * helps with autoplugging.
1361  *
1362  * Note that the return value from @getcaps is owned by the caller, so the caller
1363  * should unref the caps after usage.
1364  */
1365 void
1366 gst_pad_set_getcaps_function (GstPad * pad, GstPadGetCapsFunction getcaps)
1367 {
1368   g_return_if_fail (GST_IS_PAD (pad));
1369
1370   GST_PAD_GETCAPSFUNC (pad) = getcaps;
1371   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "getcapsfunc set to %s",
1372       GST_DEBUG_FUNCPTR_NAME (getcaps));
1373 }
1374
1375 /**
1376  * gst_pad_set_acceptcaps_function:
1377  * @pad: a #GstPad.
1378  * @acceptcaps: the #GstPadAcceptCapsFunction to set.
1379  *
1380  * Sets the given acceptcaps function for the pad.  The acceptcaps function
1381  * will be called to check if the pad can accept the given caps. Setting the
1382  * acceptcaps function to NULL restores the default behaviour of allowing 
1383  * any caps that matches the caps from gst_pad_get_caps.
1384  */
1385 void
1386 gst_pad_set_acceptcaps_function (GstPad * pad,
1387     GstPadAcceptCapsFunction acceptcaps)
1388 {
1389   g_return_if_fail (GST_IS_PAD (pad));
1390
1391   GST_PAD_ACCEPTCAPSFUNC (pad) = acceptcaps;
1392   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "acceptcapsfunc set to %s",
1393       GST_DEBUG_FUNCPTR_NAME (acceptcaps));
1394 }
1395
1396 /**
1397  * gst_pad_set_fixatecaps_function:
1398  * @pad: a #GstPad.
1399  * @fixatecaps: the #GstPadFixateCapsFunction to set.
1400  *
1401  * Sets the given fixatecaps function for the pad.  The fixatecaps function
1402  * will be called whenever the default values for a GstCaps needs to be
1403  * filled in.
1404  */
1405 void
1406 gst_pad_set_fixatecaps_function (GstPad * pad,
1407     GstPadFixateCapsFunction fixatecaps)
1408 {
1409   g_return_if_fail (GST_IS_PAD (pad));
1410
1411   GST_PAD_FIXATECAPSFUNC (pad) = fixatecaps;
1412   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "fixatecapsfunc set to %s",
1413       GST_DEBUG_FUNCPTR_NAME (fixatecaps));
1414 }
1415
1416 /**
1417  * gst_pad_set_setcaps_function:
1418  * @pad: a #GstPad.
1419  * @setcaps: the #GstPadSetCapsFunction to set.
1420  *
1421  * Sets the given setcaps function for the pad.  The setcaps function
1422  * will be called whenever a buffer with a new media type is pushed or
1423  * pulled from the pad. The pad/element needs to update its internal
1424  * structures to process the new media type. If this new type is not
1425  * acceptable, the setcaps function should return FALSE.
1426  */
1427 void
1428 gst_pad_set_setcaps_function (GstPad * pad, GstPadSetCapsFunction setcaps)
1429 {
1430   g_return_if_fail (GST_IS_PAD (pad));
1431
1432   GST_PAD_SETCAPSFUNC (pad) = setcaps;
1433   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "setcapsfunc set to %s",
1434       GST_DEBUG_FUNCPTR_NAME (setcaps));
1435 }
1436
1437 /**
1438  * gst_pad_set_bufferalloc_function:
1439  * @pad: a sink #GstPad.
1440  * @bufalloc: the #GstPadBufferAllocFunction to set.
1441  *
1442  * Sets the given bufferalloc function for the pad. Note that the
1443  * bufferalloc function can only be set on sinkpads.
1444  */
1445 void
1446 gst_pad_set_bufferalloc_function (GstPad * pad,
1447     GstPadBufferAllocFunction bufalloc)
1448 {
1449   g_return_if_fail (GST_IS_PAD (pad));
1450   g_return_if_fail (GST_PAD_IS_SINK (pad));
1451
1452   GST_PAD_BUFFERALLOCFUNC (pad) = bufalloc;
1453   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "bufferallocfunc set to %s",
1454       GST_DEBUG_FUNCPTR_NAME (bufalloc));
1455 }
1456
1457 /**
1458  * gst_pad_unlink:
1459  * @srcpad: the source #GstPad to unlink.
1460  * @sinkpad: the sink #GstPad to unlink.
1461  *
1462  * Unlinks the source pad from the sink pad. Will emit the "unlinked" signal on
1463  * both pads.
1464  *
1465  * Returns: TRUE if the pads were unlinked. This function returns FALSE if
1466  * the pads were not linked together.
1467  *
1468  * MT safe.
1469  */
1470 gboolean
1471 gst_pad_unlink (GstPad * srcpad, GstPad * sinkpad)
1472 {
1473   g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
1474   g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
1475
1476   GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinking %s:%s(%p) and %s:%s(%p)",
1477       GST_DEBUG_PAD_NAME (srcpad), srcpad,
1478       GST_DEBUG_PAD_NAME (sinkpad), sinkpad);
1479
1480   GST_OBJECT_LOCK (srcpad);
1481
1482   if (G_UNLIKELY (GST_PAD_DIRECTION (srcpad) != GST_PAD_SRC))
1483     goto not_srcpad;
1484
1485   GST_OBJECT_LOCK (sinkpad);
1486
1487   if (G_UNLIKELY (GST_PAD_DIRECTION (sinkpad) != GST_PAD_SINK))
1488     goto not_sinkpad;
1489
1490   if (G_UNLIKELY (GST_PAD_PEER (srcpad) != sinkpad))
1491     goto not_linked_together;
1492
1493   if (GST_PAD_UNLINKFUNC (srcpad)) {
1494     GST_PAD_UNLINKFUNC (srcpad) (srcpad);
1495   }
1496   if (GST_PAD_UNLINKFUNC (sinkpad)) {
1497     GST_PAD_UNLINKFUNC (sinkpad) (sinkpad);
1498   }
1499
1500   /* first clear peers */
1501   GST_PAD_PEER (srcpad) = NULL;
1502   GST_PAD_PEER (sinkpad) = NULL;
1503
1504   GST_OBJECT_UNLOCK (sinkpad);
1505   GST_OBJECT_UNLOCK (srcpad);
1506
1507   /* fire off a signal to each of the pads telling them
1508    * that they've been unlinked */
1509   g_signal_emit (G_OBJECT (srcpad), gst_pad_signals[PAD_UNLINKED], 0, sinkpad);
1510   g_signal_emit (G_OBJECT (sinkpad), gst_pad_signals[PAD_UNLINKED], 0, srcpad);
1511
1512   GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinked %s:%s and %s:%s",
1513       GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
1514
1515   return TRUE;
1516
1517 not_srcpad:
1518   {
1519     g_critical ("pad %s is not a source pad", GST_PAD_NAME (srcpad));
1520     GST_OBJECT_UNLOCK (srcpad);
1521     return FALSE;
1522   }
1523 not_sinkpad:
1524   {
1525     g_critical ("pad %s is not a sink pad", GST_PAD_NAME (sinkpad));
1526     GST_OBJECT_UNLOCK (sinkpad);
1527     GST_OBJECT_UNLOCK (srcpad);
1528     return FALSE;
1529   }
1530 not_linked_together:
1531   {
1532     /* we do not emit a warning in this case because unlinking cannot
1533      * be made MT safe.*/
1534     GST_OBJECT_UNLOCK (sinkpad);
1535     GST_OBJECT_UNLOCK (srcpad);
1536     return FALSE;
1537   }
1538 }
1539
1540 /**
1541  * gst_pad_is_linked:
1542  * @pad: pad to check
1543  *
1544  * Checks if a @pad is linked to another pad or not.
1545  *
1546  * Returns: TRUE if the pad is linked, FALSE otherwise.
1547  *
1548  * MT safe.
1549  */
1550 gboolean
1551 gst_pad_is_linked (GstPad * pad)
1552 {
1553   gboolean result;
1554
1555   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
1556
1557   GST_OBJECT_LOCK (pad);
1558   result = (GST_PAD_PEER (pad) != NULL);
1559   GST_OBJECT_UNLOCK (pad);
1560
1561   return result;
1562 }
1563
1564 /* get the caps from both pads and see if the intersection
1565  * is not empty.
1566  *
1567  * This function should be called with the pad LOCK on both
1568  * pads
1569  */
1570 static gboolean
1571 gst_pad_link_check_compatible_unlocked (GstPad * src, GstPad * sink)
1572 {
1573   GstCaps *srccaps;
1574   GstCaps *sinkcaps;
1575   GstCaps *icaps;
1576
1577   srccaps = gst_pad_get_caps_unlocked (src);
1578   sinkcaps = gst_pad_get_caps_unlocked (sink);
1579
1580   GST_CAT_DEBUG (GST_CAT_CAPS, "src caps %" GST_PTR_FORMAT, srccaps);
1581   GST_CAT_DEBUG (GST_CAT_CAPS, "sink caps %" GST_PTR_FORMAT, sinkcaps);
1582
1583   /* if we have caps on both pads we can check the intersection. If one
1584    * of the caps is NULL, we return TRUE. */
1585   if (srccaps == NULL || sinkcaps == NULL)
1586     goto done;
1587
1588   icaps = gst_caps_intersect (srccaps, sinkcaps);
1589   gst_caps_unref (srccaps);
1590   gst_caps_unref (sinkcaps);
1591
1592   if (icaps == NULL)
1593     goto was_null;
1594
1595   GST_CAT_DEBUG (GST_CAT_CAPS,
1596       "intersection caps %p %" GST_PTR_FORMAT, icaps, icaps);
1597
1598   if (gst_caps_is_empty (icaps))
1599     goto was_empty;
1600
1601   gst_caps_unref (icaps);
1602
1603 done:
1604   return TRUE;
1605
1606   /* incompatible cases */
1607 was_null:
1608   {
1609     GST_CAT_DEBUG (GST_CAT_CAPS, "intersection gave NULL");
1610     return FALSE;
1611   }
1612 was_empty:
1613   {
1614     GST_CAT_DEBUG (GST_CAT_CAPS, "intersection is EMPTY");
1615     gst_caps_unref (icaps);
1616     return FALSE;
1617   }
1618 }
1619
1620 /* check if the grandparents of both pads are the same.
1621  * This check is required so that we don't try to link
1622  * pads from elements in different bins without ghostpads.
1623  *
1624  * The LOCK should be held on both pads
1625  */
1626 static gboolean
1627 gst_pad_link_check_hierarchy (GstPad * src, GstPad * sink)
1628 {
1629   GstObject *psrc, *psink;
1630   gboolean res = TRUE;
1631
1632   psrc = GST_OBJECT_PARENT (src);
1633   psink = GST_OBJECT_PARENT (sink);
1634
1635   /* if one of the pads has no parent, we allow the link */
1636   if (psrc && psink) {
1637     /* if the parents are the same, we have a loop */
1638     if (G_UNLIKELY (psrc == psink))
1639       goto same_parents;
1640
1641     /* if they both have a parent, we check the grandparents */
1642     psrc = gst_object_get_parent (psrc);
1643     psink = gst_object_get_parent (psink);
1644
1645     if (G_UNLIKELY (psrc != psink)) {
1646       /* if they have grandparents but they are not the same */
1647       GST_CAT_DEBUG (GST_CAT_CAPS,
1648           "pads have different grandparents %" GST_PTR_FORMAT " and %"
1649           GST_PTR_FORMAT, psrc, psink);
1650       res = FALSE;
1651     }
1652     if (psrc)
1653       gst_object_unref (psrc);
1654     if (psink)
1655       gst_object_unref (psink);
1656   }
1657 done:
1658   return res;
1659
1660   /* ERRORS */
1661 same_parents:
1662   {
1663     GST_CAT_DEBUG (GST_CAT_CAPS, "pads have same parent %" GST_PTR_FORMAT,
1664         psrc);
1665     res = FALSE;
1666     goto done;
1667   }
1668 }
1669
1670 /* FIXME leftover from an attempt at refactoring... */
1671 /* call with the two pads unlocked, when this function returns GST_PAD_LINK_OK,
1672  * the two pads will be locked in the srcpad, sinkpad order. */
1673 static GstPadLinkReturn
1674 gst_pad_link_prepare (GstPad * srcpad, GstPad * sinkpad)
1675 {
1676   /* generic checks */
1677   g_return_val_if_fail (GST_IS_PAD (srcpad), GST_PAD_LINK_REFUSED);
1678   g_return_val_if_fail (GST_IS_PAD (sinkpad), GST_PAD_LINK_REFUSED);
1679
1680   GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
1681       GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
1682
1683   GST_OBJECT_LOCK (srcpad);
1684
1685   if (G_UNLIKELY (GST_PAD_DIRECTION (srcpad) != GST_PAD_SRC))
1686     goto not_srcpad;
1687
1688   if (G_UNLIKELY (GST_PAD_PEER (srcpad) != NULL))
1689     goto src_was_linked;
1690
1691   GST_OBJECT_LOCK (sinkpad);
1692
1693   if (G_UNLIKELY (GST_PAD_DIRECTION (sinkpad) != GST_PAD_SINK))
1694     goto not_sinkpad;
1695
1696   if (G_UNLIKELY (GST_PAD_PEER (sinkpad) != NULL))
1697     goto sink_was_linked;
1698
1699   /* check hierarchy, pads can only be linked if the grandparents
1700    * are the same. */
1701   if (!gst_pad_link_check_hierarchy (srcpad, sinkpad))
1702     goto wrong_hierarchy;
1703
1704   /* check pad caps for non-empty intersection */
1705   if (!gst_pad_link_check_compatible_unlocked (srcpad, sinkpad))
1706     goto no_format;
1707
1708   /* FIXME check pad scheduling for non-empty intersection */
1709
1710   return GST_PAD_LINK_OK;
1711
1712 not_srcpad:
1713   {
1714     g_critical ("pad %s is not a source pad", GST_PAD_NAME (srcpad));
1715     GST_OBJECT_UNLOCK (srcpad);
1716     return GST_PAD_LINK_WRONG_DIRECTION;
1717   }
1718 src_was_linked:
1719   {
1720     GST_CAT_INFO (GST_CAT_PADS, "src %s:%s was already linked to %s:%s",
1721         GST_DEBUG_PAD_NAME (srcpad),
1722         GST_DEBUG_PAD_NAME (GST_PAD_PEER (srcpad)));
1723     /* we do not emit a warning in this case because unlinking cannot
1724      * be made MT safe.*/
1725     GST_OBJECT_UNLOCK (srcpad);
1726     return GST_PAD_LINK_WAS_LINKED;
1727   }
1728 not_sinkpad:
1729   {
1730     g_critical ("pad %s is not a sink pad", GST_PAD_NAME (sinkpad));
1731     GST_OBJECT_UNLOCK (sinkpad);
1732     GST_OBJECT_UNLOCK (srcpad);
1733     return GST_PAD_LINK_WRONG_DIRECTION;
1734   }
1735 sink_was_linked:
1736   {
1737     GST_CAT_INFO (GST_CAT_PADS, "sink %s:%s was already linked to %s:%s",
1738         GST_DEBUG_PAD_NAME (sinkpad),
1739         GST_DEBUG_PAD_NAME (GST_PAD_PEER (sinkpad)));
1740     /* we do not emit a warning in this case because unlinking cannot
1741      * be made MT safe.*/
1742     GST_OBJECT_UNLOCK (sinkpad);
1743     GST_OBJECT_UNLOCK (srcpad);
1744     return GST_PAD_LINK_WAS_LINKED;
1745   }
1746 wrong_hierarchy:
1747   {
1748     GST_CAT_INFO (GST_CAT_PADS, "pads have wrong hierarchy");
1749     GST_OBJECT_UNLOCK (sinkpad);
1750     GST_OBJECT_UNLOCK (srcpad);
1751     return GST_PAD_LINK_WRONG_HIERARCHY;
1752   }
1753 no_format:
1754   {
1755     GST_CAT_INFO (GST_CAT_PADS, "caps are incompatible");
1756     GST_OBJECT_UNLOCK (sinkpad);
1757     GST_OBJECT_UNLOCK (srcpad);
1758     return GST_PAD_LINK_NOFORMAT;
1759   }
1760 }
1761
1762 /**
1763  * gst_pad_link:
1764  * @srcpad: the source #GstPad to link.
1765  * @sinkpad: the sink #GstPad to link.
1766  *
1767  * Links the source pad and the sink pad.
1768  *
1769  * Returns: A result code indicating if the connection worked or
1770  *          what went wrong.
1771  *
1772  * MT Safe.
1773  */
1774 GstPadLinkReturn
1775 gst_pad_link (GstPad * srcpad, GstPad * sinkpad)
1776 {
1777   GstPadLinkReturn result;
1778
1779   /* prepare will also lock the two pads */
1780   result = gst_pad_link_prepare (srcpad, sinkpad);
1781
1782   if (result != GST_PAD_LINK_OK)
1783     goto prepare_failed;
1784
1785   /* must set peers before calling the link function */
1786   GST_PAD_PEER (srcpad) = sinkpad;
1787   GST_PAD_PEER (sinkpad) = srcpad;
1788
1789   GST_OBJECT_UNLOCK (sinkpad);
1790   GST_OBJECT_UNLOCK (srcpad);
1791
1792   /* FIXME released the locks here, concurrent thread might link
1793    * something else. */
1794   if (GST_PAD_LINKFUNC (srcpad)) {
1795     /* this one will call the peer link function */
1796     result = GST_PAD_LINKFUNC (srcpad) (srcpad, sinkpad);
1797   } else if (GST_PAD_LINKFUNC (sinkpad)) {
1798     /* if no source link function, we need to call the sink link
1799      * function ourselves. */
1800     result = GST_PAD_LINKFUNC (sinkpad) (sinkpad, srcpad);
1801   } else {
1802     result = GST_PAD_LINK_OK;
1803   }
1804
1805   GST_OBJECT_LOCK (srcpad);
1806   GST_OBJECT_LOCK (sinkpad);
1807
1808   if (result == GST_PAD_LINK_OK) {
1809     GST_OBJECT_UNLOCK (sinkpad);
1810     GST_OBJECT_UNLOCK (srcpad);
1811
1812     /* fire off a signal to each of the pads telling them
1813      * that they've been linked */
1814     g_signal_emit (G_OBJECT (srcpad), gst_pad_signals[PAD_LINKED], 0, sinkpad);
1815     g_signal_emit (G_OBJECT (sinkpad), gst_pad_signals[PAD_LINKED], 0, srcpad);
1816
1817     GST_CAT_INFO (GST_CAT_PADS, "linked %s:%s and %s:%s, successful",
1818         GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
1819   } else {
1820     GST_CAT_INFO (GST_CAT_PADS, "link between %s:%s and %s:%s failed",
1821         GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
1822
1823     GST_PAD_PEER (srcpad) = NULL;
1824     GST_PAD_PEER (sinkpad) = NULL;
1825
1826     GST_OBJECT_UNLOCK (sinkpad);
1827     GST_OBJECT_UNLOCK (srcpad);
1828   }
1829   return result;
1830
1831 prepare_failed:
1832   {
1833     return result;
1834   }
1835 }
1836
1837 static void
1838 gst_pad_set_pad_template (GstPad * pad, GstPadTemplate * templ)
1839 {
1840   GstPadTemplate **template_p;
1841
1842   /* this function would need checks if it weren't static */
1843
1844   GST_OBJECT_LOCK (pad);
1845   template_p = &pad->padtemplate;
1846   gst_object_replace ((GstObject **) template_p, (GstObject *) templ);
1847   GST_OBJECT_UNLOCK (pad);
1848
1849   if (templ)
1850     gst_pad_template_pad_created (templ, pad);
1851 }
1852
1853 /**
1854  * gst_pad_get_pad_template:
1855  * @pad: a #GstPad.
1856  *
1857  * Gets the template for @pad.
1858  *
1859  * Returns: the #GstPadTemplate from which this pad was instantiated, or %NULL
1860  * if this pad has no template.
1861  *
1862  * FIXME: currently returns an unrefcounted padtemplate.
1863  */
1864 GstPadTemplate *
1865 gst_pad_get_pad_template (GstPad * pad)
1866 {
1867   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1868
1869   return GST_PAD_PAD_TEMPLATE (pad);
1870 }
1871
1872
1873 /* should be called with the pad LOCK held */
1874 /* refs the caps, so caller is responsible for getting it unreffed */
1875 static GstCaps *
1876 gst_pad_get_caps_unlocked (GstPad * pad)
1877 {
1878   GstCaps *result = NULL;
1879
1880   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get pad caps");
1881
1882   if (GST_PAD_GETCAPSFUNC (pad)) {
1883     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
1884         "dispatching to pad getcaps function");
1885
1886     GST_OBJECT_FLAG_SET (pad, GST_PAD_IN_GETCAPS);
1887     GST_OBJECT_UNLOCK (pad);
1888     result = GST_PAD_GETCAPSFUNC (pad) (pad);
1889     GST_OBJECT_LOCK (pad);
1890     GST_OBJECT_FLAG_UNSET (pad, GST_PAD_IN_GETCAPS);
1891
1892     if (result == NULL) {
1893       g_critical ("pad %s:%s returned NULL caps from getcaps function",
1894           GST_DEBUG_PAD_NAME (pad));
1895     } else {
1896       GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
1897           "pad getcaps returned %" GST_PTR_FORMAT, result);
1898 #ifndef G_DISABLE_ASSERT
1899       /* check that the returned caps are a real subset of the template caps */
1900       if (GST_PAD_PAD_TEMPLATE (pad)) {
1901         const GstCaps *templ_caps =
1902             GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad));
1903         if (!gst_caps_is_subset (result, templ_caps)) {
1904           GstCaps *temp;
1905
1906           GST_CAT_ERROR_OBJECT (GST_CAT_CAPS, pad,
1907               "pad returned caps %" GST_PTR_FORMAT
1908               " which are not a real subset of its template caps %"
1909               GST_PTR_FORMAT, result, templ_caps);
1910           g_warning
1911               ("pad %s:%s returned caps that are not a real subset of its template caps",
1912               GST_DEBUG_PAD_NAME (pad));
1913           temp = gst_caps_intersect (templ_caps, result);
1914           gst_caps_unref (result);
1915           result = temp;
1916         }
1917       }
1918 #endif
1919       goto done;
1920     }
1921   }
1922   if (GST_PAD_PAD_TEMPLATE (pad)) {
1923     GstPadTemplate *templ = GST_PAD_PAD_TEMPLATE (pad);
1924
1925     result = GST_PAD_TEMPLATE_CAPS (templ);
1926     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
1927         "using pad template %p with caps %p %" GST_PTR_FORMAT, templ, result,
1928         result);
1929
1930     result = gst_caps_ref (result);
1931     goto done;
1932   }
1933   if (GST_PAD_CAPS (pad)) {
1934     result = GST_PAD_CAPS (pad);
1935
1936     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
1937         "using pad caps %p %" GST_PTR_FORMAT, result, result);
1938
1939     result = gst_caps_ref (result);
1940     goto done;
1941   }
1942
1943   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "pad has no caps");
1944   result = gst_caps_new_empty ();
1945
1946 done:
1947   return result;
1948 }
1949
1950 /**
1951  * gst_pad_get_caps:
1952  * @pad: a  #GstPad to get the capabilities of.
1953  *
1954  * Gets the capabilities this pad can produce or consume.
1955  * Note that this method doesn't necessarily return the caps set by
1956  * gst_pad_set_caps() - use #GST_PAD_CAPS for that instead.
1957  * gst_pad_get_caps returns all possible caps a pad can operate with, using
1958  * the pad's get_caps function;
1959  * this returns the pad template caps if not explicitly set.
1960  *
1961  * Returns: a newly allocated copy of the #GstCaps of this pad.
1962  *
1963  * MT safe.
1964  */
1965 GstCaps *
1966 gst_pad_get_caps (GstPad * pad)
1967 {
1968   GstCaps *result = NULL;
1969
1970   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1971
1972   GST_OBJECT_LOCK (pad);
1973
1974   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get pad caps");
1975
1976   result = gst_pad_get_caps_unlocked (pad);
1977   GST_OBJECT_UNLOCK (pad);
1978
1979   return result;
1980 }
1981
1982 /**
1983  * gst_pad_peer_get_caps:
1984  * @pad: a  #GstPad to get the peer capabilities of.
1985  *
1986  * Gets the capabilities of the peer connected to this pad.
1987  *
1988  * Returns: the #GstCaps of the peer pad. This function returns a new caps, so use
1989  * gst_caps_unref to get rid of it. this function returns NULL if there is no
1990  * peer pad.
1991  */
1992 GstCaps *
1993 gst_pad_peer_get_caps (GstPad * pad)
1994 {
1995   GstPad *peerpad;
1996   GstCaps *result = NULL;
1997
1998   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1999
2000   GST_OBJECT_LOCK (pad);
2001
2002   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get peer caps");
2003
2004   peerpad = GST_PAD_PEER (pad);
2005   if (G_UNLIKELY (peerpad == NULL))
2006     goto no_peer;
2007
2008   gst_object_ref (peerpad);
2009   GST_OBJECT_UNLOCK (pad);
2010
2011   result = gst_pad_get_caps (peerpad);
2012
2013   gst_object_unref (peerpad);
2014
2015   return result;
2016
2017 no_peer:
2018   {
2019     GST_OBJECT_UNLOCK (pad);
2020     return NULL;
2021   }
2022 }
2023
2024 static gboolean
2025 fixate_value (GValue * dest, const GValue * src)
2026 {
2027   if (G_VALUE_TYPE (src) == GST_TYPE_INT_RANGE) {
2028     g_value_init (dest, G_TYPE_INT);
2029     g_value_set_int (dest, gst_value_get_int_range_min (src));
2030   } else if (G_VALUE_TYPE (src) == GST_TYPE_DOUBLE_RANGE) {
2031     g_value_init (dest, G_TYPE_DOUBLE);
2032     g_value_set_double (dest, gst_value_get_double_range_min (src));
2033   } else if (G_VALUE_TYPE (src) == GST_TYPE_FRACTION_RANGE) {
2034     gst_value_init_and_copy (dest, gst_value_get_fraction_range_min (src));
2035   } else if (G_VALUE_TYPE (src) == GST_TYPE_LIST) {
2036     GValue temp = { 0 };
2037
2038     gst_value_init_and_copy (&temp, gst_value_list_get_value (src, 0));
2039     if (!fixate_value (dest, &temp))
2040       gst_value_init_and_copy (dest, &temp);
2041     g_value_unset (&temp);
2042   } else if (G_VALUE_TYPE (src) == GST_TYPE_ARRAY) {
2043     gboolean res = FALSE;
2044     guint n;
2045
2046     g_value_init (dest, GST_TYPE_ARRAY);
2047     for (n = 0; n < gst_value_array_get_size (src); n++) {
2048       GValue kid = { 0 };
2049       const GValue *orig_kid = gst_value_array_get_value (src, n);
2050
2051       if (!fixate_value (&kid, orig_kid))
2052         gst_value_init_and_copy (&kid, orig_kid);
2053       else
2054         res = TRUE;
2055       gst_value_array_append_value (dest, &kid);
2056       g_value_unset (&kid);
2057     }
2058
2059     if (!res)
2060       g_value_unset (dest);
2061
2062     return res;
2063   } else {
2064     return FALSE;
2065   }
2066
2067   return TRUE;
2068 }
2069
2070 static gboolean
2071 gst_pad_default_fixate (GQuark field_id, const GValue * value, gpointer data)
2072 {
2073   GstStructure *s = data;
2074   GValue v = { 0 };
2075
2076   if (fixate_value (&v, value)) {
2077     gst_structure_id_set_value (s, field_id, &v);
2078     g_value_unset (&v);
2079   }
2080
2081   return TRUE;
2082 }
2083
2084 /**
2085  * gst_pad_fixate_caps:
2086  * @pad: a  #GstPad to fixate
2087  * @caps: the  #GstCaps to fixate
2088  *
2089  * Fixate a caps on the given pad. Modifies the caps in place, so you should
2090  * make sure that the caps are actually writable (see gst_caps_make_writable()).
2091  */
2092 void
2093 gst_pad_fixate_caps (GstPad * pad, GstCaps * caps)
2094 {
2095   GstPadFixateCapsFunction fixatefunc;
2096   guint n;
2097
2098   g_return_if_fail (GST_IS_PAD (pad));
2099   g_return_if_fail (caps != NULL);
2100
2101   if (gst_caps_is_fixed (caps))
2102     return;
2103
2104   fixatefunc = GST_PAD_FIXATECAPSFUNC (pad);
2105   if (fixatefunc) {
2106     fixatefunc (pad, caps);
2107   }
2108
2109   /* default fixation */
2110   for (n = 0; n < gst_caps_get_size (caps); n++) {
2111     GstStructure *s = gst_caps_get_structure (caps, n);
2112
2113     gst_structure_foreach (s, gst_pad_default_fixate, s);
2114   }
2115 }
2116
2117 /* Default accept caps implementation just checks against 
2118  * against the allowed caps for the pad */
2119 static gboolean
2120 gst_pad_acceptcaps_default (GstPad * pad, GstCaps * caps)
2121 {
2122   /* get the caps and see if it intersects to something
2123    * not empty */
2124   GstCaps *intersect;
2125   GstCaps *allowed;
2126   gboolean result = FALSE;
2127
2128   allowed = gst_pad_get_caps (pad);
2129   if (allowed) {
2130     intersect = gst_caps_intersect (allowed, caps);
2131
2132     result = !gst_caps_is_empty (intersect);
2133
2134     gst_caps_unref (allowed);
2135     gst_caps_unref (intersect);
2136   }
2137
2138   return result;
2139 }
2140
2141 /**
2142  * gst_pad_accept_caps:
2143  * @pad: a #GstPad to check
2144  * @caps: a #GstCaps to check on the pad
2145  *
2146  * Check if the given pad accepts the caps.
2147  *
2148  * Returns: TRUE if the pad can accept the caps.
2149  */
2150 gboolean
2151 gst_pad_accept_caps (GstPad * pad, GstCaps * caps)
2152 {
2153   gboolean result;
2154   GstPadAcceptCapsFunction acceptfunc;
2155   GstCaps *existing = NULL;
2156
2157   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2158
2159   /* any pad can be unnegotiated */
2160   if (caps == NULL)
2161     return TRUE;
2162
2163   /* lock for checking the existing caps */
2164   GST_OBJECT_LOCK (pad);
2165   acceptfunc = GST_PAD_ACCEPTCAPSFUNC (pad);
2166   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "accept caps of %p", caps);
2167   /* The current caps on a pad are trivially acceptable */
2168   if (G_LIKELY ((existing = GST_PAD_CAPS (pad)))) {
2169     if (caps == existing || gst_caps_is_equal (caps, existing))
2170       goto is_same_caps;
2171   }
2172   GST_OBJECT_UNLOCK (pad);
2173
2174   if (G_LIKELY (acceptfunc)) {
2175     /* we can call the function */
2176     result = acceptfunc (pad, caps);
2177   } else {
2178     /* Only null if the element explicitly unset it */
2179     result = gst_pad_acceptcaps_default (pad, caps);
2180   }
2181   return result;
2182
2183 is_same_caps:
2184   {
2185     GST_OBJECT_UNLOCK (pad);
2186     return TRUE;
2187   }
2188 }
2189
2190 /**
2191  * gst_pad_peer_accept_caps:
2192  * @pad: a  #GstPad to check the peer of
2193  * @caps: a #GstCaps to check on the pad
2194  *
2195  * Check if the peer of @pad accepts @caps. If @pad has no peer, this function
2196  * returns TRUE.
2197  *
2198  * Returns: TRUE if the peer of @pad can accept the caps or @pad has no peer.
2199  */
2200 gboolean
2201 gst_pad_peer_accept_caps (GstPad * pad, GstCaps * caps)
2202 {
2203   GstPad *peerpad;
2204   gboolean result;
2205
2206   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2207
2208   GST_OBJECT_LOCK (pad);
2209
2210   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "peer accept caps of (%p)", pad);
2211
2212   peerpad = GST_PAD_PEER (pad);
2213   if (G_UNLIKELY (peerpad == NULL))
2214     goto no_peer;
2215
2216   result = gst_pad_accept_caps (peerpad, caps);
2217   GST_OBJECT_UNLOCK (pad);
2218
2219   return result;
2220
2221 no_peer:
2222   {
2223     GST_OBJECT_UNLOCK (pad);
2224     return TRUE;
2225   }
2226 }
2227
2228 /**
2229  * gst_pad_set_caps:
2230  * @pad: a  #GstPad to set the capabilities of.
2231  * @caps: a #GstCaps to set.
2232  *
2233  * Sets the capabilities of this pad. The caps must be fixed. Any previous
2234  * caps on the pad will be unreffed. This function refs the caps so you should
2235  * unref if as soon as you don't need it anymore.
2236  * It is possible to set NULL caps, which will make the pad unnegotiated
2237  * again.
2238  *
2239  * Returns: TRUE if the caps could be set. FALSE if the caps were not fixed
2240  * or bad parameters were provided to this function.
2241  *
2242  * MT safe.
2243  */
2244 gboolean
2245 gst_pad_set_caps (GstPad * pad, GstCaps * caps)
2246 {
2247   GstPadSetCapsFunction setcaps;
2248   GstCaps *existing;
2249
2250   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2251   g_return_val_if_fail (caps == NULL || gst_caps_is_fixed (caps), FALSE);
2252
2253   GST_OBJECT_LOCK (pad);
2254   existing = GST_PAD_CAPS (pad);
2255   if (existing == caps)
2256     goto was_ok;
2257
2258   if (gst_caps_is_equal (caps, existing))
2259     goto setting_same_caps;
2260
2261   setcaps = GST_PAD_SETCAPSFUNC (pad);
2262
2263   /* call setcaps function to configure the pad only if the
2264    * caps is not NULL */
2265   if (setcaps != NULL && caps) {
2266     if (!GST_PAD_IS_IN_SETCAPS (pad)) {
2267       GST_OBJECT_FLAG_SET (pad, GST_PAD_IN_SETCAPS);
2268       GST_OBJECT_UNLOCK (pad);
2269       if (!setcaps (pad, caps))
2270         goto could_not_set;
2271       GST_OBJECT_LOCK (pad);
2272       GST_OBJECT_FLAG_UNSET (pad, GST_PAD_IN_SETCAPS);
2273     } else {
2274       GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "pad was dispatching");
2275     }
2276   }
2277
2278   gst_caps_replace (&GST_PAD_CAPS (pad), caps);
2279   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "caps %" GST_PTR_FORMAT, caps);
2280   GST_OBJECT_UNLOCK (pad);
2281
2282   g_object_notify (G_OBJECT (pad), "caps");
2283
2284   return TRUE;
2285
2286 was_ok:
2287   {
2288     GST_OBJECT_UNLOCK (pad);
2289     return TRUE;
2290   }
2291 setting_same_caps:
2292   {
2293     gst_caps_replace (&GST_PAD_CAPS (pad), caps);
2294     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
2295         "caps %" GST_PTR_FORMAT " same as existing, updating ptr only", caps);
2296     GST_OBJECT_UNLOCK (pad);
2297     return TRUE;
2298   }
2299
2300   /* ERRORS */
2301 could_not_set:
2302   {
2303     GST_OBJECT_LOCK (pad);
2304     GST_OBJECT_FLAG_UNSET (pad, GST_PAD_IN_SETCAPS);
2305     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
2306         "caps %" GST_PTR_FORMAT " could not be set", caps);
2307     GST_OBJECT_UNLOCK (pad);
2308
2309     return FALSE;
2310   }
2311 }
2312
2313 static gboolean
2314 gst_pad_configure_sink (GstPad * pad, GstCaps * caps)
2315 {
2316   GstPadSetCapsFunction setcaps;
2317   gboolean res;
2318
2319   setcaps = GST_PAD_SETCAPSFUNC (pad);
2320
2321   /* See if pad accepts the caps - only needed if 
2322    * no setcaps function */
2323   if (setcaps == NULL)
2324     if (!gst_pad_accept_caps (pad, caps))
2325       goto not_accepted;
2326
2327   /* set caps on pad if call succeeds */
2328   res = gst_pad_set_caps (pad, caps);
2329   /* no need to unref the caps here, set_caps takes a ref and
2330    * our ref goes away when we leave this function. */
2331
2332   return res;
2333
2334 not_accepted:
2335   {
2336     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
2337         "caps %" GST_PTR_FORMAT " not accepted", caps);
2338     return FALSE;
2339   }
2340 }
2341
2342 /* returns TRUE if the src pad could be configured to accept the given caps */
2343 static gboolean
2344 gst_pad_configure_src (GstPad * pad, GstCaps * caps, gboolean dosetcaps)
2345 {
2346   GstPadSetCapsFunction setcaps;
2347   gboolean res;
2348
2349   setcaps = GST_PAD_SETCAPSFUNC (pad);
2350
2351   /* See if pad accepts the caps - only needed if 
2352    * no setcaps function */
2353   if (setcaps == NULL)
2354     if (!gst_pad_accept_caps (pad, caps))
2355       goto not_accepted;
2356
2357   if (dosetcaps)
2358     res = gst_pad_set_caps (pad, caps);
2359   else
2360     res = TRUE;
2361
2362   return res;
2363
2364 not_accepted:
2365   {
2366     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
2367         "caps %" GST_PTR_FORMAT " not accepted", caps);
2368     return FALSE;
2369   }
2370 }
2371
2372 /**
2373  * gst_pad_get_pad_template_caps:
2374  * @pad: a #GstPad to get the template capabilities from.
2375  *
2376  * Gets the capabilities for @pad's template.
2377  *
2378  * Returns: the #GstCaps of this pad template. If you intend to keep a reference
2379  * on the caps, make a copy (see gst_caps_copy ()).
2380  */
2381 const GstCaps *
2382 gst_pad_get_pad_template_caps (GstPad * pad)
2383 {
2384   static GstStaticCaps anycaps = GST_STATIC_CAPS ("ANY");
2385
2386   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2387
2388   if (GST_PAD_PAD_TEMPLATE (pad))
2389     return GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad));
2390
2391   return gst_static_caps_get (&anycaps);
2392 }
2393
2394
2395 /**
2396  * gst_pad_get_peer:
2397  * @pad: a #GstPad to get the peer of.
2398  *
2399  * Gets the peer of @pad. This function refs the peer pad so
2400  * you need to unref it after use.
2401  *
2402  * Returns: the peer #GstPad. Unref after usage.
2403  *
2404  * MT safe.
2405  */
2406 GstPad *
2407 gst_pad_get_peer (GstPad * pad)
2408 {
2409   GstPad *result;
2410
2411   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2412
2413   GST_OBJECT_LOCK (pad);
2414   result = GST_PAD_PEER (pad);
2415   if (result)
2416     gst_object_ref (result);
2417   GST_OBJECT_UNLOCK (pad);
2418
2419   return result;
2420 }
2421
2422 /**
2423  * gst_pad_get_allowed_caps:
2424  * @srcpad: a #GstPad, it must a a source pad.
2425  *
2426  * Gets the capabilities of the allowed media types that can flow through
2427  * @srcpad and its peer. The pad must be a source pad.
2428  * The caller must free the resulting caps.
2429  *
2430  * Returns: the allowed #GstCaps of the pad link.  Free the caps when
2431  * you no longer need it. This function returns NULL when the @srcpad has no
2432  * peer.
2433  *
2434  * MT safe.
2435  */
2436 GstCaps *
2437 gst_pad_get_allowed_caps (GstPad * srcpad)
2438 {
2439   GstCaps *mycaps;
2440   GstCaps *caps;
2441   GstCaps *peercaps;
2442   GstPad *peer;
2443
2444   g_return_val_if_fail (GST_IS_PAD (srcpad), NULL);
2445   g_return_val_if_fail (GST_PAD_IS_SRC (srcpad), NULL);
2446
2447   GST_OBJECT_LOCK (srcpad);
2448
2449   peer = GST_PAD_PEER (srcpad);
2450   if (G_UNLIKELY (peer == NULL))
2451     goto no_peer;
2452
2453   GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, srcpad, "getting allowed caps");
2454
2455   gst_object_ref (peer);
2456   GST_OBJECT_UNLOCK (srcpad);
2457   mycaps = gst_pad_get_caps (srcpad);
2458
2459   peercaps = gst_pad_get_caps (peer);
2460   gst_object_unref (peer);
2461
2462   caps = gst_caps_intersect (mycaps, peercaps);
2463   gst_caps_unref (peercaps);
2464   gst_caps_unref (mycaps);
2465
2466   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, srcpad, "allowed caps %" GST_PTR_FORMAT,
2467       caps);
2468
2469   return caps;
2470
2471 no_peer:
2472   {
2473     GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, srcpad, "no peer");
2474     GST_OBJECT_UNLOCK (srcpad);
2475
2476     return NULL;
2477   }
2478 }
2479
2480 /**
2481  * gst_pad_get_negotiated_caps:
2482  * @pad: a #GstPad.
2483  *
2484  * Gets the capabilities of the media type that currently flows through @pad
2485  * and its peer.
2486  *
2487  * This function can be used on both src and sinkpads. Note that srcpads are
2488  * always negotiated before sinkpads so it is possible that the negotiated caps
2489  * on the srcpad do not match the negotiated caps of the peer.
2490  *
2491  * Returns: the negotiated #GstCaps of the pad link.  Free the caps when
2492  * you no longer need it. This function returns NULL when the @pad has no
2493  * peer or is not negotiated yet.
2494  *
2495  * MT safe.
2496  */
2497 GstCaps *
2498 gst_pad_get_negotiated_caps (GstPad * pad)
2499 {
2500   GstCaps *caps;
2501   GstPad *peer;
2502
2503   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2504
2505   GST_OBJECT_LOCK (pad);
2506
2507   if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
2508     goto no_peer;
2509
2510   GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, pad, "getting negotiated caps");
2511
2512   caps = GST_PAD_CAPS (pad);
2513   if (caps)
2514     gst_caps_ref (caps);
2515   GST_OBJECT_UNLOCK (pad);
2516
2517   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "negotiated caps %" GST_PTR_FORMAT,
2518       caps);
2519
2520   return caps;
2521
2522 no_peer:
2523   {
2524     GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, pad, "no peer");
2525     GST_OBJECT_UNLOCK (pad);
2526
2527     return NULL;
2528   }
2529 }
2530
2531 /* calls the buffer_alloc function on the given pad */
2532 static GstFlowReturn
2533 gst_pad_buffer_alloc_unchecked (GstPad * pad, guint64 offset, gint size,
2534     GstCaps * caps, GstBuffer ** buf)
2535 {
2536   GstFlowReturn ret;
2537   GstPadBufferAllocFunction bufferallocfunc;
2538
2539   GST_OBJECT_LOCK (pad);
2540   /* when the pad is flushing we cannot give a buffer */
2541   if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
2542     goto flushing;
2543
2544   if (offset == GST_BUFFER_OFFSET_NONE) {
2545     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
2546         "calling bufferallocfunc &%s (@%p) for size %d offset NONE",
2547         GST_DEBUG_FUNCPTR_NAME (bufferallocfunc), &bufferallocfunc, size);
2548   } else {
2549     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
2550         "calling bufferallocfunc &%s (@%p) of for size %d offset %"
2551         G_GUINT64_FORMAT, GST_DEBUG_FUNCPTR_NAME (bufferallocfunc),
2552         &bufferallocfunc, size, offset);
2553   }
2554   GST_OBJECT_UNLOCK (pad);
2555
2556   /* G_LIKELY for now since most elements don't implement a buffer alloc
2557    * function and there is no default alloc proxy function as this is usually
2558    * not possible. */
2559   if (G_LIKELY ((bufferallocfunc = pad->bufferallocfunc) == NULL))
2560     goto fallback;
2561
2562   ret = bufferallocfunc (pad, offset, size, caps, buf);
2563   if (G_UNLIKELY (ret != GST_FLOW_OK))
2564     goto error;
2565   /* no error, but NULL buffer means fallback to the default */
2566   if (G_UNLIKELY (*buf == NULL))
2567     goto fallback;
2568
2569   /* If the buffer alloc function didn't set up the caps like it should,
2570    * do it for it */
2571   if (G_UNLIKELY (caps && (GST_BUFFER_CAPS (*buf) == NULL))) {
2572     GST_WARNING_OBJECT (pad,
2573         "Buffer allocation function did not set caps. Setting");
2574     gst_buffer_set_caps (*buf, caps);
2575   }
2576   return ret;
2577
2578 flushing:
2579   {
2580     /* pad was flushing */
2581     GST_OBJECT_UNLOCK (pad);
2582     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "pad was flushing");
2583     return GST_FLOW_WRONG_STATE;
2584   }
2585 error:
2586   {
2587     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
2588         "alloc function returned error (%d) %s", ret, gst_flow_get_name (ret));
2589     return ret;
2590   }
2591 fallback:
2592   {
2593     /* fallback case, allocate a buffer of our own, add pad caps. */
2594     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "fallback buffer alloc");
2595
2596     *buf = gst_buffer_new_and_alloc (size);
2597     GST_BUFFER_OFFSET (*buf) = offset;
2598     gst_buffer_set_caps (*buf, caps);
2599
2600     return GST_FLOW_OK;
2601   }
2602 }
2603
2604 static GstFlowReturn
2605 gst_pad_alloc_buffer_full (GstPad * pad, guint64 offset, gint size,
2606     GstCaps * caps, GstBuffer ** buf, gboolean setcaps)
2607 {
2608   GstPad *peer;
2609   GstFlowReturn ret;
2610   gboolean caps_changed;
2611
2612   g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
2613   g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
2614   g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR);
2615
2616   GST_OBJECT_LOCK (pad);
2617   while (G_UNLIKELY (GST_PAD_IS_BLOCKED (pad)))
2618     if ((ret = handle_pad_block (pad)) != GST_FLOW_OK)
2619       goto flushed;
2620
2621   if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
2622     goto no_peer;
2623
2624   gst_object_ref (peer);
2625   GST_OBJECT_UNLOCK (pad);
2626
2627   ret = gst_pad_buffer_alloc_unchecked (peer, offset, size, caps, buf);
2628   gst_object_unref (peer);
2629
2630   if (G_UNLIKELY (ret != GST_FLOW_OK))
2631     goto peer_error;
2632
2633   /* FIXME, move capnego this into a base class? */
2634   caps = GST_BUFFER_CAPS (*buf);
2635
2636   /* Lock for checking caps, pretty pointless as the _pad_push() function might
2637    * change it concurrently, one of the problems with automatic caps setting in
2638    * pad_alloc_and_set_caps. Worst case, if does a check too much, but only when
2639    * there is heavy renegotiation going on in both directions. */
2640   GST_OBJECT_LOCK (pad);
2641   caps_changed = caps && caps != GST_PAD_CAPS (pad);
2642   GST_OBJECT_UNLOCK (pad);
2643
2644   /* we got a new datatype on the pad, see if it can handle it */
2645   if (G_UNLIKELY (caps_changed)) {
2646     GST_DEBUG_OBJECT (pad, "caps changed to %p %" GST_PTR_FORMAT, caps, caps);
2647     if (G_UNLIKELY (!gst_pad_configure_src (pad, caps, setcaps)))
2648       goto not_negotiated;
2649   }
2650   return ret;
2651
2652 flushed:
2653   {
2654     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "pad block stopped by flush");
2655     GST_OBJECT_UNLOCK (pad);
2656     return ret;
2657   }
2658 no_peer:
2659   {
2660     /* pad has no peer */
2661     GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
2662         "called bufferallocfunc but had no peer");
2663     GST_OBJECT_UNLOCK (pad);
2664     return GST_FLOW_NOT_LINKED;
2665   }
2666 peer_error:
2667   {
2668     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
2669         "alloc function returned error %s", gst_flow_get_name (ret));
2670     return ret;
2671   }
2672 not_negotiated:
2673   {
2674     gst_buffer_unref (*buf);
2675     *buf = NULL;
2676     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
2677         "alloc function returned unacceptable buffer");
2678     return GST_FLOW_NOT_NEGOTIATED;
2679   }
2680 }
2681
2682 /**
2683  * gst_pad_alloc_buffer:
2684  * @pad: a source #GstPad
2685  * @offset: the offset of the new buffer in the stream
2686  * @size: the size of the new buffer
2687  * @caps: the caps of the new buffer
2688  * @buf: a newly allocated buffer
2689  *
2690  * Allocates a new, empty buffer optimized to push to pad @pad.  This
2691  * function only works if @pad is a source pad and has a peer.
2692  *
2693  * A new, empty #GstBuffer will be put in the @buf argument.
2694  * You need to check the caps of the buffer after performing this
2695  * function and renegotiate to the format if needed.
2696  *
2697  * Returns: a result code indicating success of the operation. Any
2698  * result code other than #GST_FLOW_OK is an error and @buf should
2699  * not be used.
2700  * An error can occur if the pad is not connected or when the downstream
2701  * peer elements cannot provide an acceptable buffer.
2702  *
2703  * MT safe.
2704  */
2705 GstFlowReturn
2706 gst_pad_alloc_buffer (GstPad * pad, guint64 offset, gint size, GstCaps * caps,
2707     GstBuffer ** buf)
2708 {
2709   return gst_pad_alloc_buffer_full (pad, offset, size, caps, buf, FALSE);
2710 }
2711
2712 /**
2713  * gst_pad_alloc_buffer_and_set_caps:
2714  * @pad: a source #GstPad
2715  * @offset: the offset of the new buffer in the stream
2716  * @size: the size of the new buffer
2717  * @caps: the caps of the new buffer
2718  * @buf: a newly allocated buffer
2719  *
2720  * In addition to the function gst_pad_alloc_buffer(), this function
2721  * automatically calls gst_pad_set_caps() when the caps of the
2722  * newly allocated buffer are different from the @pad caps.
2723  *
2724  * Returns: a result code indicating success of the operation. Any
2725  * result code other than #GST_FLOW_OK is an error and @buf should
2726  * not be used.
2727  * An error can occur if the pad is not connected or when the downstream
2728  * peer elements cannot provide an acceptable buffer.
2729  *
2730  * MT safe.
2731  */
2732 GstFlowReturn
2733 gst_pad_alloc_buffer_and_set_caps (GstPad * pad, guint64 offset, gint size,
2734     GstCaps * caps, GstBuffer ** buf)
2735 {
2736   return gst_pad_alloc_buffer_full (pad, offset, size, caps, buf, TRUE);
2737 }
2738
2739 /**
2740  * gst_pad_get_internal_links_default:
2741  * @pad: the #GstPad to get the internal links of.
2742  *
2743  * Gets a list of pads to which the given pad is linked to
2744  * inside of the parent element.
2745  * This is the default handler, and thus returns a list of all of the
2746  * pads inside the parent element with opposite direction.
2747  * The caller must free this list after use.
2748  *
2749  * Returns: a newly allocated #GList of pads, or NULL if the pad has no parent.
2750  *
2751  * Not MT safe.
2752  */
2753 GList *
2754 gst_pad_get_internal_links_default (GstPad * pad)
2755 {
2756   GList *res = NULL;
2757   GstElement *parent;
2758   GList *parent_pads;
2759   GstPadDirection direction;
2760
2761   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2762
2763   direction = pad->direction;
2764
2765   parent = GST_PAD_PARENT (pad);
2766   if (!parent)
2767     return NULL;
2768
2769   parent_pads = parent->pads;
2770
2771   while (parent_pads) {
2772     GstPad *parent_pad = GST_PAD_CAST (parent_pads->data);
2773
2774     if (parent_pad->direction != direction) {
2775       res = g_list_prepend (res, parent_pad);
2776     }
2777
2778     parent_pads = g_list_next (parent_pads);
2779   }
2780
2781   return res;
2782 }
2783
2784 /**
2785  * gst_pad_get_internal_links:
2786  * @pad: the #GstPad to get the internal links of.
2787  *
2788  * Gets a list of pads to which the given pad is linked to
2789  * inside of the parent element.
2790  * The caller must free this list after use.
2791  *
2792  * Returns: a newly allocated #GList of pads.
2793  *
2794  * Not MT safe.
2795  */
2796 GList *
2797 gst_pad_get_internal_links (GstPad * pad)
2798 {
2799   GList *res = NULL;
2800
2801   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2802
2803   if (GST_PAD_INTLINKFUNC (pad))
2804     res = GST_PAD_INTLINKFUNC (pad) (pad);
2805
2806   return res;
2807 }
2808
2809
2810 static gboolean
2811 gst_pad_event_default_dispatch (GstPad * pad, GstEvent * event)
2812 {
2813   GList *orig, *pads;
2814   gboolean result;
2815
2816   GST_INFO_OBJECT (pad, "Sending event %p to all internally linked pads",
2817       event);
2818
2819   result = (GST_PAD_DIRECTION (pad) == GST_PAD_SINK);
2820
2821   orig = pads = gst_pad_get_internal_links (pad);
2822
2823   while (pads) {
2824     GstPad *eventpad = GST_PAD_CAST (pads->data);
2825
2826     pads = g_list_next (pads);
2827
2828     if (GST_PAD_DIRECTION (eventpad) == GST_PAD_SRC) {
2829       /* for each pad we send to, we should ref the event; it's up
2830        * to downstream to unref again when handled. */
2831       GST_LOG_OBJECT (pad, "Reffing and sending event %p (%s) to %s:%s",
2832           event, GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (eventpad));
2833       gst_event_ref (event);
2834       gst_pad_push_event (eventpad, event);
2835     } else {
2836       /* we only send the event on one pad, multi-sinkpad elements
2837        * should implement a handler */
2838       GST_LOG_OBJECT (pad, "sending event %p (%s) to one sink pad %s:%s",
2839           event, GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (eventpad));
2840       result = gst_pad_push_event (eventpad, event);
2841       goto done;
2842     }
2843   }
2844   /* we handled the incoming event so we unref once */
2845   GST_LOG_OBJECT (pad, "handled event %p, unreffing", event);
2846   gst_event_unref (event);
2847
2848 done:
2849   g_list_free (orig);
2850
2851   return result;
2852 }
2853
2854 /**
2855  * gst_pad_event_default:
2856  * @pad: a #GstPad to call the default event handler on.
2857  * @event: the #GstEvent to handle.
2858  *
2859  * Invokes the default event handler for the given pad. End-of-stream and
2860  * discontinuity events are handled specially, and then the event is sent to all
2861  * pads internally linked to @pad. Note that if there are many possible sink
2862  * pads that are internally linked to @pad, only one will be sent an event.
2863  * Multi-sinkpad elements should implement custom event handlers.
2864  *
2865  * Returns: TRUE if the event was sent succesfully.
2866  */
2867 gboolean
2868 gst_pad_event_default (GstPad * pad, GstEvent * event)
2869 {
2870   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2871   g_return_val_if_fail (event != NULL, FALSE);
2872
2873   switch (GST_EVENT_TYPE (event)) {
2874     case GST_EVENT_EOS:
2875     {
2876       GST_DEBUG_OBJECT (pad, "pausing task because of eos");
2877       gst_pad_pause_task (pad);
2878     }
2879     default:
2880       break;
2881   }
2882
2883   return gst_pad_event_default_dispatch (pad, event);
2884 }
2885
2886 /**
2887  * gst_pad_dispatcher:
2888  * @pad: a #GstPad to dispatch.
2889  * @dispatch: the #GstDispatcherFunction to call.
2890  * @data: gpointer user data passed to the dispatcher function.
2891  *
2892  * Invokes the given dispatcher function on all pads that are
2893  * internally linked to the given pad.
2894  * The GstPadDispatcherFunction should return TRUE when no further pads
2895  * need to be processed.
2896  *
2897  * Returns: TRUE if one of the dispatcher functions returned TRUE.
2898  */
2899 gboolean
2900 gst_pad_dispatcher (GstPad * pad, GstPadDispatcherFunction dispatch,
2901     gpointer data)
2902 {
2903   gboolean res = FALSE;
2904   GList *int_pads, *orig;
2905
2906   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2907   g_return_val_if_fail (dispatch != NULL, FALSE);
2908
2909   orig = int_pads = gst_pad_get_internal_links (pad);
2910
2911   while (int_pads) {
2912     GstPad *int_pad = GST_PAD_CAST (int_pads->data);
2913     GstPad *int_peer = GST_PAD_PEER (int_pad);
2914
2915     if (int_peer) {
2916       res = dispatch (int_peer, data);
2917       if (res)
2918         break;
2919     }
2920     int_pads = g_list_next (int_pads);
2921   }
2922
2923   g_list_free (orig);
2924
2925   return res;
2926 }
2927
2928 /**
2929  * gst_pad_query:
2930  * @pad: a #GstPad to invoke the default query on.
2931  * @query: the #GstQuery to perform.
2932  *
2933  * Dispatches a query to a pad. The query should have been allocated by the
2934  * caller via one of the type-specific allocation functions in gstquery.h. The
2935  * element is responsible for filling the query with an appropriate response,
2936  * which should then be parsed with a type-specific query parsing function.
2937  *
2938  * Again, the caller is responsible for both the allocation and deallocation of
2939  * the query structure.
2940  *
2941  * Returns: TRUE if the query could be performed.
2942  */
2943 gboolean
2944 gst_pad_query (GstPad * pad, GstQuery * query)
2945 {
2946   GstPadQueryFunction func;
2947
2948   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2949   g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
2950
2951   GST_DEBUG_OBJECT (pad, "sending query %p", query);
2952
2953   if ((func = GST_PAD_QUERYFUNC (pad)) == NULL)
2954     goto no_func;
2955
2956   return func (pad, query);
2957
2958 no_func:
2959   {
2960     GST_DEBUG_OBJECT (pad, "had no query function");
2961     return FALSE;
2962   }
2963 }
2964
2965 /**
2966  * gst_pad_query_default:
2967  * @pad: a #GstPad to call the default query handler on.
2968  * @query: the #GstQuery to handle.
2969  *
2970  * Invokes the default query handler for the given pad. 
2971  * The query is sent to all pads internally linked to @pad. Note that 
2972  * if there are many possible sink pads that are internally linked to 
2973  * @pad, only one will be sent the query.
2974  * Multi-sinkpad elements should implement custom query handlers.
2975  *
2976  * Returns: TRUE if the query was performed succesfully.
2977  */
2978 gboolean
2979 gst_pad_query_default (GstPad * pad, GstQuery * query)
2980 {
2981   switch (GST_QUERY_TYPE (query)) {
2982     case GST_QUERY_POSITION:
2983     case GST_QUERY_SEEKING:
2984     case GST_QUERY_FORMATS:
2985     case GST_QUERY_LATENCY:
2986     case GST_QUERY_JITTER:
2987     case GST_QUERY_RATE:
2988     case GST_QUERY_CONVERT:
2989     default:
2990       return gst_pad_dispatcher
2991           (pad, (GstPadDispatcherFunction) gst_pad_query, query);
2992   }
2993 }
2994
2995 #ifndef GST_DISABLE_LOADSAVE
2996 /* FIXME: why isn't this on a GstElement ? */
2997 /**
2998  * gst_pad_load_and_link:
2999  * @self: an #xmlNodePtr to read the description from.
3000  * @parent: the #GstObject element that owns the pad.
3001  *
3002  * Reads the pad definition from the XML node and links the given pad
3003  * in the element to a pad of an element up in the hierarchy.
3004  */
3005 void
3006 gst_pad_load_and_link (xmlNodePtr self, GstObject * parent)
3007 {
3008   xmlNodePtr field = self->xmlChildrenNode;
3009   GstPad *pad = NULL, *targetpad;
3010   gchar *peer = NULL;
3011   gchar **split;
3012   GstElement *target;
3013   GstObject *grandparent;
3014   gchar *name = NULL;
3015
3016   while (field) {
3017     if (!strcmp ((char *) field->name, "name")) {
3018       name = (gchar *) xmlNodeGetContent (field);
3019       pad = gst_element_get_pad (GST_ELEMENT (parent), name);
3020       g_free (name);
3021     } else if (!strcmp ((char *) field->name, "peer")) {
3022       peer = (gchar *) xmlNodeGetContent (field);
3023     }
3024     field = field->next;
3025   }
3026   g_return_if_fail (pad != NULL);
3027
3028   if (peer == NULL)
3029     return;
3030
3031   split = g_strsplit (peer, ".", 2);
3032
3033   if (split[0] == NULL || split[1] == NULL) {
3034     GST_CAT_DEBUG_OBJECT (GST_CAT_XML, pad,
3035         "Could not parse peer '%s', leaving unlinked", peer);
3036
3037     g_free (peer);
3038     return;
3039   }
3040   g_free (peer);
3041
3042   g_return_if_fail (split[0] != NULL);
3043   g_return_if_fail (split[1] != NULL);
3044
3045   grandparent = gst_object_get_parent (parent);
3046
3047   if (grandparent && GST_IS_BIN (grandparent)) {
3048     target = gst_bin_get_by_name_recurse_up (GST_BIN (grandparent), split[0]);
3049   } else
3050     goto cleanup;
3051
3052   if (target == NULL)
3053     goto cleanup;
3054
3055   targetpad = gst_element_get_pad (target, split[1]);
3056
3057   if (targetpad == NULL)
3058     goto cleanup;
3059
3060   gst_pad_link (pad, targetpad);
3061
3062 cleanup:
3063   g_strfreev (split);
3064 }
3065
3066 /**
3067  * gst_pad_save_thyself:
3068  * @pad: a #GstPad to save.
3069  * @parent: the parent #xmlNodePtr to save the description in.
3070  *
3071  * Saves the pad into an xml representation.
3072  *
3073  * Returns: the #xmlNodePtr representation of the pad.
3074  */
3075 static xmlNodePtr
3076 gst_pad_save_thyself (GstObject * object, xmlNodePtr parent)
3077 {
3078   GstPad *pad;
3079   GstPad *peer;
3080
3081   g_return_val_if_fail (GST_IS_PAD (object), NULL);
3082
3083   pad = GST_PAD (object);
3084
3085   xmlNewChild (parent, NULL, (xmlChar *) "name",
3086       (xmlChar *) GST_PAD_NAME (pad));
3087   if (GST_PAD_PEER (pad) != NULL) {
3088     gchar *content;
3089
3090     peer = GST_PAD_PEER (pad);
3091     /* first check to see if the peer's parent's parent is the same */
3092     /* we just save it off */
3093     content = g_strdup_printf ("%s.%s",
3094         GST_OBJECT_NAME (GST_PAD_PARENT (peer)), GST_PAD_NAME (peer));
3095     xmlNewChild (parent, NULL, (xmlChar *) "peer", (xmlChar *) content);
3096     g_free (content);
3097   } else
3098     xmlNewChild (parent, NULL, (xmlChar *) "peer", NULL);
3099
3100   return parent;
3101 }
3102
3103 #if 0
3104 /**
3105  * gst_ghost_pad_save_thyself:
3106  * @pad: a ghost #GstPad to save.
3107  * @parent: the parent #xmlNodePtr to save the description in.
3108  *
3109  * Saves the ghost pad into an xml representation.
3110  *
3111  * Returns: the #xmlNodePtr representation of the pad.
3112  */
3113 xmlNodePtr
3114 gst_ghost_pad_save_thyself (GstPad * pad, xmlNodePtr parent)
3115 {
3116   xmlNodePtr self;
3117
3118   g_return_val_if_fail (GST_IS_GHOST_PAD (pad), NULL);
3119
3120   self = xmlNewChild (parent, NULL, (xmlChar *) "ghostpad", NULL);
3121   xmlNewChild (self, NULL, (xmlChar *) "name", (xmlChar *) GST_PAD_NAME (pad));
3122   xmlNewChild (self, NULL, (xmlChar *) "parent",
3123       (xmlChar *) GST_OBJECT_NAME (GST_PAD_PARENT (pad)));
3124
3125   /* FIXME FIXME FIXME! */
3126
3127   return self;
3128 }
3129 #endif /* 0 */
3130 #endif /* GST_DISABLE_LOADSAVE */
3131
3132 /*
3133  * should be called with pad OBJECT_LOCK and STREAM_LOCK held. 
3134  * GST_PAD_IS_BLOCK (pad) == TRUE when this function is
3135  * called.
3136  *
3137  * This function perform the pad blocking when an event, buffer push
3138  * or buffer_alloc is performed on a _SRC_ pad. It blocks the
3139  * streaming thread after informing the pad has been blocked. 
3140  *
3141  * An application can with this method wait and block any streaming
3142  * thread and perform operations such as seeking or linking.
3143  *
3144  * Two methods are available for notifying the application of the
3145  * block: 
3146  * - the callback method, which happens in the STREAMING thread with
3147  *   the STREAM_LOCK held. With this method, the most usefull way of
3148  *   dealing with the callback is to post a message to the main thread
3149  *   where the pad block can then be handled outside of the streaming
3150  *   thread. With the last method one can perform all operations such
3151  *   as doing a state change, linking, unblocking, seeking etc on the
3152  *   pad.
3153  * - the GCond signal method, which makes any thread unblock when
3154  *   the pad block happens.
3155  *
3156  * MT safe.
3157  */
3158 static GstFlowReturn
3159 handle_pad_block (GstPad * pad)
3160 {
3161   GstPadBlockCallback callback;
3162   gpointer user_data;
3163   GstFlowReturn ret = GST_FLOW_OK;
3164
3165   GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "signal block taken");
3166
3167   /* flushing, don't bother trying to block and return WRONG_STATE
3168    * right away */
3169   if (GST_PAD_IS_FLUSHING (pad))
3170     goto flushingnonref;
3171
3172   /* we grab an extra ref for the callbacks, this is probably not
3173    * needed (callback code does not have a ref and cannot unref). I
3174    * think this was done to make it possible to unref the element in
3175    * the callback, which is in the end totally impossible as it 
3176    * requires grabbing the STREAM_LOCK and OBJECT_LOCK which are
3177    * all taken when calling this function. */
3178   gst_object_ref (pad);
3179
3180   /* we either have a callback installed to notify the block or
3181    * some other thread is doing a GCond wait. */
3182   callback = pad->block_callback;
3183   if (callback) {
3184     /* there is a callback installed, call it. We release the
3185      * lock so that the callback can do something usefull with the
3186      * pad */
3187     user_data = pad->block_data;
3188     GST_OBJECT_UNLOCK (pad);
3189     callback (pad, TRUE, user_data);
3190     GST_OBJECT_LOCK (pad);
3191   } else {
3192     /* no callback, signal the thread that is doing a GCond wait
3193      * if any. */
3194     GST_PAD_BLOCK_SIGNAL (pad);
3195   }
3196
3197   /* OBJECT_LOCK could have been released when we did the callback, which
3198    * then could have made the pad unblock so we need to check the blocking
3199    * condition again.   */
3200   while (GST_PAD_IS_BLOCKED (pad)) {
3201     if (GST_PAD_IS_FLUSHING (pad))
3202       goto flushing;
3203
3204     /* now we block the streaming thread. It can be unlocked when we 
3205      * deactivate the pad (which will also set the FLUSHING flag) or
3206      * when the pad is unblocked. A flushing event will also unblock
3207      * the pad after setting the FLUSHING flag. */
3208     GST_PAD_BLOCK_WAIT (pad);
3209
3210     /* see if we got unlocked by a flush or not */
3211     if (GST_PAD_IS_FLUSHING (pad))
3212       goto flushing;
3213   }
3214
3215   GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "got unblocked");
3216
3217   /* when we get here, the pad is unblocked again and we perform
3218    * the needed unblock code. */
3219   callback = pad->block_callback;
3220   if (callback) {
3221     /* we need to call the callback */
3222     user_data = pad->block_data;
3223     GST_OBJECT_UNLOCK (pad);
3224     callback (pad, FALSE, user_data);
3225     GST_OBJECT_LOCK (pad);
3226   } else {
3227     /* we need to signal the thread waiting on the GCond */
3228     GST_PAD_BLOCK_SIGNAL (pad);
3229   }
3230
3231   gst_object_unref (pad);
3232
3233   return ret;
3234
3235 flushingnonref:
3236   {
3237     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "pad was flushing");
3238     return GST_FLOW_WRONG_STATE;
3239   }
3240 flushing:
3241   {
3242     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "pad became flushing");
3243     gst_object_unref (pad);
3244     return GST_FLOW_WRONG_STATE;
3245   }
3246 }
3247
3248 /**********************************************************************
3249  * Data passing functions
3250  */
3251
3252 static gboolean
3253 gst_pad_emit_have_data_signal (GstPad * pad, GstMiniObject * obj)
3254 {
3255   GValue ret = { 0 };
3256   GValue args[2] = { {0}, {0} };
3257   gboolean res;
3258   GQuark detail;
3259
3260   /* init */
3261   g_value_init (&ret, G_TYPE_BOOLEAN);
3262   g_value_set_boolean (&ret, TRUE);
3263   g_value_init (&args[0], GST_TYPE_PAD);
3264   g_value_set_object (&args[0], pad);
3265   g_value_init (&args[1], GST_TYPE_MINI_OBJECT);        // G_TYPE_POINTER);
3266   gst_value_set_mini_object (&args[1], obj);
3267
3268   if (GST_IS_EVENT (obj))
3269     detail = event_quark;
3270   else
3271     detail = buffer_quark;
3272
3273   /* actually emit */
3274   g_signal_emitv (args, gst_pad_signals[PAD_HAVE_DATA], detail, &ret);
3275   res = g_value_get_boolean (&ret);
3276
3277   /* clean up */
3278   g_value_unset (&ret);
3279   g_value_unset (&args[0]);
3280   g_value_unset (&args[1]);
3281
3282   return res;
3283 }
3284
3285 /* this is the chain function that does not perform the additional argument
3286  * checking for that little extra speed.
3287  */
3288 static inline GstFlowReturn
3289 gst_pad_chain_unchecked (GstPad * pad, GstBuffer * buffer)
3290 {
3291   GstCaps *caps;
3292   gboolean caps_changed;
3293   GstPadChainFunction chainfunc;
3294   GstFlowReturn ret;
3295   gboolean emit_signal;
3296
3297   GST_PAD_STREAM_LOCK (pad);
3298
3299   GST_OBJECT_LOCK (pad);
3300   if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
3301     goto flushing;
3302
3303   caps = GST_BUFFER_CAPS (buffer);
3304   caps_changed = caps && caps != GST_PAD_CAPS (pad);
3305
3306   emit_signal = GST_PAD_DO_BUFFER_SIGNALS (pad) > 0;
3307   GST_OBJECT_UNLOCK (pad);
3308
3309   /* see if the signal should be emited, we emit before caps nego as
3310    * we might drop the buffer and do capsnego for nothing. */
3311   if (G_UNLIKELY (emit_signal)) {
3312     if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (buffer)))
3313       goto dropping;
3314   }
3315
3316   /* we got a new datatype on the pad, see if it can handle it */
3317   if (G_UNLIKELY (caps_changed)) {
3318     GST_DEBUG_OBJECT (pad, "caps changed to %p %" GST_PTR_FORMAT, caps, caps);
3319     if (G_UNLIKELY (!gst_pad_configure_sink (pad, caps)))
3320       goto not_negotiated;
3321   }
3322
3323   /* NOTE: we read the chainfunc unlocked.
3324    * we cannot hold the lock for the pad so we might send
3325    * the data to the wrong function. This is not really a
3326    * problem since functions are assigned at creation time
3327    * and don't change that often... */
3328   if (G_UNLIKELY ((chainfunc = GST_PAD_CHAINFUNC (pad)) == NULL))
3329     goto no_function;
3330
3331   GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3332       "calling chainfunction &%s", GST_DEBUG_FUNCPTR_NAME (chainfunc));
3333
3334   ret = chainfunc (pad, buffer);
3335
3336   GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3337       "called chainfunction &%s, returned %s",
3338       GST_DEBUG_FUNCPTR_NAME (chainfunc), gst_flow_get_name (ret));
3339
3340   GST_PAD_STREAM_UNLOCK (pad);
3341
3342   return ret;
3343
3344   /* ERRORS */
3345 flushing:
3346   {
3347     gst_buffer_unref (buffer);
3348     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3349         "pushing, but pad was flushing");
3350     GST_OBJECT_UNLOCK (pad);
3351     GST_PAD_STREAM_UNLOCK (pad);
3352     return GST_FLOW_WRONG_STATE;
3353   }
3354 dropping:
3355   {
3356     gst_buffer_unref (buffer);
3357     GST_DEBUG_OBJECT (pad, "Dropping buffer due to FALSE probe return");
3358     GST_PAD_STREAM_UNLOCK (pad);
3359     return GST_FLOW_OK;
3360   }
3361 not_negotiated:
3362   {
3363     gst_buffer_unref (buffer);
3364     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3365         "pushing buffer but pad did not accept");
3366     GST_PAD_STREAM_UNLOCK (pad);
3367     return GST_FLOW_NOT_NEGOTIATED;
3368   }
3369 no_function:
3370   {
3371     gst_buffer_unref (buffer);
3372     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3373         "pushing, but not chainhandler");
3374     GST_ELEMENT_ERROR (GST_PAD_PARENT (pad), CORE, PAD, (NULL),
3375         ("push on pad %s:%s but it has no chainfunction",
3376             GST_DEBUG_PAD_NAME (pad)));
3377     GST_PAD_STREAM_UNLOCK (pad);
3378     return GST_FLOW_NOT_SUPPORTED;
3379   }
3380 }
3381
3382 /**
3383  * gst_pad_chain:
3384  * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
3385  * @buffer: the #GstBuffer to send, return GST_FLOW_ERROR if not.
3386  *
3387  * Chain a buffer to @pad.
3388  *
3389  * The function returns #GST_FLOW_WRONG_STATE if the pad was flushing.
3390  *
3391  * If the caps on @buffer are different from the current caps on @pad, this
3392  * function will call any setcaps function (see gst_pad_set_setcaps_function())
3393  * installed on @pad. If the new caps are not acceptable for @pad, this function
3394  * returns #GST_FLOW_NOT_NEGOTIATED.
3395  *
3396  * The function proceeds calling the chain function installed on @pad (see
3397  * gst_pad_set_chain_function()) and the return value of that function is
3398  * returned to the caller. #GST_FLOW_NOT_SUPPORTED is returned if @pad has no
3399  * chain function.
3400  *
3401  * In all cases, success or failure, the caller loses its reference to @buffer
3402  * after calling this function.
3403  *
3404  * Returns: a #GstFlowReturn from the pad.
3405  *
3406  * MT safe.
3407  */
3408 GstFlowReturn
3409 gst_pad_chain (GstPad * pad, GstBuffer * buffer)
3410 {
3411   g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
3412   g_return_val_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SINK,
3413       GST_FLOW_ERROR);
3414   g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
3415
3416   return gst_pad_chain_unchecked (pad, buffer);
3417 }
3418
3419 /**
3420  * gst_pad_push:
3421  * @pad: a source #GstPad, returns #GST_FLOW_ERROR if not.
3422  * @buffer: the #GstBuffer to push returns GST_FLOW_ERROR if not.
3423  *
3424  * Pushes a buffer to the peer of @pad.
3425  *
3426  * This function will call an installed pad block before triggering any
3427  * installed pad probes.
3428  *
3429  * If the caps on @buffer are different from the currently configured caps on
3430  * @pad, this function will call any installed setcaps function on @pad (see
3431  * gst_pad_set_setcaps_function()). In case of failure to renegotiate the new
3432  * format, this function returns #GST_FLOW_NOT_NEGOTIATED.
3433  *
3434  * The function proceeds calling gst_pad_chain() on the peer pad and returns the
3435  * value from that function. If @pad has no peer, #GST_FLOW_NOT_LINKED will be
3436  * returned.
3437  *
3438  * In all cases, success or failure, the caller loses its reference to @buffer
3439  * after calling this function.
3440  *
3441  * Returns: a #GstFlowReturn from the peer pad.
3442  *
3443  * MT safe.
3444  */
3445 GstFlowReturn
3446 gst_pad_push (GstPad * pad, GstBuffer * buffer)
3447 {
3448   GstPad *peer;
3449   GstFlowReturn ret;
3450
3451   GstCaps *caps;
3452   gboolean caps_changed;
3453
3454   g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
3455   g_return_val_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SRC, GST_FLOW_ERROR);
3456   g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
3457
3458   GST_OBJECT_LOCK (pad);
3459
3460   /* FIXME: this check can go away; pad_set_blocked could be implemented with
3461    * probes completely or probes with an extended pad block. */
3462   while (G_UNLIKELY (GST_PAD_IS_BLOCKED (pad)))
3463     if ((ret = handle_pad_block (pad)) != GST_FLOW_OK)
3464       goto flushed;
3465
3466   /* we emit signals on the pad arg, the peer will have a chance to
3467    * emit in the _chain() function */
3468   if (G_UNLIKELY (GST_PAD_DO_BUFFER_SIGNALS (pad) > 0)) {
3469     /* unlock before emitting */
3470     GST_OBJECT_UNLOCK (pad);
3471
3472     /* if the signal handler returned FALSE, it means we should just drop the
3473      * buffer */
3474     if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (buffer)))
3475       goto dropped;
3476
3477     GST_OBJECT_LOCK (pad);
3478   }
3479
3480   if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
3481     goto not_linked;
3482
3483   /* take ref to peer pad before releasing the lock */
3484   gst_object_ref (peer);
3485
3486   /* Before pushing the buffer to the peer pad, ensure that caps 
3487    * are set on this pad */
3488   caps = GST_BUFFER_CAPS (buffer);
3489   caps_changed = caps && caps != GST_PAD_CAPS (pad);
3490
3491   GST_OBJECT_UNLOCK (pad);
3492
3493   /* we got a new datatype from the pad, it had better handle it */
3494   if (G_UNLIKELY (caps_changed)) {
3495     GST_DEBUG_OBJECT (pad, "caps changed to %p %" GST_PTR_FORMAT, caps, caps);
3496     if (G_UNLIKELY (!gst_pad_configure_src (pad, caps, TRUE)))
3497       goto not_negotiated;
3498   }
3499
3500   ret = gst_pad_chain_unchecked (peer, buffer);
3501
3502   gst_object_unref (peer);
3503
3504   return ret;
3505
3506   /* ERROR recovery here */
3507 flushed:
3508   {
3509     gst_buffer_unref (buffer);
3510     GST_DEBUG_OBJECT (pad, "pad block stopped by flush");
3511     GST_OBJECT_UNLOCK (pad);
3512     return ret;
3513   }
3514 dropped:
3515   {
3516     gst_buffer_unref (buffer);
3517     GST_DEBUG_OBJECT (pad, "Dropping buffer due to FALSE probe return");
3518     return GST_FLOW_OK;
3519   }
3520 not_linked:
3521   {
3522     gst_buffer_unref (buffer);
3523     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3524         "pushing, but it was not linked");
3525     GST_OBJECT_UNLOCK (pad);
3526     return GST_FLOW_NOT_LINKED;
3527   }
3528 not_negotiated:
3529   {
3530     gst_buffer_unref (buffer);
3531     gst_object_unref (peer);
3532     GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
3533         "element pushed buffer then refused to accept the caps");
3534     return GST_FLOW_NOT_NEGOTIATED;
3535   }
3536 }
3537
3538 /**
3539  * gst_pad_check_pull_range:
3540  * @pad: a sink #GstPad.
3541  *
3542  * Checks if a gst_pad_pull_range() can be performed on the peer
3543  * source pad. This function is used by plugins that want to check
3544  * if they can use random access on the peer source pad.
3545  *
3546  * The peer sourcepad can implement a custom #GstPadCheckGetRangeFunction
3547  * if it needs to perform some logic to determine if pull_range is
3548  * possible.
3549  *
3550  * Returns: a gboolean with the result.
3551  *
3552  * MT safe.
3553  */
3554 gboolean
3555 gst_pad_check_pull_range (GstPad * pad)
3556 {
3557   GstPad *peer;
3558   gboolean ret;
3559   GstPadCheckGetRangeFunction checkgetrangefunc;
3560
3561   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3562
3563   GST_OBJECT_LOCK (pad);
3564   if (GST_PAD_DIRECTION (pad) != GST_PAD_SINK)
3565     goto wrong_direction;
3566
3567   if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
3568     goto not_connected;
3569
3570   gst_object_ref (peer);
3571   GST_OBJECT_UNLOCK (pad);
3572
3573   /* see note in above function */
3574   if (G_LIKELY ((checkgetrangefunc = peer->checkgetrangefunc) == NULL)) {
3575     /* FIXME, kindoff ghetto */
3576     ret = GST_PAD_GETRANGEFUNC (peer) != NULL;
3577   } else {
3578     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3579         "calling checkgetrangefunc %s of peer pad %s:%s",
3580         GST_DEBUG_FUNCPTR_NAME (checkgetrangefunc), GST_DEBUG_PAD_NAME (peer));
3581
3582     ret = checkgetrangefunc (peer);
3583   }
3584
3585   gst_object_unref (peer);
3586
3587   return ret;
3588
3589   /* ERROR recovery here */
3590 wrong_direction:
3591   {
3592     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3593         "checking pull range, but pad must be a sinkpad");
3594     GST_OBJECT_UNLOCK (pad);
3595     return FALSE;
3596   }
3597 not_connected:
3598   {
3599     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3600         "checking pull range, but it was not linked");
3601     GST_OBJECT_UNLOCK (pad);
3602     return FALSE;
3603   }
3604 }
3605
3606 /**
3607  * gst_pad_get_range:
3608  * @pad: a src #GstPad, returns #GST_FLOW_ERROR if not.
3609  * @offset: The start offset of the buffer
3610  * @size: The length of the buffer
3611  * @buffer: a pointer to hold the #GstBuffer, returns #GST_FLOW_ERROR if %NULL.
3612  *
3613  * When @pad is flushing this function returns #GST_FLOW_WRONG_STATE
3614  * immediatly.
3615  *
3616  * Calls the getrange function of @pad, see #GstPadGetRangeFunction for a
3617  * description of a getrange function. If @pad has no getrange function
3618  * installed (see gst_pad_set_getrange_function()) this function returns
3619  * #GST_FLOW_NOT_SUPPORTED.
3620  *
3621  * Returns: a #GstFlowReturn from the pad.
3622  *
3623  * MT safe.
3624  */
3625 GstFlowReturn
3626 gst_pad_get_range (GstPad * pad, guint64 offset, guint size,
3627     GstBuffer ** buffer)
3628 {
3629   GstFlowReturn ret;
3630   GstPadGetRangeFunction getrangefunc;
3631   gboolean emit_signal;
3632
3633   g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
3634   g_return_val_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SRC, GST_FLOW_ERROR);
3635   g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
3636
3637   GST_PAD_STREAM_LOCK (pad);
3638
3639   GST_OBJECT_LOCK (pad);
3640   if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
3641     goto flushing;
3642
3643   emit_signal = GST_PAD_DO_BUFFER_SIGNALS (pad) > 0;
3644   GST_OBJECT_UNLOCK (pad);
3645
3646   if (G_UNLIKELY ((getrangefunc = GST_PAD_GETRANGEFUNC (pad)) == NULL))
3647     goto no_function;
3648
3649   GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3650       "calling getrangefunc %s, offset %"
3651       G_GUINT64_FORMAT ", size %u",
3652       GST_DEBUG_FUNCPTR_NAME (getrangefunc), offset, size);
3653
3654   ret = getrangefunc (pad, offset, size, buffer);
3655
3656   /* can only fire the signal if we have a valid buffer */
3657   if (G_UNLIKELY (emit_signal) && (ret == GST_FLOW_OK)) {
3658     if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (*buffer)))
3659       goto dropping;
3660   }
3661
3662   GST_PAD_STREAM_UNLOCK (pad);
3663
3664   return ret;
3665
3666   /* ERRORS */
3667 flushing:
3668   {
3669     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3670         "pulling range, but pad was flushing");
3671     GST_OBJECT_UNLOCK (pad);
3672     GST_PAD_STREAM_UNLOCK (pad);
3673     return GST_FLOW_WRONG_STATE;
3674   }
3675 no_function:
3676   {
3677     GST_ELEMENT_ERROR (GST_PAD_PARENT (pad), CORE, PAD, (NULL),
3678         ("pullrange on pad %s:%s but it has no getrangefunction",
3679             GST_DEBUG_PAD_NAME (pad)));
3680     GST_PAD_STREAM_UNLOCK (pad);
3681     return GST_FLOW_NOT_SUPPORTED;
3682   }
3683 dropping:
3684   {
3685     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3686         "Dropping data after FALSE probe return");
3687     GST_PAD_STREAM_UNLOCK (pad);
3688     gst_buffer_unref (*buffer);
3689     *buffer = NULL;
3690     return GST_FLOW_UNEXPECTED;
3691   }
3692 }
3693
3694
3695 /**
3696  * gst_pad_pull_range:
3697  * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
3698  * @offset: The start offset of the buffer
3699  * @size: The length of the buffer
3700  * @buffer: a pointer to hold the #GstBuffer, returns GST_FLOW_ERROR if %NULL.
3701  *
3702  * Pulls a buffer from the peer pad. 
3703  *
3704  * This function will first trigger the pad block signal if it was 
3705  * installed.
3706  *
3707  * When @pad is not linked #GST_FLOW_NOT_LINKED is returned else this
3708  * function returns the result of gst_pad_get_range() on the peer pad.
3709  * See gst_pad_get_range() for a list of return values and for the
3710  * semantics of the arguments of this function.
3711  *
3712  * Returns: a #GstFlowReturn from the peer pad.
3713  * When this function returns #GST_FLOW_OK, @buffer will contain a valid
3714  * #GstBuffer that should be freed with gst_buffer_unref() after usage.
3715  * @buffer may not be used or freed when any other return value than 
3716  * #GST_FLOW_OK is returned.
3717  *
3718  * MT safe.
3719  */
3720 GstFlowReturn
3721 gst_pad_pull_range (GstPad * pad, guint64 offset, guint size,
3722     GstBuffer ** buffer)
3723 {
3724   GstPad *peer;
3725   GstFlowReturn ret;
3726   gboolean emit_signal;
3727
3728   g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
3729   g_return_val_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SINK,
3730       GST_FLOW_ERROR);
3731   g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
3732
3733   GST_OBJECT_LOCK (pad);
3734
3735   while (G_UNLIKELY (GST_PAD_IS_BLOCKED (pad)))
3736     handle_pad_block (pad);
3737
3738   if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
3739     goto not_connected;
3740
3741   /* signal emision for the pad, peer has chance to emit when
3742    * we call _get_range() */
3743   emit_signal = GST_PAD_DO_BUFFER_SIGNALS (pad) > 0;
3744
3745   gst_object_ref (peer);
3746   GST_OBJECT_UNLOCK (pad);
3747
3748   ret = gst_pad_get_range (peer, offset, size, buffer);
3749
3750   gst_object_unref (peer);
3751
3752   /* can only fire the signal if we have a valid buffer */
3753   if (G_UNLIKELY (emit_signal) && (ret == GST_FLOW_OK)) {
3754     if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (*buffer)))
3755       goto dropping;
3756   }
3757   return ret;
3758
3759   /* ERROR recovery here */
3760 not_connected:
3761   {
3762     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3763         "pulling range, but it was not linked");
3764     GST_OBJECT_UNLOCK (pad);
3765     return GST_FLOW_NOT_LINKED;
3766   }
3767 dropping:
3768   {
3769     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3770         "Dropping data after FALSE probe return");
3771     gst_buffer_unref (*buffer);
3772     *buffer = NULL;
3773     return GST_FLOW_UNEXPECTED;
3774   }
3775 }
3776
3777 /**
3778  * gst_pad_push_event:
3779  * @pad: a #GstPad to push the event to.
3780  * @event: the #GstEvent to send to the pad.
3781  *
3782  * Sends the event to the peer of the given pad. This function is
3783  * mainly used by elements to send events to their peer
3784  * elements.
3785  *
3786  * This function takes owership of the provided event so you should
3787  * gst_event_ref() it if you want to reuse the event after this call.
3788  *
3789  * Returns: TRUE if the event was handled.
3790  *
3791  * MT safe.
3792  */
3793 gboolean
3794 gst_pad_push_event (GstPad * pad, GstEvent * event)
3795 {
3796   GstPad *peerpad;
3797   gboolean result;
3798
3799   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3800   g_return_val_if_fail (event != NULL, FALSE);
3801   g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
3802
3803   GST_LOG_OBJECT (pad, "event:%s", GST_EVENT_TYPE_NAME (event));
3804
3805   GST_OBJECT_LOCK (pad);
3806
3807   /* Two checks to be made:
3808    * . (un)set the FLUSHING flag for flushing events,
3809    * . handle pad blocking */
3810   switch (GST_EVENT_TYPE (event)) {
3811     case GST_EVENT_FLUSH_START:
3812       GST_PAD_SET_FLUSHING (pad);
3813
3814       if (G_UNLIKELY (GST_PAD_IS_BLOCKED (pad))) {
3815         /* flush start will have set the FLUSHING flag and will then
3816          * unlock all threads doing a GCond wait on the blocked pad. This
3817          * will typically unblock the STREAMING thread blocked on a pad. */
3818         GST_PAD_BLOCK_SIGNAL (pad);
3819         goto flushed;
3820       }
3821       break;
3822     case GST_EVENT_FLUSH_STOP:
3823       GST_PAD_UNSET_FLUSHING (pad);
3824
3825       if (G_UNLIKELY (GST_PAD_IS_BLOCKED (pad)))
3826         goto flushed;
3827       break;
3828     default:
3829       if (G_UNLIKELY (GST_PAD_IS_BLOCKED (pad))) {
3830         if (GST_PAD_IS_FLUSHING (pad))
3831           goto flushed;
3832         while (GST_PAD_IS_BLOCKED (pad))
3833           /* else block the event as long as the pad is blocked */
3834           if (handle_pad_block (pad) != GST_FLOW_OK)
3835             goto flushed;
3836       }
3837       break;
3838   }
3839
3840   if (G_UNLIKELY (GST_PAD_DO_EVENT_SIGNALS (pad) > 0)) {
3841     GST_OBJECT_UNLOCK (pad);
3842
3843     if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (event)))
3844       goto dropping;
3845
3846     GST_OBJECT_LOCK (pad);
3847   }
3848   peerpad = GST_PAD_PEER (pad);
3849   if (peerpad == NULL)
3850     goto not_linked;
3851
3852   GST_LOG_OBJECT (peerpad, "sending event on peerpad");
3853   gst_object_ref (peerpad);
3854   GST_OBJECT_UNLOCK (pad);
3855
3856   result = gst_pad_send_event (peerpad, event);
3857
3858   gst_object_unref (peerpad);
3859   GST_LOG_OBJECT (peerpad, "sent event on peerpad");
3860
3861   return result;
3862
3863   /* ERROR handling */
3864 dropping:
3865   {
3866     GST_DEBUG_OBJECT (pad, "Dropping event after FALSE probe return");
3867     gst_event_unref (event);
3868     return FALSE;
3869   }
3870 not_linked:
3871   {
3872     GST_DEBUG_OBJECT (pad, "Dropping event because pad is not linked");
3873     gst_event_unref (event);
3874     GST_OBJECT_UNLOCK (pad);
3875     return FALSE;
3876   }
3877
3878 flushed:
3879   {
3880     GST_DEBUG_OBJECT (pad,
3881         "Not forwarding event since we're flushing and blocking");
3882     gst_event_unref (event);
3883     GST_OBJECT_UNLOCK (pad);
3884     return TRUE;
3885   }
3886 }
3887
3888 /**
3889  * gst_pad_send_event:
3890  * @pad: a #GstPad to send the event to.
3891  * @event: the #GstEvent to send to the pad.
3892  *
3893  * Sends the event to the pad. This function can be used
3894  * by applications to send events in the pipeline.
3895  *
3896  * If @pad is a source pad, @event should be an upstream event. If @pad is a
3897  * sink pad, @event should be a downstream event. For example, you would not
3898  * send a #GST_EVENT_EOS on a src pad; EOS events only propagate downstream.
3899  * Furthermore, some downstream events have to be serialized with data flow,
3900  * like EOS, while some can travel out-of-band, like #GST_EVENT_FLUSH_START. If
3901  * the event needs to be serialized with data flow, this function will take the
3902  * pad's stream lock while calling its event function.
3903  *
3904  * To find out whether an event type is upstream, downstream, or downstream and
3905  * serialized, see #GstEventTypeFlags, gst_event_type_get_flags(),
3906  * #GST_EVENT_IS_UPSTREAM, #GST_EVENT_IS_DOWNSTREAM, and
3907  * #GST_EVENT_IS_SERIALIZED. Note that in practice that an application or plugin
3908  * doesn't need to bother itself with this information; the core handles all
3909  * necessary locks and checks.
3910  *
3911  * This function takes owership of the provided event so you should
3912  * gst_event_ref() it if you want to reuse the event after this call.
3913  *
3914  * Returns: TRUE if the event was handled.
3915  */
3916 gboolean
3917 gst_pad_send_event (GstPad * pad, GstEvent * event)
3918 {
3919   gboolean result = FALSE;
3920   GstPadEventFunction eventfunc;
3921   gboolean serialized, need_unlock = FALSE;
3922
3923   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3924   g_return_val_if_fail (event != NULL, FALSE);
3925
3926   GST_OBJECT_LOCK (pad);
3927   if (GST_PAD_IS_SINK (pad)) {
3928     if (G_UNLIKELY (!GST_EVENT_IS_DOWNSTREAM (event)))
3929       goto wrong_direction;
3930     serialized = GST_EVENT_IS_SERIALIZED (event);
3931   } else if (GST_PAD_IS_SRC (pad)) {
3932     if (G_UNLIKELY (!GST_EVENT_IS_UPSTREAM (event)))
3933       goto wrong_direction;
3934     /* events on srcpad never are serialized */
3935     serialized = FALSE;
3936   } else
3937     goto unknown_direction;
3938
3939   if (G_UNLIKELY (GST_EVENT_SRC (event) == NULL)) {
3940     GST_LOG_OBJECT (pad, "event had no source, setting pad as event source");
3941     GST_EVENT_SRC (event) = gst_object_ref (pad);
3942   }
3943
3944   /* pad signals */
3945   if (G_UNLIKELY (GST_PAD_DO_EVENT_SIGNALS (pad) > 0)) {
3946     GST_OBJECT_UNLOCK (pad);
3947
3948     if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT_CAST (event)))
3949       goto dropping;
3950
3951     GST_OBJECT_LOCK (pad);
3952   }
3953
3954   switch (GST_EVENT_TYPE (event)) {
3955     case GST_EVENT_FLUSH_START:
3956       GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad,
3957           "have event type %d (FLUSH_START)", GST_EVENT_TYPE (event));
3958
3959       /* can't even accept a flush begin event when flushing */
3960       if (GST_PAD_IS_FLUSHING (pad))
3961         goto flushing;
3962       GST_PAD_SET_FLUSHING (pad);
3963       GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad, "set flush flag");
3964       break;
3965     case GST_EVENT_FLUSH_STOP:
3966       GST_PAD_UNSET_FLUSHING (pad);
3967       GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad, "cleared flush flag");
3968       GST_OBJECT_UNLOCK (pad);
3969       /* grab stream lock */
3970       GST_PAD_STREAM_LOCK (pad);
3971       need_unlock = TRUE;
3972       GST_OBJECT_LOCK (pad);
3973       break;
3974     default:
3975       GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad, "have event type %s",
3976           GST_EVENT_TYPE_NAME (event));
3977
3978       /* make this a little faster, no point in grabbing the lock
3979        * if the pad is allready flushing. */
3980       if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
3981         goto flushing;
3982
3983       if (serialized) {
3984         /* lock order: STREAM_LOCK, LOCK */
3985         GST_OBJECT_UNLOCK (pad);
3986         GST_PAD_STREAM_LOCK (pad);
3987         need_unlock = TRUE;
3988         GST_OBJECT_LOCK (pad);
3989         if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
3990           goto flushing;
3991       }
3992       break;
3993   }
3994   if (G_UNLIKELY ((eventfunc = GST_PAD_EVENTFUNC (pad)) == NULL))
3995     goto no_function;
3996
3997   GST_OBJECT_UNLOCK (pad);
3998
3999   result = eventfunc (pad, event);
4000
4001   if (need_unlock)
4002     GST_PAD_STREAM_UNLOCK (pad);
4003
4004   return result;
4005
4006   /* ERROR handling */
4007 wrong_direction:
4008   {
4009     g_warning ("pad %s:%s sending %s event in wrong direction",
4010         GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE_NAME (event));
4011     GST_OBJECT_UNLOCK (pad);
4012     gst_event_unref (event);
4013     return FALSE;
4014   }
4015 unknown_direction:
4016   {
4017     g_warning ("pad %s:%s has invalid direction", GST_DEBUG_PAD_NAME (pad));
4018     GST_OBJECT_UNLOCK (pad);
4019     gst_event_unref (event);
4020     return FALSE;
4021   }
4022 no_function:
4023   {
4024     g_warning ("pad %s:%s has no event handler, file a bug.",
4025         GST_DEBUG_PAD_NAME (pad));
4026     GST_OBJECT_UNLOCK (pad);
4027     gst_event_unref (event);
4028     return FALSE;
4029   }
4030 flushing:
4031   {
4032     GST_OBJECT_UNLOCK (pad);
4033     if (need_unlock)
4034       GST_PAD_STREAM_UNLOCK (pad);
4035     GST_CAT_INFO_OBJECT (GST_CAT_EVENT, pad,
4036         "Received event on flushing pad. Discarding");
4037     gst_event_unref (event);
4038     return FALSE;
4039   }
4040 dropping:
4041   {
4042     GST_DEBUG_OBJECT (pad, "Dropping event after FALSE probe return");
4043     gst_event_unref (event);
4044     return FALSE;
4045   }
4046 }
4047
4048 /**
4049  * gst_pad_set_element_private:
4050  * @pad: the #GstPad to set the private data of.
4051  * @priv: The private data to attach to the pad.
4052  *
4053  * Set the given private data gpointer on the pad.
4054  * This function can only be used by the element that owns the pad.
4055  * No locking is performed in this function.
4056  */
4057 void
4058 gst_pad_set_element_private (GstPad * pad, gpointer priv)
4059 {
4060   pad->element_private = priv;
4061 }
4062
4063 /**
4064  * gst_pad_get_element_private:
4065  * @pad: the #GstPad to get the private data of.
4066  *
4067  * Gets the private data of a pad.
4068  * No locking is performed in this function.
4069  *
4070  * Returns: a #gpointer to the private data.
4071  */
4072 gpointer
4073 gst_pad_get_element_private (GstPad * pad)
4074 {
4075   return pad->element_private;
4076 }
4077
4078 /**
4079  * gst_pad_start_task:
4080  * @pad: the #GstPad to start the task of
4081  * @func: the task function to call
4082  * @data: data passed to the task function
4083  *
4084  * Starts a task that repeadedly calls @func with @data. This function
4085  * is nostly used in the pad activation function to start the
4086  * dataflow. This function will automatically acquire the STREAM_LOCK of
4087  * the pad before calling @func.
4088  *
4089  * Returns: a TRUE if the task could be started.
4090  */
4091 gboolean
4092 gst_pad_start_task (GstPad * pad, GstTaskFunction func, gpointer data)
4093 {
4094   GstTask *task;
4095
4096   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4097   g_return_val_if_fail (func != NULL, FALSE);
4098
4099   GST_OBJECT_LOCK (pad);
4100   task = GST_PAD_TASK (pad);
4101   if (task == NULL) {
4102     task = gst_task_create (func, data);
4103     gst_task_set_lock (task, GST_PAD_GET_STREAM_LOCK (pad));
4104     GST_PAD_TASK (pad) = task;
4105   }
4106   gst_task_start (task);
4107   GST_OBJECT_UNLOCK (pad);
4108
4109   return TRUE;
4110 }
4111
4112 /**
4113  * gst_pad_pause_task:
4114  * @pad: the #GstPad to pause the task of
4115  *
4116  * Pause the task of @pad. This function will also make sure that the
4117  * function executed by the task will effectively stop.
4118  *
4119  * Returns: a TRUE if the task could be paused or FALSE when the pad
4120  * has no task.
4121  */
4122 gboolean
4123 gst_pad_pause_task (GstPad * pad)
4124 {
4125   GstTask *task;
4126
4127   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4128
4129   GST_OBJECT_LOCK (pad);
4130   task = GST_PAD_TASK (pad);
4131   if (task == NULL)
4132     goto no_task;
4133   gst_task_pause (task);
4134   GST_OBJECT_UNLOCK (pad);
4135
4136   GST_PAD_STREAM_LOCK (pad);
4137   GST_PAD_STREAM_UNLOCK (pad);
4138
4139   return TRUE;
4140
4141 no_task:
4142   {
4143     GST_DEBUG_OBJECT (pad, "pad has no task");
4144     GST_OBJECT_UNLOCK (pad);
4145     return FALSE;
4146   }
4147 }
4148
4149 /**
4150  * gst_pad_stop_task:
4151  * @pad: the #GstPad to stop the task of
4152  *
4153  * Stop the task of @pad. This function will also make sure that the
4154  * function executed by the task will effectively stop if not called
4155  * from the GstTaskFunction.
4156  *
4157  * This function will deadlock if called from the GstTaskFunction of
4158  * the task. Use gst_task_pause() instead.
4159  *
4160  * Regardless of whether the pad has a task, the stream lock is acquired and
4161  * released so as to ensure that streaming through this pad has finished.
4162  *
4163  * Returns: a TRUE if the task could be stopped or FALSE on error.
4164  */
4165 gboolean
4166 gst_pad_stop_task (GstPad * pad)
4167 {
4168   GstTask *task;
4169
4170   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4171
4172   GST_OBJECT_LOCK (pad);
4173   task = GST_PAD_TASK (pad);
4174   if (task == NULL)
4175     goto no_task;
4176   GST_PAD_TASK (pad) = NULL;
4177   gst_task_stop (task);
4178   GST_OBJECT_UNLOCK (pad);
4179
4180   GST_PAD_STREAM_LOCK (pad);
4181   GST_PAD_STREAM_UNLOCK (pad);
4182
4183   gst_task_join (task);
4184
4185   gst_object_unref (task);
4186
4187   return TRUE;
4188
4189 no_task:
4190   {
4191     GST_OBJECT_UNLOCK (pad);
4192
4193     GST_PAD_STREAM_LOCK (pad);
4194     GST_PAD_STREAM_UNLOCK (pad);
4195
4196     return TRUE;
4197   }
4198 }