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