debugging and cleanups
[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 #include "gst_private.h"
24
25 #include "gstpad.h"
26 #include "gstmarshal.h"
27 #include "gstutils.h"
28 #include "gstelement.h"
29 #include "gstbin.h"
30 #include "gstscheduler.h"
31 #include "gstevent.h"
32 #include "gstinfo.h"
33 #include "gsterror.h"
34 #include "gstvalue.h"
35
36 GST_DEBUG_CATEGORY_STATIC (debug_dataflow);
37 #define DEBUG_DATA(obj,data,notice) G_STMT_START{\
38   if (GST_IS_EVENT (data)) { \
39     GST_CAT_DEBUG_OBJECT (debug_dataflow, obj, "%s event %p (type %d)", notice, data, \
40         GST_EVENT_TYPE (data)); \
41   } else { \
42     GST_CAT_LOG_OBJECT (debug_dataflow, obj, "%s buffer %p (size %u, refcount %d)", notice, data, \
43         GST_BUFFER_SIZE (data), GST_BUFFER_REFCOUNT_VALUE (data)); \
44   } \
45 }G_STMT_END
46 #define GST_CAT_DEFAULT GST_CAT_PADS
47
48 struct _GstPadLink
49 {
50   GType type;
51
52   gboolean bla;
53   gboolean srcnotify;
54   gboolean sinknotify;
55
56   GstPad *srcpad;
57   GstPad *sinkpad;
58
59   GstCaps *srccaps;
60   GstCaps *sinkcaps;
61   GstCaps *filtercaps;
62   GstCaps *caps;
63
64   GstPadFixateFunction app_fixate;
65
66   gboolean engaged;
67   GstData *temp_store;          /* used only when we invented a DISCONT */
68 };
69
70 enum
71 {
72   TEMPL_PAD_CREATED,
73   /* FILL ME */
74   TEMPL_LAST_SIGNAL
75 };
76
77 static GstObject *padtemplate_parent_class = NULL;
78 static guint gst_pad_template_signals[TEMPL_LAST_SIGNAL] = { 0 };
79
80 GType _gst_pad_type = 0;
81
82 /***** Start with the base GstPad class *****/
83 static void gst_pad_class_init (GstPadClass * klass);
84 static void gst_pad_init (GstPad * pad);
85 static void gst_pad_dispose (GObject * object);
86
87 static void gst_pad_set_pad_template (GstPad * pad, GstPadTemplate * templ);
88 static GstCaps *_gst_pad_default_fixate_func (GstPad * pad,
89     const GstCaps * caps);
90
91 static gboolean gst_pad_link_try (GstPadLink * link);
92 static void gst_pad_link_free (GstPadLink * link);
93
94 #ifndef GST_DISABLE_LOADSAVE
95 static xmlNodePtr gst_pad_save_thyself (GstObject * object, xmlNodePtr parent);
96 #endif
97
98 static GstObject *pad_parent_class = NULL;
99
100 GType
101 gst_pad_get_type (void)
102 {
103   if (!_gst_pad_type) {
104     static const GTypeInfo pad_info = {
105       sizeof (GstPadClass), NULL, NULL,
106       (GClassInitFunc) gst_pad_class_init, NULL, NULL,
107       sizeof (GstPad),
108       0,
109       (GInstanceInitFunc) gst_pad_init, NULL
110     };
111
112     _gst_pad_type = g_type_register_static (GST_TYPE_OBJECT, "GstPad",
113         &pad_info, 0);
114
115     GST_DEBUG_CATEGORY_INIT (debug_dataflow, "GST_DATAFLOW",
116         GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "dataflow inside pads");
117   }
118   return _gst_pad_type;
119 }
120
121 static void
122 gst_pad_class_init (GstPadClass * klass)
123 {
124   GObjectClass *gobject_class;
125
126   gobject_class = (GObjectClass *) klass;
127
128   pad_parent_class = g_type_class_ref (GST_TYPE_OBJECT);
129
130   gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_pad_dispose);
131 }
132
133 static void
134 gst_pad_init (GstPad * pad)
135 {
136   /* all structs are initialized to NULL by glib */
137 }
138 static void
139 gst_pad_dispose (GObject * object)
140 {
141   GstPad *pad = GST_PAD (object);
142
143   gst_pad_set_pad_template (pad, NULL);
144
145   G_OBJECT_CLASS (pad_parent_class)->dispose (object);
146 }
147
148
149
150 /***** Then do the Real Pad *****/
151 /* Pad signals and args */
152 enum
153 {
154   REAL_LINKED,
155   REAL_UNLINKED,
156   REAL_FIXATE,
157   /* FILL ME */
158   REAL_LAST_SIGNAL
159 };
160
161 enum
162 {
163   REAL_ARG_0,
164   REAL_ARG_CAPS,
165   REAL_ARG_ACTIVE
166       /* FILL ME */
167 };
168
169 static void gst_real_pad_class_init (GstRealPadClass * klass);
170 static void gst_real_pad_init (GstRealPad * pad);
171 static void gst_real_pad_dispose (GObject * object);
172
173 static gboolean _gst_real_pad_fixate_accumulator (GSignalInvocationHint * ihint,
174     GValue * return_accu, const GValue * handler_return, gpointer dummy);
175 static void gst_real_pad_set_property (GObject * object, guint prop_id,
176     const GValue * value, GParamSpec * pspec);
177 static void gst_real_pad_get_property (GObject * object, guint prop_id,
178     GValue * value, GParamSpec * pspec);
179
180 GType _gst_real_pad_type = 0;
181
182 static GstPad *real_pad_parent_class = NULL;
183 static guint gst_real_pad_signals[REAL_LAST_SIGNAL] = { 0 };
184
185 GType
186 gst_real_pad_get_type (void)
187 {
188   if (!_gst_real_pad_type) {
189     static const GTypeInfo pad_info = {
190       sizeof (GstRealPadClass), NULL, NULL,
191       (GClassInitFunc) gst_real_pad_class_init, NULL, NULL,
192       sizeof (GstRealPad),
193       0,
194       (GInstanceInitFunc) gst_real_pad_init, NULL
195     };
196
197     _gst_real_pad_type = g_type_register_static (GST_TYPE_PAD, "GstRealPad",
198         &pad_info, 0);
199   }
200   return _gst_real_pad_type;
201 }
202
203 static void
204 gst_real_pad_class_init (GstRealPadClass * klass)
205 {
206   GObjectClass *gobject_class;
207   GstObjectClass *gstobject_class;
208
209   gobject_class = (GObjectClass *) klass;
210   gstobject_class = (GstObjectClass *) klass;
211
212   real_pad_parent_class = g_type_class_ref (GST_TYPE_PAD);
213
214   gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_real_pad_dispose);
215   gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_real_pad_set_property);
216   gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_real_pad_get_property);
217
218   gst_real_pad_signals[REAL_LINKED] =
219       g_signal_new ("linked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
220       G_STRUCT_OFFSET (GstRealPadClass, linked), NULL, NULL,
221       gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
222   gst_real_pad_signals[REAL_UNLINKED] =
223       g_signal_new ("unlinked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
224       G_STRUCT_OFFSET (GstRealPadClass, unlinked), NULL, NULL,
225       gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
226   gst_real_pad_signals[REAL_FIXATE] =
227       g_signal_new ("fixate", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
228       G_STRUCT_OFFSET (GstRealPadClass, appfixatefunc),
229       _gst_real_pad_fixate_accumulator, NULL,
230       gst_marshal_BOXED__BOXED, GST_TYPE_CAPS, 1,
231       GST_TYPE_CAPS | G_SIGNAL_TYPE_STATIC_SCOPE);
232
233 /*  gtk_object_add_arg_type ("GstRealPad::active", G_TYPE_BOOLEAN, */
234 /*                           GTK_ARG_READWRITE, REAL_ARG_ACTIVE); */
235   g_object_class_install_property (G_OBJECT_CLASS (klass), REAL_ARG_ACTIVE,
236       g_param_spec_boolean ("active", "Active", "Whether the pad is active.",
237           TRUE, G_PARAM_READWRITE));
238   g_object_class_install_property (G_OBJECT_CLASS (klass), REAL_ARG_CAPS,
239       g_param_spec_boxed ("caps", "Caps", "The capabilities of the pad",
240           GST_TYPE_CAPS, G_PARAM_READABLE));
241
242 #ifndef GST_DISABLE_LOADSAVE
243   gstobject_class->save_thyself = GST_DEBUG_FUNCPTR (gst_pad_save_thyself);
244 #endif
245   gstobject_class->path_string_separator = ".";
246 }
247
248 static gboolean
249 _gst_real_pad_fixate_accumulator (GSignalInvocationHint * ihint,
250     GValue * return_accu, const GValue * handler_return, gpointer dummy)
251 {
252   if (gst_value_get_caps (handler_return)) {
253     g_value_copy (handler_return, return_accu);
254     /* stop emission if something was returned */
255     return FALSE;
256   }
257   return TRUE;
258 }
259
260 static void
261 gst_real_pad_init (GstRealPad * pad)
262 {
263   pad->direction = GST_PAD_UNKNOWN;
264   pad->peer = NULL;
265
266   pad->chainfunc = NULL;
267   pad->getfunc = NULL;
268
269   pad->chainhandler = NULL;
270   pad->gethandler = NULL;
271
272   pad->ghostpads = NULL;
273   pad->caps = NULL;
274
275   pad->linkfunc = NULL;
276   pad->getcapsfunc = NULL;
277
278   pad->eventfunc = gst_pad_event_default;
279   pad->convertfunc = gst_pad_convert_default;
280   pad->queryfunc = gst_pad_query_default;
281   pad->intlinkfunc = gst_pad_get_internal_links_default;
282
283   pad->eventmaskfunc = gst_pad_get_event_masks_default;
284   pad->formatsfunc = gst_pad_get_formats_default;
285   pad->querytypefunc = gst_pad_get_query_types_default;
286
287   GST_FLAG_SET (pad, GST_PAD_DISABLED);
288   GST_FLAG_UNSET (pad, GST_PAD_NEGOTIATING);
289
290   gst_probe_dispatcher_init (&pad->probedisp);
291 }
292
293 static void
294 gst_real_pad_set_property (GObject * object, guint prop_id,
295     const GValue * value, GParamSpec * pspec)
296 {
297   g_return_if_fail (GST_IS_PAD (object));
298
299   switch (prop_id) {
300     case REAL_ARG_ACTIVE:
301       gst_pad_set_active (GST_PAD (object), g_value_get_boolean (value));
302       break;
303     default:
304       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
305       break;
306   }
307 }
308
309 static void
310 gst_real_pad_get_property (GObject * object, guint prop_id,
311     GValue * value, GParamSpec * pspec)
312 {
313   g_return_if_fail (GST_IS_PAD (object));
314
315   switch (prop_id) {
316     case REAL_ARG_ACTIVE:
317       g_value_set_boolean (value, !GST_FLAG_IS_SET (object, GST_PAD_DISABLED));
318       break;
319     case REAL_ARG_CAPS:
320       g_value_set_boxed (value, GST_PAD_CAPS (GST_REAL_PAD (object)));
321       break;
322     default:
323       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
324       break;
325   }
326 }
327
328 /* FIXME-0.9: Replace these custom functions with proper inheritance via _init
329    functions and object properties */
330 /**
331  * gst_pad_custom_new:
332  * @type: the #Gtype of the pad.
333  * @name: the name of the new pad.
334  * @direction: the #GstPadDirection of the pad.
335  *
336  * Creates a new pad with the given name and type in the given direction.
337  * If name is NULL, a guaranteed unique name (across all pads) 
338  * will be assigned.
339  *
340  * Returns: a new #GstPad, or NULL in case of an error.
341  */
342 GstPad *
343 gst_pad_custom_new (GType type, const gchar * name, GstPadDirection direction)
344 {
345   GstRealPad *pad;
346
347   g_return_val_if_fail (direction != GST_PAD_UNKNOWN, NULL);
348
349   pad = g_object_new (type, NULL);
350   gst_object_set_name (GST_OBJECT (pad), name);
351   GST_RPAD_DIRECTION (pad) = direction;
352
353   return GST_PAD (pad);
354 }
355
356 /**
357  * gst_pad_new:
358  * @name: the name of the new pad.
359  * @direction: the #GstPadDirection of the pad.
360  *
361  * Creates a new real pad with the given name in the given direction.
362  * If name is NULL, a guaranteed unique name (across all pads) 
363  * will be assigned.
364  *
365  * Returns: a new #GstPad, or NULL in case of an error.
366  */
367 GstPad *
368 gst_pad_new (const gchar * name, GstPadDirection direction)
369 {
370   return gst_pad_custom_new (gst_real_pad_get_type (), name, direction);
371 }
372
373 /**
374  * gst_pad_custom_new_from_template:
375  * @type: the custom #GType of the pad.
376  * @templ: the #GstPadTemplate to instantiate from.
377  * @name: the name of the new pad.
378  *
379  * Creates a new custom pad with the given name from the given template.
380  * If name is NULL, a guaranteed unique name (across all pads) 
381  * will be assigned.
382  *
383  * Returns: a new #GstPad, or NULL in case of an error.
384  */
385 GstPad *
386 gst_pad_custom_new_from_template (GType type, GstPadTemplate * templ,
387     const gchar * name)
388 {
389   GstPad *pad;
390
391   g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
392
393   pad = gst_pad_custom_new (type, name, templ->direction);
394   gst_pad_set_pad_template (pad, templ);
395
396   return pad;
397 }
398
399 /**
400  * gst_pad_new_from_template:
401  * @templ: the pad template to use
402  * @name: the name of the element
403  *
404  * Creates a new real pad with the given name from the given template.
405  * If name is NULL, a guaranteed unique name (across all pads) 
406  * will be assigned.
407  *
408  * Returns: a new #GstPad, or NULL in case of an error.
409  */
410 GstPad *
411 gst_pad_new_from_template (GstPadTemplate * templ, const gchar * name)
412 {
413   return gst_pad_custom_new_from_template (gst_real_pad_get_type (),
414       templ, name);
415 }
416
417 /* FIXME 0.9: GST_PAD_UNKNOWN needs to die! */
418 /**
419  * gst_pad_get_direction:
420  * @pad: a #GstPad to get the direction of.
421  *
422  * Gets the direction of the pad.
423  *
424  * Returns: the #GstPadDirection of the pad.
425  */
426 GstPadDirection
427 gst_pad_get_direction (GstPad * pad)
428 {
429   g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_UNKNOWN);
430
431   if (GST_IS_REAL_PAD (pad))
432     return GST_PAD_DIRECTION (pad);
433   else
434     return GST_PAD_UNKNOWN;
435 }
436
437 /**
438  * gst_pad_set_active:
439  * @pad: the #GstPad to activate or deactivate.
440  * @active: TRUE to activate the pad.
441  *
442  * Activates or deactivates the given pad.
443  */
444 void
445 gst_pad_set_active (GstPad * pad, gboolean active)
446 {
447   GstRealPad *realpad;
448   gboolean old;
449   GstPadLink *link;
450
451   g_return_if_fail (GST_IS_PAD (pad));
452
453   old = GST_PAD_IS_ACTIVE (pad);
454
455   if (old == active)
456     return;
457
458   realpad = GST_PAD_REALIZE (pad);
459
460   if (active) {
461     GST_CAT_DEBUG (GST_CAT_PADS, "activating pad %s:%s",
462         GST_DEBUG_PAD_NAME (realpad));
463     GST_FLAG_UNSET (realpad, GST_PAD_DISABLED);
464   } else {
465     GST_CAT_DEBUG (GST_CAT_PADS, "de-activating pad %s:%s",
466         GST_DEBUG_PAD_NAME (realpad));
467     GST_FLAG_SET (realpad, GST_PAD_DISABLED);
468   }
469   link = GST_RPAD_LINK (realpad);
470   if (link) {
471     if (link->temp_store) {
472       GST_CAT_INFO (GST_CAT_PADS,
473           "deleting cached buffer from bufpen of pad %s:%s",
474           GST_DEBUG_PAD_NAME (realpad));
475       gst_data_unref (link->temp_store);
476       link->temp_store = NULL;
477     }
478   }
479
480   g_object_notify (G_OBJECT (realpad), "active");
481 }
482
483 /**
484  * gst_pad_is_active:
485  * @pad: the #GstPad to query
486  *
487  * Query if a pad is active
488  *
489  * Returns: TRUE if the pad is active.
490  */
491 gboolean
492 gst_pad_is_active (GstPad * pad)
493 {
494   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
495
496   return !GST_FLAG_IS_SET (pad, GST_PAD_DISABLED);
497 }
498
499 /**
500  * gst_pad_set_name:
501  * @pad: a #GstPad to set the name of.
502  * @name: the name of the pad.
503  *
504  * Sets the name of a pad.  If name is NULL, then a guaranteed unique
505  * name will be assigned.
506  */
507 void
508 gst_pad_set_name (GstPad * pad, const gchar * name)
509 {
510   g_return_if_fail (GST_IS_PAD (pad));
511
512   gst_object_set_name (GST_OBJECT (pad), name);
513 }
514
515 /* FIXME 0.9: This function must die */
516 /**
517  * gst_pad_get_name:
518  * @pad: a #GstPad to get the name of.
519  *
520  * Gets the name of a pad.
521  *
522  * Returns: the name of the pad.  This is not a newly allocated pointer
523  * so you must not free it.
524  */
525 const gchar *
526 gst_pad_get_name (GstPad * pad)
527 {
528   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
529
530   return GST_OBJECT_NAME (pad);
531 }
532
533 /**
534  * gst_pad_set_chain_function:
535  * @pad: a real sink #GstPad.
536  * @chain: the #GstPadChainFunction to set.
537  *
538  * Sets the given chain function for the pad. The chain function is called to
539  * process a #GstData input buffer.
540  */
541 void
542 gst_pad_set_chain_function (GstPad * pad, GstPadChainFunction chain)
543 {
544   g_return_if_fail (GST_IS_REAL_PAD (pad));
545   g_return_if_fail (GST_RPAD_DIRECTION (pad) == GST_PAD_SINK);
546
547   GST_RPAD_CHAINFUNC (pad) = chain;
548   GST_CAT_DEBUG (GST_CAT_PADS, "chainfunc for %s:%s set to %s",
549       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (chain));
550 }
551
552 /**
553  * gst_pad_set_get_function:
554  * @pad: a real source #GstPad.
555  * @get: the #GstPadGetFunction to set.
556  *
557  * Sets the given get function for the pad. The get function is called to
558  * produce a new #GstData to start the processing pipeline. Get functions cannot
559  * return %NULL.
560  */
561 void
562 gst_pad_set_get_function (GstPad * pad, GstPadGetFunction get)
563 {
564   g_return_if_fail (GST_IS_REAL_PAD (pad));
565   g_return_if_fail (GST_RPAD_DIRECTION (pad) == GST_PAD_SRC);
566
567   GST_RPAD_GETFUNC (pad) = get;
568
569   GST_CAT_DEBUG (GST_CAT_PADS, "getfunc for %s:%s  set to %s",
570       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (get));
571 }
572
573 /**
574  * gst_pad_set_event_function:
575  * @pad: a real source #GstPad.
576  * @event: the #GstPadEventFunction to set.
577  *
578  * Sets the given event handler for the pad.
579  */
580 void
581 gst_pad_set_event_function (GstPad * pad, GstPadEventFunction event)
582 {
583   g_return_if_fail (GST_IS_REAL_PAD (pad));
584   g_return_if_fail (GST_RPAD_DIRECTION (pad) == GST_PAD_SRC);
585
586   GST_RPAD_EVENTFUNC (pad) = event;
587
588   GST_CAT_DEBUG (GST_CAT_PADS, "eventfunc for %s:%s  set to %s",
589       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (event));
590 }
591
592 /**
593  * gst_pad_set_event_mask_function:
594  * @pad: a real #GstPad of either direction.
595  * @mask_func: the #GstPadEventMaskFunction to set.
596  *
597  * Sets the given event mask function for the pad.
598  */
599 void
600 gst_pad_set_event_mask_function (GstPad * pad,
601     GstPadEventMaskFunction mask_func)
602 {
603   g_return_if_fail (GST_IS_REAL_PAD (pad));
604
605   GST_RPAD_EVENTMASKFUNC (pad) = mask_func;
606
607   GST_CAT_DEBUG (GST_CAT_PADS, "eventmaskfunc for %s:%s  set to %s",
608       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (mask_func));
609 }
610
611 /**
612  * gst_pad_get_event_masks:
613  * @pad: a #GstPad.
614  *
615  * Gets the array of eventmasks from the given pad.
616  *
617  * Returns: a zero-terminated array of #GstEventMask, or NULL if the pad does
618  * not have an event mask function.
619  */
620 const GstEventMask *
621 gst_pad_get_event_masks (GstPad * pad)
622 {
623   GstRealPad *rpad;
624
625   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
626
627   rpad = GST_PAD_REALIZE (pad);
628
629   g_return_val_if_fail (rpad, FALSE);
630
631   if (GST_RPAD_EVENTMASKFUNC (rpad))
632     return GST_RPAD_EVENTMASKFUNC (rpad) (GST_PAD (pad));
633
634   return NULL;
635 }
636
637 static gboolean
638 gst_pad_get_event_masks_dispatcher (GstPad * pad, const GstEventMask ** data)
639 {
640   *data = gst_pad_get_event_masks (pad);
641
642   return TRUE;
643 }
644
645 /**
646  * gst_pad_get_event_masks_default:
647  * @pad: a #GstPad.
648  *
649  * Invokes the default event masks dispatcher on the pad.
650  *
651  * Returns: a zero-terminated array of #GstEventMask, or NULL if none of the
652  * internally-linked pads have an event mask function.
653  */
654 const GstEventMask *
655 gst_pad_get_event_masks_default (GstPad * pad)
656 {
657   GstEventMask *result = NULL;
658
659   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
660
661   gst_pad_dispatcher (pad, (GstPadDispatcherFunction)
662       gst_pad_get_event_masks_dispatcher, &result);
663
664   return result;
665 }
666
667 /**
668  * gst_pad_set_convert_function:
669  * @pad: a real #GstPad of either direction.
670  * @convert: the #GstPadConvertFunction to set.
671  *
672  * Sets the given convert function for the pad.
673  */
674 void
675 gst_pad_set_convert_function (GstPad * pad, GstPadConvertFunction convert)
676 {
677   g_return_if_fail (GST_IS_REAL_PAD (pad));
678
679   GST_RPAD_CONVERTFUNC (pad) = convert;
680
681   GST_CAT_DEBUG (GST_CAT_PADS, "convertfunc for %s:%s  set to %s",
682       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (convert));
683 }
684
685 /**
686  * gst_pad_set_query_function:
687  * @pad: a real #GstPad of either direction.
688  * @query: the #GstPadQueryFunction to set.
689  *
690  * Set the given query function for the pad.
691  */
692 void
693 gst_pad_set_query_function (GstPad * pad, GstPadQueryFunction query)
694 {
695   g_return_if_fail (GST_IS_REAL_PAD (pad));
696
697   GST_RPAD_QUERYFUNC (pad) = query;
698
699   GST_CAT_DEBUG (GST_CAT_PADS, "queryfunc for %s:%s  set to %s",
700       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (query));
701 }
702
703 /**
704  * gst_pad_set_query_type_function:
705  * @pad: a real #GstPad of either direction.
706  * @type_func: the #GstPadQueryTypeFunction to set.
707  *
708  * Set the given query type function for the pad.
709  */
710 void
711 gst_pad_set_query_type_function (GstPad * pad,
712     GstPadQueryTypeFunction type_func)
713 {
714   g_return_if_fail (GST_IS_REAL_PAD (pad));
715
716   GST_RPAD_QUERYTYPEFUNC (pad) = type_func;
717
718   GST_CAT_DEBUG (GST_CAT_PADS, "querytypefunc for %s:%s  set to %s",
719       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (type_func));
720 }
721
722 /**
723  * gst_pad_get_query_types:
724  * @pad: a #GstPad.
725  *
726  * Get an array of supported queries that can be performed
727  * on this pad.
728  *
729  * Returns: a zero-terminated array of #GstQueryType.
730  */
731 const GstQueryType *
732 gst_pad_get_query_types (GstPad * pad)
733 {
734   GstRealPad *rpad;
735
736   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
737
738   rpad = GST_PAD_REALIZE (pad);
739
740   g_return_val_if_fail (rpad, NULL);
741
742   if (GST_RPAD_QUERYTYPEFUNC (rpad))
743     return GST_RPAD_QUERYTYPEFUNC (rpad) (GST_PAD (pad));
744
745   return NULL;
746 }
747
748 static gboolean
749 gst_pad_get_query_types_dispatcher (GstPad * pad, const GstQueryType ** data)
750 {
751   *data = gst_pad_get_query_types (pad);
752
753   return TRUE;
754 }
755
756 /**
757  * gst_pad_get_query_types_default:
758  * @pad: a #GstPad.
759  *
760  * Invoke the default dispatcher for the query types on
761  * the pad.
762  *
763  * Returns: an zero-terminated array of #GstQueryType, or NULL if none of the
764  * internally-linked pads has a query types function.
765  */
766 const GstQueryType *
767 gst_pad_get_query_types_default (GstPad * pad)
768 {
769   GstQueryType *result = NULL;
770
771   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
772
773   gst_pad_dispatcher (pad, (GstPadDispatcherFunction)
774       gst_pad_get_query_types_dispatcher, &result);
775
776   return result;
777 }
778
779 /**
780  * gst_pad_set_internal_link_function:
781  * @pad: a real #GstPad of either direction.
782  * @intlink: the #GstPadIntLinkFunction to set.
783  *
784  * Sets the given internal link function for the pad.
785  */
786 void
787 gst_pad_set_internal_link_function (GstPad * pad, GstPadIntLinkFunction intlink)
788 {
789   g_return_if_fail (GST_IS_REAL_PAD (pad));
790
791   GST_RPAD_INTLINKFUNC (pad) = intlink;
792   GST_CAT_DEBUG (GST_CAT_PADS, "internal link for %s:%s  set to %s",
793       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (intlink));
794 }
795
796 /**
797  * gst_pad_set_formats_function:
798  * @pad: a real #GstPad of either direction.
799  * @formats: the #GstPadFormatsFunction to set.
800  *
801  * Sets the given formats function for the pad.
802  */
803 void
804 gst_pad_set_formats_function (GstPad * pad, GstPadFormatsFunction formats)
805 {
806   g_return_if_fail (GST_IS_REAL_PAD (pad));
807
808   GST_RPAD_FORMATSFUNC (pad) = formats;
809   GST_CAT_DEBUG (GST_CAT_PADS, "formats function for %s:%s  set to %s",
810       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (formats));
811 }
812
813 /**
814  * gst_pad_set_link_function:
815  * @pad: a real #GstPad.
816  * @link: the #GstPadLinkFunction to set.
817  * 
818  * Sets the given link function for the pad. It will be called when the pad is
819  * linked or relinked with caps. The caps passed to the link function are
820  * guaranteed to be fixed. This means that you can assume that the caps is not
821  * ANY or EMPTY, and that there is exactly one structure in the caps, and that
822  * all the fields in the structure are fixed.
823  * 
824  * The return value GST_PAD_LINK_OK should be used when the caps are acceptable,
825  * and you've extracted all the necessary information from the caps and set the
826  * element's internal state appropriately.
827  * 
828  * The return value GST_PAD_LINK_REFUSED should be used when the caps are
829  * unacceptable for whatever reason.
830  * 
831  * The return value GST_PAD_LINK_DELAYED should be used when the element is in a
832  * state where it can't determine whether the caps are acceptable or not. This
833  * is often used if the element needs to open a device or process data before
834  * determining acceptable caps.
835  * 
836  * @link must not call gst_caps_try_set_caps() on the pad that was specified as
837  * a parameter, although it may (and often should) call gst_caps_try_set_caps()
838  * on other pads.
839  */
840 void
841 gst_pad_set_link_function (GstPad * pad, GstPadLinkFunction link)
842 {
843   g_return_if_fail (GST_IS_REAL_PAD (pad));
844
845   GST_RPAD_LINKFUNC (pad) = link;
846   GST_CAT_DEBUG (GST_CAT_PADS, "linkfunc for %s:%s set to %s",
847       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (link));
848 }
849
850 /**
851  * gst_pad_set_unlink_function:
852  * @pad: a real #GstPad.
853  * @unlink: the #GstPadUnlinkFunction to set.
854  *
855  * Sets the given unlink function for the pad. It will be called
856  * when the pad is unlinked.
857  */
858 void
859 gst_pad_set_unlink_function (GstPad * pad, GstPadUnlinkFunction unlink)
860 {
861   g_return_if_fail (GST_IS_REAL_PAD (pad));
862
863   GST_RPAD_UNLINKFUNC (pad) = unlink;
864   GST_CAT_DEBUG (GST_CAT_PADS, "unlinkfunc for %s:%s set to %s",
865       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (unlink));
866 }
867
868 /**
869  * gst_pad_set_fixate_function:
870  * @pad: a real #GstPad.
871  * @fixate: the #GstPadFixateFunction to set.
872  *
873  * Sets the given fixate function for the pad. Its job is to narrow down the
874  * possible caps for a connection. Fixate functions are called with a const
875  * caps, and should return a caps that is a strict subset of the given caps.
876  * That is, @fixate should create a caps that is "more fixed" than previously,
877  * but it does not have to return fixed caps. If @fixate can't provide more
878  * fixed caps, it should return %NULL.
879  * 
880  * Note that @fixate will only be called after the "fixate" signal is emitted,
881  * and only if the caps are still non-fixed.
882  */
883 void
884 gst_pad_set_fixate_function (GstPad * pad, GstPadFixateFunction fixate)
885 {
886   g_return_if_fail (GST_IS_REAL_PAD (pad));
887
888   GST_RPAD_FIXATEFUNC (pad) = fixate;
889   GST_CAT_DEBUG (GST_CAT_PADS, "fixatefunc for %s:%s set to %s",
890       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (fixate));
891 }
892
893 /**
894  * gst_pad_set_getcaps_function:
895  * @pad: a real #GstPad.
896  * @getcaps: the #GstPadGetCapsFunction to set.
897  * 
898  * Sets the given getcaps function for the pad. @getcaps should return the
899  * allowable caps for a pad in the context of the element's state, its link to
900  * other elements, and the devices or files it has opened. These caps must be a
901  * subset of the pad template caps. In the NULL state with no links, @getcaps
902  * should ideally return the same caps as the pad template. In rare
903  * circumstances, an object property can affect the caps returned by @getcaps,
904  * but this is discouraged.
905  *
906  * You do not need to call this function if @pad's allowed caps are always the
907  * same as the pad template caps.
908  *
909  * For most filters, the caps returned by @getcaps is directly affected by the
910  * allowed caps on other pads. For demuxers and decoders, the caps returned by
911  * the srcpad's getcaps function is directly related to the stream data. Again,
912  * @getcaps should return the most specific caps it reasonably can, since this
913  * helps with autoplugging. However, the returned caps should not depend on the
914  * stream type currently negotiated for @pad.
915  *
916  * Note that the return value from @getcaps is owned by the caller.
917  */
918 void
919 gst_pad_set_getcaps_function (GstPad * pad, GstPadGetCapsFunction getcaps)
920 {
921   g_return_if_fail (GST_IS_REAL_PAD (pad));
922
923   GST_RPAD_GETCAPSFUNC (pad) = getcaps;
924   GST_CAT_DEBUG (GST_CAT_PADS, "getcapsfunc for %s:%s set to %s",
925       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (getcaps));
926 }
927
928 /**
929  * gst_pad_set_bufferalloc_function:
930  * @pad: a real sink #GstPad.
931  * @bufalloc: the #GstPadBufferAllocFunction to set.
932  *
933  * Sets the given bufferalloc function for the pad. Note that the
934  * bufferalloc function can only be set on sinkpads.
935  */
936 void
937 gst_pad_set_bufferalloc_function (GstPad * pad,
938     GstPadBufferAllocFunction bufalloc)
939 {
940   g_return_if_fail (GST_IS_REAL_PAD (pad));
941   g_return_if_fail (GST_PAD_IS_SINK (pad));
942
943   GST_RPAD_BUFFERALLOCFUNC (pad) = bufalloc;
944   GST_CAT_DEBUG (GST_CAT_PADS, "bufferallocfunc for %s:%s set to %s",
945       GST_DEBUG_PAD_NAME (pad), GST_DEBUG_FUNCPTR_NAME (bufalloc));
946 }
947
948 /* FIXME 0.9: Do we actually want to allow the case where src and sink are
949    switched? */
950 /**
951  * gst_pad_unlink:
952  * @srcpad: the source #GstPad to unlink.
953  * @sinkpad: the sink #GstPad to unlink.
954  *
955  * Unlinks the source pad from the sink pad. Will emit the "unlinked" signal on
956  * both pads.
957  */
958 void
959 gst_pad_unlink (GstPad * srcpad, GstPad * sinkpad)
960 {
961   GstRealPad *realsrc, *realsink;
962   GstScheduler *src_sched, *sink_sched;
963
964   g_return_if_fail (GST_IS_PAD (srcpad));
965   g_return_if_fail (GST_IS_PAD (sinkpad));
966
967   GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinking %s:%s(%p) and %s:%s(%p)",
968       GST_DEBUG_PAD_NAME (srcpad), srcpad,
969       GST_DEBUG_PAD_NAME (sinkpad), sinkpad);
970
971   realsrc = GST_PAD_REALIZE (srcpad);
972   realsink = GST_PAD_REALIZE (sinkpad);
973
974   g_return_if_fail (GST_RPAD_PEER (realsrc) != NULL);
975   g_return_if_fail (GST_RPAD_PEER (realsink) == realsrc);
976
977   if ((GST_RPAD_DIRECTION (realsrc) == GST_PAD_SINK) &&
978       (GST_RPAD_DIRECTION (realsink) == GST_PAD_SRC)) {
979     GstRealPad *temppad;
980
981     temppad = realsrc;
982     realsrc = realsink;
983     realsink = temppad;
984   }
985   g_return_if_fail ((GST_RPAD_DIRECTION (realsrc) == GST_PAD_SRC) &&
986       (GST_RPAD_DIRECTION (realsink) == GST_PAD_SINK));
987
988   if (GST_RPAD_UNLINKFUNC (realsrc)) {
989     GST_RPAD_UNLINKFUNC (realsrc) (GST_PAD (realsrc));
990   }
991   if (GST_RPAD_UNLINKFUNC (realsink)) {
992     GST_RPAD_UNLINKFUNC (realsink) (GST_PAD (realsink));
993   }
994
995   /* get the schedulers before we unlink */
996   src_sched = gst_pad_get_scheduler (GST_PAD (realsrc));
997   sink_sched = gst_pad_get_scheduler (GST_PAD (realsink));
998
999   if (GST_RPAD_LINK (realsrc))
1000     gst_pad_link_free (GST_RPAD_LINK (realsrc));
1001
1002   /* first clear peers */
1003   GST_RPAD_PEER (realsrc) = NULL;
1004   GST_RPAD_PEER (realsink) = NULL;
1005   GST_RPAD_LINK (realsrc) = NULL;
1006   GST_RPAD_LINK (realsink) = NULL;
1007
1008   /* now tell the scheduler */
1009   if (src_sched && src_sched == sink_sched) {
1010     gst_scheduler_pad_unlink (src_sched, GST_PAD (realsrc), GST_PAD (realsink));
1011   }
1012
1013   /* hold a reference, as they can go away in the signal handlers */
1014   gst_object_ref (GST_OBJECT (realsrc));
1015   gst_object_ref (GST_OBJECT (realsink));
1016
1017   /* fire off a signal to each of the pads telling them 
1018    * that they've been unlinked */
1019   g_signal_emit (G_OBJECT (realsrc), gst_real_pad_signals[REAL_UNLINKED],
1020       0, realsink);
1021   g_signal_emit (G_OBJECT (realsink), gst_real_pad_signals[REAL_UNLINKED],
1022       0, realsrc);
1023
1024   GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinked %s:%s and %s:%s",
1025       GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
1026
1027   gst_object_unref (GST_OBJECT (realsrc));
1028   gst_object_unref (GST_OBJECT (realsink));
1029 }
1030
1031 /**
1032  * gst_pad_is_linked:
1033  * @pad: pad to check
1034  *
1035  * Checks if a @pad is linked to another pad or not.
1036  *
1037  * Returns: TRUE if the pad is linked, FALSE otherwise.
1038  */
1039 gboolean
1040 gst_pad_is_linked (GstPad * pad)
1041 {
1042   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
1043
1044   return GST_PAD_PEER (pad) != NULL;
1045 }
1046
1047 static gboolean
1048 gst_pad_check_schedulers (GstRealPad * realsrc, GstRealPad * realsink)
1049 {
1050   GstScheduler *src_sched, *sink_sched;
1051   gint num_decoupled = 0;
1052
1053   src_sched = gst_pad_get_scheduler (GST_PAD (realsrc));
1054   sink_sched = gst_pad_get_scheduler (GST_PAD (realsink));
1055
1056   if (src_sched && sink_sched) {
1057     if (GST_FLAG_IS_SET (GST_PAD_PARENT (realsrc), GST_ELEMENT_DECOUPLED))
1058       num_decoupled++;
1059     if (GST_FLAG_IS_SET (GST_PAD_PARENT (realsink), GST_ELEMENT_DECOUPLED))
1060       num_decoupled++;
1061
1062     if (src_sched != sink_sched && num_decoupled != 1) {
1063       return FALSE;
1064     }
1065   }
1066   return TRUE;
1067 }
1068
1069 #define GST_PAD_LINK_SRC(pad) ((GST_PAD_IS_SRC (pad)) ? (pad) : GST_PAD_PEER (pad))
1070 #define GST_PAD_LINK_SINK(pad) ((GST_PAD_IS_SINK (pad)) ? (pad) : GST_PAD_PEER (pad))
1071
1072 static GstPadLink *
1073 gst_pad_link_new (void)
1074 {
1075   GstPadLink *link;
1076
1077   link = g_new0 (GstPadLink, 1);
1078   link->sinknotify = TRUE;
1079   link->srcnotify = TRUE;
1080
1081   link->engaged = FALSE;
1082   return link;
1083 }
1084
1085 static void
1086 gst_pad_link_free (GstPadLink * link)
1087 {
1088   if (link->srccaps)
1089     gst_caps_free (link->srccaps);
1090   if (link->sinkcaps)
1091     gst_caps_free (link->sinkcaps);
1092   if (link->filtercaps)
1093     gst_caps_free (link->filtercaps);
1094   if (link->caps)
1095     gst_caps_free (link->caps);
1096   if (link->temp_store)
1097     gst_data_unref (link->temp_store);
1098 #ifdef USE_POISONING
1099   memset (link, 0xff, sizeof (*link));
1100 #endif
1101   g_free (link);
1102 }
1103
1104 static void
1105 gst_pad_link_intersect (GstPadLink * link)
1106 {
1107   GstCaps *pad_intersection;
1108
1109   if (link->caps)
1110     gst_caps_free (link->caps);
1111
1112   GST_DEBUG ("intersecting link from %s:%s to %s:%s",
1113       GST_DEBUG_PAD_NAME (link->srcpad), GST_DEBUG_PAD_NAME (link->sinkpad));
1114   GST_DEBUG ("... srccaps %" GST_PTR_FORMAT, link->srccaps);
1115   GST_DEBUG ("... sinkcaps %" GST_PTR_FORMAT, link->sinkcaps);
1116   GST_DEBUG ("... filtercaps %" GST_PTR_FORMAT, link->filtercaps);
1117
1118   pad_intersection = gst_caps_intersect (link->srccaps, link->sinkcaps);
1119
1120   if (link->filtercaps) {
1121     GST_DEBUG ("unfiltered intersection %" GST_PTR_FORMAT, pad_intersection);
1122     link->caps = gst_caps_intersect (pad_intersection, link->filtercaps);
1123     gst_caps_free (pad_intersection);
1124   } else {
1125     link->caps = pad_intersection;
1126   }
1127
1128   GST_DEBUG ("intersection %" GST_PTR_FORMAT, link->caps);
1129 }
1130
1131 static gboolean
1132 gst_pad_link_ready_for_negotiation (GstPadLink * link)
1133 {
1134   GstElement *parent;
1135
1136   parent = GST_PAD_PARENT (link->srcpad);
1137   if (!parent || GST_STATE (parent) < GST_STATE_READY) {
1138     GST_DEBUG ("parent %s of pad %s:%s is not READY",
1139         GST_ELEMENT_NAME (parent), GST_DEBUG_PAD_NAME (link->srcpad));
1140     return FALSE;
1141   }
1142   parent = GST_PAD_PARENT (link->sinkpad);
1143   if (!parent || GST_STATE (parent) < GST_STATE_READY) {
1144     GST_DEBUG ("parent %s of pad %s:%s is not READY",
1145         GST_ELEMENT_NAME (parent), GST_DEBUG_PAD_NAME (link->sinkpad));
1146     return FALSE;
1147   }
1148
1149   return TRUE;
1150 }
1151
1152 static void
1153 gst_pad_link_fixate (GstPadLink * link)
1154 {
1155   GstCaps *caps;
1156   GstCaps *newcaps;
1157
1158   caps = link->caps;
1159
1160   g_return_if_fail (caps != NULL);
1161   g_return_if_fail (!gst_caps_is_empty (caps));
1162
1163   GST_DEBUG ("trying to fixate caps %" GST_PTR_FORMAT, caps);
1164
1165   gst_caps_do_simplify (caps);
1166   while (!gst_caps_is_fixed (caps)) {
1167     int i;
1168
1169     for (i = 0; i < 5; i++) {
1170       newcaps = NULL;
1171       switch (i) {
1172         case 0:
1173           g_signal_emit (G_OBJECT (link->srcpad),
1174               gst_real_pad_signals[REAL_FIXATE], 0, caps, &newcaps);
1175           GST_DEBUG ("app srcpad signal fixated to %" GST_PTR_FORMAT, newcaps);
1176           break;
1177         case 1:
1178           g_signal_emit (G_OBJECT (link->sinkpad),
1179               gst_real_pad_signals[REAL_FIXATE], 0, caps, &newcaps);
1180           GST_DEBUG ("app sinkpad signal fixated to %" GST_PTR_FORMAT, newcaps);
1181           break;
1182         case 2:
1183           if (GST_RPAD_FIXATEFUNC (link->srcpad)) {
1184             newcaps =
1185                 GST_RPAD_FIXATEFUNC (link->srcpad) (GST_PAD (link->srcpad),
1186                 caps);
1187             GST_DEBUG ("srcpad %s:%s fixated to %" GST_PTR_FORMAT,
1188                 GST_DEBUG_PAD_NAME (link->srcpad), newcaps);
1189           } else
1190             GST_DEBUG ("srcpad %s:%s doesn't have a fixate function",
1191                 GST_DEBUG_PAD_NAME (link->srcpad));
1192
1193           break;
1194         case 3:
1195           if (GST_RPAD_FIXATEFUNC (link->sinkpad)) {
1196             newcaps =
1197                 GST_RPAD_FIXATEFUNC (link->sinkpad) (GST_PAD (link->sinkpad),
1198                 caps);
1199             GST_DEBUG ("sinkpad %s:%s fixated to %" GST_PTR_FORMAT,
1200                 GST_DEBUG_PAD_NAME (link->sinkpad), newcaps);
1201           } else
1202             GST_DEBUG ("sinkpad %s:%s doesn't have a fixate function",
1203                 GST_DEBUG_PAD_NAME (link->sinkpad));
1204           break;
1205         case 4:
1206           newcaps = _gst_pad_default_fixate_func (GST_PAD (link->srcpad), caps);
1207           GST_DEBUG ("core fixated to %" GST_PTR_FORMAT, newcaps);
1208           break;
1209       }
1210       if (newcaps) {
1211         G_GNUC_UNUSED gboolean bad;
1212
1213         gst_caps_do_simplify (newcaps);
1214 #ifndef G_DISABLE_CHECKS
1215         /* some mad checking for correctly working fixation functions */
1216
1217         if (i == 4) {
1218           /* we trust the default fixation function unconditionally */
1219           bad = FALSE;
1220         } else if (gst_caps_is_any (caps)) {
1221           bad = gst_caps_is_any (newcaps);
1222         } else {
1223           GstCaps *test = gst_caps_subtract (caps, newcaps);
1224
1225           bad = gst_caps_is_empty (test);
1226           gst_caps_free (test);
1227           /* simplifying is ok, too */
1228           if (bad)
1229             bad = (gst_caps_get_size (newcaps) >= gst_caps_get_size (caps));
1230         }
1231         if (bad) {
1232           gchar *newcaps_str = gst_caps_to_string (newcaps);
1233           gchar *caps_str = gst_caps_to_string (caps);
1234
1235           g_warning
1236               ("a fixation function did not fixate correctly, the returned caps %s are no true subset of %s.",
1237               newcaps_str, caps_str);
1238           g_free (newcaps_str);
1239           g_free (caps_str);
1240           gst_caps_free (newcaps);
1241         } else
1242 #endif
1243         {
1244           gst_caps_free (caps);
1245           caps = newcaps;
1246           break;
1247         }
1248       }
1249     }
1250   }
1251
1252   link->caps = caps;
1253 }
1254
1255 static GstPadLinkReturn
1256 gst_pad_link_call_link_functions (GstPadLink * link)
1257 {
1258   gboolean negotiating;
1259   GstPadLinkReturn res;
1260
1261   if (link->srcnotify && GST_RPAD_LINKFUNC (link->srcpad)) {
1262     GST_DEBUG ("calling link function on pad %s:%s",
1263         GST_DEBUG_PAD_NAME (link->srcpad));
1264
1265     negotiating = GST_FLAG_IS_SET (link->srcpad, GST_PAD_NEGOTIATING);
1266
1267     /* set the NEGOTIATING flag if not already done */
1268     if (!negotiating)
1269       GST_FLAG_SET (link->srcpad, GST_PAD_NEGOTIATING);
1270
1271     /* call the link function */
1272     res = GST_RPAD_LINKFUNC (link->srcpad) (GST_PAD (link->srcpad), link->caps);
1273
1274     /* unset again after negotiating only if we set it  */
1275     if (!negotiating)
1276       GST_FLAG_UNSET (link->srcpad, GST_PAD_NEGOTIATING);
1277
1278     GST_DEBUG ("got reply %d from link function on pad %s:%s",
1279         res, GST_DEBUG_PAD_NAME (link->srcpad));
1280
1281     if (GST_PAD_LINK_FAILED (res)) {
1282       GST_CAT_INFO (GST_CAT_CAPS,
1283           "pad %s:%s doesn't accept caps %" GST_PTR_FORMAT,
1284           GST_DEBUG_PAD_NAME (link->srcpad), link->caps);
1285       return res;
1286     }
1287   }
1288
1289   if (link->sinknotify && GST_RPAD_LINKFUNC (link->sinkpad)) {
1290     GST_DEBUG ("calling link function on pad %s:%s",
1291         GST_DEBUG_PAD_NAME (link->sinkpad));
1292
1293     negotiating = GST_FLAG_IS_SET (link->sinkpad, GST_PAD_NEGOTIATING);
1294
1295     /* set the NEGOTIATING flag if not already done */
1296     if (!negotiating)
1297       GST_FLAG_SET (link->sinkpad, GST_PAD_NEGOTIATING);
1298
1299     /* call the link function */
1300     res = GST_RPAD_LINKFUNC (link->sinkpad) (GST_PAD (link->sinkpad),
1301         link->caps);
1302
1303     /* unset again after negotiating only if we set it  */
1304     if (!negotiating)
1305       GST_FLAG_UNSET (link->sinkpad, GST_PAD_NEGOTIATING);
1306
1307     GST_DEBUG ("got reply %d from link function on pad %s:%s",
1308         res, GST_DEBUG_PAD_NAME (link->sinkpad));
1309
1310     if (GST_PAD_LINK_FAILED (res)) {
1311       GST_CAT_INFO (GST_CAT_CAPS,
1312           "pad %s:%s doesn't accept caps %" GST_PTR_FORMAT,
1313           GST_DEBUG_PAD_NAME (link->sinkpad), link->caps);
1314       return res;
1315     }
1316   }
1317
1318   return GST_PAD_LINK_OK;
1319 }
1320
1321 static GstPadLinkReturn
1322 gst_pad_link_negotiate (GstPadLink * link)
1323 {
1324   GST_DEBUG ("negotiating link from pad %s:%s to pad %s:%s",
1325       GST_DEBUG_PAD_NAME (link->srcpad), GST_DEBUG_PAD_NAME (link->sinkpad));
1326
1327   gst_pad_link_intersect (link);
1328   if (gst_caps_is_empty (link->caps))
1329     return GST_PAD_LINK_REFUSED;
1330
1331   gst_pad_link_fixate (link);
1332   if (gst_caps_is_empty (link->caps))
1333     return GST_PAD_LINK_REFUSED;
1334
1335   if (!gst_pad_link_ready_for_negotiation (link)) {
1336     return GST_PAD_LINK_DELAYED;
1337   }
1338   GST_DEBUG ("trying to call link function on caps %" GST_PTR_FORMAT,
1339       link->caps);
1340
1341   return gst_pad_link_call_link_functions (link);
1342 }
1343
1344 /**
1345  * gst_pad_link_try:
1346  * @link: link to try
1347  *
1348  * Tries to (re)link the pads with the given link. The function takes ownership
1349  * of the supplied link. If the function returns FALSE and an old link existed,
1350  * that link can be assumed to work unchanged.
1351  *
1352  * Returns: TRUE if the link succeeded, FALSE if not.
1353  */
1354 static gboolean
1355 gst_pad_link_try (GstPadLink * link)
1356 {
1357   GstPad *srcpad, *sinkpad;
1358   GstPadLink *oldlink;
1359   GstPadLinkReturn ret;
1360
1361   /* we use assertions here, because this function is static */
1362   g_assert (link);
1363   srcpad = link->srcpad;
1364   g_assert (srcpad);
1365   sinkpad = link->sinkpad;
1366   g_assert (sinkpad);
1367   oldlink = GST_RPAD_LINK (srcpad);
1368   g_assert (oldlink == GST_RPAD_LINK (sinkpad));
1369
1370   GST_DEBUG ("negotiating given link");
1371   ret = gst_pad_link_negotiate (link);
1372   if (GST_PAD_LINK_FAILED (ret) && oldlink && oldlink->caps) {
1373     GST_DEBUG ("negotiating failed, but there was a valid old link");
1374     oldlink->srcnotify = link->srcnotify;
1375     oldlink->sinknotify = link->sinknotify;
1376     if (GST_PAD_LINK_FAILED (gst_pad_link_call_link_functions (oldlink))) {
1377       g_warning ("pads don't accept old caps. We assume they did though");
1378     }
1379   }
1380   if (ret == GST_PAD_LINK_REFUSED) {
1381     GST_DEBUG ("link refused, returning");
1382     gst_pad_link_free (link);
1383     return ret;
1384   }
1385   if (ret == GST_PAD_LINK_DELAYED) {
1386     GST_DEBUG ("link delayed, replacing link caps and returning");
1387     gst_caps_replace (&link->caps, NULL);
1388   }
1389
1390   GST_RPAD_PEER (srcpad) = GST_REAL_PAD (link->sinkpad);
1391   GST_RPAD_PEER (sinkpad) = GST_REAL_PAD (link->srcpad);
1392   if (oldlink) {
1393     GST_DEBUG ("copying stuff from oldlink");
1394     link->temp_store = oldlink->temp_store;
1395     link->engaged = oldlink->engaged;
1396     oldlink->temp_store = NULL;
1397     gst_pad_link_free (oldlink);
1398   }
1399   GST_RPAD_LINK (srcpad) = link;
1400   GST_RPAD_LINK (sinkpad) = link;
1401   if (ret == GST_PAD_LINK_OK) {
1402     GST_DEBUG ("notifying caps after successful link");
1403     g_object_notify (G_OBJECT (srcpad), "caps");
1404     g_object_notify (G_OBJECT (sinkpad), "caps");
1405   }
1406
1407   return ret;
1408 }
1409
1410 /**
1411  * gst_pad_renegotiate:
1412  * @pad: a #GstPad
1413  *
1414  * Initiate caps negotiation on @pad. @pad must be linked.
1415  *
1416  * If @pad's parent is not at least in #GST_STATE_READY, returns
1417  * #GST_PAD_LINK_DELAYED.
1418  *
1419  * Otherwise caps are retrieved from both @pad and its peer by calling their
1420  * getcaps functions. They are then intersected, returning #GST_PAD_LINK_FAIL if
1421  * there is no intersection.
1422  *
1423  * The intersection is fixated if necessary, and then the link functions of @pad
1424  * and its peer are called.
1425  *
1426  * Returns: The return value of @pad's link function (see
1427  * gst_pad_set_link_function()), or #GST_PAD_LINK_OK if there is no link
1428  * function.
1429  *
1430  * The macros GST_PAD_LINK_SUCCESSFUL() and GST_PAD_LINK_FAILED() should be used
1431  * when you just need success/failure information.
1432  */
1433 GstPadLinkReturn
1434 gst_pad_renegotiate (GstPad * pad)
1435 {
1436   GstPadLink *link;
1437
1438   g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_LINK_REFUSED);
1439   g_return_val_if_fail (GST_PAD_LINK_SRC (pad), GST_PAD_LINK_REFUSED);
1440   g_return_val_if_fail (GST_PAD_LINK_SINK (pad), GST_PAD_LINK_REFUSED);
1441
1442   link = gst_pad_link_new ();
1443
1444   link->srcpad = GST_PAD_LINK_SRC (pad);
1445   link->sinkpad = GST_PAD_LINK_SINK (pad);
1446
1447   if (!gst_pad_link_ready_for_negotiation (link)) {
1448     gst_pad_link_free (link);
1449     return GST_PAD_LINK_DELAYED;
1450   }
1451
1452   if (GST_REAL_PAD (pad)->link->filtercaps) {
1453     link->filtercaps = gst_caps_copy (GST_REAL_PAD (pad)->link->filtercaps);
1454   }
1455   link->srccaps = gst_pad_get_caps (link->srcpad);
1456   link->sinkcaps = gst_pad_get_caps (link->sinkpad);
1457
1458   return gst_pad_link_try (link);
1459 }
1460
1461 /**
1462  * gst_pad_try_set_caps:
1463  * @pad: a #GstPad
1464  * @caps: #GstCaps to set on @pad
1465  *
1466  * Try to set the caps on @pad. @caps must be fixed. If @pad is unlinked,
1467  * returns #GST_PAD_LINK_OK without doing anything. Otherwise, start caps
1468  * negotiation on @pad.
1469  *
1470  * Returns: The return value of @pad's link function (see
1471  * gst_pad_set_link_function()), or #GST_PAD_LINK_OK if there is no link
1472  * function.
1473  *
1474  * The macros GST_PAD_LINK_SUCCESSFUL() and GST_PAD_LINK_FAILED() should be used
1475  * when you just need success/failure information.
1476  */
1477 GstPadLinkReturn
1478 gst_pad_try_set_caps (GstPad * pad, const GstCaps * caps)
1479 {
1480   GstPadLink *link;
1481   GstPadLink *oldlink;
1482   GstPadLinkReturn ret;
1483
1484   g_return_val_if_fail (GST_IS_REAL_PAD (pad), GST_PAD_LINK_REFUSED);
1485   g_return_val_if_fail (!GST_PAD_IS_NEGOTIATING (pad), GST_PAD_LINK_REFUSED);
1486
1487   /* setting non-fixed caps on a pad is not allowed */
1488   if (!gst_caps_is_fixed (caps)) {
1489     GST_CAT_INFO (GST_CAT_CAPS,
1490         "trying to set unfixed caps on pad %s:%s, not allowed",
1491         GST_DEBUG_PAD_NAME (pad));
1492     g_warning ("trying to set non fixed caps on pad %s:%s, not allowed",
1493         GST_DEBUG_PAD_NAME (pad));
1494
1495     GST_DEBUG ("unfixed caps %" GST_PTR_FORMAT, caps);
1496     return GST_PAD_LINK_REFUSED;
1497   }
1498
1499   /* we allow setting caps on non-linked pads.  It's ignored */
1500   if (!GST_PAD_PEER (pad)) {
1501     GST_DEBUG ("unlinked pad %s:%s, returning OK", GST_DEBUG_PAD_NAME (pad));
1502     return GST_PAD_LINK_OK;
1503   }
1504
1505   g_return_val_if_fail (GST_PAD_LINK_SRC (pad), GST_PAD_LINK_REFUSED);
1506   g_return_val_if_fail (GST_PAD_LINK_SINK (pad), GST_PAD_LINK_REFUSED);
1507
1508   /* if the desired caps are already there, it's trivially ok */
1509   if (GST_PAD_CAPS (pad) && gst_caps_is_equal (caps, GST_PAD_CAPS (pad))) {
1510     GST_DEBUG ("pad %s:%s already has these caps", GST_DEBUG_PAD_NAME (pad));
1511     return GST_PAD_LINK_OK;
1512   }
1513
1514   link = gst_pad_link_new ();
1515
1516   link->srcpad = GST_PAD_LINK_SRC (pad);
1517   link->sinkpad = GST_PAD_LINK_SINK (pad);
1518
1519   if (!gst_pad_link_ready_for_negotiation (link)) {
1520     GST_DEBUG ("link not ready for negotiating, delaying");
1521     gst_pad_link_free (link);
1522     return GST_PAD_LINK_DELAYED;
1523   }
1524
1525   oldlink = GST_REAL_PAD (pad)->link;
1526   if (oldlink && oldlink->filtercaps) {
1527     link->filtercaps = gst_caps_copy (oldlink->filtercaps);
1528   }
1529   if (link->srcpad == pad) {
1530     link->srccaps = gst_caps_copy (caps);
1531     link->sinkcaps = gst_pad_get_caps (link->sinkpad);
1532     link->srcnotify = FALSE;
1533   } else {
1534     link->srccaps = gst_pad_get_caps (link->srcpad);
1535     link->sinkcaps = gst_caps_copy (caps);
1536     link->sinknotify = FALSE;
1537   }
1538
1539   GST_DEBUG ("trying to link");
1540   ret = gst_pad_link_try (link);
1541
1542   return ret;
1543 }
1544
1545 /**
1546  * gst_pad_try_set_caps_nonfixed:
1547  * @pad: a real #GstPad
1548  * @caps: #GstCaps to set on @pad
1549  *
1550  * Like gst_pad_try_set_caps(), but allows non-fixed caps.
1551  *
1552  * Returns: a #GstPadLinkReturn, like gst_pad_try_set_caps().
1553  */
1554 GstPadLinkReturn
1555 gst_pad_try_set_caps_nonfixed (GstPad * pad, const GstCaps * caps)
1556 {
1557   GstPadLink *link;
1558   GstPadLink *oldlink;
1559   GstPadLinkReturn ret;
1560
1561   g_return_val_if_fail (GST_IS_REAL_PAD (pad), GST_PAD_LINK_REFUSED);
1562   g_return_val_if_fail (!GST_PAD_IS_NEGOTIATING (pad), GST_PAD_LINK_REFUSED);
1563
1564   /* we allow setting caps on non-linked pads.  It's ignored */
1565   if (!GST_PAD_PEER (pad)) {
1566     return GST_PAD_LINK_OK;
1567   }
1568
1569   g_return_val_if_fail (GST_PAD_LINK_SRC (pad), GST_PAD_LINK_REFUSED);
1570   g_return_val_if_fail (GST_PAD_LINK_SINK (pad), GST_PAD_LINK_REFUSED);
1571
1572   /* if the link is already negotiated and the caps are compatible
1573    * with what we're setting, it's trivially OK. */
1574   if (GST_PAD_CAPS (pad)) {
1575     GstCaps *intersection;
1576
1577     intersection = gst_caps_intersect (caps, GST_PAD_CAPS (pad));
1578     if (!gst_caps_is_empty (intersection)) {
1579       gst_caps_free (intersection);
1580       return GST_PAD_LINK_OK;
1581     }
1582     gst_caps_free (intersection);
1583   }
1584
1585   link = gst_pad_link_new ();
1586
1587   link->srcpad = GST_PAD_LINK_SRC (pad);
1588   link->sinkpad = GST_PAD_LINK_SINK (pad);
1589
1590   if (!gst_pad_link_ready_for_negotiation (link)) {
1591     gst_pad_link_free (link);
1592     return GST_PAD_LINK_DELAYED;
1593   }
1594
1595   oldlink = GST_REAL_PAD (pad)->link;
1596   if (oldlink && oldlink->filtercaps) {
1597     link->filtercaps = gst_caps_copy (oldlink->filtercaps);
1598   }
1599   if (link->srcpad == pad) {
1600     link->srccaps = gst_caps_copy (caps);
1601     link->sinkcaps = gst_pad_get_caps (link->sinkpad);
1602     link->srcnotify = FALSE;
1603   } else {
1604     link->srccaps = gst_pad_get_caps (link->srcpad);
1605     link->sinkcaps = gst_caps_copy (caps);
1606     link->sinknotify = FALSE;
1607   }
1608
1609   ret = gst_pad_link_try (link);
1610
1611   return ret;
1612 }
1613
1614 /**
1615  * gst_pad_can_link_filtered:
1616  * @srcpad: the source #GstPad to link.
1617  * @sinkpad: the sink #GstPad to link.
1618  * @filtercaps: the filter #GstCaps.
1619  *
1620  * Checks if the source pad and the sink pad can be linked when constrained
1621  * by the given filter caps. Both @srcpad and @sinkpad must be unlinked.
1622  *
1623  * Returns: TRUE if the pads can be linked, FALSE otherwise.
1624  */
1625 gboolean
1626 gst_pad_can_link_filtered (GstPad * srcpad, GstPad * sinkpad,
1627     const GstCaps * filtercaps)
1628 {
1629   GstRealPad *realsrc, *realsink;
1630   GstPadLink *link;
1631
1632   /* FIXME This function is gross.  It's almost a direct copy of
1633    * gst_pad_link_filtered().  Any decent programmer would attempt
1634    * to merge the two functions, which I will do some day. --ds
1635    */
1636
1637   /* generic checks */
1638   g_return_val_if_fail (srcpad != NULL, FALSE);
1639   g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
1640   g_return_val_if_fail (sinkpad != NULL, FALSE);
1641   g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
1642
1643   GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
1644       GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
1645
1646   /* now we need to deal with the real/ghost stuff */
1647   realsrc = GST_PAD_REALIZE (srcpad);
1648   realsink = GST_PAD_REALIZE (sinkpad);
1649
1650   if ((GST_PAD (realsrc) != srcpad) || (GST_PAD (realsink) != sinkpad)) {
1651     GST_CAT_INFO (GST_CAT_PADS, "*actually* linking %s:%s and %s:%s",
1652         GST_DEBUG_PAD_NAME (realsrc), GST_DEBUG_PAD_NAME (realsink));
1653   }
1654   /* FIXME: shouldn't we convert this to g_return_val_if_fail? */
1655   if (GST_RPAD_PEER (realsrc) != NULL) {
1656     GST_CAT_INFO (GST_CAT_PADS, "Real source pad %s:%s has a peer, failed",
1657         GST_DEBUG_PAD_NAME (realsrc));
1658     return FALSE;
1659   }
1660   if (GST_RPAD_PEER (realsink) != NULL) {
1661     GST_CAT_INFO (GST_CAT_PADS, "Real sink pad %s:%s has a peer, failed",
1662         GST_DEBUG_PAD_NAME (realsink));
1663     return FALSE;
1664   }
1665   if (GST_PAD_PARENT (realsrc) == NULL) {
1666     GST_CAT_INFO (GST_CAT_PADS, "Real src pad %s:%s has no parent, failed",
1667         GST_DEBUG_PAD_NAME (realsrc));
1668     return FALSE;
1669   }
1670   if (GST_PAD_PARENT (realsink) == NULL) {
1671     GST_CAT_INFO (GST_CAT_PADS, "Real sink pad %s:%s has no parent, failed",
1672         GST_DEBUG_PAD_NAME (realsrc));
1673     return FALSE;
1674   }
1675
1676   if (!gst_pad_check_schedulers (realsrc, realsink)) {
1677     g_warning ("linking pads with different scheds requires "
1678         "exactly one decoupled element (such as queue)");
1679     return FALSE;
1680   }
1681
1682   g_return_val_if_fail (realsrc != NULL, GST_PAD_LINK_REFUSED);
1683   g_return_val_if_fail (realsink != NULL, GST_PAD_LINK_REFUSED);
1684
1685   link = gst_pad_link_new ();
1686
1687   if (GST_RPAD_DIRECTION (realsrc) == GST_PAD_SRC) {
1688     link->srcpad = GST_PAD (realsrc);
1689     link->sinkpad = GST_PAD (realsink);
1690   } else {
1691     link->srcpad = GST_PAD (realsink);
1692     link->sinkpad = GST_PAD (realsrc);
1693   }
1694
1695   if (GST_RPAD_DIRECTION (link->srcpad) != GST_PAD_SRC) {
1696     GST_CAT_INFO (GST_CAT_PADS,
1697         "Real src pad %s:%s is not a source pad, failed",
1698         GST_DEBUG_PAD_NAME (link->srcpad));
1699     gst_pad_link_free (link);
1700     return FALSE;
1701   }
1702   if (GST_RPAD_DIRECTION (link->sinkpad) != GST_PAD_SINK) {
1703     GST_CAT_INFO (GST_CAT_PADS, "Real sink pad %s:%s is not a sink pad, failed",
1704         GST_DEBUG_PAD_NAME (link->sinkpad));
1705     gst_pad_link_free (link);
1706     return FALSE;
1707   }
1708
1709   link->srccaps = gst_pad_get_caps (link->srcpad);
1710   link->sinkcaps = gst_pad_get_caps (link->sinkpad);
1711   if (filtercaps)
1712     link->filtercaps = gst_caps_copy (filtercaps);
1713
1714   gst_pad_link_intersect (link);
1715   if (gst_caps_is_empty (link->caps)) {
1716     gst_pad_link_free (link);
1717     return FALSE;
1718   }
1719
1720   gst_pad_link_free (link);
1721   return TRUE;
1722 }
1723
1724 /**
1725  * gst_pad_can_link:
1726  * @srcpad: the source #GstPad to link.
1727  * @sinkpad: the sink #GstPad to link.
1728  *
1729  * Checks if the source pad and the sink pad can be linked.
1730  *
1731  * Returns: TRUE if the pads can be linked, FALSE otherwise.
1732  */
1733 gboolean
1734 gst_pad_can_link (GstPad * srcpad, GstPad * sinkpad)
1735 {
1736   return gst_pad_can_link_filtered (srcpad, sinkpad, NULL);
1737 }
1738
1739 /**
1740  * gst_pad_link_filtered:
1741  * @srcpad: the source #GstPad to link.
1742  * @sinkpad: the sink #GstPad to link.
1743  * @filtercaps: the filter #GstCaps.
1744  *
1745  * Links the source pad and the sink pad, constrained
1746  * by the given filter caps.
1747  *
1748  * Returns: TRUE if the pads have been linked, FALSE otherwise.
1749  */
1750 gboolean
1751 gst_pad_link_filtered (GstPad * srcpad, GstPad * sinkpad,
1752     const GstCaps * filtercaps)
1753 {
1754   GstRealPad *realsrc, *realsink;
1755   GstScheduler *src_sched, *sink_sched;
1756   GstPadLink *link;
1757
1758   /* generic checks */
1759   g_return_val_if_fail (srcpad != NULL, FALSE);
1760   g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
1761   g_return_val_if_fail (sinkpad != NULL, FALSE);
1762   g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
1763
1764   GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
1765       GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
1766
1767   /* now we need to deal with the real/ghost stuff */
1768   realsrc = GST_PAD_REALIZE (srcpad);
1769   realsink = GST_PAD_REALIZE (sinkpad);
1770
1771   if ((GST_PAD (realsrc) != srcpad) || (GST_PAD (realsink) != sinkpad)) {
1772     GST_CAT_INFO (GST_CAT_PADS, "*actually* linking %s:%s and %s:%s",
1773         GST_DEBUG_PAD_NAME (realsrc), GST_DEBUG_PAD_NAME (realsink));
1774   }
1775   /* FIXME: shouldn't we convert this to g_return_val_if_fail? */
1776   if (GST_RPAD_PEER (realsrc) != NULL) {
1777     GST_CAT_INFO (GST_CAT_PADS, "Real source pad %s:%s has a peer, failed",
1778         GST_DEBUG_PAD_NAME (realsrc));
1779     return FALSE;
1780   }
1781   if (GST_RPAD_PEER (realsink) != NULL) {
1782     GST_CAT_INFO (GST_CAT_PADS, "Real sink pad %s:%s has a peer, failed",
1783         GST_DEBUG_PAD_NAME (realsink));
1784     return FALSE;
1785   }
1786   if (GST_PAD_PARENT (realsrc) == NULL) {
1787     GST_CAT_INFO (GST_CAT_PADS, "Real src pad %s:%s has no parent, failed",
1788         GST_DEBUG_PAD_NAME (realsrc));
1789     return FALSE;
1790   }
1791   if (GST_PAD_PARENT (realsink) == NULL) {
1792     GST_CAT_INFO (GST_CAT_PADS, "Real sink pad %s:%s has no parent, failed",
1793         GST_DEBUG_PAD_NAME (realsrc));
1794     return FALSE;
1795   }
1796
1797   if (!gst_pad_check_schedulers (realsrc, realsink)) {
1798     g_warning ("linking pads with different scheds requires "
1799         "exactly one decoupled element (such as queue)");
1800     return FALSE;
1801   }
1802
1803   g_return_val_if_fail (realsrc != NULL, GST_PAD_LINK_REFUSED);
1804   g_return_val_if_fail (realsink != NULL, GST_PAD_LINK_REFUSED);
1805
1806   link = gst_pad_link_new ();
1807
1808   if (GST_RPAD_DIRECTION (realsrc) == GST_PAD_SRC) {
1809     link->srcpad = GST_PAD (realsrc);
1810     link->sinkpad = GST_PAD (realsink);
1811   } else {
1812     link->srcpad = GST_PAD (realsink);
1813     link->sinkpad = GST_PAD (realsrc);
1814   }
1815
1816   if (GST_RPAD_DIRECTION (link->srcpad) != GST_PAD_SRC) {
1817     GST_CAT_INFO (GST_CAT_PADS,
1818         "Real src pad %s:%s is not a source pad, failed",
1819         GST_DEBUG_PAD_NAME (link->srcpad));
1820     gst_pad_link_free (link);
1821     return FALSE;
1822   }
1823   if (GST_RPAD_DIRECTION (link->sinkpad) != GST_PAD_SINK) {
1824     GST_CAT_INFO (GST_CAT_PADS, "Real sink pad %s:%s is not a sink pad, failed",
1825         GST_DEBUG_PAD_NAME (link->sinkpad));
1826     gst_pad_link_free (link);
1827     return FALSE;
1828   }
1829
1830   link->srccaps = gst_pad_get_caps (link->srcpad);
1831   link->sinkcaps = gst_pad_get_caps (link->sinkpad);
1832   if (filtercaps)
1833     link->filtercaps = gst_caps_copy (filtercaps);
1834   if (gst_pad_link_try (link) == GST_PAD_LINK_REFUSED)
1835     return FALSE;
1836
1837   /* fire off a signal to each of the pads telling them 
1838    * that they've been linked */
1839   g_signal_emit (G_OBJECT (link->srcpad), gst_real_pad_signals[REAL_LINKED],
1840       0, link->sinkpad);
1841   g_signal_emit (G_OBJECT (link->sinkpad), gst_real_pad_signals[REAL_LINKED],
1842       0, link->srcpad);
1843
1844   src_sched = gst_pad_get_scheduler (GST_PAD (link->srcpad));
1845   sink_sched = gst_pad_get_scheduler (GST_PAD (link->sinkpad));
1846
1847   /* now tell the scheduler */
1848   if (src_sched && src_sched == sink_sched) {
1849     gst_scheduler_pad_link (src_sched,
1850         GST_PAD (link->srcpad), GST_PAD (link->sinkpad));
1851   } else {
1852     GST_CAT_INFO (GST_CAT_PADS,
1853         "not telling link to scheduler %s:%s and %s:%s, %p %p",
1854         GST_DEBUG_PAD_NAME (link->srcpad), GST_DEBUG_PAD_NAME (link->sinkpad),
1855         src_sched, sink_sched);
1856   }
1857
1858   GST_CAT_INFO (GST_CAT_PADS, "linked %s:%s and %s:%s, successful",
1859       GST_DEBUG_PAD_NAME (link->srcpad), GST_DEBUG_PAD_NAME (link->sinkpad));
1860
1861   return TRUE;
1862 }
1863
1864 /**
1865  * gst_pad_link:
1866  * @srcpad: the source #GstPad to link.
1867  * @sinkpad: the sink #GstPad to link.
1868  *
1869  * Links the source pad to the sink pad.
1870  *
1871  * Returns: TRUE if the pad could be linked, FALSE otherwise.
1872  */
1873 gboolean
1874 gst_pad_link (GstPad * srcpad, GstPad * sinkpad)
1875 {
1876   return gst_pad_link_filtered (srcpad, sinkpad, NULL);
1877 }
1878
1879 /* FIXME 0.9: Remove this */
1880 /**
1881  * gst_pad_set_parent:
1882  * @pad: a #GstPad to set the parent of.
1883  * @parent: the new parent #GstElement.
1884  *
1885  * Sets the parent object of a pad. Deprecated, use gst_object_set_parent()
1886  * instead.
1887  */
1888 void
1889 gst_pad_set_parent (GstPad * pad, GstElement * parent)
1890 {
1891   g_return_if_fail (GST_IS_PAD (pad));
1892   g_return_if_fail (GST_PAD_PARENT (pad) == NULL);
1893   g_return_if_fail (GST_IS_ELEMENT (parent));
1894
1895   gst_object_set_parent (GST_OBJECT (pad), GST_OBJECT (parent));
1896 }
1897
1898 /* FIXME 0.9: Remove this */
1899 /**
1900  * gst_pad_get_parent:
1901  * @pad: the #GstPad to get the parent of.
1902  *
1903  * Gets the parent object of this pad. Deprecated, use gst_object_get_parent()
1904  * instead.
1905  *
1906  * Returns: the parent #GstElement.
1907  */
1908 GstElement *
1909 gst_pad_get_parent (GstPad * pad)
1910 {
1911   g_return_val_if_fail (pad != NULL, NULL);
1912   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1913
1914   return GST_PAD_PARENT (pad);
1915 }
1916
1917 static void
1918 gst_pad_set_pad_template (GstPad * pad, GstPadTemplate * templ)
1919 {
1920   /* this function would need checks if it weren't static */
1921
1922   gst_object_replace ((GstObject **) & pad->padtemplate, (GstObject *) templ);
1923
1924   if (templ) {
1925     gst_object_sink (GST_OBJECT (templ));
1926     g_signal_emit (G_OBJECT (templ),
1927         gst_pad_template_signals[TEMPL_PAD_CREATED], 0, pad);
1928   }
1929 }
1930
1931 /**
1932  * gst_pad_get_pad_template:
1933  * @pad: a #GstPad.
1934  *
1935  * Gets the template for @pad.
1936  *
1937  * Returns: the #GstPadTemplate from which this pad was instantiated, or %NULL
1938  * if this pad has no template.
1939  */
1940 GstPadTemplate *
1941 gst_pad_get_pad_template (GstPad * pad)
1942 {
1943   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1944
1945   return GST_PAD_PAD_TEMPLATE (pad);
1946 }
1947
1948
1949 /**
1950  * gst_pad_get_scheduler:
1951  * @pad: a #GstPad to get the scheduler of.
1952  *
1953  * Gets the scheduler of the pad. Since the pad does not
1954  * have a scheduler of its own, the scheduler of the parent
1955  * is taken. For decoupled pads, the scheduler of the peer
1956  * parent is taken.
1957  *
1958  * Returns: the #GstScheduler of the pad, or %NULL if there is no parent or the
1959  * parent is not yet in a managing bin.
1960  */
1961 GstScheduler *
1962 gst_pad_get_scheduler (GstPad * pad)
1963 {
1964   GstScheduler *scheduler = NULL;
1965   GstElement *parent;
1966
1967   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1968
1969   parent = gst_pad_get_parent (pad);
1970   if (parent) {
1971     if (GST_FLAG_IS_SET (parent, GST_ELEMENT_DECOUPLED)) {
1972       GstRealPad *peer = GST_RPAD_PEER (pad);
1973
1974       if (peer) {
1975         scheduler =
1976             gst_element_get_scheduler (gst_pad_get_parent (GST_PAD (peer)));
1977       }
1978     } else {
1979       scheduler = gst_element_get_scheduler (parent);
1980     }
1981   }
1982
1983   return scheduler;
1984 }
1985
1986 /**
1987  * gst_pad_get_real_parent:
1988  * @pad: a #GstPad to get the real parent of.
1989  *
1990  * Gets the real parent object of this pad. If the pad
1991  * is a ghost pad, the actual owner of the real pad is
1992  * returned, as opposed to #gst_pad_get_parent().
1993  *
1994  * Returns: the parent #GstElement.
1995  */
1996 GstElement *
1997 gst_pad_get_real_parent (GstPad * pad)
1998 {
1999   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2000
2001   return GST_PAD_PARENT (GST_PAD (GST_PAD_REALIZE (pad)));
2002 }
2003
2004 /* FIXME 0.9: Make static. */
2005 /**
2006  * gst_pad_add_ghost_pad:
2007  * @pad: a #GstPad to attach the ghost pad to.
2008  * @ghostpad: the ghost #GstPad to to the pad.
2009  *
2010  * Adds a ghost pad to a pad. Private function, will be removed from the API in
2011  * 0.9.
2012  */
2013 void
2014 gst_pad_add_ghost_pad (GstPad * pad, GstPad * ghostpad)
2015 {
2016   GstRealPad *realpad;
2017
2018   g_return_if_fail (GST_IS_PAD (pad));
2019   g_return_if_fail (GST_IS_GHOST_PAD (ghostpad));
2020
2021   /* if we're ghosting a ghost pad, drill down to find the real pad */
2022   realpad = (GstRealPad *) pad;
2023   while (GST_IS_GHOST_PAD (realpad))
2024     realpad = GST_GPAD_REALPAD (realpad);
2025   g_return_if_fail (GST_IS_REAL_PAD (realpad));
2026
2027   /* will ref the pad template */
2028   GST_GPAD_REALPAD (ghostpad) = realpad;
2029   realpad->ghostpads = g_list_prepend (realpad->ghostpads, ghostpad);
2030   gst_pad_set_pad_template (GST_PAD (ghostpad), GST_PAD_PAD_TEMPLATE (pad));
2031 }
2032
2033 /* FIXME 0.9: Make static. */
2034 /**
2035  * gst_pad_remove_ghost_pad:
2036  * @pad: a #GstPad to remove the ghost pad from.
2037  * @ghostpad: the ghost #GstPad to remove from the pad.
2038  *
2039  * Removes a ghost pad from a pad. Private, will be removed from the API in 0.9.
2040  */
2041 void
2042 gst_pad_remove_ghost_pad (GstPad * pad, GstPad * ghostpad)
2043 {
2044   GstRealPad *realpad;
2045
2046   g_return_if_fail (GST_IS_PAD (pad));
2047   g_return_if_fail (GST_IS_GHOST_PAD (ghostpad));
2048   realpad = GST_PAD_REALIZE (pad);
2049   g_return_if_fail (GST_GPAD_REALPAD (ghostpad) == realpad);
2050
2051   gst_pad_set_pad_template (GST_PAD (ghostpad), NULL);
2052   realpad->ghostpads = g_list_remove (realpad->ghostpads, ghostpad);
2053   GST_GPAD_REALPAD (ghostpad) = NULL;
2054 }
2055
2056 /**
2057  * gst_pad_get_ghost_pad_list:
2058  * @pad: a #GstPad to get the ghost pads of.
2059  *
2060  * Gets the ghost pads of this pad.
2061  *
2062  * Returns: a #GList of ghost pads.
2063  */
2064 GList *
2065 gst_pad_get_ghost_pad_list (GstPad * pad)
2066 {
2067   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2068
2069   return GST_PAD_REALIZE (pad)->ghostpads;
2070 }
2071
2072 static gboolean
2073 _gst_pad_default_fixate_foreach (GQuark field_id, GValue * value, gpointer s)
2074 {
2075   GstStructure *structure = (GstStructure *) s;
2076   GType type = G_VALUE_TYPE (value);
2077
2078   if (gst_type_is_fixed (type))
2079     return TRUE;
2080
2081   if (type == GST_TYPE_INT_RANGE) {
2082     gst_structure_set (structure, g_quark_to_string (field_id),
2083         G_TYPE_INT, gst_value_get_int_range_min (value), NULL);
2084     return FALSE;
2085   }
2086   if (type == GST_TYPE_DOUBLE_RANGE) {
2087     gst_structure_set (structure, g_quark_to_string (field_id),
2088         G_TYPE_DOUBLE, gst_value_get_double_range_min (value), NULL);
2089     return FALSE;
2090   }
2091   if (type == GST_TYPE_LIST) {
2092     gst_structure_set_value (structure, g_quark_to_string (field_id),
2093         gst_value_list_get_value (value, 0));
2094     return FALSE;
2095   }
2096
2097   g_critical ("don't know how to fixate type %s", g_type_name (type));
2098   return TRUE;
2099 }
2100
2101 static GstCaps *
2102 _gst_pad_default_fixate_func (GstPad * pad, const GstCaps * caps)
2103 {
2104   static GstStaticCaps octetcaps = GST_STATIC_CAPS ("application/octet-stream");
2105   GstStructure *structure;
2106   GstCaps *newcaps;
2107
2108   g_return_val_if_fail (pad != NULL, NULL);
2109   g_return_val_if_fail (caps != NULL, NULL);
2110   g_return_val_if_fail (!gst_caps_is_empty (caps), NULL);
2111
2112   if (gst_caps_is_any (caps)) {
2113     return gst_caps_copy (gst_static_caps_get (&octetcaps));
2114   }
2115
2116   if (caps->structs->len > 1) {
2117     return gst_caps_new_full (gst_structure_copy (gst_caps_get_structure (caps,
2118                 0)), NULL);
2119   }
2120
2121   newcaps = gst_caps_copy (caps);
2122   structure = gst_caps_get_structure (newcaps, 0);
2123   gst_structure_foreach (structure, _gst_pad_default_fixate_foreach, structure);
2124
2125   return newcaps;
2126 }
2127
2128 /**
2129  * gst_pad_perform_negotiate:
2130  * @srcpad: the source #GstPad.
2131  * @sinkpad: the sink #GstPad.
2132  *
2133  * Tries to negotiate the pads. See gst_pad_renegotiate() for a brief
2134  * description of caps negotiation.
2135  *
2136  * Returns: TRUE if the pads were succesfully negotiated, FALSE otherwise.
2137  */
2138 gboolean
2139 gst_pad_perform_negotiate (GstPad * srcpad, GstPad * sinkpad)
2140 {
2141   return GST_PAD_LINK_SUCCESSFUL (gst_pad_renegotiate (srcpad));
2142 }
2143
2144 static void
2145 gst_pad_link_unnegotiate (GstPadLink * link)
2146 {
2147   g_return_if_fail (link != NULL);
2148
2149   if (link->caps) {
2150     gst_caps_free (link->caps);
2151     link->caps = NULL;
2152     link->engaged = FALSE;
2153     if (GST_RPAD_LINK (link->srcpad) != link) {
2154       g_warning ("unnegotiating unset link");
2155     } else {
2156       g_object_notify (G_OBJECT (link->srcpad), "caps");
2157     }
2158     if (GST_RPAD_LINK (link->sinkpad) != link) {
2159       g_warning ("unnegotiating unset link");
2160     } else {
2161       g_object_notify (G_OBJECT (link->sinkpad), "caps");
2162     }
2163   }
2164 }
2165
2166 /**
2167  * gst_pad_unnegotiate:
2168  * @pad: pad to unnegotiate
2169  *
2170  * "Unnegotiates" a pad. The currently negotiated caps are cleared and the pad 
2171  * needs renegotiation.
2172  */
2173 void
2174 gst_pad_unnegotiate (GstPad * pad)
2175 {
2176   GstPadLink *link;
2177
2178   g_return_if_fail (GST_IS_PAD (pad));
2179
2180   link = GST_RPAD_LINK (GST_PAD_REALIZE (pad));
2181   if (link)
2182     gst_pad_link_unnegotiate (link);
2183 }
2184
2185 /* returning NULL indicates that the arguments are invalid */
2186 static GstPadLink *
2187 gst_pad_link_prepare (GstPad * srcpad, GstPad * sinkpad,
2188     const GstCaps * filtercaps)
2189 {
2190   GstRealPad *realsrc, *realsink;
2191   GstPadLink *link;
2192
2193   g_return_val_if_fail (GST_IS_PAD (srcpad), NULL);
2194   g_return_val_if_fail (GST_IS_PAD (sinkpad), NULL);
2195
2196   realsrc = GST_PAD_REALIZE (srcpad);
2197   realsink = GST_PAD_REALIZE (sinkpad);
2198
2199   if ((GST_PAD (realsrc) != srcpad) || (GST_PAD (realsink) != sinkpad)) {
2200     GST_CAT_DEBUG (GST_CAT_PADS, "*actually* linking %s:%s and %s:%s",
2201         GST_DEBUG_PAD_NAME (realsrc), GST_DEBUG_PAD_NAME (realsink));
2202   }
2203
2204   g_return_val_if_fail (GST_RPAD_PEER (realsrc) == NULL, NULL);
2205   g_return_val_if_fail (GST_RPAD_PEER (realsink) == NULL, NULL);
2206   g_return_val_if_fail (GST_PAD_PARENT (realsrc) != NULL, NULL);
2207   g_return_val_if_fail (GST_PAD_PARENT (realsink) != NULL, NULL);
2208
2209   if (!gst_pad_check_schedulers (realsrc, realsink)) {
2210     g_warning ("linking pads with different scheds requires "
2211         "exactly one decoupled element (such as queue)");
2212     return NULL;
2213   }
2214
2215   if (GST_RPAD_DIRECTION (realsrc) == GST_RPAD_DIRECTION (realsink)) {
2216     g_warning ("%s:%s and %s:%s are both %s pads, failed",
2217         GST_DEBUG_PAD_NAME (realsrc), GST_DEBUG_PAD_NAME (realsink),
2218         GST_RPAD_DIRECTION (realsrc) == GST_PAD_SRC ? "src" : "sink");
2219     return NULL;
2220   }
2221
2222   link = gst_pad_link_new ();
2223
2224   if (GST_RPAD_DIRECTION (realsrc) == GST_PAD_SRC) {
2225     link->srcpad = GST_PAD (realsrc);
2226     link->sinkpad = GST_PAD (realsink);
2227   } else {
2228     link->srcpad = GST_PAD (realsink);
2229     link->sinkpad = GST_PAD (realsrc);
2230   }
2231
2232   link->srccaps = gst_pad_get_caps (link->srcpad);
2233   link->sinkcaps = gst_pad_get_caps (link->sinkpad);
2234   if (filtercaps)
2235     link->filtercaps = gst_caps_copy (filtercaps);
2236
2237   return link;
2238 }
2239
2240 /**
2241  * gst_pad_try_relink_filtered:
2242  * @srcpad: the source #GstPad to relink.
2243  * @sinkpad: the sink #GstPad to relink.
2244  * @filtercaps: the #GstPad to use as a filter in the relink.
2245  *
2246  * Tries to relink the given source and sink pad, constrained by the given
2247  * capabilities.
2248  *
2249  * Returns: TRUE if the pads were succesfully renegotiated, FALSE otherwise.
2250  */
2251 gboolean
2252 gst_pad_try_relink_filtered (GstPad * srcpad, GstPad * sinkpad,
2253     const GstCaps * filtercaps)
2254 {
2255   GstPadLink *link;
2256
2257   GST_INFO ("trying to relink %" GST_PTR_FORMAT " and %" GST_PTR_FORMAT
2258       " with filtercaps %" GST_PTR_FORMAT, srcpad, sinkpad);
2259
2260   link = gst_pad_link_prepare (srcpad, sinkpad, filtercaps);
2261   if (!link)
2262     return FALSE;
2263
2264   if (GST_RPAD_PEER (link->srcpad) != (GstRealPad *) link->sinkpad) {
2265     g_warning ("Pads %s:%s and %s:%s were never linked",
2266         GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
2267     gst_pad_link_free (link);
2268     return FALSE;
2269   }
2270
2271   if (GST_PAD_LINK_FAILED (gst_pad_link_try (link)))
2272     return FALSE;
2273
2274   return TRUE;
2275 }
2276
2277 /**
2278  * gst_pad_relink_filtered:
2279  * @srcpad: the source #GstPad to relink.
2280  * @sinkpad: the sink #GstPad to relink.
2281  * @filtercaps: the #GstPad to use as a filter in the relink.
2282  *
2283  * Relinks the given source and sink pad, constrained by the given
2284  * capabilities.  If the relink fails, the pads are unlinked
2285  * and FALSE is returned.
2286  *
2287  * Returns: TRUE if the pads were succesfully relinked, FALSE otherwise.
2288  */
2289 gboolean
2290 gst_pad_relink_filtered (GstPad * srcpad, GstPad * sinkpad,
2291     const GstCaps * filtercaps)
2292 {
2293   if (gst_pad_try_relink_filtered (srcpad, sinkpad, filtercaps))
2294     return TRUE;
2295
2296   gst_pad_unlink (srcpad, sinkpad);
2297   return FALSE;
2298 }
2299
2300 /**
2301  * gst_pad_proxy_getcaps:
2302  * @pad: a #GstPad to proxy.
2303  *
2304  * Calls gst_pad_get_allowed_caps() for every other pad belonging to the
2305  * same element as @pad, and returns the intersection of the results.
2306  *
2307  * This function is useful as a default getcaps function for an element
2308  * that can handle any stream format, but requires all its pads to have
2309  * the same caps.  Two such elements are tee and aggregator.
2310  *
2311  * Returns: the intersection of the other pads' allowed caps.
2312  */
2313 GstCaps *
2314 gst_pad_proxy_getcaps (GstPad * pad)
2315 {
2316   GstElement *element;
2317   const GList *pads;
2318   GstCaps *caps;
2319
2320   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2321
2322   GST_DEBUG ("proxying getcaps for %s:%s", GST_DEBUG_PAD_NAME (pad));
2323
2324   element = gst_pad_get_parent (pad);
2325
2326   pads = gst_element_get_pad_list (element);
2327
2328   caps = gst_caps_new_any ();
2329   while (pads) {
2330     GstPad *otherpad = GST_PAD (pads->data);
2331     GstCaps *temp;
2332
2333     if (otherpad != pad) {
2334       GstCaps *allowed = gst_pad_get_allowed_caps (otherpad);
2335
2336       temp = gst_caps_intersect (caps, allowed);
2337       gst_caps_free (caps);
2338       gst_caps_free (allowed);
2339       caps = temp;
2340     }
2341
2342     pads = g_list_next (pads);
2343   }
2344
2345   return caps;
2346 }
2347
2348 /**
2349  * gst_pad_proxy_pad_link:
2350  * @pad: a #GstPad to proxy from
2351  * @caps: the #GstCaps to link with
2352  *
2353  * Calls gst_pad_try_set_caps() for every other pad belonging to the
2354  * same element as @pad.  If gst_pad_try_set_caps() fails on any pad,
2355  * the proxy link fails. May be used only during negotiation.
2356  *
2357  * Returns: GST_PAD_LINK_OK if sucessful
2358  */
2359 GstPadLinkReturn
2360 gst_pad_proxy_pad_link (GstPad * pad, const GstCaps * caps)
2361 {
2362   GstElement *element;
2363   const GList *pads;
2364   GstPadLinkReturn ret;
2365
2366   g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_LINK_REFUSED);
2367   g_return_val_if_fail (caps != NULL, GST_PAD_LINK_REFUSED);
2368
2369   GST_DEBUG ("proxying pad link for %s:%s", GST_DEBUG_PAD_NAME (pad));
2370
2371   element = gst_pad_get_parent (pad);
2372
2373   pads = gst_element_get_pad_list (element);
2374
2375   while (pads) {
2376     GstPad *otherpad = GST_PAD (pads->data);
2377
2378     if (otherpad != pad) {
2379       ret = gst_pad_try_set_caps (otherpad, caps);
2380       if (GST_PAD_LINK_FAILED (ret)) {
2381         return ret;
2382       }
2383     }
2384     pads = g_list_next (pads);
2385   }
2386
2387   return GST_PAD_LINK_OK;
2388 }
2389
2390 /**
2391  * gst_pad_proxy_fixate:
2392  * @pad: a #GstPad to proxy.
2393  * @caps: the #GstCaps to fixate
2394  *
2395  * Implements a default fixate function based on the caps set on the other
2396  * pads in the element.  This function should only be used if every pad
2397  * has the same pad template caps.
2398  *
2399  * Returns: a fixated caps, or NULL if caps cannot be fixed
2400  */
2401 GstCaps *
2402 gst_pad_proxy_fixate (GstPad * pad, const GstCaps * caps)
2403 {
2404   GstElement *element;
2405   const GList *pads;
2406   const GstCaps *othercaps;
2407
2408   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2409   g_return_val_if_fail (caps != NULL, NULL);
2410
2411   GST_DEBUG ("proxying fixate for %s:%s\n", GST_DEBUG_PAD_NAME (pad));
2412
2413   element = gst_pad_get_parent (pad);
2414
2415   pads = gst_element_get_pad_list (element);
2416
2417   while (pads) {
2418     GstPad *otherpad = GST_PAD (pads->data);
2419
2420     /* FIXME check that each pad has the same pad template caps */
2421
2422     if (otherpad != pad) {
2423       othercaps = gst_pad_get_negotiated_caps (otherpad);
2424
2425       if (othercaps && !gst_caps_is_subset (caps, othercaps)) {
2426         GstCaps *icaps;
2427
2428         icaps = gst_caps_intersect (othercaps, caps);
2429         if (!gst_caps_is_empty (icaps)) {
2430           return icaps;
2431         } else {
2432           gst_caps_free (icaps);
2433         }
2434       }
2435     }
2436     pads = g_list_next (pads);
2437   }
2438
2439   return NULL;
2440 }
2441
2442 /**
2443  * gst_pad_set_explicit_caps:
2444  * @pad: a #GstPad to set the explicit caps of
2445  * @caps: the #GstCaps to set
2446  *
2447  * If a pad has been told to use explicit caps, this function is used
2448  * to set the explicit caps.  If @caps is NULL, the explicit caps are
2449  * unset.
2450  *
2451  * This function calls gst_pad_try_set_caps() on the pad.  If that
2452  * call fails, GST_ELEMENT_ERROR() is called to indicate a negotiation
2453  * failure.
2454  * 
2455  * Returns: TRUE if the caps were set correctly, otherwise FALSE
2456  */
2457 gboolean
2458 gst_pad_set_explicit_caps (GstPad * pad, const GstCaps * caps)
2459 {
2460   GstPadLinkReturn link_ret;
2461
2462   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2463
2464   GST_CAT_DEBUG (GST_CAT_PADS,
2465       "setting explicit caps on %s:%s to %" GST_PTR_FORMAT,
2466       GST_DEBUG_PAD_NAME (pad), caps);
2467
2468   if (caps == NULL) {
2469     GST_CAT_DEBUG (GST_CAT_PADS, "caps is NULL");
2470     gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), NULL);
2471     return TRUE;
2472   }
2473
2474   gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), gst_caps_copy (caps));
2475
2476   if (!GST_PAD_IS_LINKED (pad)) {
2477     GST_CAT_DEBUG (GST_CAT_PADS, "pad is not linked");
2478     return TRUE;
2479   }
2480   link_ret = gst_pad_try_set_caps (pad, caps);
2481   if (link_ret == GST_PAD_LINK_REFUSED) {
2482     gchar *caps_str = gst_caps_to_string (caps);
2483
2484     GST_ELEMENT_ERROR (gst_pad_get_parent (pad), CORE, PAD, (NULL),
2485         ("failed to negotiate (try_set_caps with \"%s\" returned REFUSED)",
2486             caps_str));
2487     g_free (caps_str);
2488     return FALSE;
2489   }
2490
2491   return TRUE;
2492 }
2493
2494 static GstCaps *
2495 gst_pad_explicit_getcaps (GstPad * pad)
2496 {
2497   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2498
2499   if (GST_RPAD_EXPLICIT_CAPS (pad) == NULL) {
2500     const GstCaps *caps = gst_pad_get_pad_template_caps (pad);
2501
2502     return gst_caps_copy (caps);
2503   }
2504   return gst_caps_copy (GST_RPAD_EXPLICIT_CAPS (pad));
2505 }
2506
2507 static GstPadLinkReturn
2508 gst_pad_explicit_link (GstPad * pad, const GstCaps * caps)
2509 {
2510   g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_LINK_REFUSED);
2511   g_return_val_if_fail (caps != NULL, GST_PAD_LINK_REFUSED);
2512
2513   if (GST_RPAD_EXPLICIT_CAPS (pad) == NULL) {
2514     return GST_PAD_LINK_DELAYED;
2515   }
2516
2517   return GST_PAD_LINK_OK;
2518 }
2519
2520 /**
2521  * gst_pad_use_explicit_caps:
2522  * @pad: a #GstPad to set to use explicit caps
2523  *
2524  * This function handles negotiation for pads that need to be set
2525  * to particular caps under complete control of the element, based
2526  * on some state in the element.  This is often the case with
2527  * decoders and other elements whose caps is determined by the data
2528  * stream.
2529  *
2530  * WARNING: This function is a hack and will be replaced with something
2531  * better in gstreamer-0.9.
2532  */
2533 void
2534 gst_pad_use_explicit_caps (GstPad * pad)
2535 {
2536   g_return_if_fail (GST_IS_PAD (pad));
2537
2538   gst_pad_set_getcaps_function (pad, gst_pad_explicit_getcaps);
2539   gst_pad_set_link_function (pad, gst_pad_explicit_link);
2540   gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), NULL);
2541 }
2542
2543 /**
2544  * gst_pad_proxy_link:
2545  * @pad: a #GstPad to proxy to.
2546  * @caps: the #GstCaps to use in proxying.
2547  *
2548  * Proxies the link function to the specified pad.
2549  *
2550  * Returns: TRUE if the peer pad accepted the caps, FALSE otherwise.
2551  */
2552 GstPadLinkReturn
2553 gst_pad_proxy_link (GstPad * pad, const GstCaps * caps)
2554 {
2555   return gst_pad_try_set_caps (pad, caps);
2556 }
2557
2558 /**
2559  * gst_pad_is_negotiated:
2560  * @pad: a #GstPad to get the negotiation status of
2561  *
2562  * Returns: TRUE if the pad has successfully negotiated caps.
2563  */
2564 gboolean
2565 gst_pad_is_negotiated (GstPad * pad)
2566 {
2567   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2568
2569   if (!GST_PAD_REALIZE (pad))
2570     return FALSE;
2571   if (!GST_RPAD_LINK (pad))
2572     return FALSE;
2573
2574   return (GST_RPAD_LINK (pad)->caps != NULL);
2575 }
2576
2577 /**
2578  * gst_pad_get_negotiated_caps:
2579  * @pad: a #GstPad to get the negotiated capabilites of
2580  *
2581  * Gets the currently negotiated caps of a pad.
2582  *
2583  * Returns: the currently negotiated caps of a pad, or NULL if the pad isn't
2584  *          negotiated.
2585  */
2586 G_CONST_RETURN GstCaps *
2587 gst_pad_get_negotiated_caps (GstPad * pad)
2588 {
2589   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2590
2591   if (!GST_PAD_REALIZE (pad))
2592     return NULL;
2593   if (!GST_RPAD_LINK (pad))
2594     return NULL;
2595
2596   return GST_RPAD_LINK (pad)->caps;
2597 }
2598
2599 /**
2600  * gst_pad_get_caps:
2601  * @pad: a  #GstPad to get the capabilities of.
2602  *
2603  * Gets the capabilities of this pad.
2604  *
2605  * Returns: the #GstCaps of this pad. This function returns a new caps, so use 
2606  * gst_caps_free to get rid of it.
2607  */
2608 GstCaps *
2609 gst_pad_get_caps (GstPad * pad)
2610 {
2611   GstRealPad *realpad;
2612
2613   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2614
2615   realpad = GST_PAD_REALIZE (pad);
2616
2617   GST_CAT_DEBUG (GST_CAT_CAPS, "get pad caps of %s:%s (%p)",
2618       GST_DEBUG_PAD_NAME (realpad), realpad);
2619
2620   if (GST_RPAD_GETCAPSFUNC (realpad)) {
2621     GstCaps *caps;
2622
2623     GST_CAT_DEBUG (GST_CAT_CAPS, "using pad getcaps function");
2624     caps = GST_RPAD_GETCAPSFUNC (realpad) (GST_PAD (realpad));
2625
2626     if (caps == NULL) {
2627       g_critical ("pad %s:%s returned NULL caps from getcaps function\n",
2628           GST_DEBUG_PAD_NAME (realpad));
2629     } else {
2630 #ifndef G_DISABLE_ASSERT
2631       /* check that the returned caps are a real subset of the template caps */
2632       if (GST_PAD_PAD_TEMPLATE (realpad)) {
2633         const GstCaps *templ_caps =
2634             GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (realpad));
2635         if (!gst_caps_is_subset (caps, templ_caps)) {
2636           GstCaps *temp;
2637
2638           GST_CAT_ERROR_OBJECT (GST_CAT_CAPS, pad,
2639               "pad returned caps %" GST_PTR_FORMAT
2640               " which are not a real subset of its template caps %"
2641               GST_PTR_FORMAT, caps, templ_caps);
2642           g_warning
2643               ("pad %s:%s returned caps that are not a real subset of its template caps",
2644               GST_DEBUG_PAD_NAME (realpad));
2645           temp = gst_caps_intersect (templ_caps, caps);
2646           gst_caps_free (caps);
2647           caps = temp;
2648         }
2649       }
2650 #endif
2651       return caps;
2652     }
2653   }
2654   if (GST_PAD_PAD_TEMPLATE (realpad)) {
2655     GstPadTemplate *templ = GST_PAD_PAD_TEMPLATE (realpad);
2656     const GstCaps *caps;
2657
2658     caps = GST_PAD_TEMPLATE_CAPS (templ);
2659     GST_CAT_DEBUG (GST_CAT_CAPS,
2660         "using pad template %p with caps %" GST_PTR_FORMAT, templ, caps);
2661
2662 #if 0
2663     /* FIXME we should enable something like this someday, but this is
2664      * a bit buggy */
2665     if (!gst_caps_is_fixed (caps)) {
2666       g_warning
2667           ("pad %s:%s (%p) has no getcaps function and the pad template returns non-fixed caps.  Element is probably broken.\n",
2668           GST_DEBUG_PAD_NAME (realpad), realpad);
2669     }
2670 #endif
2671
2672     return gst_caps_copy (GST_PAD_TEMPLATE_CAPS (templ));
2673   }
2674   GST_CAT_DEBUG (GST_CAT_CAPS, "pad has no caps");
2675
2676 #if 0
2677   /* FIXME enable */
2678   g_warning ("pad %s:%s (%p) has no pad template\n",
2679       GST_DEBUG_PAD_NAME (realpad), realpad);
2680 #endif
2681
2682   return gst_caps_new_any ();
2683 }
2684
2685 /**
2686  * gst_pad_get_pad_template_caps:
2687  * @pad: a #GstPad to get the template capabilities from.
2688  *
2689  * Gets the capabilities for @pad's template.
2690  *
2691  * Returns: the #GstCaps of this pad template. If you intend to keep a reference
2692  * on the caps, make a copy (see gst_caps_copy ()).
2693  */
2694 const GstCaps *
2695 gst_pad_get_pad_template_caps (GstPad * pad)
2696 {
2697   static GstStaticCaps anycaps = GST_STATIC_CAPS ("ANY");
2698
2699   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2700
2701   if (GST_PAD_PAD_TEMPLATE (pad))
2702     return GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad));
2703
2704 #if 0
2705   /* FIXME this should be enabled some day */
2706   /* wingo: why? mail the list during 0.9 when you find this :) */
2707   g_warning ("pad %s:%s (%p) has no pad template\n",
2708       GST_DEBUG_PAD_NAME (realpad), realpad);
2709 #endif
2710
2711   return gst_static_caps_get (&anycaps);
2712 }
2713
2714 /* FIXME 0.9: This function should probably die, or at least be renamed to
2715  * get_caps_by_format. */
2716 /**
2717  * gst_pad_template_get_caps_by_name:
2718  * @templ: a #GstPadTemplate to get the capabilities of.
2719  * @name: the name of the capability to get.
2720  *
2721  * Gets the capability with the given name from @templ.
2722  *
2723  * Returns: the #GstCaps of this pad template, or NULL if not found. If you
2724  * intend to keep a reference on the caps, make a copy (see gst_caps_copy ()).
2725  */
2726 const GstCaps *
2727 gst_pad_template_get_caps_by_name (GstPadTemplate * templ, const gchar * name)
2728 {
2729   GstCaps *caps;
2730
2731   g_return_val_if_fail (templ != NULL, NULL);
2732
2733   caps = GST_PAD_TEMPLATE_CAPS (templ);
2734   if (!caps)
2735     return NULL;
2736
2737   /* FIXME */
2738   return NULL;
2739 }
2740
2741 /* FIXME 0.9: What good is this if it only works for already-negotiated pads? */
2742 /**
2743  * gst_pad_check_compatibility:
2744  * @srcpad: the source #GstPad to check.
2745  * @sinkpad: the sink #GstPad to check against.
2746  *
2747  * Checks if two pads have compatible capabilities. If neither one has yet been
2748  * negotiated, returns TRUE for no good reason.
2749  *
2750  * Returns: TRUE if they are compatible or if the capabilities could not be
2751  * checked, FALSE if the capabilities are not compatible.
2752  */
2753 gboolean
2754 gst_pad_check_compatibility (GstPad * srcpad, GstPad * sinkpad)
2755 {
2756   g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
2757   g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
2758
2759   if (GST_PAD_CAPS (srcpad) && GST_PAD_CAPS (sinkpad)) {
2760     if (!gst_caps_is_always_compatible (GST_PAD_CAPS (srcpad),
2761             GST_PAD_CAPS (sinkpad))) {
2762       return FALSE;
2763     } else {
2764       return TRUE;
2765     }
2766   } else {
2767     GST_CAT_DEBUG (GST_CAT_PADS,
2768         "could not check capabilities of pads (%s:%s) and (%s:%s) %p %p",
2769         GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad),
2770         GST_PAD_CAPS (srcpad), GST_PAD_CAPS (sinkpad));
2771     return TRUE;
2772   }
2773 }
2774
2775 /**
2776  * gst_pad_get_peer:
2777  * @pad: a #GstPad to get the peer of.
2778  *
2779  * Gets the peer of @pad.
2780  *
2781  * Returns: the peer #GstPad.
2782  */
2783 GstPad *
2784 gst_pad_get_peer (GstPad * pad)
2785 {
2786   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2787
2788   return GST_PAD (GST_PAD_PEER (pad));
2789 }
2790
2791 /**
2792  * gst_pad_get_allowed_caps:
2793  * @pad: a real #GstPad.
2794  *
2795  * Gets the capabilities of the allowed media types that can flow through @pad.
2796  * The caller must free the resulting caps.
2797  *
2798  * Returns: the allowed #GstCaps of the pad link.  Free the caps when
2799  * you no longer need it.
2800  */
2801 GstCaps *
2802 gst_pad_get_allowed_caps (GstPad * pad)
2803 {
2804   const GstCaps *mycaps;
2805   GstCaps *caps;
2806   GstCaps *peercaps;
2807   GstCaps *icaps;
2808   GstPadLink *link;
2809
2810   g_return_val_if_fail (GST_IS_REAL_PAD (pad), NULL);
2811
2812   GST_CAT_DEBUG (GST_CAT_PROPERTIES, "%s:%s: getting allowed caps",
2813       GST_DEBUG_PAD_NAME (pad));
2814
2815   mycaps = gst_pad_get_pad_template_caps (pad);
2816   if (GST_RPAD_PEER (pad) == NULL) {
2817     GST_CAT_DEBUG (GST_CAT_PROPERTIES, "%s:%s: no peer, returning template",
2818         GST_DEBUG_PAD_NAME (pad));
2819     return gst_caps_copy (mycaps);
2820   }
2821
2822   peercaps = gst_pad_get_caps (GST_PAD_PEER (pad));
2823   caps = gst_caps_intersect (mycaps, peercaps);
2824   gst_caps_free (peercaps);
2825
2826   link = GST_RPAD_LINK (pad);
2827   if (link->filtercaps) {
2828     icaps = gst_caps_intersect (caps, link->filtercaps);
2829     gst_caps_free (caps);
2830     GST_CAT_DEBUG (GST_CAT_PROPERTIES,
2831         "%s:%s: returning filtered intersection with peer",
2832         GST_DEBUG_PAD_NAME (pad));
2833     return icaps;
2834   } else {
2835     GST_CAT_DEBUG (GST_CAT_PROPERTIES,
2836         "%s:%s: returning unfiltered intersection with peer",
2837         GST_DEBUG_PAD_NAME (pad));
2838     return caps;
2839   }
2840 }
2841
2842 /**
2843  * gst_pad_caps_change_notify:
2844  * @pad: a #GstPad
2845  *
2846  * Called to indicate that the return value of @pad's getcaps function may have
2847  * changed, and that a renegotiation is suggested.
2848  */
2849 void
2850 gst_pad_caps_change_notify (GstPad * pad)
2851 {
2852 }
2853
2854 /**
2855  * gst_pad_recover_caps_error:
2856  * @pad: a #GstPad that had a failed capsnego
2857  * @allowed: possible caps for the link
2858  *
2859  * Attempt to recover from a failed caps negotiation. This function
2860  * is typically called by a plugin that exhausted its list of caps
2861  * and wants the application to resolve the issue. The application
2862  * should connect to the pad's caps_nego_failed signal and should
2863  * resolve the issue by connecting another element for example.
2864  *
2865  * Returns: TRUE when the issue was resolved, dumps detailed information
2866  * on the console and returns FALSE otherwise.
2867  */
2868 gboolean
2869 gst_pad_recover_caps_error (GstPad * pad, const GstCaps * allowed)
2870 {
2871   /* FIXME */
2872   return FALSE;
2873 }
2874
2875 /**
2876  * gst_pad_alloc_buffer:
2877  * @pad: a source #GstPad
2878  * @offset: the offset of the new buffer in the stream
2879  * @size: the size of the new buffer
2880  *
2881  * Allocates a new, empty buffer optimized to push to pad @pad.  This
2882  * function only works if @pad is a source pad.
2883  *
2884  * Returns: a new, empty #GstBuffer, or NULL if there is an error
2885  */
2886 GstBuffer *
2887 gst_pad_alloc_buffer (GstPad * pad, guint64 offset, gint size)
2888 {
2889   GstRealPad *peer;
2890
2891   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2892   g_return_val_if_fail (GST_PAD_IS_SRC (pad), NULL);
2893
2894   peer = GST_RPAD_PEER (pad);
2895
2896   if (!peer)
2897     return gst_buffer_new_and_alloc (size);
2898
2899   GST_CAT_DEBUG (GST_CAT_BUFFER, "(%s:%s): getting buffer",
2900       GST_DEBUG_PAD_NAME (pad));
2901
2902   if (peer->bufferallocfunc) {
2903     GST_CAT_DEBUG (GST_CAT_PADS,
2904         "calling bufferallocfunc &%s (@%p) of peer pad %s:%s",
2905         GST_DEBUG_FUNCPTR_NAME (peer->bufferallocfunc),
2906         &peer->bufferallocfunc, GST_DEBUG_PAD_NAME (((GstPad *) peer)));
2907     return (peer->bufferallocfunc) (GST_PAD (peer), offset, size);
2908   } else {
2909     return gst_buffer_new_and_alloc (size);
2910   }
2911 }
2912
2913 static void
2914 gst_real_pad_dispose (GObject * object)
2915 {
2916   GstPad *pad = GST_PAD (object);
2917
2918   /* No linked pad can ever be disposed.
2919    * It has to have a parent to be linked 
2920    * and a parent would hold a reference */
2921   /* FIXME: what about if g_object_dispose is explicitly called on the pad? Is
2922      that legal? otherwise we could assert GST_OBJECT_PARENT (pad) == NULL as
2923      well... */
2924   g_assert (GST_PAD_PEER (pad) == NULL);
2925
2926   GST_CAT_DEBUG (GST_CAT_REFCOUNTING, "dispose %s:%s",
2927       GST_DEBUG_PAD_NAME (pad));
2928
2929   /* we destroy the ghostpads, because they are nothing without the real pad */
2930   if (GST_REAL_PAD (pad)->ghostpads) {
2931     GList *orig, *ghostpads;
2932
2933     orig = ghostpads = g_list_copy (GST_REAL_PAD (pad)->ghostpads);
2934
2935     while (ghostpads) {
2936       GstPad *ghostpad = GST_PAD (ghostpads->data);
2937
2938       if (GST_IS_ELEMENT (GST_OBJECT_PARENT (ghostpad))) {
2939         GstElement *parent = GST_ELEMENT (GST_OBJECT_PARENT (ghostpad));
2940
2941         GST_CAT_DEBUG (GST_CAT_REFCOUNTING,
2942             "removing ghost pad from element '%s'", GST_OBJECT_NAME (parent));
2943         gst_element_remove_pad (parent, ghostpad);
2944       } else {
2945         /* handle the case where we have some floating ghost pad that was never
2946            added to an element */
2947         g_object_set (ghostpad, "real-pad", NULL, NULL);
2948       }
2949       ghostpads = g_list_next (ghostpads);
2950     }
2951     g_list_free (orig);
2952     /* as the ghost pads are removed, they remove themselves from ->ghostpads.
2953        So it should be empty now. Let's assert that. */
2954     g_assert (GST_REAL_PAD (pad)->ghostpads == NULL);
2955   }
2956
2957   if (GST_IS_ELEMENT (GST_OBJECT_PARENT (pad))) {
2958     GST_CAT_DEBUG (GST_CAT_REFCOUNTING, "removing pad from element '%s'",
2959         GST_OBJECT_NAME (GST_OBJECT (GST_ELEMENT (GST_OBJECT_PARENT (pad)))));
2960
2961     gst_element_remove_pad (GST_ELEMENT (GST_OBJECT_PARENT (pad)), pad);
2962   }
2963
2964   if (GST_RPAD_EXPLICIT_CAPS (pad)) {
2965     GST_ERROR_OBJECT (pad, "still explicit caps %" GST_PTR_FORMAT " set",
2966         GST_RPAD_EXPLICIT_CAPS (pad));
2967     g_warning ("pad %p has still explicit caps set", pad);
2968     gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), NULL);
2969   }
2970   G_OBJECT_CLASS (real_pad_parent_class)->dispose (object);
2971 }
2972
2973
2974 #ifndef GST_DISABLE_LOADSAVE
2975 /* FIXME: why isn't this on a GstElement ? */
2976 /**
2977  * gst_pad_load_and_link:
2978  * @self: an #xmlNodePtr to read the description from.
2979  * @parent: the #GstObject element that owns the pad.
2980  *
2981  * Reads the pad definition from the XML node and links the given pad
2982  * in the element to a pad of an element up in the hierarchy.
2983  */
2984 void
2985 gst_pad_load_and_link (xmlNodePtr self, GstObject * parent)
2986 {
2987   xmlNodePtr field = self->xmlChildrenNode;
2988   GstPad *pad = NULL, *targetpad;
2989   gchar *peer = NULL;
2990   gchar **split;
2991   GstElement *target;
2992   GstObject *grandparent;
2993
2994   while (field) {
2995     if (!strcmp (field->name, "name")) {
2996       pad = gst_element_get_pad (GST_ELEMENT (parent),
2997           xmlNodeGetContent (field));
2998     } else if (!strcmp (field->name, "peer")) {
2999       peer = xmlNodeGetContent (field);
3000     }
3001     field = field->next;
3002   }
3003   g_return_if_fail (pad != NULL);
3004
3005   if (peer == NULL)
3006     return;
3007
3008   split = g_strsplit (peer, ".", 2);
3009
3010   if (split[0] == NULL || split[1] == NULL) {
3011     GST_CAT_DEBUG (GST_CAT_XML,
3012         "Could not parse peer '%s' for pad %s:%s, leaving unlinked",
3013         peer, GST_DEBUG_PAD_NAME (pad));
3014     return;
3015   }
3016
3017   g_return_if_fail (split[0] != NULL);
3018   g_return_if_fail (split[1] != NULL);
3019
3020   grandparent = gst_object_get_parent (parent);
3021
3022   if (grandparent && GST_IS_BIN (grandparent)) {
3023     target = gst_bin_get_by_name_recurse_up (GST_BIN (grandparent), split[0]);
3024   } else
3025     goto cleanup;
3026
3027   if (target == NULL)
3028     goto cleanup;
3029
3030   targetpad = gst_element_get_pad (target, split[1]);
3031
3032   if (targetpad == NULL)
3033     goto cleanup;
3034
3035   gst_pad_link (pad, targetpad);
3036
3037 cleanup:
3038   g_strfreev (split);
3039 }
3040
3041 /**
3042  * gst_pad_save_thyself:
3043  * @pad: a #GstPad to save.
3044  * @parent: the parent #xmlNodePtr to save the description in.
3045  *
3046  * Saves the pad into an xml representation.
3047  *
3048  * Returns: the #xmlNodePtr representation of the pad.
3049  */
3050 static xmlNodePtr
3051 gst_pad_save_thyself (GstObject * object, xmlNodePtr parent)
3052 {
3053   GstRealPad *realpad;
3054   GstPad *peer;
3055
3056   g_return_val_if_fail (GST_IS_REAL_PAD (object), NULL);
3057
3058   realpad = GST_REAL_PAD (object);
3059
3060   xmlNewChild (parent, NULL, "name", GST_PAD_NAME (realpad));
3061   if (GST_RPAD_PEER (realpad) != NULL) {
3062     gchar *content;
3063
3064     peer = GST_PAD (GST_RPAD_PEER (realpad));
3065     /* first check to see if the peer's parent's parent is the same */
3066     /* we just save it off */
3067     content = g_strdup_printf ("%s.%s",
3068         GST_OBJECT_NAME (GST_PAD_PARENT (peer)), GST_PAD_NAME (peer));
3069     xmlNewChild (parent, NULL, "peer", content);
3070     g_free (content);
3071   } else
3072     xmlNewChild (parent, NULL, "peer", "");
3073
3074   return parent;
3075 }
3076
3077 /* FIXME: shouldn't it be gst_pad_ghost_* ?
3078  * dunno -- wingo 7 feb 2004
3079  */
3080 /**
3081  * gst_ghost_pad_save_thyself:
3082  * @pad: a ghost #GstPad to save.
3083  * @parent: the parent #xmlNodePtr to save the description in.
3084  *
3085  * Saves the ghost pad into an xml representation.
3086  *
3087  * Returns: the #xmlNodePtr representation of the pad.
3088  */
3089 xmlNodePtr
3090 gst_ghost_pad_save_thyself (GstPad * pad, xmlNodePtr parent)
3091 {
3092   xmlNodePtr self;
3093
3094   g_return_val_if_fail (GST_IS_GHOST_PAD (pad), NULL);
3095
3096   self = xmlNewChild (parent, NULL, "ghostpad", NULL);
3097   xmlNewChild (self, NULL, "name", GST_PAD_NAME (pad));
3098   xmlNewChild (self, NULL, "parent", GST_OBJECT_NAME (GST_PAD_PARENT (pad)));
3099
3100   /* FIXME FIXME FIXME! */
3101
3102   return self;
3103 }
3104 #endif /* GST_DISABLE_LOADSAVE */
3105
3106 static GstData *
3107 _invent_event (GstPad * pad, GstBuffer * buffer)
3108 {
3109   GstEvent *event;
3110   GstEventType event_type;
3111   guint64 offset;
3112
3113   if (GST_BUFFER_OFFSET_IS_VALID (buffer))
3114     event_type = GST_FORMAT_DEFAULT;
3115   else
3116     event_type = GST_FORMAT_UNDEFINED;
3117
3118   offset = GST_BUFFER_OFFSET (buffer);
3119
3120   if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) {
3121     GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
3122
3123     event = gst_event_new_discontinuous (TRUE,
3124         GST_FORMAT_TIME, timestamp, event_type, offset, GST_FORMAT_UNDEFINED);
3125     GST_CAT_WARNING (GST_CAT_SCHEDULING,
3126         "needed to invent a DISCONT (time %" G_GUINT64_FORMAT
3127         ") for %s:%s => %s:%s", timestamp,
3128         GST_DEBUG_PAD_NAME (GST_PAD_PEER (pad)), GST_DEBUG_PAD_NAME (pad));
3129   } else {
3130     event = gst_event_new_discontinuous (TRUE,
3131         event_type, offset, GST_FORMAT_UNDEFINED);
3132     GST_CAT_WARNING (GST_CAT_SCHEDULING,
3133         "needed to invent a DISCONT (no time) for %s:%s => %s:%s",
3134         GST_DEBUG_PAD_NAME (GST_PAD_PEER (pad)), GST_DEBUG_PAD_NAME (pad));
3135   }
3136
3137   return GST_DATA (event);
3138 }
3139
3140 /**
3141  * gst_pad_push:
3142  * @pad: a source #GstPad.
3143  * @data: the #GstData to push.
3144  *
3145  * Pushes a buffer or an event to the peer of @pad. @pad must be linked. May
3146  * only be called by @pad's parent.
3147  */
3148 void
3149 gst_pad_push (GstPad * pad, GstData * data)
3150 {
3151   GstRealPad *peer;
3152
3153   g_return_if_fail (GST_IS_PAD (pad));
3154   g_return_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SRC);
3155   g_return_if_fail (data != NULL);
3156
3157   DEBUG_DATA (pad, data, "gst_pad_push");
3158   if (!gst_probe_dispatcher_dispatch (&(GST_REAL_PAD (pad)->probedisp), &data))
3159     return;
3160
3161   if (!GST_PAD_IS_LINKED (pad)) {
3162     GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3163         "not pushing data %p as pad is unconnected", data);
3164     gst_data_unref (data);
3165     return;
3166   }
3167
3168   GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "pushing");
3169   peer = GST_RPAD_PEER (pad);
3170
3171   if (!peer) {
3172     g_warning ("push on pad %s:%s but it is unlinked",
3173         GST_DEBUG_PAD_NAME (pad));
3174   } else {
3175     if (!GST_IS_EVENT (data) && !GST_PAD_IS_ACTIVE (peer)) {
3176       g_warning ("push on peer of pad %s:%s but peer is not active",
3177           GST_DEBUG_PAD_NAME (pad));
3178       return;
3179     }
3180
3181     if (peer->chainhandler) {
3182       if (data) {
3183         GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3184             "calling chainhandler &%s of peer pad %s:%s",
3185             GST_DEBUG_FUNCPTR_NAME (peer->chainhandler),
3186             GST_DEBUG_PAD_NAME (GST_PAD (peer)));
3187         if (!gst_probe_dispatcher_dispatch (&peer->probedisp, &data))
3188           return;
3189
3190         (peer->chainhandler) (GST_PAD (peer), data);
3191         return;
3192       } else {
3193         g_warning ("trying to push a NULL buffer on pad %s:%s",
3194             GST_DEBUG_PAD_NAME (peer));
3195         return;
3196       }
3197     } else {
3198       g_warning ("internal error: push on pad %s:%s but it has no chainhandler",
3199           GST_DEBUG_PAD_NAME (peer));
3200     }
3201   }
3202   /* clean up the mess here */
3203   if (data != NULL)
3204     gst_data_unref (data);
3205 }
3206
3207 /**
3208  * gst_pad_pull:
3209  * @pad: a sink #GstPad.
3210  *
3211  * Pulls an event or a buffer from the peer pad. May only be called by @pad's
3212  * parent.
3213  *
3214  * Returns: a new #GstData from the peer pad.
3215  */
3216 GstData *
3217 gst_pad_pull (GstPad * pad)
3218 {
3219   GstRealPad *peer;
3220   GstData *data;
3221
3222   g_return_val_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SINK,
3223       GST_DATA (gst_event_new (GST_EVENT_INTERRUPT)));
3224
3225   peer = GST_RPAD_PEER (pad);
3226
3227   if (!peer) {
3228     GST_ELEMENT_ERROR (GST_PAD_PARENT (pad), CORE, PAD, (NULL),
3229         ("pull on pad %s:%s but it was unlinked", GST_DEBUG_PAD_NAME (pad)));
3230   } else {
3231   restart:
3232     if (peer->gethandler) {
3233       GstPadLink *link = GST_RPAD_LINK (pad);
3234
3235       GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
3236           "calling gethandler %s of peer pad %s:%s",
3237           GST_DEBUG_FUNCPTR_NAME (peer->gethandler), GST_DEBUG_PAD_NAME (peer));
3238
3239       if (link->temp_store) {
3240         g_assert (link->engaged);
3241         data = link->temp_store;
3242         link->temp_store = NULL;
3243       } else {
3244         data = (peer->gethandler) (GST_PAD (peer));
3245         /* refetch - we might have been relinked */
3246         link = GST_RPAD_LINK (pad);
3247         peer = GST_RPAD_PEER (pad);
3248       }
3249
3250       if (data) {
3251         if (!link->engaged) {
3252           g_assert (link->temp_store == NULL);
3253           if (GST_IS_BUFFER (data)) {
3254             link->temp_store = data;
3255             link->engaged = TRUE;
3256             data = _invent_event (pad, GST_BUFFER (data));
3257           } else if (GST_IS_EVENT (data) &&
3258               GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS &&
3259               GST_EVENT_DISCONT_NEW_MEDIA (data)) {
3260             link->engaged = TRUE;
3261             GST_CAT_LOG (GST_CAT_SCHEDULING,
3262                 "link engaged by discont event for pad %s:%s",
3263                 GST_DEBUG_PAD_NAME (pad));
3264           }
3265         }
3266         if (!gst_probe_dispatcher_dispatch (&peer->probedisp, &data))
3267           goto restart;
3268         DEBUG_DATA (pad, data, "gst_pad_pull returned");
3269         return data;
3270       }
3271
3272       /* no null buffers allowed */
3273       GST_ELEMENT_ERROR (GST_PAD_PARENT (pad), CORE, PAD, (NULL),
3274           ("NULL buffer during pull on %s:%s", GST_DEBUG_PAD_NAME (pad)));
3275     } else {
3276       GST_ELEMENT_ERROR (GST_PAD_PARENT (pad), CORE, PAD, (NULL),
3277           ("pull on pad %s:%s but the peer pad %s:%s has no gethandler",
3278               GST_DEBUG_PAD_NAME (pad), GST_DEBUG_PAD_NAME (peer)));
3279     }
3280   }
3281   data = GST_DATA (gst_event_new (GST_EVENT_INTERRUPT));
3282   DEBUG_DATA (pad, data, "gst_pad_pull returned created");
3283   return data;
3284 }
3285
3286 GstData *
3287 gst_pad_collect_array (GstScheduler * scheduler, GstPad ** selected,
3288     GstPad ** padlist)
3289 {
3290   GstSchedulerClass *klass = GST_SCHEDULER_GET_CLASS (scheduler);
3291
3292   if (!GST_FLAG_IS_SET (scheduler, GST_SCHEDULER_FLAG_NEW_API) ||
3293       !klass->pad_select) {
3294     /* better randomness? */
3295     if (selected)
3296       *selected = padlist[0];
3297     return gst_pad_pull (padlist[0]);
3298   } else {
3299     GstPad *select;
3300
3301     return klass->pad_select (scheduler, selected ? selected : &select,
3302         padlist);
3303   }
3304 }
3305
3306 /**
3307  * gst_pad_collectv:
3308  * @selected: set to the pad the buffer comes from if not NULL
3309  * @padlist: a #GList of sink pads.
3310  *
3311  * Waits for a buffer on any of the list of pads. Each #GstPad in @padlist must
3312  * belong to the same element and be owned by the caller.
3313  *
3314  * Returns: the #GstData that was available
3315  */
3316 GstData *
3317 gst_pad_collectv (GstPad ** selected, const GList * padlist)
3318 {
3319   /* need to use alloca here because we must not leak data */
3320   GstPad **pads;
3321   GstPad *test;
3322   GstElement *element = NULL;
3323   int i = 0;
3324
3325   g_return_val_if_fail (padlist != NULL, NULL);
3326   pads = g_alloca (sizeof (gpointer) * (g_list_length ((GList *) padlist) + 1));
3327   for (; padlist; padlist = g_list_next (padlist)) {
3328     test = GST_PAD (padlist->data);
3329     g_return_val_if_fail (GST_IS_PAD (test), NULL);
3330     g_return_val_if_fail (GST_PAD_IS_SINK (test), NULL);
3331     if (element) {
3332       g_return_val_if_fail (element == gst_pad_get_parent (test), NULL);
3333     } else {
3334       element = gst_pad_get_parent (test);
3335     }
3336     pads[i++] = test;
3337   }
3338   pads[i] = NULL;
3339
3340   return gst_pad_collect_array (GST_SCHEDULER (element), selected, pads);
3341 }
3342
3343 /**
3344  * gst_pad_collect:
3345  * @selected: set to the pad the buffer comes from if not NULL
3346  * @pad: first pad
3347  * @...: more sink pads.
3348  *
3349  * Waits for a buffer on the given set of pads.
3350  *
3351  * Returns: the #GstData that was available.
3352  */
3353 GstData *
3354 gst_pad_collect (GstPad ** selected, GstPad * pad, ...)
3355 {
3356   GstData *result;
3357   va_list var_args;
3358
3359   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
3360
3361   va_start (var_args, pad);
3362
3363   result = gst_pad_collect_valist (selected, pad, var_args);
3364
3365   va_end (var_args);
3366
3367   return result;
3368 }
3369
3370 /**
3371  * gst_pad_collect_valist:
3372  * @selected: set to the pad the buffer comes from if not NULL
3373  * @pad: first pad
3374  * @...: more sink pads.
3375  *
3376  * Waits for a buffer on the given set of pads.
3377  *
3378  * Returns: the #GstData that was available.
3379  */
3380 GstData *
3381 gst_pad_collect_valist (GstPad ** selected, GstPad * pad, va_list var_args)
3382 {
3383   GstPad **padlist;
3384   GstElement *element = NULL;
3385   gint i = 0, maxlength;
3386
3387   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
3388
3389   element = gst_pad_get_parent (pad);
3390   maxlength = element->numsinkpads;
3391   /* can we make this list a bit smaller than this upper limit? */
3392   padlist = g_alloca (sizeof (gpointer) * (maxlength + 1));
3393   while (pad) {
3394     g_return_val_if_fail (i < maxlength, NULL);
3395     g_return_val_if_fail (element == gst_pad_get_parent (pad), NULL);
3396     padlist[i++] = pad;
3397     pad = va_arg (var_args, GstPad *);
3398   }
3399   return gst_pad_collect_array (GST_SCHEDULER (element), selected, padlist);
3400 }
3401
3402 /**
3403  * gst_pad_selectv:
3404  * @padlist: a #GList of sink pads.
3405  *
3406  * Waits for a buffer on any of the list of pads. Each #GstPad in @padlist must
3407  * be owned by the calling code.
3408  *
3409  * Returns: the #GstPad that has a buffer available. 
3410  * Use #gst_pad_pull() to get the buffer.
3411  */
3412 GstPad *
3413 gst_pad_selectv (GList * padlist)
3414 {
3415   return NULL;
3416 }
3417
3418 /**
3419  * gst_pad_select_valist:
3420  * @pad: a first #GstPad to perform the select on.
3421  * @varargs: A va_list of more pads to select on.
3422  *
3423  * Waits for a buffer on the given set of pads.
3424  *
3425  * Returns: the #GstPad that has a buffer available.
3426  * Use #gst_pad_pull() to get the buffer.
3427  */
3428 GstPad *
3429 gst_pad_select_valist (GstPad * pad, va_list var_args)
3430 {
3431   GstPad *result;
3432   GList *padlist = NULL;
3433
3434   if (pad == NULL)
3435     return NULL;
3436
3437   while (pad) {
3438     padlist = g_list_prepend (padlist, pad);
3439     pad = va_arg (var_args, GstPad *);
3440   }
3441   result = gst_pad_selectv (padlist);
3442   g_list_free (padlist);
3443
3444   return result;
3445 }
3446
3447 /**
3448  * gst_pad_select:
3449  * @pad: a first sink #GstPad to perform the select on.
3450  * @...: A NULL-terminated list of more pads to select on.
3451  *
3452  * Waits for a buffer on the given set of pads.
3453  *
3454  * Returns: the #GstPad that has a buffer available.
3455  * Use #gst_pad_pull() to get the buffer.
3456  */
3457 GstPad *
3458 gst_pad_select (GstPad * pad, ...)
3459 {
3460   GstPad *result;
3461   va_list var_args;
3462
3463   if (pad == NULL)
3464     return NULL;
3465
3466   va_start (var_args, pad);
3467
3468   result = gst_pad_select_valist (pad, var_args);
3469
3470   va_end (var_args);
3471
3472   return result;
3473 }
3474
3475 /************************************************************************
3476  *
3477  * templates
3478  *
3479  */
3480 static void gst_pad_template_class_init (GstPadTemplateClass * klass);
3481 static void gst_pad_template_init (GstPadTemplate * templ);
3482 static void gst_pad_template_dispose (GObject * object);
3483
3484 GType
3485 gst_pad_template_get_type (void)
3486 {
3487   static GType padtemplate_type = 0;
3488
3489   if (!padtemplate_type) {
3490     static const GTypeInfo padtemplate_info = {
3491       sizeof (GstPadTemplateClass), NULL, NULL,
3492       (GClassInitFunc) gst_pad_template_class_init, NULL, NULL,
3493       sizeof (GstPadTemplate),
3494       0,
3495       (GInstanceInitFunc) gst_pad_template_init, NULL
3496     };
3497
3498     padtemplate_type =
3499         g_type_register_static (GST_TYPE_OBJECT, "GstPadTemplate",
3500         &padtemplate_info, 0);
3501   }
3502   return padtemplate_type;
3503 }
3504
3505 static void
3506 gst_pad_template_class_init (GstPadTemplateClass * klass)
3507 {
3508   GObjectClass *gobject_class;
3509   GstObjectClass *gstobject_class;
3510
3511   gobject_class = (GObjectClass *) klass;
3512   gstobject_class = (GstObjectClass *) klass;
3513
3514   padtemplate_parent_class = g_type_class_ref (GST_TYPE_OBJECT);
3515
3516   gst_pad_template_signals[TEMPL_PAD_CREATED] =
3517       g_signal_new ("pad-created", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
3518       G_STRUCT_OFFSET (GstPadTemplateClass, pad_created),
3519       NULL, NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
3520
3521   gobject_class->dispose = gst_pad_template_dispose;
3522
3523   gstobject_class->path_string_separator = "*";
3524 }
3525
3526 static void
3527 gst_pad_template_init (GstPadTemplate * templ)
3528 {
3529 }
3530
3531 static void
3532 gst_pad_template_dispose (GObject * object)
3533 {
3534   GstPadTemplate *templ = GST_PAD_TEMPLATE (object);
3535
3536   g_free (GST_PAD_TEMPLATE_NAME_TEMPLATE (templ));
3537   if (GST_PAD_TEMPLATE_CAPS (templ)) {
3538     gst_caps_free (GST_PAD_TEMPLATE_CAPS (templ));
3539   }
3540
3541   G_OBJECT_CLASS (padtemplate_parent_class)->dispose (object);
3542 }
3543
3544 /* ALWAYS padtemplates cannot have conversion specifications, it doesn't make
3545  * sense.
3546  * SOMETIMES padtemplates can do whatever they want, they are provided by the
3547  * element.
3548  * REQUEST padtemplates can be reverse-parsed (the user asks for 'sink1', the
3549  * 'sink%d' template is automatically selected), so we need to restrict their
3550  * naming.
3551  */
3552 static gboolean
3553 name_is_valid (const gchar * name, GstPadPresence presence)
3554 {
3555   const gchar *str;
3556
3557   if (presence == GST_PAD_ALWAYS) {
3558     if (strchr (name, '%')) {
3559       g_warning ("invalid name template %s: conversion specifications are not"
3560           " allowed for GST_PAD_ALWAYS padtemplates", name);
3561       return FALSE;
3562     }
3563   } else if (presence == GST_PAD_REQUEST) {
3564     if ((str = strchr (name, '%')) && strchr (str + 1, '%')) {
3565       g_warning ("invalid name template %s: only one conversion specification"
3566           " allowed in GST_PAD_REQUEST padtemplate", name);
3567       return FALSE;
3568     }
3569     if (str && (*(str + 1) != 's' && *(str + 1) != 'd')) {
3570       g_warning ("invalid name template %s: conversion specification must be of"
3571           " type '%%d' or '%%s' for GST_PAD_REQUEST padtemplate", name);
3572       return FALSE;
3573     }
3574     if (str && (*(str + 2) != '\0')) {
3575       g_warning ("invalid name template %s: conversion specification must"
3576           " appear at the end of the GST_PAD_REQUEST padtemplate name", name);
3577       return FALSE;
3578     }
3579   }
3580
3581   return TRUE;
3582 }
3583
3584 /**
3585  * gst_static_pad_template_get:
3586  * @pad_template: the static pad template
3587  *
3588  * Converts a #GstStaticPadTemplate into a #GstPadTemplate.
3589  *
3590  * Returns: a new #GstPadTemplate.
3591  */
3592 GstPadTemplate *
3593 gst_static_pad_template_get (GstStaticPadTemplate * pad_template)
3594 {
3595   GstPadTemplate *new;
3596
3597   if (!name_is_valid (pad_template->name_template, pad_template->presence))
3598     return NULL;
3599
3600   new = g_object_new (gst_pad_template_get_type (),
3601       "name", pad_template->name_template, NULL);
3602
3603   GST_PAD_TEMPLATE_NAME_TEMPLATE (new) = g_strdup (pad_template->name_template);
3604   GST_PAD_TEMPLATE_DIRECTION (new) = pad_template->direction;
3605   GST_PAD_TEMPLATE_PRESENCE (new) = pad_template->presence;
3606
3607   GST_PAD_TEMPLATE_CAPS (new) =
3608       gst_caps_copy (gst_static_caps_get (&pad_template->static_caps));
3609
3610   return new;
3611 }
3612
3613 /**
3614  * gst_pad_template_new:
3615  * @name_template: the name template.
3616  * @direction: the #GstPadDirection of the template.
3617  * @presence: the #GstPadPresence of the pad.
3618  * @caps: a #GstCaps set for the template. The caps are taken ownership of.
3619  *
3620  * Creates a new pad template with a name according to the given template
3621  * and with the given arguments. This functions takes ownership of the provided
3622  * caps, so be sure to not use them afterwards.
3623  *
3624  * Returns: a new #GstPadTemplate.
3625  */
3626 GstPadTemplate *
3627 gst_pad_template_new (const gchar * name_template,
3628     GstPadDirection direction, GstPadPresence presence, GstCaps * caps)
3629 {
3630   GstPadTemplate *new;
3631
3632   g_return_val_if_fail (name_template != NULL, NULL);
3633   g_return_val_if_fail (caps != NULL, NULL);
3634
3635   if (!name_is_valid (name_template, presence))
3636     return NULL;
3637
3638 #if 0
3639 #ifdef USE_POISONING
3640   if (caps) {
3641     GstCaps *newcaps = gst_caps_copy (caps);
3642
3643     gst_caps_free (caps);
3644     caps = newcaps;
3645   }
3646 #endif
3647 #endif
3648   new = g_object_new (gst_pad_template_get_type (),
3649       "name", name_template, NULL);
3650
3651   GST_PAD_TEMPLATE_NAME_TEMPLATE (new) = g_strdup (name_template);
3652   GST_PAD_TEMPLATE_DIRECTION (new) = direction;
3653   GST_PAD_TEMPLATE_PRESENCE (new) = presence;
3654   gst_caps_do_simplify (caps);
3655   GST_PAD_TEMPLATE_CAPS (new) = caps;
3656
3657   return new;
3658 }
3659
3660 /**
3661  * gst_pad_template_get_caps:
3662  * @templ: a #GstPadTemplate to get capabilities of.
3663  *
3664  * Gets the capabilities of the pad template.
3665  *
3666  * Returns: the #GstCaps of the pad template. If you need to keep a reference to
3667  * the caps, make a copy (see gst_caps_copy ()).
3668  */
3669 const GstCaps *
3670 gst_pad_template_get_caps (GstPadTemplate * templ)
3671 {
3672   g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
3673
3674   return GST_PAD_TEMPLATE_CAPS (templ);
3675 }
3676
3677 /**
3678  * gst_pad_set_element_private:
3679  * @pad: the #GstPad to set the private data of.
3680  * @priv: The private data to attach to the pad.
3681  *
3682  * Set the given private data gpointer on the pad. 
3683  * This function can only be used by the element that owns the pad.
3684  */
3685 void
3686 gst_pad_set_element_private (GstPad * pad, gpointer priv)
3687 {
3688   pad->element_private = priv;
3689 }
3690
3691 /**
3692  * gst_pad_get_element_private:
3693  * @pad: the #GstPad to get the private data of.
3694  *
3695  * Gets the private data of a pad.
3696  *
3697  * Returns: a #gpointer to the private data.
3698  */
3699 gpointer
3700 gst_pad_get_element_private (GstPad * pad)
3701 {
3702   return pad->element_private;
3703 }
3704
3705
3706 /***** ghost pads *****/
3707 GType _gst_ghost_pad_type = 0;
3708
3709 static void gst_ghost_pad_class_init (GstGhostPadClass * klass);
3710 static void gst_ghost_pad_init (GstGhostPad * pad);
3711 static void gst_ghost_pad_dispose (GObject * object);
3712 static void gst_ghost_pad_get_property (GObject * object, guint prop_id,
3713     GValue * value, GParamSpec * pspec);
3714 static void gst_ghost_pad_set_property (GObject * object, guint prop_id,
3715     const GValue * value, GParamSpec * pspec);
3716
3717 static GstPad *ghost_pad_parent_class = NULL;
3718
3719 /* static guint gst_ghost_pad_signals[LAST_SIGNAL] = { 0 }; */
3720 enum
3721 {
3722   GPAD_ARG_0,
3723   GPAD_ARG_REAL_PAD
3724       /* fill me */
3725 };
3726
3727 GType
3728 gst_ghost_pad_get_type (void)
3729 {
3730   if (!_gst_ghost_pad_type) {
3731     static const GTypeInfo pad_info = {
3732       sizeof (GstGhostPadClass), NULL, NULL,
3733       (GClassInitFunc) gst_ghost_pad_class_init, NULL, NULL,
3734       sizeof (GstGhostPad),
3735       0,
3736       (GInstanceInitFunc) gst_ghost_pad_init,
3737       NULL
3738     };
3739
3740     _gst_ghost_pad_type = g_type_register_static (GST_TYPE_PAD, "GstGhostPad",
3741         &pad_info, 0);
3742   }
3743   return _gst_ghost_pad_type;
3744 }
3745
3746 static void
3747 gst_ghost_pad_class_init (GstGhostPadClass * klass)
3748 {
3749   GObjectClass *gobject_class;
3750
3751   gobject_class = (GObjectClass *) klass;
3752
3753   ghost_pad_parent_class = g_type_class_ref (GST_TYPE_PAD);
3754
3755   gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_ghost_pad_dispose);
3756   gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_ghost_pad_set_property);
3757   gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_ghost_pad_get_property);
3758
3759   g_object_class_install_property (gobject_class, GPAD_ARG_REAL_PAD,
3760       g_param_spec_object ("real-pad", "Real pad",
3761           "The real pad for the ghost pad", GST_TYPE_PAD, G_PARAM_READWRITE));
3762 }
3763
3764 static void
3765 gst_ghost_pad_init (GstGhostPad * pad)
3766 {
3767   /* zeroed by glib */
3768 }
3769
3770 static void
3771 gst_ghost_pad_dispose (GObject * object)
3772 {
3773   g_object_set (object, "real-pad", NULL, NULL);
3774
3775   G_OBJECT_CLASS (ghost_pad_parent_class)->dispose (object);
3776 }
3777
3778 static void
3779 gst_ghost_pad_set_property (GObject * object, guint prop_id,
3780     const GValue * value, GParamSpec * pspec)
3781 {
3782   GstPad *ghostpad = (GstPad *) object;
3783   GstPad *oldrealpad = (GstPad *) GST_GPAD_REALPAD (ghostpad);
3784   GstPad *realpad = NULL;
3785
3786   switch (prop_id) {
3787     case GPAD_ARG_REAL_PAD:
3788       realpad = g_value_get_object (value);
3789
3790       if (oldrealpad) {
3791         if (realpad == oldrealpad)
3792           return;
3793         else
3794           gst_pad_remove_ghost_pad (oldrealpad, ghostpad);
3795       }
3796
3797       if (realpad)
3798         gst_pad_add_ghost_pad (realpad, ghostpad);
3799       break;
3800
3801     default:
3802       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3803       break;
3804   }
3805 }
3806
3807 static void
3808 gst_ghost_pad_get_property (GObject * object, guint prop_id,
3809     GValue * value, GParamSpec * pspec)
3810 {
3811   switch (prop_id) {
3812     case GPAD_ARG_REAL_PAD:
3813       g_value_set_object (value, GST_GPAD_REALPAD (object));
3814       break;
3815
3816     default:
3817       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3818       break;
3819   }
3820 }
3821
3822 /**
3823  * gst_ghost_pad_new:
3824  * @name: the name of the new ghost pad.
3825  * @pad: the #GstPad to create a ghost pad for.
3826  *
3827  * Creates a new ghost pad associated with @pad, and named @name. If @name is
3828  * %NULL, a guaranteed unique name (across all ghost pads) will be assigned.
3829  *
3830  * Returns: a new ghost #GstPad, or %NULL in case of an error.
3831  */
3832 GstPad *
3833 gst_ghost_pad_new (const gchar * name, GstPad * pad)
3834 {
3835   GstPad *gpad;
3836
3837   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
3838
3839   gpad = g_object_new (GST_TYPE_GHOST_PAD, "name", name, "real-pad", pad, NULL);
3840
3841   GST_CAT_DEBUG (GST_CAT_PADS, "created ghost pad \"%s\" for pad %s:%s",
3842       GST_OBJECT_NAME (gpad), GST_DEBUG_PAD_NAME (pad));
3843
3844   return gpad;
3845 }
3846
3847 /**
3848  * gst_pad_get_internal_links_default:
3849  * @pad: the #GstPad to get the internal links of.
3850  *
3851  * Gets a list of pads to which the given pad is linked to
3852  * inside of the parent element.
3853  * This is the default handler, and thus returns a list of all of the
3854  * pads inside the parent element with opposite direction.
3855  * The caller must free this list after use.
3856  *
3857  * Returns: a newly allocated #GList of pads.
3858  */
3859 GList *
3860 gst_pad_get_internal_links_default (GstPad * pad)
3861 {
3862   GList *res = NULL;
3863   GstElement *parent;
3864   GList *parent_pads;
3865   GstPadDirection direction;
3866   GstRealPad *rpad;
3867
3868   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3869
3870   rpad = GST_PAD_REALIZE (pad);
3871   direction = rpad->direction;
3872
3873   parent = GST_PAD_PARENT (rpad);
3874   parent_pads = parent->pads;
3875
3876   while (parent_pads) {
3877     GstRealPad *parent_pad = GST_PAD_REALIZE (parent_pads->data);
3878
3879     if (parent_pad->direction != direction) {
3880       res = g_list_prepend (res, parent_pad);
3881     }
3882
3883     parent_pads = g_list_next (parent_pads);
3884   }
3885
3886   return res;
3887 }
3888
3889 /**
3890  * gst_pad_get_internal_links:
3891  * @pad: the #GstPad to get the internal links of.
3892  *
3893  * Gets a list of pads to which the given pad is linked to
3894  * inside of the parent element.
3895  * The caller must free this list after use.
3896  *
3897  * Returns: a newly allocated #GList of pads.
3898  */
3899 GList *
3900 gst_pad_get_internal_links (GstPad * pad)
3901 {
3902   GList *res = NULL;
3903   GstRealPad *rpad;
3904
3905   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
3906
3907   rpad = GST_PAD_REALIZE (pad);
3908
3909   if (GST_RPAD_INTLINKFUNC (rpad))
3910     res = GST_RPAD_INTLINKFUNC (rpad) (GST_PAD (rpad));
3911
3912   return res;
3913 }
3914
3915
3916 static gboolean
3917 gst_pad_event_default_dispatch (GstPad * pad, GstElement * element,
3918     GstEvent * event)
3919 {
3920   GList *orig, *pads;
3921
3922   GST_INFO_OBJECT (pad, "Sending event %p to all internally linked pads",
3923       event);
3924
3925   orig = pads = gst_pad_get_internal_links (pad);
3926
3927   while (pads) {
3928     GstPad *eventpad = GST_PAD (pads->data);
3929
3930     pads = g_list_next (pads);
3931
3932     /* for all of the internally-linked pads that are actually linked */
3933     if (GST_PAD_IS_LINKED (eventpad)) {
3934       if (GST_PAD_DIRECTION (eventpad) == GST_PAD_SRC) {
3935         /* increase the refcount */
3936         gst_event_ref (event);
3937         gst_pad_push (eventpad, GST_DATA (event));
3938       } else {
3939         GstPad *peerpad = GST_PAD (GST_RPAD_PEER (eventpad));
3940
3941         /* we only send the event on one pad, multi-sinkpad elements 
3942          * should implement a handler */
3943         g_list_free (orig);
3944         return gst_pad_send_event (peerpad, event);
3945       }
3946     }
3947   }
3948   gst_event_unref (event);
3949   g_list_free (orig);
3950   return (GST_PAD_DIRECTION (pad) == GST_PAD_SINK);
3951 }
3952
3953 /**
3954  * gst_pad_event_default:
3955  * @pad: a #GstPad to call the default event handler on.
3956  * @event: the #GstEvent to handle.
3957  *
3958  * Invokes the default event handler for the given pad. End-of-stream and
3959  * discontinuity events are handled specially, and then the event is sent to all
3960  * pads internally linked to @pad. Note that if there are many possible sink
3961  * pads that are internally linked to @pad, only one will be sent an event.
3962  * Multi-sinkpad elements should implement custom event handlers.
3963  *
3964  * Returns: TRUE if the event was sent succesfully.
3965  */
3966 gboolean
3967 gst_pad_event_default (GstPad * pad, GstEvent * event)
3968 {
3969   GstElement *element;
3970
3971   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3972   g_return_val_if_fail (event != NULL, FALSE);
3973
3974   element = GST_PAD_PARENT (pad);
3975
3976   switch (GST_EVENT_TYPE (event)) {
3977     case GST_EVENT_EOS:
3978       gst_pad_event_default_dispatch (pad, element, event);
3979       gst_element_set_eos (element);
3980       break;
3981     case GST_EVENT_DISCONTINUOUS:
3982     {
3983       guint64 time;
3984
3985       if (gst_element_requires_clock (element) && element->clock) {
3986         if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &time)) {
3987           gst_element_set_time (element, time);
3988         } else {
3989           GstFormat format = GST_FORMAT_TIME;
3990           guint i;
3991
3992           for (i = 0; i < event->event_data.discont.noffsets; i++) {
3993             if (gst_pad_convert (pad,
3994                     event->event_data.discont.offsets[i].format,
3995                     event->event_data.discont.offsets[i].value, &format,
3996                     &time)) {
3997               gst_element_set_time (element, time);
3998             } else if (i == event->event_data.discont.noffsets) {
3999               g_warning
4000                   ("can't adjust clock to new time when time not provided");
4001             }
4002           }
4003         }
4004       }
4005     }
4006     default:
4007       return gst_pad_event_default_dispatch (pad, element, event);
4008   }
4009   return TRUE;
4010 }
4011
4012 /**
4013  * gst_pad_dispatcher:
4014  * @pad: a #GstPad to dispatch.
4015  * @dispatch: the #GstDispatcherFunction to call.
4016  * @data: gpointer user data passed to the dispatcher function.
4017  *
4018  * Invokes the given dispatcher function on all pads that are 
4019  * internally linked to the given pad. 
4020  * The GstPadDispatcherFunction should return TRUE when no further pads 
4021  * need to be processed.
4022  *
4023  * Returns: TRUE if one of the dispatcher functions returned TRUE.
4024  */
4025 gboolean
4026 gst_pad_dispatcher (GstPad * pad, GstPadDispatcherFunction dispatch,
4027     gpointer data)
4028 {
4029   gboolean res = FALSE;
4030   GList *int_pads, *orig;
4031
4032   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4033   g_return_val_if_fail (dispatch != NULL, FALSE);
4034
4035   orig = int_pads = gst_pad_get_internal_links (pad);
4036
4037   while (int_pads) {
4038     GstRealPad *int_rpad = GST_PAD_REALIZE (int_pads->data);
4039     GstRealPad *int_peer = GST_RPAD_PEER (int_rpad);
4040
4041     if (int_peer) {
4042       res = dispatch (GST_PAD (int_peer), data);
4043       if (res)
4044         break;
4045     }
4046     int_pads = g_list_next (int_pads);
4047   }
4048
4049   g_list_free (orig);
4050
4051   return res;
4052 }
4053
4054 /**
4055  * gst_pad_send_event:
4056  * @pad: a #GstPad to send the event to.
4057  * @event: the #GstEvent to send to the pad.
4058  *
4059  * Sends the event to the pad.
4060  *
4061  * Returns: TRUE if the event was handled.
4062  */
4063 gboolean
4064 gst_pad_send_event (GstPad * pad, GstEvent * event)
4065 {
4066   gboolean success = FALSE;
4067   GstRealPad *rpad;
4068
4069   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4070   g_return_val_if_fail (event != NULL, FALSE);
4071
4072   rpad = GST_PAD_REALIZE (pad);
4073
4074   if (GST_EVENT_SRC (event) == NULL)
4075     GST_EVENT_SRC (event) = gst_object_ref (GST_OBJECT (rpad));
4076
4077   GST_CAT_DEBUG (GST_CAT_EVENT, "have event %d on pad %s:%s",
4078       GST_EVENT_TYPE (event), GST_DEBUG_PAD_NAME (rpad));
4079
4080   if (GST_RPAD_EVENTHANDLER (rpad))
4081     success = GST_RPAD_EVENTHANDLER (rpad) (GST_PAD (rpad), event);
4082   else {
4083     g_warning ("pad %s:%s has no event handler", GST_DEBUG_PAD_NAME (rpad));
4084     gst_event_unref (event);
4085   }
4086
4087   return success;
4088 }
4089
4090 typedef struct
4091 {
4092   GstFormat src_format;
4093   gint64 src_value;
4094   GstFormat *dest_format;
4095   gint64 *dest_value;
4096 }
4097 GstPadConvertData;
4098
4099 static gboolean
4100 gst_pad_convert_dispatcher (GstPad * pad, GstPadConvertData * data)
4101 {
4102   return gst_pad_convert (pad, data->src_format, data->src_value,
4103       data->dest_format, data->dest_value);
4104 }
4105
4106 /**
4107  * gst_pad_convert_default:
4108  * @pad: a #GstPad to invoke the default converter on.
4109  * @src_format: the source #GstFormat.
4110  * @src_value: the source value.
4111  * @dest_format: a pointer to the destination #GstFormat.
4112  * @dest_value: a pointer to the destination value.
4113  *
4114  * Invokes the default converter on a pad. 
4115  * This will forward the call to the pad obtained 
4116  * using the internal link of
4117  * the element.
4118  *
4119  * Returns: TRUE if the conversion could be performed.
4120  */
4121 gboolean
4122 gst_pad_convert_default (GstPad * pad,
4123     GstFormat src_format, gint64 src_value,
4124     GstFormat * dest_format, gint64 * dest_value)
4125 {
4126   GstPadConvertData data;
4127
4128   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4129   g_return_val_if_fail (dest_format != NULL, FALSE);
4130   g_return_val_if_fail (dest_value != NULL, FALSE);
4131
4132   data.src_format = src_format;
4133   data.src_value = src_value;
4134   data.dest_format = dest_format;
4135   data.dest_value = dest_value;
4136
4137   return gst_pad_dispatcher (pad, (GstPadDispatcherFunction)
4138       gst_pad_convert_dispatcher, &data);
4139 }
4140
4141 /**
4142  * gst_pad_convert:
4143  * @pad: a #GstPad to invoke the default converter on.
4144  * @src_format: the source #GstFormat.
4145  * @src_value: the source value.
4146  * @dest_format: a pointer to the destination #GstFormat.
4147  * @dest_value: a pointer to the destination value.
4148  *
4149  * Invokes a conversion on the pad.
4150  *
4151  * Returns: TRUE if the conversion could be performed.
4152  */
4153 gboolean
4154 gst_pad_convert (GstPad * pad,
4155     GstFormat src_format, gint64 src_value,
4156     GstFormat * dest_format, gint64 * dest_value)
4157 {
4158   GstRealPad *rpad;
4159
4160   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4161   g_return_val_if_fail (dest_format != NULL, FALSE);
4162   g_return_val_if_fail (dest_value != NULL, FALSE);
4163
4164   if (src_format == *dest_format) {
4165     *dest_value = src_value;
4166     return TRUE;
4167   }
4168
4169   rpad = GST_PAD_REALIZE (pad);
4170
4171   if (GST_RPAD_CONVERTFUNC (rpad)) {
4172     return GST_RPAD_CONVERTFUNC (rpad) (GST_PAD (rpad), src_format,
4173         src_value, dest_format, dest_value);
4174   }
4175
4176   return FALSE;
4177 }
4178
4179 typedef struct
4180 {
4181   GstQueryType type;
4182   GstFormat *format;
4183   gint64 *value;
4184 }
4185 GstPadQueryData;
4186
4187 static gboolean
4188 gst_pad_query_dispatcher (GstPad * pad, GstPadQueryData * data)
4189 {
4190   return gst_pad_query (pad, data->type, data->format, data->value);
4191 }
4192
4193 /**
4194  * gst_pad_query_default:
4195  * @pad: a #GstPad to invoke the default query on.
4196  * @type: the #GstQueryType of the query to perform.
4197  * @format: a pointer to the #GstFormat of the result.
4198  * @value: a pointer to the result.
4199  *
4200  * Invokes the default query function on a pad. 
4201  *
4202  * Returns: TRUE if the query could be performed.
4203  */
4204 gboolean
4205 gst_pad_query_default (GstPad * pad, GstQueryType type,
4206     GstFormat * format, gint64 * value)
4207 {
4208   GstPadQueryData data;
4209
4210   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4211   g_return_val_if_fail (format != NULL, FALSE);
4212   g_return_val_if_fail (value != NULL, FALSE);
4213
4214   data.type = type;
4215   data.format = format;
4216   data.value = value;
4217
4218   return gst_pad_dispatcher (pad, (GstPadDispatcherFunction)
4219       gst_pad_query_dispatcher, &data);
4220 }
4221
4222 /**
4223  * gst_pad_query:
4224  * @pad: a #GstPad to invoke the default query on.
4225  * @type: the #GstQueryType of the query to perform.
4226  * @format: a pointer to the #GstFormat asked for.
4227  *          On return contains the #GstFormat used.
4228  * @value: a pointer to the result.
4229  *
4230  * Queries a pad for one of the available properties. The format will be
4231  * adjusted to the actual format used when specifying formats such as 
4232  * GST_FORMAT_DEFAULT.
4233  * FIXME: Tell if the format can be adjusted when specifying a definite format.
4234  *
4235  * Returns: TRUE if the query could be performed.
4236  */
4237 gboolean
4238 gst_pad_query (GstPad * pad, GstQueryType type,
4239     GstFormat * format, gint64 * value)
4240 {
4241   GstRealPad *rpad;
4242
4243   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
4244   g_return_val_if_fail (format != NULL, FALSE);
4245   g_return_val_if_fail (value != NULL, FALSE);
4246
4247   rpad = GST_PAD_REALIZE (pad);
4248
4249   g_return_val_if_fail (rpad, FALSE);
4250
4251   if (GST_RPAD_QUERYFUNC (rpad))
4252     return GST_RPAD_QUERYFUNC (rpad) (GST_PAD (pad), type, format, value);
4253
4254   return FALSE;
4255 }
4256
4257 static gboolean
4258 gst_pad_get_formats_dispatcher (GstPad * pad, const GstFormat ** data)
4259 {
4260   *data = gst_pad_get_formats (pad);
4261
4262   return TRUE;
4263 }
4264
4265 /**
4266  * gst_pad_get_formats_default:
4267  * @pad: a #GstPad to query
4268  *
4269  * Invoke the default format dispatcher for the pad.
4270  *
4271  * Returns: An array of GstFormats ended with a 0 value.
4272  */
4273 const GstFormat *
4274 gst_pad_get_formats_default (GstPad * pad)
4275 {
4276   GstFormat *result = NULL;
4277
4278   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
4279
4280   gst_pad_dispatcher (pad, (GstPadDispatcherFunction)
4281       gst_pad_get_formats_dispatcher, &result);
4282
4283   return result;
4284 }
4285
4286 /**
4287  * gst_pad_get_formats:
4288  * @pad: a #GstPad to query
4289  *
4290  * Gets the list of supported formats from the pad.
4291  *
4292  * Returns: An array of GstFormats ended with a 0 value.
4293  */
4294 const GstFormat *
4295 gst_pad_get_formats (GstPad * pad)
4296 {
4297   GstRealPad *rpad;
4298
4299   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
4300
4301   rpad = GST_PAD_REALIZE (pad);
4302
4303   if (GST_RPAD_FORMATSFUNC (rpad))
4304     return GST_RPAD_FORMATSFUNC (rpad) (GST_PAD (pad));
4305
4306   return NULL;
4307 }
4308
4309 #define CALL_CHAINFUNC(pad, data) G_STMT_START {\
4310   GstData *__temp = (data); \
4311   DEBUG_DATA (pad, __temp, "calling chain function with "); \
4312   if (GST_IS_EVENT (__temp) && \
4313       !GST_FLAG_IS_SET (gst_pad_get_parent (pad), GST_ELEMENT_EVENT_AWARE)) { \
4314     gst_pad_send_event (pad, GST_EVENT (__temp)); \
4315   } else { \
4316     GST_RPAD_CHAINFUNC (pad) (pad, __temp); \
4317   } \
4318 }G_STMT_END
4319 /**
4320  * gst_pad_call_chain_function:
4321  * @pad: sink pad to call chain function on
4322  * @data: data to call the chain function with
4323  *
4324  * Calls the chain function of the given pad while making sure the internal
4325  * consistency is kept. Use this function inside schedulers instead of calling
4326  * the chain function yourself.
4327  */
4328 void
4329 gst_pad_call_chain_function (GstPad * pad, GstData * data)
4330 {
4331   GstPadLink *link;
4332
4333   g_return_if_fail (GST_IS_REAL_PAD (pad));
4334   g_return_if_fail (GST_PAD_IS_SINK (pad));
4335   g_return_if_fail (data != NULL);
4336   g_return_if_fail (GST_RPAD_CHAINFUNC (pad) != NULL);
4337   g_return_if_fail (GST_RPAD_LINK (pad) != NULL);
4338
4339   link = GST_RPAD_LINK (pad);
4340   if (!link->engaged) {
4341     g_assert (link->temp_store == NULL);
4342     if (GST_IS_BUFFER (data)) {
4343       link->temp_store = data;
4344       link->engaged = TRUE;
4345       CALL_CHAINFUNC (pad, _invent_event (pad, GST_BUFFER (data)));
4346       link = GST_RPAD_LINK (pad);
4347       if (link->temp_store == NULL)     /* happens after relinking in chainfunc */
4348         return;
4349       g_assert (link->temp_store == data);
4350       link->temp_store = NULL;
4351     } else if (GST_IS_EVENT (data) &&
4352         GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS &&
4353         GST_EVENT_DISCONT_NEW_MEDIA (data)) {
4354       link->engaged = TRUE;
4355       GST_CAT_LOG (GST_CAT_SCHEDULING,
4356           "link engaged by discont event for pad %s:%s",
4357           GST_DEBUG_PAD_NAME (pad));
4358     }
4359   }
4360   CALL_CHAINFUNC (pad, data);
4361 }
4362
4363 /**
4364  * gst_pad_call_get_function:
4365  * @pad: sink pad to call chain function on
4366  *
4367  * Calls the get function of the given pad while making sure the internal
4368  * consistency is kept. Use this function inside schedulers instead of calling
4369  * the get function yourself.
4370  *
4371  * Returns: the data provided by the pad or NULL if no data was available.
4372  */
4373 GstData *
4374 gst_pad_call_get_function (GstPad * pad)
4375 {
4376   GstData *data;
4377
4378   g_return_val_if_fail (GST_IS_REAL_PAD (pad), NULL);
4379   g_return_val_if_fail (GST_PAD_IS_SRC (pad), NULL);
4380   g_return_val_if_fail (GST_RPAD_GETFUNC (pad) != NULL, NULL);
4381
4382   data = GST_RPAD_GETFUNC (pad) (pad);
4383   DEBUG_DATA (pad, data, "getfunction returned");
4384   return data;
4385 }