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