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