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