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