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