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