element: Consider GstPadTemplate as immutable
[platform/upstream/gstreamer.git] / gst / gstelement.c
1 /* GStreamer
2  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3  *                    2004 Wim Taymans <wim@fluendo.com>
4  *
5  * gstelement.c: The base element, all elements derive from this
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 /**
24  * SECTION:gstelement
25  * @short_description: Abstract base class for all pipeline elements
26  * @see_also: #GstElementFactory, #GstPad
27  *
28  * GstElement is the abstract base class needed to construct an element that
29  * can be used in a GStreamer pipeline. Please refer to the plugin writers
30  * guide for more information on creating #GstElement subclasses.
31  *
32  * The name of a #GstElement can be get with gst_element_get_name() and set with
33  * gst_element_set_name().  For speed, GST_ELEMENT_NAME() can be used in the
34  * core when using the appropriate locking. Do not use this in plug-ins or
35  * applications in order to retain ABI compatibility.
36  *
37  * All elements have pads (of the type #GstPad).  These pads link to pads on
38  * other elements.  #GstBuffer flow between these linked pads.
39  * A #GstElement has a #GList of #GstPad structures for all their input (or sink)
40  * and output (or source) pads.
41  * Core and plug-in writers can add and remove pads with gst_element_add_pad()
42  * and gst_element_remove_pad().
43  *
44  * A pad of an element can be retrieved by name with gst_element_get_pad().
45  * An iterator of all pads can be retrieved with gst_element_iterate_pads().
46  *
47  * Elements can be linked through their pads.
48  * If the link is straightforward, use the gst_element_link()
49  * convenience function to link two elements, or gst_element_link_many()
50  * for more elements in a row.
51  * Use gst_element_link_filtered() to link two elements constrained by
52  * a specified set of #GstCaps.
53  * For finer control, use gst_element_link_pads() and
54  * gst_element_link_pads_filtered() to specify the pads to link on
55  * each element by name.
56  *
57  * Each element has a state (see #GstState).  You can get and set the state
58  * of an element with gst_element_get_state() and gst_element_set_state().
59  * Setting a state triggers a #GstStateChange. To get a string representation
60  * of a #GstState, use gst_element_state_get_name().
61  *
62  * You can get and set a #GstClock on an element using gst_element_get_clock()
63  * and gst_element_set_clock().
64  * Some elements can provide a clock for the pipeline if
65  * gst_element_provides_clock() returns %TRUE. With the
66  * gst_element_provide_clock() method one can retrieve the clock provided by
67  * such an element.
68  * Not all elements require a clock to operate correctly. If
69  * gst_element_requires_clock() returns %TRUE, a clock should be set on the
70  * element with gst_element_set_clock().
71  *
72  * Note that clock slection and distribution is normally handled by the
73  * toplevel #GstPipeline so the clock functions are only to be used in very
74  * specific situations.
75  *
76  * Last reviewed on 2009-05-29 (0.10.24)
77  */
78
79 #include "gst_private.h"
80 #include <glib.h>
81 #include <stdarg.h>
82 #include <gobject/gvaluecollector.h>
83
84 #include "gstelement.h"
85 #include "gstelementmetadata.h"
86 #include "gstenumtypes.h"
87 #include "gstbus.h"
88 #include "gstmarshal.h"
89 #include "gsterror.h"
90 #include "gstevent.h"
91 #include "gstutils.h"
92 #include "gstinfo.h"
93 #include "gstvalue.h"
94 #include "gst-i18n-lib.h"
95
96 /* Element signals and args */
97 enum
98 {
99   PAD_ADDED,
100   PAD_REMOVED,
101   NO_MORE_PADS,
102   /* add more above */
103   LAST_SIGNAL
104 };
105
106 enum
107 {
108   ARG_0
109       /* FILL ME */
110 };
111
112 static void gst_element_class_init (GstElementClass * klass);
113 static void gst_element_init (GstElement * element);
114 static void gst_element_base_class_init (gpointer g_class);
115 static void gst_element_base_class_finalize (gpointer g_class);
116
117 static void gst_element_dispose (GObject * object);
118 static void gst_element_finalize (GObject * object);
119
120 static GstStateChangeReturn gst_element_change_state_func (GstElement * element,
121     GstStateChange transition);
122 static GstStateChangeReturn gst_element_get_state_func (GstElement * element,
123     GstState * state, GstState * pending, GstClockTime timeout);
124 static GstStateChangeReturn gst_element_set_state_func (GstElement * element,
125     GstState state);
126 static void gst_element_set_bus_func (GstElement * element, GstBus * bus);
127
128 static gboolean gst_element_default_send_event (GstElement * element,
129     GstEvent * event);
130 static gboolean gst_element_default_query (GstElement * element,
131     GstQuery * query);
132
133 static GstPadTemplate
134     * gst_element_class_get_request_pad_template (GstElementClass *
135     element_class, const gchar * name);
136
137 static GstObjectClass *parent_class = NULL;
138 static guint gst_element_signals[LAST_SIGNAL] = { 0 };
139
140 /* this is used in gstelementfactory.c:gst_element_register() */
141 GQuark _gst_elementclass_factory = 0;
142
143 GType
144 gst_element_get_type (void)
145 {
146   static volatile gsize gst_element_type = 0;
147
148   if (g_once_init_enter (&gst_element_type)) {
149     GType _type;
150     static const GTypeInfo element_info = {
151       sizeof (GstElementClass),
152       gst_element_base_class_init,
153       gst_element_base_class_finalize,
154       (GClassInitFunc) gst_element_class_init,
155       NULL,
156       NULL,
157       sizeof (GstElement),
158       0,
159       (GInstanceInitFunc) gst_element_init,
160       NULL
161     };
162
163     _type = g_type_register_static (GST_TYPE_OBJECT, "GstElement",
164         &element_info, G_TYPE_FLAG_ABSTRACT);
165
166     _gst_elementclass_factory =
167         g_quark_from_static_string ("GST_ELEMENTCLASS_FACTORY");
168     g_once_init_leave (&gst_element_type, _type);
169   }
170   return gst_element_type;
171 }
172
173 static void
174 gst_element_class_init (GstElementClass * klass)
175 {
176   GObjectClass *gobject_class;
177   GstObjectClass *gstobject_class;
178
179   gobject_class = (GObjectClass *) klass;
180   gstobject_class = (GstObjectClass *) klass;
181
182   parent_class = g_type_class_peek_parent (klass);
183
184   /**
185    * GstElement::pad-added:
186    * @gstelement: the object which received the signal
187    * @new_pad: the pad that has been added
188    *
189    * a new #GstPad has been added to the element. Note that this signal will
190    * usually be emitted from the context of the streaming thread. Also keep in
191    * mind that if you add new elements to the pipeline in the signal handler
192    * you will need to set them to the desired target state with
193    * gst_element_set_state() or gst_element_sync_state_with_parent().
194    */
195   gst_element_signals[PAD_ADDED] =
196       g_signal_new ("pad-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
197       G_STRUCT_OFFSET (GstElementClass, pad_added), NULL, NULL,
198       gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
199   /**
200    * GstElement::pad-removed:
201    * @gstelement: the object which received the signal
202    * @old_pad: the pad that has been removed
203    *
204    * a #GstPad has been removed from the element
205    */
206   gst_element_signals[PAD_REMOVED] =
207       g_signal_new ("pad-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
208       G_STRUCT_OFFSET (GstElementClass, pad_removed), NULL, NULL,
209       gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
210   /**
211    * GstElement::no-more-pads:
212    * @gstelement: the object which received the signal
213    *
214    * This signals that the element will not generate more dynamic pads.
215    * Note that this signal will usually be emitted from the context of
216    * the streaming thread.
217    */
218   gst_element_signals[NO_MORE_PADS] =
219       g_signal_new ("no-more-pads", G_TYPE_FROM_CLASS (klass),
220       G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, no_more_pads), NULL,
221       NULL, gst_marshal_VOID__VOID, G_TYPE_NONE, 0);
222
223   gobject_class->dispose = gst_element_dispose;
224   gobject_class->finalize = gst_element_finalize;
225
226   klass->change_state = GST_DEBUG_FUNCPTR (gst_element_change_state_func);
227   klass->set_state = GST_DEBUG_FUNCPTR (gst_element_set_state_func);
228   klass->get_state = GST_DEBUG_FUNCPTR (gst_element_get_state_func);
229   klass->set_bus = GST_DEBUG_FUNCPTR (gst_element_set_bus_func);
230   klass->query = GST_DEBUG_FUNCPTR (gst_element_default_query);
231   klass->send_event = GST_DEBUG_FUNCPTR (gst_element_default_send_event);
232   klass->numpadtemplates = 0;
233
234   klass->elementfactory = NULL;
235 }
236
237 static void
238 gst_element_base_class_init (gpointer g_class)
239 {
240   GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
241   GList *node, *padtemplates;
242
243   /* Copy the element details here so elements can inherit the
244    * details from their base class and classes only need to set
245    * the details in class_init instead of base_init */
246   element_class->metadata =
247       element_class->metadata ? gst_structure_copy (element_class->metadata) :
248       gst_structure_empty_new ("metadata");
249
250   /* Copy the pad templates so elements inherit them
251    * from their base class but elements can add pad templates in class_init
252    * instead of base_init.
253    */
254   padtemplates = g_list_copy (element_class->padtemplates);
255   for (node = padtemplates; node != NULL; node = node->next) {
256     GstPadTemplate *tmpl = (GstPadTemplate *) node->data;
257     gst_object_ref (tmpl);
258   }
259   element_class->padtemplates = padtemplates;
260
261   /* set the factory, see gst_element_register() */
262   element_class->elementfactory =
263       g_type_get_qdata (G_TYPE_FROM_CLASS (element_class),
264       _gst_elementclass_factory);
265   GST_DEBUG ("type %s : factory %p", G_OBJECT_CLASS_NAME (element_class),
266       element_class->elementfactory);
267 }
268
269 static void
270 gst_element_base_class_finalize (gpointer g_class)
271 {
272   GstElementClass *klass = GST_ELEMENT_CLASS (g_class);
273
274   g_list_foreach (klass->padtemplates, (GFunc) gst_object_unref, NULL);
275   g_list_free (klass->padtemplates);
276
277   gst_structure_free (klass->metadata);
278 }
279
280 static void
281 gst_element_init (GstElement * element)
282 {
283   GST_STATE (element) = GST_STATE_NULL;
284   GST_STATE_TARGET (element) = GST_STATE_NULL;
285   GST_STATE_NEXT (element) = GST_STATE_VOID_PENDING;
286   GST_STATE_PENDING (element) = GST_STATE_VOID_PENDING;
287   GST_STATE_RETURN (element) = GST_STATE_CHANGE_SUCCESS;
288
289   /* FIXME 0.11: Store this directly in the instance struct */
290   element->state_lock = g_slice_new (GStaticRecMutex);
291   g_static_rec_mutex_init (element->state_lock);
292   element->state_cond = g_cond_new ();
293 }
294
295 /**
296  * gst_element_release_request_pad:
297  * @element: a #GstElement to release the request pad of.
298  * @pad: the #GstPad to release.
299  *
300  * Makes the element free the previously requested pad as obtained
301  * with gst_element_get_request_pad().
302  *
303  * This does not unref the pad. If the pad was created by using
304  * gst_element_get_request_pad(), gst_element_release_request_pad() needs to be
305  * followed by gst_object_unref() to free the @pad.
306  *
307  * MT safe.
308  */
309 void
310 gst_element_release_request_pad (GstElement * element, GstPad * pad)
311 {
312   GstElementClass *oclass;
313
314   g_return_if_fail (GST_IS_ELEMENT (element));
315   g_return_if_fail (GST_IS_PAD (pad));
316
317   oclass = GST_ELEMENT_GET_CLASS (element);
318
319   /* if the element implements a custom release function we call that, else we
320    * simply remove the pad from the element */
321   if (oclass->release_pad)
322     (oclass->release_pad) (element, pad);
323   else
324     gst_element_remove_pad (element, pad);
325 }
326
327 /**
328  * gst_element_requires_clock:
329  * @element: a #GstElement to query
330  *
331  * Query if the element requires a clock.
332  *
333  * Returns: %TRUE if the element requires a clock
334  *
335  * MT safe.
336  */
337 gboolean
338 gst_element_requires_clock (GstElement * element)
339 {
340   gboolean result;
341
342   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
343
344   result = (GST_ELEMENT_GET_CLASS (element)->set_clock != NULL);
345
346   return result;
347 }
348
349 /**
350  * gst_element_provides_clock:
351  * @element: a #GstElement to query
352  *
353  * Query if the element provides a clock. A #GstClock provided by an
354  * element can be used as the global #GstClock for the pipeline.
355  * An element that can provide a clock is only required to do so in the PAUSED
356  * state, this means when it is fully negotiated and has allocated the resources
357  * to operate the clock.
358  *
359  * Returns: %TRUE if the element provides a clock
360  *
361  * MT safe.
362  */
363 gboolean
364 gst_element_provides_clock (GstElement * element)
365 {
366   gboolean result;
367
368   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
369
370   result = (GST_ELEMENT_GET_CLASS (element)->provide_clock != NULL);
371
372   return result;
373 }
374
375 /**
376  * gst_element_provide_clock:
377  * @element: a #GstElement to query
378  *
379  * Get the clock provided by the given element.
380  * <note>An element is only required to provide a clock in the PAUSED
381  * state. Some elements can provide a clock in other states.</note>
382  *
383  * Returns: (transfer full): the GstClock provided by the element or %NULL
384  * if no clock could be provided.  Unref after usage.
385  *
386  * MT safe.
387  */
388 GstClock *
389 gst_element_provide_clock (GstElement * element)
390 {
391   GstClock *result = NULL;
392   GstElementClass *oclass;
393
394   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
395
396   oclass = GST_ELEMENT_GET_CLASS (element);
397
398   if (oclass->provide_clock)
399     result = oclass->provide_clock (element);
400
401   return result;
402 }
403
404 /**
405  * gst_element_set_clock:
406  * @element: a #GstElement to set the clock for.
407  * @clock: the #GstClock to set for the element.
408  *
409  * Sets the clock for the element. This function increases the
410  * refcount on the clock. Any previously set clock on the object
411  * is unreffed.
412  *
413  * Returns: %TRUE if the element accepted the clock. An element can refuse a
414  * clock when it, for example, is not able to slave its internal clock to the
415  * @clock or when it requires a specific clock to operate.
416  *
417  * MT safe.
418  */
419 gboolean
420 gst_element_set_clock (GstElement * element, GstClock * clock)
421 {
422   GstElementClass *oclass;
423   gboolean res = TRUE;
424   GstClock **clock_p;
425
426   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
427   g_return_val_if_fail (clock == NULL || GST_IS_CLOCK (clock), FALSE);
428
429   oclass = GST_ELEMENT_GET_CLASS (element);
430
431   GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, element, "setting clock %p", clock);
432
433   if (oclass->set_clock)
434     res = oclass->set_clock (element, clock);
435
436   if (res) {
437     /* only update the clock pointer if the element accepted the clock */
438     GST_OBJECT_LOCK (element);
439     clock_p = &element->clock;
440     gst_object_replace ((GstObject **) clock_p, (GstObject *) clock);
441     GST_OBJECT_UNLOCK (element);
442   }
443   return res;
444 }
445
446 /**
447  * gst_element_get_clock:
448  * @element: a #GstElement to get the clock of.
449  *
450  * Gets the currently configured clock of the element. This is the clock as was
451  * last set with gst_element_set_clock().
452  *
453  * Returns: (transfer full): the #GstClock of the element. unref after usage.
454  *
455  * MT safe.
456  */
457 GstClock *
458 gst_element_get_clock (GstElement * element)
459 {
460   GstClock *result;
461
462   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
463
464   GST_OBJECT_LOCK (element);
465   if ((result = element->clock))
466     gst_object_ref (result);
467   GST_OBJECT_UNLOCK (element);
468
469   return result;
470 }
471
472 /**
473  * gst_element_set_base_time:
474  * @element: a #GstElement.
475  * @time: the base time to set.
476  *
477  * Set the base time of an element. See gst_element_get_base_time().
478  *
479  * MT safe.
480  */
481 void
482 gst_element_set_base_time (GstElement * element, GstClockTime time)
483 {
484   GstClockTime old;
485
486   g_return_if_fail (GST_IS_ELEMENT (element));
487
488   GST_OBJECT_LOCK (element);
489   old = element->base_time;
490   element->base_time = time;
491   GST_OBJECT_UNLOCK (element);
492
493   GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, element,
494       "set base_time=%" GST_TIME_FORMAT ", old %" GST_TIME_FORMAT,
495       GST_TIME_ARGS (time), GST_TIME_ARGS (old));
496 }
497
498 /**
499  * gst_element_get_base_time:
500  * @element: a #GstElement.
501  *
502  * Returns the base time of the element. The base time is the
503  * absolute time of the clock when this element was last put to
504  * PLAYING. Subtracting the base time from the clock time gives
505  * the running time of the element.
506  *
507  * Returns: the base time of the element.
508  *
509  * MT safe.
510  */
511 GstClockTime
512 gst_element_get_base_time (GstElement * element)
513 {
514   GstClockTime result;
515
516   g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_TIME_NONE);
517
518   GST_OBJECT_LOCK (element);
519   result = element->base_time;
520   GST_OBJECT_UNLOCK (element);
521
522   return result;
523 }
524
525 /**
526  * gst_element_set_start_time:
527  * @element: a #GstElement.
528  * @time: the base time to set.
529  *
530  * Set the start time of an element. The start time of the element is the
531  * running time of the element when it last went to the PAUSED state. In READY
532  * or after a flushing seek, it is set to 0.
533  *
534  * Toplevel elements like #GstPipeline will manage the start_time and
535  * base_time on its children. Setting the start_time to #GST_CLOCK_TIME_NONE
536  * on such a toplevel element will disable the distribution of the base_time to
537  * the children and can be useful if the application manages the base_time
538  * itself, for example if you want to synchronize capture from multiple
539  * pipelines, and you can also ensure that the pipelines have the same clock.
540  *
541  * MT safe.
542  *
543  * Since: 0.10.24
544  */
545 void
546 gst_element_set_start_time (GstElement * element, GstClockTime time)
547 {
548   GstClockTime old;
549
550   g_return_if_fail (GST_IS_ELEMENT (element));
551
552   GST_OBJECT_LOCK (element);
553   old = GST_ELEMENT_START_TIME (element);
554   GST_ELEMENT_START_TIME (element) = time;
555   GST_OBJECT_UNLOCK (element);
556
557   GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, element,
558       "set start_time=%" GST_TIME_FORMAT ", old %" GST_TIME_FORMAT,
559       GST_TIME_ARGS (time), GST_TIME_ARGS (old));
560 }
561
562 /**
563  * gst_element_get_start_time:
564  * @element: a #GstElement.
565  *
566  * Returns the start time of the element. The start time is the
567  * running time of the clock when this element was last put to PAUSED.
568  *
569  * Usually the start_time is managed by a toplevel element such as
570  * #GstPipeline.
571  *
572  * MT safe.
573  *
574  * Returns: the start time of the element.
575  *
576  * Since: 0.10.24
577  */
578 GstClockTime
579 gst_element_get_start_time (GstElement * element)
580 {
581   GstClockTime result;
582
583   g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_TIME_NONE);
584
585   GST_OBJECT_LOCK (element);
586   result = GST_ELEMENT_START_TIME (element);
587   GST_OBJECT_UNLOCK (element);
588
589   return result;
590 }
591
592 /**
593  * gst_element_is_indexable:
594  * @element: a #GstElement.
595  *
596  * Queries if the element can be indexed.
597  *
598  * Returns: TRUE if the element can be indexed.
599  *
600  * MT safe.
601  */
602 gboolean
603 gst_element_is_indexable (GstElement * element)
604 {
605   gboolean result;
606
607   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
608
609   result = (GST_ELEMENT_GET_CLASS (element)->set_index != NULL);
610
611   return result;
612 }
613
614 /**
615  * gst_element_set_index:
616  * @element: a #GstElement.
617  * @index: (transfer none): a #GstIndex.
618  *
619  * Set @index on the element. The refcount of the index
620  * will be increased, any previously set index is unreffed.
621  *
622  * MT safe.
623  */
624 void
625 gst_element_set_index (GstElement * element, GstIndex * index)
626 {
627   GstElementClass *oclass;
628
629   g_return_if_fail (GST_IS_ELEMENT (element));
630   g_return_if_fail (index == NULL || GST_IS_INDEX (index));
631
632   oclass = GST_ELEMENT_GET_CLASS (element);
633
634   if (oclass->set_index)
635     oclass->set_index (element, index);
636 }
637
638 /**
639  * gst_element_get_index:
640  * @element: a #GstElement.
641  *
642  * Gets the index from the element.
643  *
644  * Returns: (transfer full): a #GstIndex or %NULL when no index was set on the
645  * element. unref after usage.
646  *
647  * MT safe.
648  */
649 GstIndex *
650 gst_element_get_index (GstElement * element)
651 {
652   GstElementClass *oclass;
653   GstIndex *result = NULL;
654
655   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
656
657   oclass = GST_ELEMENT_GET_CLASS (element);
658
659   if (oclass->get_index)
660     result = oclass->get_index (element);
661
662   return result;
663 }
664
665 /**
666  * gst_element_add_pad:
667  * @element: a #GstElement to add the pad to.
668  * @pad: (transfer full): the #GstPad to add to the element.
669  *
670  * Adds a pad (link point) to @element. @pad's parent will be set to @element;
671  * see gst_object_set_parent() for refcounting information.
672  *
673  * Pads are not automatically activated so elements should perform the needed
674  * steps to activate the pad in case this pad is added in the PAUSED or PLAYING
675  * state. See gst_pad_set_active() for more information about activating pads.
676  *
677  * The pad and the element should be unlocked when calling this function.
678  *
679  * This function will emit the #GstElement::pad-added signal on the element.
680  *
681  * Returns: %TRUE if the pad could be added. This function can fail when
682  * a pad with the same name already existed or the pad already had another
683  * parent.
684  *
685  * MT safe.
686  */
687 gboolean
688 gst_element_add_pad (GstElement * element, GstPad * pad)
689 {
690   gchar *pad_name;
691   gboolean flushing;
692
693   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
694   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
695
696   /* locking pad to look at the name */
697   GST_OBJECT_LOCK (pad);
698   pad_name = g_strdup (GST_PAD_NAME (pad));
699   GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element, "adding pad '%s'",
700       GST_STR_NULL (pad_name));
701   flushing = GST_PAD_IS_FLUSHING (pad);
702   GST_OBJECT_UNLOCK (pad);
703
704   /* then check to see if there's already a pad by that name here */
705   GST_OBJECT_LOCK (element);
706   if (G_UNLIKELY (!gst_object_check_uniqueness (element->pads, pad_name)))
707     goto name_exists;
708
709   /* try to set the pad's parent */
710   if (G_UNLIKELY (!gst_object_set_parent (GST_OBJECT_CAST (pad),
711               GST_OBJECT_CAST (element))))
712     goto had_parent;
713
714   /* check for flushing pads */
715   if (flushing && (GST_STATE (element) > GST_STATE_READY ||
716           GST_STATE_NEXT (element) == GST_STATE_PAUSED)) {
717     g_warning ("adding flushing pad '%s' to running element '%s', you need to "
718         "use gst_pad_set_active(pad,TRUE) before adding it.",
719         GST_STR_NULL (pad_name), GST_ELEMENT_NAME (element));
720     /* unset flushing */
721     GST_OBJECT_LOCK (pad);
722     GST_PAD_UNSET_FLUSHING (pad);
723     GST_OBJECT_UNLOCK (pad);
724   }
725
726   g_free (pad_name);
727
728   /* add it to the list */
729   switch (gst_pad_get_direction (pad)) {
730     case GST_PAD_SRC:
731       element->srcpads = g_list_prepend (element->srcpads, pad);
732       element->numsrcpads++;
733       break;
734     case GST_PAD_SINK:
735       element->sinkpads = g_list_prepend (element->sinkpads, pad);
736       element->numsinkpads++;
737       break;
738     default:
739       goto no_direction;
740   }
741   element->pads = g_list_prepend (element->pads, pad);
742   element->numpads++;
743   element->pads_cookie++;
744   GST_OBJECT_UNLOCK (element);
745
746   /* emit the PAD_ADDED signal */
747   g_signal_emit (element, gst_element_signals[PAD_ADDED], 0, pad);
748
749   return TRUE;
750
751   /* ERROR cases */
752 name_exists:
753   {
754     g_critical ("Padname %s is not unique in element %s, not adding",
755         pad_name, GST_ELEMENT_NAME (element));
756     GST_OBJECT_UNLOCK (element);
757     g_free (pad_name);
758     return FALSE;
759   }
760 had_parent:
761   {
762     g_critical
763         ("Pad %s already has parent when trying to add to element %s",
764         pad_name, GST_ELEMENT_NAME (element));
765     GST_OBJECT_UNLOCK (element);
766     g_free (pad_name);
767     return FALSE;
768   }
769 no_direction:
770   {
771     GST_OBJECT_LOCK (pad);
772     g_critical
773         ("Trying to add pad %s to element %s, but it has no direction",
774         GST_OBJECT_NAME (pad), GST_ELEMENT_NAME (element));
775     GST_OBJECT_UNLOCK (pad);
776     GST_OBJECT_UNLOCK (element);
777     return FALSE;
778   }
779 }
780
781 /**
782  * gst_element_remove_pad:
783  * @element: a #GstElement to remove pad from.
784  * @pad: (transfer none): the #GstPad to remove from the element.
785  *
786  * Removes @pad from @element. @pad will be destroyed if it has not been
787  * referenced elsewhere using gst_object_unparent().
788  *
789  * This function is used by plugin developers and should not be used
790  * by applications. Pads that were dynamically requested from elements
791  * with gst_element_get_request_pad() should be released with the
792  * gst_element_release_request_pad() function instead.
793  *
794  * Pads are not automatically deactivated so elements should perform the needed
795  * steps to deactivate the pad in case this pad is removed in the PAUSED or
796  * PLAYING state. See gst_pad_set_active() for more information about
797  * deactivating pads.
798  *
799  * The pad and the element should be unlocked when calling this function.
800  *
801  * This function will emit the #GstElement::pad-removed signal on the element.
802  *
803  * Returns: %TRUE if the pad could be removed. Can return %FALSE if the
804  * pad does not belong to the provided element.
805  *
806  * MT safe.
807  */
808 gboolean
809 gst_element_remove_pad (GstElement * element, GstPad * pad)
810 {
811   GstPad *peer;
812
813   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
814   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
815
816   /* locking pad to look at the name and parent */
817   GST_OBJECT_LOCK (pad);
818   GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element, "removing pad '%s'",
819       GST_STR_NULL (GST_PAD_NAME (pad)));
820
821   if (G_UNLIKELY (GST_PAD_PARENT (pad) != element))
822     goto not_our_pad;
823   GST_OBJECT_UNLOCK (pad);
824
825   /* unlink */
826   if ((peer = gst_pad_get_peer (pad))) {
827     /* window for MT unsafeness, someone else could unlink here
828      * and then we call unlink with wrong pads. The unlink
829      * function would catch this and safely return failed. */
830     if (GST_PAD_IS_SRC (pad))
831       gst_pad_unlink (pad, peer);
832     else
833       gst_pad_unlink (peer, pad);
834
835     gst_object_unref (peer);
836   }
837
838   GST_OBJECT_LOCK (element);
839   /* remove it from the list */
840   switch (gst_pad_get_direction (pad)) {
841     case GST_PAD_SRC:
842       element->srcpads = g_list_remove (element->srcpads, pad);
843       element->numsrcpads--;
844       break;
845     case GST_PAD_SINK:
846       element->sinkpads = g_list_remove (element->sinkpads, pad);
847       element->numsinkpads--;
848       break;
849     default:
850       g_critical ("Removing pad without direction???");
851       break;
852   }
853   element->pads = g_list_remove (element->pads, pad);
854   element->numpads--;
855   element->pads_cookie++;
856   GST_OBJECT_UNLOCK (element);
857
858   /* emit the PAD_REMOVED signal before unparenting and losing the last ref. */
859   g_signal_emit (element, gst_element_signals[PAD_REMOVED], 0, pad);
860
861   gst_object_unparent (GST_OBJECT_CAST (pad));
862
863   return TRUE;
864
865   /* ERRORS */
866 not_our_pad:
867   {
868     /* FIXME, locking order? */
869     GST_OBJECT_LOCK (element);
870     g_critical ("Padname %s:%s does not belong to element %s when removing",
871         GST_DEBUG_PAD_NAME (pad), GST_ELEMENT_NAME (element));
872     GST_OBJECT_UNLOCK (element);
873     GST_OBJECT_UNLOCK (pad);
874     return FALSE;
875   }
876 }
877
878 /**
879  * gst_element_no_more_pads:
880  * @element: a #GstElement
881  *
882  * Use this function to signal that the element does not expect any more pads
883  * to show up in the current pipeline. This function should be called whenever
884  * pads have been added by the element itself. Elements with #GST_PAD_SOMETIMES
885  * pad templates use this in combination with autopluggers to figure out that
886  * the element is done initializing its pads.
887  *
888  * This function emits the #GstElement::no-more-pads signal.
889  *
890  * MT safe.
891  */
892 void
893 gst_element_no_more_pads (GstElement * element)
894 {
895   g_return_if_fail (GST_IS_ELEMENT (element));
896
897   g_signal_emit (element, gst_element_signals[NO_MORE_PADS], 0);
898 }
899
900 static gint
901 pad_compare_name (GstPad * pad1, const gchar * name)
902 {
903   gint result;
904
905   GST_OBJECT_LOCK (pad1);
906   result = strcmp (GST_PAD_NAME (pad1), name);
907   GST_OBJECT_UNLOCK (pad1);
908
909   return result;
910 }
911
912 /**
913  * gst_element_get_static_pad:
914  * @element: a #GstElement to find a static pad of.
915  * @name: the name of the static #GstPad to retrieve.
916  *
917  * Retrieves a pad from @element by name. This version only retrieves
918  * already-existing (i.e. 'static') pads.
919  *
920  * Returns: (transfer full): the requested #GstPad if found, otherwise %NULL.
921  *     unref after usage.
922  *
923  * MT safe.
924  */
925 GstPad *
926 gst_element_get_static_pad (GstElement * element, const gchar * name)
927 {
928   GList *find;
929   GstPad *result = NULL;
930
931   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
932   g_return_val_if_fail (name != NULL, NULL);
933
934   GST_OBJECT_LOCK (element);
935   find =
936       g_list_find_custom (element->pads, name, (GCompareFunc) pad_compare_name);
937   if (find) {
938     result = GST_PAD_CAST (find->data);
939     gst_object_ref (result);
940   }
941
942   if (result == NULL) {
943     GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "no such pad '%s' in element \"%s\"",
944         name, GST_ELEMENT_NAME (element));
945   } else {
946     GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "found pad %s:%s",
947         GST_ELEMENT_NAME (element), name);
948   }
949   GST_OBJECT_UNLOCK (element);
950
951   return result;
952 }
953
954 static GstPad *
955 _gst_element_request_pad (GstElement * element, GstPadTemplate * templ,
956     const gchar * name, const GstCaps * caps)
957 {
958   GstPad *newpad = NULL;
959   GstElementClass *oclass;
960
961   oclass = GST_ELEMENT_GET_CLASS (element);
962
963 #ifndef G_DISABLE_CHECKS
964   /* Some sanity checking here */
965   if (name) {
966     GstPad *pad;
967
968     /* Is this the template name? */
969     if (strstr (name, "%") || !strchr (templ->name_template, '%')) {
970       g_return_val_if_fail (strcmp (name, templ->name_template) == 0, NULL);
971     } else {
972       const gchar *str, *data;
973       gchar *endptr;
974
975       /* Otherwise check if it's a valid name for the name template */
976       str = strchr (templ->name_template, '%');
977       g_return_val_if_fail (str != NULL, NULL);
978       g_return_val_if_fail (strncmp (templ->name_template, name,
979               str - templ->name_template) == 0, NULL);
980       g_return_val_if_fail (strlen (name) > str - templ->name_template, NULL);
981
982       data = name + (str - templ->name_template);
983
984       /* Can either be %s or %d or %u, do sanity checking for %d */
985       if (*(str + 1) == 'd') {
986         gint64 tmp;
987
988         /* it's an int */
989         tmp = g_ascii_strtoll (data, &endptr, 10);
990         g_return_val_if_fail (tmp >= G_MININT && tmp <= G_MAXINT
991             && *endptr == '\0', NULL);
992       } else if (*(str + 1) == 'u') {
993         guint64 tmp;
994
995         /* it's an int */
996         tmp = g_ascii_strtoull (data, &endptr, 10);
997         g_return_val_if_fail (tmp <= G_MAXUINT && *endptr == '\0', NULL);
998       }
999     }
1000
1001     pad = gst_element_get_static_pad (element, name);
1002     if (pad) {
1003       gst_object_unref (pad);
1004       /* FIXME 0.11: Change this to g_return_val_if_fail() */
1005       g_critical ("Element %s already has a pad named %s, the behaviour of "
1006           " gst_element_get_request_pad() for existing pads is undefined!",
1007           GST_ELEMENT_NAME (element), name);
1008     }
1009   }
1010 #endif
1011
1012   if (oclass->request_new_pad)
1013     newpad = (oclass->request_new_pad) (element, templ, name, caps);
1014
1015   if (newpad)
1016     gst_object_ref (newpad);
1017
1018   return newpad;
1019 }
1020
1021 /**
1022  * gst_element_get_request_pad:
1023  * @element: a #GstElement to find a request pad of.
1024  * @name: the name of the request #GstPad to retrieve.
1025  *
1026  * Retrieves a pad from the element by name. This version only retrieves
1027  * request pads. The pad should be released with
1028  * gst_element_release_request_pad().
1029  *
1030  * This method is slow and will be deprecated in the future. New code should
1031  * use gst_element_request_pad() with the requested template.
1032  *
1033  * Returns: (transfer full): requested #GstPad if found, otherwise %NULL.
1034  *     Release after usage.
1035  */
1036 GstPad *
1037 gst_element_get_request_pad (GstElement * element, const gchar * name)
1038 {
1039   GstPadTemplate *templ = NULL;
1040   GstPad *pad;
1041   const gchar *req_name = NULL;
1042   gboolean templ_found = FALSE;
1043   GList *list;
1044   const gchar *data;
1045   gchar *str, *endptr = NULL;
1046   GstElementClass *class;
1047
1048   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1049   g_return_val_if_fail (name != NULL, NULL);
1050
1051   class = GST_ELEMENT_GET_CLASS (element);
1052
1053   /* if the name contains a %, we assume it's the complete template name. Get
1054    * the template and try to get a pad */
1055   if (strstr (name, "%")) {
1056     templ = gst_element_class_get_request_pad_template (class, name);
1057     req_name = NULL;
1058     if (templ)
1059       templ_found = TRUE;
1060   } else {
1061     /* there is no % in the name, try to find a matching template */
1062     list = class->padtemplates;
1063     while (!templ_found && list) {
1064       templ = (GstPadTemplate *) list->data;
1065       if (templ->presence == GST_PAD_REQUEST) {
1066         GST_CAT_DEBUG (GST_CAT_PADS, "comparing %s to %s", name,
1067             templ->name_template);
1068         /* see if we find an exact match */
1069         if (strcmp (name, templ->name_template) == 0) {
1070           templ_found = TRUE;
1071           req_name = name;
1072           break;
1073         }
1074         /* Because of sanity checks in gst_pad_template_new(), we know that %s
1075            and %d and %u, occurring at the end of the name_template, are the only
1076            possibilities. */
1077         else if ((str = strchr (templ->name_template, '%'))
1078             && strncmp (templ->name_template, name,
1079                 str - templ->name_template) == 0
1080             && strlen (name) > str - templ->name_template) {
1081           data = name + (str - templ->name_template);
1082           if (*(str + 1) == 'd') {
1083             glong tmp;
1084
1085             /* it's an int */
1086             tmp = strtol (data, &endptr, 10);
1087             if (tmp != G_MINLONG && tmp != G_MAXLONG && endptr &&
1088                 *endptr == '\0') {
1089               templ_found = TRUE;
1090               req_name = name;
1091               break;
1092             }
1093           } else if (*(str + 1) == 'u') {
1094             gulong tmp;
1095
1096             /* it's an int */
1097             tmp = strtoul (data, &endptr, 10);
1098             if (tmp != G_MAXULONG && endptr && *endptr == '\0') {
1099               templ_found = TRUE;
1100               req_name = name;
1101               break;
1102             }
1103           } else {
1104             /* it's a string */
1105             templ_found = TRUE;
1106             req_name = name;
1107             break;
1108           }
1109         }
1110       }
1111       list = list->next;
1112     }
1113   }
1114
1115   if (!templ_found)
1116     return NULL;
1117
1118   pad = _gst_element_request_pad (element, templ, req_name, NULL);
1119
1120   return pad;
1121 }
1122
1123 /**
1124  * gst_element_request_pad:
1125  * @element: a #GstElement to find a request pad of.
1126  * @templ: a #GstPadTemplate of which we want a pad of.
1127  * @name: (transfer none) (allow-none): the name of the request #GstPad
1128  * to retrieve. Can be %NULL.
1129  * @caps: (transfer none) (allow-none): the caps of the pad we want to
1130  * request. Can be %NULL.
1131  *
1132  * Retrieves a request pad from the element according to the provided template.
1133  *
1134  * If the @caps are specified and the element implements thew new
1135  * request_new_pad_full virtual method, the element will use them to select
1136  * which pad to create.
1137  *
1138  * The pad should be released with gst_element_release_request_pad().
1139  *
1140  * Returns: (transfer full): requested #GstPad if found, otherwise %NULL.
1141  *     Release after usage.
1142  *
1143  * Since: 0.10.32
1144  */
1145 GstPad *
1146 gst_element_request_pad (GstElement * element,
1147     GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
1148 {
1149   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1150   g_return_val_if_fail (templ != NULL, NULL);
1151
1152   return _gst_element_request_pad (element, templ, name, caps);
1153 }
1154
1155 /**
1156  * gst_element_get_pad:
1157  * @element: a #GstElement.
1158  * @name: the name of the pad to retrieve.
1159  *
1160  * Retrieves a pad from @element by name. Tries gst_element_get_static_pad()
1161  * first, then gst_element_get_request_pad().
1162  *
1163  * Deprecated: This function is deprecated as it's unclear if the reference
1164  * to the result pad should be released with gst_object_unref() in case of a static pad
1165  * or gst_element_release_request_pad() in case of a request pad.
1166  * Use gst_element_get_static_pad() or gst_element_get_request_pad() instead.
1167  *
1168  * Returns: (transfer full): the #GstPad if found, otherwise %NULL. Unref or Release after usage,
1169  * depending on the type of the pad.
1170  */
1171 #ifndef GST_REMOVE_DEPRECATED
1172 #ifdef GST_DISABLE_DEPRECATED
1173 GstPad *gst_element_get_pad (GstElement * element, const gchar * name);
1174 #endif
1175 GstPad *
1176 gst_element_get_pad (GstElement * element, const gchar * name)
1177 {
1178   GstPad *pad;
1179
1180   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1181   g_return_val_if_fail (name != NULL, NULL);
1182
1183   pad = gst_element_get_static_pad (element, name);
1184   if (!pad)
1185     pad = gst_element_get_request_pad (element, name);
1186
1187   return pad;
1188 }
1189 #endif /* GST_REMOVE_DEPRECATED */
1190
1191 static GstIterator *
1192 gst_element_iterate_pad_list (GstElement * element, GList ** padlist)
1193 {
1194   GstIterator *result;
1195
1196   GST_OBJECT_LOCK (element);
1197   result = gst_iterator_new_list (GST_TYPE_PAD,
1198       GST_OBJECT_GET_LOCK (element),
1199       &element->pads_cookie, padlist, (GObject *) element, NULL);
1200   GST_OBJECT_UNLOCK (element);
1201
1202   return result;
1203 }
1204
1205 /**
1206  * gst_element_iterate_pads:
1207  * @element: a #GstElement to iterate pads of.
1208  *
1209  * Retrieves an iterattor of @element's pads. The iterator should
1210  * be freed after usage.
1211  *
1212  * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
1213  *     after use.
1214  *
1215  * MT safe.
1216  */
1217 GstIterator *
1218 gst_element_iterate_pads (GstElement * element)
1219 {
1220   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1221
1222   return gst_element_iterate_pad_list (element, &element->pads);
1223 }
1224
1225 /**
1226  * gst_element_iterate_src_pads:
1227  * @element: a #GstElement.
1228  *
1229  * Retrieves an iterator of @element's source pads.
1230  *
1231  * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
1232  *     after use.
1233  *
1234  * MT safe.
1235  */
1236 GstIterator *
1237 gst_element_iterate_src_pads (GstElement * element)
1238 {
1239   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1240
1241   return gst_element_iterate_pad_list (element, &element->srcpads);
1242 }
1243
1244 /**
1245  * gst_element_iterate_sink_pads:
1246  * @element: a #GstElement.
1247  *
1248  * Retrieves an iterator of @element's sink pads.
1249  *
1250  * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
1251  *     after use.
1252  *
1253  * MT safe.
1254  */
1255 GstIterator *
1256 gst_element_iterate_sink_pads (GstElement * element)
1257 {
1258   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1259
1260   return gst_element_iterate_pad_list (element, &element->sinkpads);
1261 }
1262
1263 /**
1264  * gst_element_class_add_pad_template:
1265  * @klass: the #GstElementClass to add the pad template to.
1266  * @templ: (transfer full): a #GstPadTemplate to add to the element class.
1267  *
1268  * Adds a padtemplate to an element class. This is mainly used in the _class_init
1269  * functions of classes. If a pad template with the same name as an already
1270  * existing one is added the old one is replaced by the new one.
1271  *
1272  */
1273 void
1274 gst_element_class_add_pad_template (GstElementClass * klass,
1275     GstPadTemplate * templ)
1276 {
1277   GList *template_list = klass->padtemplates;
1278
1279   g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
1280   g_return_if_fail (GST_IS_PAD_TEMPLATE (templ));
1281
1282   /* If we already have a pad template with the same name replace the
1283    * old one. */
1284   while (template_list) {
1285     GstPadTemplate *padtempl = (GstPadTemplate *) template_list->data;
1286
1287     /* Found pad with the same name, replace and return */
1288     if (strcmp (templ->name_template, padtempl->name_template) == 0) {
1289       gst_object_unref (padtempl);
1290       template_list->data = templ;
1291       return;
1292     }
1293     template_list = g_list_next (template_list);
1294   }
1295
1296   /* Take ownership of the floating ref */
1297   g_object_ref_sink (templ);
1298
1299   klass->padtemplates = g_list_append (klass->padtemplates, templ);
1300   klass->numpadtemplates++;
1301 }
1302
1303 /**
1304  * gst_element_class_add_metadata:
1305  * @klass: class to set metadata for
1306  * @key: the key to set
1307  * @value: the value to set
1308  *
1309  * Set @key with @value as metadata in @klass.
1310  */
1311 void
1312 gst_element_class_add_metadata (GstElementClass * klass,
1313     const gchar * key, const gchar * value)
1314 {
1315   g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
1316   g_return_if_fail (key != NULL);
1317   g_return_if_fail (value != NULL);
1318
1319   gst_structure_set ((GstStructure *) klass->metadata,
1320       key, G_TYPE_STRING, value, NULL);
1321 }
1322
1323 /**
1324  * gst_element_class_set_metadata:
1325  * @klass: class to set metadata for
1326  * @longname: The long English name of the element. E.g. "File Sink"
1327  * @classification: String describing the type of element, as an unordered list
1328  * separated with slashes ('/'). See draft-klass.txt of the design docs
1329  * for more details and common types. E.g: "Sink/File"
1330  * @description: Sentence describing the purpose of the element.
1331  * E.g: "Write stream to a file"
1332  * @author: Name and contact details of the author(s). Use \n to separate
1333  * multiple author metadata. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
1334  *
1335  * Sets the detailed information for a #GstElementClass.
1336  * <note>This function is for use in _class_init functions only.</note>
1337  */
1338 void
1339 gst_element_class_set_metadata (GstElementClass * klass,
1340     const gchar * longname, const gchar * classification,
1341     const gchar * description, const gchar * author)
1342 {
1343   g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
1344
1345   gst_structure_set ((GstStructure *) klass->metadata,
1346       GST_ELEMENT_METADATA_LONGNAME, G_TYPE_STRING, longname,
1347       GST_ELEMENT_METADATA_KLASS, G_TYPE_STRING, classification,
1348       GST_ELEMENT_METADATA_DESCRIPTION, G_TYPE_STRING, description,
1349       GST_ELEMENT_METADATA_AUTHOR, G_TYPE_STRING, author, NULL);
1350 }
1351
1352 /**
1353  * gst_element_class_get_pad_template_list:
1354  * @element_class: a #GstElementClass to get pad templates of.
1355  *
1356  * Retrieves a list of the pad templates associated with @element_class. The
1357  * list must not be modified by the calling code.
1358  * <note>If you use this function in the #GInstanceInitFunc of an object class
1359  * that has subclasses, make sure to pass the g_class parameter of the
1360  * #GInstanceInitFunc here.</note>
1361  *
1362  * Returns: (transfer none) (element-type Gst.PadTemplate): the #GList of
1363  *     pad templates.
1364  */
1365 GList *
1366 gst_element_class_get_pad_template_list (GstElementClass * element_class)
1367 {
1368   g_return_val_if_fail (GST_IS_ELEMENT_CLASS (element_class), NULL);
1369
1370   return element_class->padtemplates;
1371 }
1372
1373 /**
1374  * gst_element_class_get_pad_template:
1375  * @element_class: a #GstElementClass to get the pad template of.
1376  * @name: the name of the #GstPadTemplate to get.
1377  *
1378  * Retrieves a padtemplate from @element_class with the given name.
1379  * <note>If you use this function in the #GInstanceInitFunc of an object class
1380  * that has subclasses, make sure to pass the g_class parameter of the
1381  * #GInstanceInitFunc here.</note>
1382  *
1383  * Returns: (transfer none): the #GstPadTemplate with the given name, or %NULL
1384  *     if none was found. No unreferencing is necessary.
1385  */
1386 GstPadTemplate *
1387 gst_element_class_get_pad_template (GstElementClass *
1388     element_class, const gchar * name)
1389 {
1390   GList *padlist;
1391
1392   g_return_val_if_fail (GST_IS_ELEMENT_CLASS (element_class), NULL);
1393   g_return_val_if_fail (name != NULL, NULL);
1394
1395   padlist = element_class->padtemplates;
1396
1397   while (padlist) {
1398     GstPadTemplate *padtempl = (GstPadTemplate *) padlist->data;
1399
1400     if (strcmp (padtempl->name_template, name) == 0)
1401       return padtempl;
1402
1403     padlist = g_list_next (padlist);
1404   }
1405
1406   return NULL;
1407 }
1408
1409 static GstPadTemplate *
1410 gst_element_class_get_request_pad_template (GstElementClass *
1411     element_class, const gchar * name)
1412 {
1413   GstPadTemplate *tmpl;
1414
1415   tmpl = gst_element_class_get_pad_template (element_class, name);
1416   if (tmpl != NULL && tmpl->presence == GST_PAD_REQUEST)
1417     return tmpl;
1418
1419   return NULL;
1420 }
1421
1422 /* get a random pad on element of the given direction.
1423  * The pad is random in a sense that it is the first pad that is (optionaly) linked.
1424  */
1425 static GstPad *
1426 gst_element_get_random_pad (GstElement * element,
1427     gboolean need_linked, GstPadDirection dir)
1428 {
1429   GstPad *result = NULL;
1430   GList *pads;
1431
1432   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "getting a random pad");
1433
1434   switch (dir) {
1435     case GST_PAD_SRC:
1436       GST_OBJECT_LOCK (element);
1437       pads = element->srcpads;
1438       break;
1439     case GST_PAD_SINK:
1440       GST_OBJECT_LOCK (element);
1441       pads = element->sinkpads;
1442       break;
1443     default:
1444       goto wrong_direction;
1445   }
1446   for (; pads; pads = g_list_next (pads)) {
1447     GstPad *pad = GST_PAD_CAST (pads->data);
1448
1449     GST_OBJECT_LOCK (pad);
1450     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "checking pad %s:%s",
1451         GST_DEBUG_PAD_NAME (pad));
1452
1453     if (need_linked && !GST_PAD_IS_LINKED (pad)) {
1454       /* if we require a linked pad, and it is not linked, continue the
1455        * search */
1456       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is not linked",
1457           GST_DEBUG_PAD_NAME (pad));
1458       GST_OBJECT_UNLOCK (pad);
1459       continue;
1460     } else {
1461       /* found a pad, stop search */
1462       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "found pad %s:%s",
1463           GST_DEBUG_PAD_NAME (pad));
1464       GST_OBJECT_UNLOCK (pad);
1465       result = pad;
1466       break;
1467     }
1468   }
1469   if (result)
1470     gst_object_ref (result);
1471
1472   GST_OBJECT_UNLOCK (element);
1473
1474   return result;
1475
1476   /* ERROR handling */
1477 wrong_direction:
1478   {
1479     g_warning ("unknown pad direction %d", dir);
1480     return NULL;
1481   }
1482 }
1483
1484 static gboolean
1485 gst_element_default_send_event (GstElement * element, GstEvent * event)
1486 {
1487   gboolean result = FALSE;
1488   GstPad *pad;
1489
1490   pad = GST_EVENT_IS_DOWNSTREAM (event) ?
1491       gst_element_get_random_pad (element, TRUE, GST_PAD_SRC) :
1492       gst_element_get_random_pad (element, TRUE, GST_PAD_SINK);
1493
1494   if (pad) {
1495     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1496         "pushing %s event to random %s pad %s:%s",
1497         GST_EVENT_TYPE_NAME (event),
1498         (GST_PAD_DIRECTION (pad) == GST_PAD_SRC ? "src" : "sink"),
1499         GST_DEBUG_PAD_NAME (pad));
1500
1501     result = gst_pad_push_event (pad, event);
1502     gst_object_unref (pad);
1503   } else {
1504     GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "can't send %s event on element %s",
1505         GST_EVENT_TYPE_NAME (event), GST_ELEMENT_NAME (element));
1506     gst_event_unref (event);
1507   }
1508   return result;
1509 }
1510
1511 /**
1512  * gst_element_send_event:
1513  * @element: a #GstElement to send the event to.
1514  * @event: (transfer full): the #GstEvent to send to the element.
1515  *
1516  * Sends an event to an element. If the element doesn't implement an
1517  * event handler, the event will be pushed on a random linked sink pad for
1518  * upstream events or a random linked source pad for downstream events.
1519  *
1520  * This function takes owership of the provided event so you should
1521  * gst_event_ref() it if you want to reuse the event after this call.
1522  *
1523  * Returns: %TRUE if the event was handled.
1524  *
1525  * MT safe.
1526  */
1527 gboolean
1528 gst_element_send_event (GstElement * element, GstEvent * event)
1529 {
1530   GstElementClass *oclass;
1531   gboolean result = FALSE;
1532
1533   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
1534   g_return_val_if_fail (event != NULL, FALSE);
1535
1536   oclass = GST_ELEMENT_GET_CLASS (element);
1537
1538   GST_STATE_LOCK (element);
1539   if (oclass->send_event) {
1540     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send %s event on element %s",
1541         GST_EVENT_TYPE_NAME (event), GST_ELEMENT_NAME (element));
1542     result = oclass->send_event (element, event);
1543   } else {
1544     result = gst_element_default_send_event (element, event);
1545   }
1546   GST_STATE_UNLOCK (element);
1547
1548   return result;
1549 }
1550
1551 /**
1552  * gst_element_seek:
1553  * @element: a #GstElement to send the event to.
1554  * @rate: The new playback rate
1555  * @format: The format of the seek values
1556  * @flags: The optional seek flags.
1557  * @cur_type: The type and flags for the new current position
1558  * @cur: The value of the new current position
1559  * @stop_type: The type and flags for the new stop position
1560  * @stop: The value of the new stop position
1561  *
1562  * Sends a seek event to an element. See gst_event_new_seek() for the details of
1563  * the parameters. The seek event is sent to the element using
1564  * gst_element_send_event().
1565  *
1566  * Returns: %TRUE if the event was handled.
1567  *
1568  * MT safe.
1569  */
1570 gboolean
1571 gst_element_seek (GstElement * element, gdouble rate, GstFormat format,
1572     GstSeekFlags flags, GstSeekType cur_type, gint64 cur,
1573     GstSeekType stop_type, gint64 stop)
1574 {
1575   GstEvent *event;
1576   gboolean result;
1577
1578   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
1579
1580   event =
1581       gst_event_new_seek (rate, format, flags, cur_type, cur, stop_type, stop);
1582   result = gst_element_send_event (element, event);
1583
1584   return result;
1585 }
1586
1587 /**
1588  * gst_element_get_query_types:
1589  * @element: a #GstElement to query
1590  *
1591  * Get an array of query types from the element.
1592  * If the element doesn't implement a query types function,
1593  * the query will be forwarded to the peer of a random linked sink pad.
1594  *
1595  * Returns: An array of #GstQueryType elements that should not
1596  * be freed or modified.
1597  *
1598  * MT safe.
1599  */
1600 const GstQueryType *
1601 gst_element_get_query_types (GstElement * element)
1602 {
1603   GstElementClass *oclass;
1604   const GstQueryType *result = NULL;
1605
1606   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1607
1608   oclass = GST_ELEMENT_GET_CLASS (element);
1609
1610   if (oclass->get_query_types) {
1611     result = oclass->get_query_types (element);
1612   } else {
1613     GstPad *pad = gst_element_get_random_pad (element, TRUE, GST_PAD_SINK);
1614
1615     if (pad) {
1616       GstPad *peer = gst_pad_get_peer (pad);
1617
1618       if (peer) {
1619         result = gst_pad_get_query_types (peer);
1620
1621         gst_object_unref (peer);
1622       }
1623       gst_object_unref (pad);
1624     }
1625   }
1626   return result;
1627 }
1628
1629 static gboolean
1630 gst_element_default_query (GstElement * element, GstQuery * query)
1631 {
1632   gboolean result = FALSE;
1633   GstPad *pad;
1634
1635   pad = gst_element_get_random_pad (element, FALSE, GST_PAD_SRC);
1636   if (pad) {
1637     result = gst_pad_query (pad, query);
1638
1639     gst_object_unref (pad);
1640   } else {
1641     pad = gst_element_get_random_pad (element, TRUE, GST_PAD_SINK);
1642     if (pad) {
1643       GstPad *peer = gst_pad_get_peer (pad);
1644
1645       if (peer) {
1646         result = gst_pad_query (peer, query);
1647
1648         gst_object_unref (peer);
1649       }
1650       gst_object_unref (pad);
1651     }
1652   }
1653   return result;
1654 }
1655
1656 /**
1657  * gst_element_query:
1658  * @element: a #GstElement to perform the query on.
1659  * @query: (transfer none): the #GstQuery.
1660  *
1661  * Performs a query on the given element.
1662  *
1663  * For elements that don't implement a query handler, this function
1664  * forwards the query to a random srcpad or to the peer of a
1665  * random linked sinkpad of this element.
1666  *
1667  * Please note that some queries might need a running pipeline to work.
1668  *
1669  * Returns: TRUE if the query could be performed.
1670  *
1671  * MT safe.
1672  */
1673 gboolean
1674 gst_element_query (GstElement * element, GstQuery * query)
1675 {
1676   GstElementClass *oclass;
1677   gboolean result = FALSE;
1678
1679   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
1680   g_return_val_if_fail (query != NULL, FALSE);
1681
1682   oclass = GST_ELEMENT_GET_CLASS (element);
1683
1684   if (oclass->query) {
1685     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send query on element %s",
1686         GST_ELEMENT_NAME (element));
1687     result = oclass->query (element, query);
1688   } else {
1689     result = gst_element_default_query (element, query);
1690   }
1691   return result;
1692 }
1693
1694 /**
1695  * gst_element_post_message:
1696  * @element: a #GstElement posting the message
1697  * @message: (transfer full): a #GstMessage to post
1698  *
1699  * Post a message on the element's #GstBus. This function takes ownership of the
1700  * message; if you want to access the message after this call, you should add an
1701  * additional reference before calling.
1702  *
1703  * Returns: %TRUE if the message was successfully posted. The function returns
1704  * %FALSE if the element did not have a bus.
1705  *
1706  * MT safe.
1707  */
1708 gboolean
1709 gst_element_post_message (GstElement * element, GstMessage * message)
1710 {
1711   GstBus *bus;
1712   gboolean result = FALSE;
1713
1714   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
1715   g_return_val_if_fail (message != NULL, FALSE);
1716
1717   GST_OBJECT_LOCK (element);
1718   bus = element->bus;
1719
1720   if (G_UNLIKELY (bus == NULL))
1721     goto no_bus;
1722
1723   gst_object_ref (bus);
1724   GST_OBJECT_UNLOCK (element);
1725
1726   /* we release the element lock when posting the message so that any
1727    * (synchronous) message handlers can operate on the element */
1728   result = gst_bus_post (bus, message);
1729   gst_object_unref (bus);
1730
1731   return result;
1732
1733   /* ERRORS */
1734 no_bus:
1735   {
1736     GST_CAT_DEBUG_OBJECT (GST_CAT_MESSAGE, element,
1737         "not posting message %p: no bus", message);
1738     GST_OBJECT_UNLOCK (element);
1739     gst_message_unref (message);
1740     return FALSE;
1741   }
1742 }
1743
1744 /**
1745  * _gst_element_error_printf:
1746  * @format: the printf-like format to use, or %NULL
1747  *
1748  * This function is only used internally by the gst_element_error() macro.
1749  *
1750  * Returns: (transfer full): a newly allocated string, or %NULL if the format
1751  *     was %NULL or ""
1752  *
1753  * MT safe.
1754  */
1755 gchar *
1756 _gst_element_error_printf (const gchar * format, ...)
1757 {
1758   va_list args;
1759   gchar *buffer;
1760
1761   if (format == NULL)
1762     return NULL;
1763   if (format[0] == 0)
1764     return NULL;
1765
1766   va_start (args, format);
1767   buffer = g_strdup_vprintf (format, args);
1768   va_end (args);
1769   return buffer;
1770 }
1771
1772 /**
1773  * gst_element_message_full:
1774  * @element:  a #GstElement to send message from
1775  * @type:     the #GstMessageType
1776  * @domain:   the GStreamer GError domain this message belongs to
1777  * @code:     the GError code belonging to the domain
1778  * @text:     (allow-none) (transfer full): an allocated text string to be used
1779  *            as a replacement for the default message connected to code,
1780  *            or %NULL
1781  * @debug:    (allow-none) (transfer full): an allocated debug message to be
1782  *            used as a replacement for the default debugging information,
1783  *            or %NULL
1784  * @file:     the source code file where the error was generated
1785  * @function: the source code function where the error was generated
1786  * @line:     the source code line where the error was generated
1787  *
1788  * Post an error, warning or info message on the bus from inside an element.
1789  *
1790  * @type must be of #GST_MESSAGE_ERROR, #GST_MESSAGE_WARNING or
1791  * #GST_MESSAGE_INFO.
1792  *
1793  * MT safe.
1794  */
1795 void gst_element_message_full
1796     (GstElement * element, GstMessageType type,
1797     GQuark domain, gint code, gchar * text,
1798     gchar * debug, const gchar * file, const gchar * function, gint line)
1799 {
1800   GError *gerror = NULL;
1801   gchar *name;
1802   gchar *sent_text;
1803   gchar *sent_debug;
1804   gboolean has_debug = TRUE;
1805   GstMessage *message = NULL;
1806
1807   /* checks */
1808   GST_CAT_DEBUG_OBJECT (GST_CAT_MESSAGE, element, "start");
1809   g_return_if_fail (GST_IS_ELEMENT (element));
1810   g_return_if_fail ((type == GST_MESSAGE_ERROR) ||
1811       (type == GST_MESSAGE_WARNING) || (type == GST_MESSAGE_INFO));
1812
1813   /* check if we send the given text or the default error text */
1814   if ((text == NULL) || (text[0] == 0)) {
1815     /* text could have come from g_strdup_printf (""); */
1816     g_free (text);
1817     sent_text = gst_error_get_message (domain, code);
1818   } else
1819     sent_text = text;
1820
1821   /* construct a sent_debug with extra information from source */
1822   if ((debug == NULL) || (debug[0] == 0)) {
1823     /* debug could have come from g_strdup_printf (""); */
1824     has_debug = FALSE;
1825   }
1826
1827   name = gst_object_get_path_string (GST_OBJECT_CAST (element));
1828   if (has_debug)
1829     sent_debug = g_strdup_printf ("%s(%d): %s (): %s:\n%s",
1830         file, line, function, name, debug);
1831   else
1832     sent_debug = g_strdup_printf ("%s(%d): %s (): %s",
1833         file, line, function, name);
1834   g_free (name);
1835   g_free (debug);
1836
1837   /* create gerror and post message */
1838   GST_CAT_INFO_OBJECT (GST_CAT_ERROR_SYSTEM, element, "posting message: %s",
1839       sent_text);
1840   gerror = g_error_new_literal (domain, code, sent_text);
1841
1842   switch (type) {
1843     case GST_MESSAGE_ERROR:
1844       message =
1845           gst_message_new_error (GST_OBJECT_CAST (element), gerror, sent_debug);
1846       break;
1847     case GST_MESSAGE_WARNING:
1848       message = gst_message_new_warning (GST_OBJECT_CAST (element), gerror,
1849           sent_debug);
1850       break;
1851     case GST_MESSAGE_INFO:
1852       message = gst_message_new_info (GST_OBJECT_CAST (element), gerror,
1853           sent_debug);
1854       break;
1855     default:
1856       g_assert_not_reached ();
1857       break;
1858   }
1859   gst_element_post_message (element, message);
1860
1861   GST_CAT_INFO_OBJECT (GST_CAT_ERROR_SYSTEM, element, "posted %s message: %s",
1862       (type == GST_MESSAGE_ERROR ? "error" : "warning"), sent_text);
1863
1864   /* cleanup */
1865   g_error_free (gerror);
1866   g_free (sent_debug);
1867   g_free (sent_text);
1868 }
1869
1870 /**
1871  * gst_element_is_locked_state:
1872  * @element: a #GstElement.
1873  *
1874  * Checks if the state of an element is locked.
1875  * If the state of an element is locked, state changes of the parent don't
1876  * affect the element.
1877  * This way you can leave currently unused elements inside bins. Just lock their
1878  * state before changing the state from #GST_STATE_NULL.
1879  *
1880  * MT safe.
1881  *
1882  * Returns: TRUE, if the element's state is locked.
1883  */
1884 gboolean
1885 gst_element_is_locked_state (GstElement * element)
1886 {
1887   gboolean result;
1888
1889   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
1890
1891   GST_OBJECT_LOCK (element);
1892   result = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
1893   GST_OBJECT_UNLOCK (element);
1894
1895   return result;
1896 }
1897
1898 /**
1899  * gst_element_set_locked_state:
1900  * @element: a #GstElement
1901  * @locked_state: TRUE to lock the element's state
1902  *
1903  * Locks the state of an element, so state changes of the parent don't affect
1904  * this element anymore.
1905  *
1906  * MT safe.
1907  *
1908  * Returns: TRUE if the state was changed, FALSE if bad parameters were given
1909  * or the elements state-locking needed no change.
1910  */
1911 gboolean
1912 gst_element_set_locked_state (GstElement * element, gboolean locked_state)
1913 {
1914   gboolean old;
1915
1916   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
1917
1918   GST_OBJECT_LOCK (element);
1919   old = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
1920
1921   if (G_UNLIKELY (old == locked_state))
1922     goto was_ok;
1923
1924   if (locked_state) {
1925     GST_CAT_DEBUG (GST_CAT_STATES, "locking state of element %s",
1926         GST_ELEMENT_NAME (element));
1927     GST_OBJECT_FLAG_SET (element, GST_ELEMENT_LOCKED_STATE);
1928   } else {
1929     GST_CAT_DEBUG (GST_CAT_STATES, "unlocking state of element %s",
1930         GST_ELEMENT_NAME (element));
1931     GST_OBJECT_FLAG_UNSET (element, GST_ELEMENT_LOCKED_STATE);
1932   }
1933   GST_OBJECT_UNLOCK (element);
1934
1935   return TRUE;
1936
1937 was_ok:
1938   {
1939     GST_CAT_DEBUG (GST_CAT_STATES,
1940         "elements %s was already in locked state %d",
1941         GST_ELEMENT_NAME (element), old);
1942     GST_OBJECT_UNLOCK (element);
1943
1944     return FALSE;
1945   }
1946 }
1947
1948 /**
1949  * gst_element_sync_state_with_parent:
1950  * @element: a #GstElement.
1951  *
1952  * Tries to change the state of the element to the same as its parent.
1953  * If this function returns FALSE, the state of element is undefined.
1954  *
1955  * Returns: TRUE, if the element's state could be synced to the parent's state.
1956  *
1957  * MT safe.
1958  */
1959 gboolean
1960 gst_element_sync_state_with_parent (GstElement * element)
1961 {
1962   GstElement *parent;
1963   GstState target;
1964   GstStateChangeReturn ret;
1965
1966   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
1967
1968   if ((parent = GST_ELEMENT_CAST (gst_element_get_parent (element)))) {
1969     GstState parent_current, parent_pending;
1970
1971     GST_OBJECT_LOCK (parent);
1972     parent_current = GST_STATE (parent);
1973     parent_pending = GST_STATE_PENDING (parent);
1974     GST_OBJECT_UNLOCK (parent);
1975
1976     /* set to pending if there is one, else we set it to the current state of
1977      * the parent */
1978     if (parent_pending != GST_STATE_VOID_PENDING)
1979       target = parent_pending;
1980     else
1981       target = parent_current;
1982
1983     GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
1984         "syncing state (%s) to parent %s %s (%s, %s)",
1985         gst_element_state_get_name (GST_STATE (element)),
1986         GST_ELEMENT_NAME (parent), gst_element_state_get_name (target),
1987         gst_element_state_get_name (parent_current),
1988         gst_element_state_get_name (parent_pending));
1989
1990     ret = gst_element_set_state (element, target);
1991     if (ret == GST_STATE_CHANGE_FAILURE)
1992       goto failed;
1993
1994     gst_object_unref (parent);
1995
1996     return TRUE;
1997   } else {
1998     GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "element has no parent");
1999   }
2000   return FALSE;
2001
2002   /* ERROR */
2003 failed:
2004   {
2005     GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2006         "syncing state failed (%s)",
2007         gst_element_state_change_return_get_name (ret));
2008     gst_object_unref (parent);
2009     return FALSE;
2010   }
2011 }
2012
2013 /* MT safe */
2014 static GstStateChangeReturn
2015 gst_element_get_state_func (GstElement * element,
2016     GstState * state, GstState * pending, GstClockTime timeout)
2017 {
2018   GstStateChangeReturn ret = GST_STATE_CHANGE_FAILURE;
2019   GstState old_pending;
2020
2021   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "getting state, timeout %"
2022       GST_TIME_FORMAT, GST_TIME_ARGS (timeout));
2023
2024   GST_OBJECT_LOCK (element);
2025   ret = GST_STATE_RETURN (element);
2026   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "RETURN is %s",
2027       gst_element_state_change_return_get_name (ret));
2028
2029   /* we got an error, report immediately */
2030   if (ret == GST_STATE_CHANGE_FAILURE)
2031     goto done;
2032
2033   /* we got no_preroll, report immediatly */
2034   if (ret == GST_STATE_CHANGE_NO_PREROLL)
2035     goto done;
2036
2037   /* no need to wait async if we are not async */
2038   if (ret != GST_STATE_CHANGE_ASYNC)
2039     goto done;
2040
2041   old_pending = GST_STATE_PENDING (element);
2042   if (old_pending != GST_STATE_VOID_PENDING) {
2043     GTimeVal *timeval, abstimeout;
2044     guint32 cookie;
2045
2046     if (timeout != GST_CLOCK_TIME_NONE) {
2047       glong add = timeout / 1000;
2048
2049       if (add == 0)
2050         goto done;
2051
2052       /* make timeout absolute */
2053       g_get_current_time (&abstimeout);
2054       g_time_val_add (&abstimeout, add);
2055       timeval = &abstimeout;
2056     } else {
2057       timeval = NULL;
2058     }
2059     /* get cookie to detect state changes during waiting */
2060     cookie = element->state_cookie;
2061
2062     GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
2063         "waiting for element to commit state");
2064
2065     /* we have a pending state change, wait for it to complete */
2066     if (!GST_STATE_TIMED_WAIT (element, timeval)) {
2067       GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "timed out");
2068       /* timeout triggered */
2069       ret = GST_STATE_CHANGE_ASYNC;
2070     } else {
2071       if (cookie != element->state_cookie)
2072         goto interrupted;
2073
2074       /* could be success or failure */
2075       if (old_pending == GST_STATE (element)) {
2076         GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "got success");
2077         ret = GST_STATE_CHANGE_SUCCESS;
2078       } else {
2079         GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "got failure");
2080         ret = GST_STATE_CHANGE_FAILURE;
2081       }
2082     }
2083     /* if nothing is pending anymore we can return SUCCESS */
2084     if (GST_STATE_PENDING (element) == GST_STATE_VOID_PENDING) {
2085       GST_CAT_LOG_OBJECT (GST_CAT_STATES, element, "nothing pending");
2086       ret = GST_STATE_CHANGE_SUCCESS;
2087     }
2088   }
2089
2090 done:
2091   if (state)
2092     *state = GST_STATE (element);
2093   if (pending)
2094     *pending = GST_STATE_PENDING (element);
2095
2096   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2097       "state current: %s, pending: %s, result: %s",
2098       gst_element_state_get_name (GST_STATE (element)),
2099       gst_element_state_get_name (GST_STATE_PENDING (element)),
2100       gst_element_state_change_return_get_name (ret));
2101   GST_OBJECT_UNLOCK (element);
2102
2103   return ret;
2104
2105 interrupted:
2106   {
2107     if (state)
2108       *state = GST_STATE_VOID_PENDING;
2109     if (pending)
2110       *pending = GST_STATE_VOID_PENDING;
2111
2112     GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "interruped");
2113
2114     GST_OBJECT_UNLOCK (element);
2115
2116     return GST_STATE_CHANGE_FAILURE;
2117   }
2118 }
2119
2120 /**
2121  * gst_element_get_state:
2122  * @element: a #GstElement to get the state of.
2123  * @state: (out) (allow-none): a pointer to #GstState to hold the state.
2124  *     Can be %NULL.
2125  * @pending: (out) (allow-none): a pointer to #GstState to hold the pending
2126  *     state. Can be %NULL.
2127  * @timeout: a #GstClockTime to specify the timeout for an async
2128  *           state change or %GST_CLOCK_TIME_NONE for infinite timeout.
2129  *
2130  * Gets the state of the element.
2131  *
2132  * For elements that performed an ASYNC state change, as reported by
2133  * gst_element_set_state(), this function will block up to the
2134  * specified timeout value for the state change to complete.
2135  * If the element completes the state change or goes into
2136  * an error, this function returns immediately with a return value of
2137  * %GST_STATE_CHANGE_SUCCESS or %GST_STATE_CHANGE_FAILURE respectively.
2138  *
2139  * For elements that did not return %GST_STATE_CHANGE_ASYNC, this function
2140  * returns the current and pending state immediately.
2141  *
2142  * This function returns %GST_STATE_CHANGE_NO_PREROLL if the element
2143  * successfully changed its state but is not able to provide data yet.
2144  * This mostly happens for live sources that only produce data in
2145  * %GST_STATE_PLAYING. While the state change return is equivalent to
2146  * %GST_STATE_CHANGE_SUCCESS, it is returned to the application to signal that
2147  * some sink elements might not be able to complete their state change because
2148  * an element is not producing data to complete the preroll. When setting the
2149  * element to playing, the preroll will complete and playback will start.
2150  *
2151  * Returns: %GST_STATE_CHANGE_SUCCESS if the element has no more pending state
2152  *          and the last state change succeeded, %GST_STATE_CHANGE_ASYNC if the
2153  *          element is still performing a state change or
2154  *          %GST_STATE_CHANGE_FAILURE if the last state change failed.
2155  *
2156  * MT safe.
2157  */
2158 GstStateChangeReturn
2159 gst_element_get_state (GstElement * element,
2160     GstState * state, GstState * pending, GstClockTime timeout)
2161 {
2162   GstElementClass *oclass;
2163   GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
2164
2165   g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE);
2166
2167   oclass = GST_ELEMENT_GET_CLASS (element);
2168
2169   if (oclass->get_state)
2170     result = (oclass->get_state) (element, state, pending, timeout);
2171
2172   return result;
2173 }
2174
2175 /**
2176  * gst_element_abort_state:
2177  * @element: a #GstElement to abort the state of.
2178  *
2179  * Abort the state change of the element. This function is used
2180  * by elements that do asynchronous state changes and find out
2181  * something is wrong.
2182  *
2183  * This function should be called with the STATE_LOCK held.
2184  *
2185  * MT safe.
2186  */
2187 void
2188 gst_element_abort_state (GstElement * element)
2189 {
2190   GstState pending;
2191
2192 #ifndef GST_DISABLE_GST_DEBUG
2193   GstState old_state;
2194 #endif
2195
2196   g_return_if_fail (GST_IS_ELEMENT (element));
2197
2198   GST_OBJECT_LOCK (element);
2199   pending = GST_STATE_PENDING (element);
2200
2201   if (pending == GST_STATE_VOID_PENDING ||
2202       GST_STATE_RETURN (element) == GST_STATE_CHANGE_FAILURE)
2203     goto nothing_aborted;
2204
2205 #ifndef GST_DISABLE_GST_DEBUG
2206   old_state = GST_STATE (element);
2207
2208   GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
2209       "aborting state from %s to %s", gst_element_state_get_name (old_state),
2210       gst_element_state_get_name (pending));
2211 #endif
2212
2213   /* flag error */
2214   GST_STATE_RETURN (element) = GST_STATE_CHANGE_FAILURE;
2215
2216   GST_STATE_BROADCAST (element);
2217   GST_OBJECT_UNLOCK (element);
2218
2219   return;
2220
2221 nothing_aborted:
2222   {
2223     GST_OBJECT_UNLOCK (element);
2224     return;
2225   }
2226 }
2227
2228 /* Not static because GstBin has manual state handling too */
2229 void
2230 _priv_gst_element_state_changed (GstElement * element, GstState oldstate,
2231     GstState newstate, GstState pending)
2232 {
2233   GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
2234   GstMessage *message;
2235
2236   GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
2237       "notifying about state-changed %s to %s (%s pending)",
2238       gst_element_state_get_name (oldstate),
2239       gst_element_state_get_name (newstate),
2240       gst_element_state_get_name (pending));
2241
2242   if (klass->state_changed)
2243     klass->state_changed (element, oldstate, newstate, pending);
2244
2245   message = gst_message_new_state_changed (GST_OBJECT_CAST (element),
2246       oldstate, newstate, pending);
2247   gst_element_post_message (element, message);
2248 }
2249
2250 /**
2251  * gst_element_continue_state:
2252  * @element: a #GstElement to continue the state change of.
2253  * @ret: The previous state return value
2254  *
2255  * Commit the state change of the element and proceed to the next
2256  * pending state if any. This function is used
2257  * by elements that do asynchronous state changes.
2258  * The core will normally call this method automatically when an
2259  * element returned %GST_STATE_CHANGE_SUCCESS from the state change function.
2260  *
2261  * If after calling this method the element still has not reached
2262  * the pending state, the next state change is performed.
2263  *
2264  * This method is used internally and should normally not be called by plugins
2265  * or applications.
2266  *
2267  * Returns: The result of the commit state change.
2268  *
2269  * MT safe.
2270  */
2271 GstStateChangeReturn
2272 gst_element_continue_state (GstElement * element, GstStateChangeReturn ret)
2273 {
2274   GstStateChangeReturn old_ret;
2275   GstState old_state, old_next;
2276   GstState current, next, pending;
2277   GstStateChange transition;
2278
2279   GST_OBJECT_LOCK (element);
2280   old_ret = GST_STATE_RETURN (element);
2281   GST_STATE_RETURN (element) = ret;
2282   pending = GST_STATE_PENDING (element);
2283
2284   /* check if there is something to commit */
2285   if (pending == GST_STATE_VOID_PENDING)
2286     goto nothing_pending;
2287
2288   old_state = GST_STATE (element);
2289   /* this is the state we should go to next */
2290   old_next = GST_STATE_NEXT (element);
2291   /* update current state */
2292   current = GST_STATE (element) = old_next;
2293
2294   /* see if we reached the final state */
2295   if (pending == current)
2296     goto complete;
2297
2298   next = GST_STATE_GET_NEXT (current, pending);
2299   transition = (GstStateChange) GST_STATE_TRANSITION (current, next);
2300
2301   GST_STATE_NEXT (element) = next;
2302   /* mark busy */
2303   GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
2304   GST_OBJECT_UNLOCK (element);
2305
2306   GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
2307       "committing state from %s to %s, pending %s, next %s",
2308       gst_element_state_get_name (old_state),
2309       gst_element_state_get_name (old_next),
2310       gst_element_state_get_name (pending), gst_element_state_get_name (next));
2311
2312   _priv_gst_element_state_changed (element, old_state, old_next, pending);
2313
2314   GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
2315       "continue state change %s to %s, final %s",
2316       gst_element_state_get_name (current),
2317       gst_element_state_get_name (next), gst_element_state_get_name (pending));
2318
2319   ret = gst_element_change_state (element, transition);
2320
2321   return ret;
2322
2323 nothing_pending:
2324   {
2325     GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "nothing pending");
2326     GST_OBJECT_UNLOCK (element);
2327     return ret;
2328   }
2329 complete:
2330   {
2331     GST_STATE_PENDING (element) = GST_STATE_VOID_PENDING;
2332     GST_STATE_NEXT (element) = GST_STATE_VOID_PENDING;
2333
2334     GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
2335         "completed state change to %s", gst_element_state_get_name (pending));
2336     GST_OBJECT_UNLOCK (element);
2337
2338     /* don't post silly messages with the same state. This can happen
2339      * when an element state is changed to what it already was. For bins
2340      * this can be the result of a lost state, which we check with the
2341      * previous return value.
2342      * We do signal the cond though as a _get_state() might be blocking
2343      * on it. */
2344     if (old_state != old_next || old_ret == GST_STATE_CHANGE_ASYNC)
2345       _priv_gst_element_state_changed (element, old_state, old_next,
2346           GST_STATE_VOID_PENDING);
2347
2348     GST_STATE_BROADCAST (element);
2349
2350     return ret;
2351   }
2352 }
2353
2354 /**
2355  * gst_element_lost_state:
2356  * @element: a #GstElement the state is lost of
2357  * @new_base_time: if a new base time should be distributed
2358  *
2359  * Brings the element to the lost state. The current state of the
2360  * element is copied to the pending state so that any call to
2361  * gst_element_get_state() will return %GST_STATE_CHANGE_ASYNC.
2362  *
2363  * An ASYNC_START message is posted with indication to distribute a new
2364  * base_time to the element when @new_base_time is %TRUE.
2365  * If the element was PLAYING, it will go to PAUSED. The element
2366  * will be restored to its PLAYING state by the parent pipeline when it
2367  * prerolls again.
2368  *
2369  * This is mostly used for elements that lost their preroll buffer
2370  * in the %GST_STATE_PAUSED or %GST_STATE_PLAYING state after a flush,
2371  * they will go to their pending state again when a new preroll buffer is
2372  * queued. This function can only be called when the element is currently
2373  * not in error or an async state change.
2374  *
2375  * This function is used internally and should normally not be called from
2376  * plugins or applications.
2377  */
2378 void
2379 gst_element_lost_state (GstElement * element, gboolean new_base_time)
2380 {
2381   GstState old_state, new_state;
2382   GstMessage *message;
2383
2384   g_return_if_fail (GST_IS_ELEMENT (element));
2385
2386   GST_OBJECT_LOCK (element);
2387   if (GST_STATE_RETURN (element) == GST_STATE_CHANGE_FAILURE)
2388     goto nothing_lost;
2389
2390   if (GST_STATE_PENDING (element) != GST_STATE_VOID_PENDING)
2391     goto only_async_start;
2392
2393   old_state = GST_STATE (element);
2394
2395   /* when we were PLAYING, the new state is PAUSED. We will also not
2396    * automatically go to PLAYING but let the parent bin(s) set us to PLAYING
2397    * when we preroll. */
2398   if (old_state > GST_STATE_PAUSED)
2399     new_state = GST_STATE_PAUSED;
2400   else
2401     new_state = old_state;
2402
2403   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2404       "lost state of %s to %s", gst_element_state_get_name (old_state),
2405       gst_element_state_get_name (new_state));
2406
2407   GST_STATE (element) = new_state;
2408   GST_STATE_NEXT (element) = new_state;
2409   GST_STATE_PENDING (element) = new_state;
2410   GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
2411   if (new_base_time)
2412     GST_ELEMENT_START_TIME (element) = 0;
2413   GST_OBJECT_UNLOCK (element);
2414
2415   _priv_gst_element_state_changed (element, new_state, new_state, new_state);
2416
2417   message =
2418       gst_message_new_async_start (GST_OBJECT_CAST (element), new_base_time);
2419   gst_element_post_message (element, message);
2420
2421   return;
2422
2423 nothing_lost:
2424   {
2425     GST_OBJECT_UNLOCK (element);
2426     return;
2427   }
2428 only_async_start:
2429   {
2430     GST_OBJECT_UNLOCK (element);
2431
2432     message = gst_message_new_async_start (GST_OBJECT_CAST (element), TRUE);
2433     gst_element_post_message (element, message);
2434     return;
2435   }
2436 }
2437
2438 /**
2439  * gst_element_set_state:
2440  * @element: a #GstElement to change state of.
2441  * @state: the element's new #GstState.
2442  *
2443  * Sets the state of the element. This function will try to set the
2444  * requested state by going through all the intermediary states and calling
2445  * the class's state change function for each.
2446  *
2447  * This function can return #GST_STATE_CHANGE_ASYNC, in which case the
2448  * element will perform the remainder of the state change asynchronously in
2449  * another thread.
2450  * An application can use gst_element_get_state() to wait for the completion
2451  * of the state change or it can wait for a state change message on the bus.
2452  *
2453  * State changes to %GST_STATE_READY or %GST_STATE_NULL never return
2454  * #GST_STATE_CHANGE_ASYNC.
2455  *
2456  * Returns: Result of the state change using #GstStateChangeReturn.
2457  *
2458  * MT safe.
2459  */
2460 GstStateChangeReturn
2461 gst_element_set_state (GstElement * element, GstState state)
2462 {
2463   GstElementClass *oclass;
2464   GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
2465
2466   g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE);
2467
2468   oclass = GST_ELEMENT_GET_CLASS (element);
2469
2470   if (oclass->set_state)
2471     result = (oclass->set_state) (element, state);
2472
2473   return result;
2474 }
2475
2476 /*
2477  * default set state function, calculates the next state based
2478  * on current state and calls the change_state function
2479  */
2480 static GstStateChangeReturn
2481 gst_element_set_state_func (GstElement * element, GstState state)
2482 {
2483   GstState current, next, old_pending;
2484   GstStateChangeReturn ret;
2485   GstStateChange transition;
2486   GstStateChangeReturn old_ret;
2487
2488   g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE);
2489
2490   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "set_state to %s",
2491       gst_element_state_get_name (state));
2492
2493   /* state lock is taken to protect the set_state() and get_state()
2494    * procedures, it does not lock any variables. */
2495   GST_STATE_LOCK (element);
2496
2497   /* now calculate how to get to the new state */
2498   GST_OBJECT_LOCK (element);
2499   old_ret = GST_STATE_RETURN (element);
2500   /* previous state change returned an error, remove all pending
2501    * and next states */
2502   if (old_ret == GST_STATE_CHANGE_FAILURE) {
2503     GST_STATE_NEXT (element) = GST_STATE_VOID_PENDING;
2504     GST_STATE_PENDING (element) = GST_STATE_VOID_PENDING;
2505     GST_STATE_RETURN (element) = GST_STATE_CHANGE_SUCCESS;
2506   }
2507
2508   current = GST_STATE (element);
2509   next = GST_STATE_NEXT (element);
2510   old_pending = GST_STATE_PENDING (element);
2511
2512   /* this is the (new) state we should go to. TARGET is the last state we set on
2513    * the element. */
2514   if (state != GST_STATE_TARGET (element)) {
2515     GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2516         "setting target state to %s", gst_element_state_get_name (state));
2517     GST_STATE_TARGET (element) = state;
2518     /* increment state cookie so that we can track each state change. We only do
2519      * this if this is actually a new state change. */
2520     element->state_cookie++;
2521   }
2522   GST_STATE_PENDING (element) = state;
2523
2524   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2525       "current %s, old_pending %s, next %s, old return %s",
2526       gst_element_state_get_name (current),
2527       gst_element_state_get_name (old_pending),
2528       gst_element_state_get_name (next),
2529       gst_element_state_change_return_get_name (old_ret));
2530
2531   /* if the element was busy doing a state change, we just update the
2532    * target state, it'll get to it async then. */
2533   if (old_pending != GST_STATE_VOID_PENDING) {
2534     /* upwards state change will happen ASYNC */
2535     if (old_pending <= state)
2536       goto was_busy;
2537     /* element is going to this state already */
2538     else if (next == state)
2539       goto was_busy;
2540     /* element was performing an ASYNC upward state change and
2541      * we request to go downward again. Start from the next pending
2542      * state then. */
2543     else if (next > state
2544         && GST_STATE_RETURN (element) == GST_STATE_CHANGE_ASYNC) {
2545       current = next;
2546     }
2547   }
2548   next = GST_STATE_GET_NEXT (current, state);
2549   /* now we store the next state */
2550   GST_STATE_NEXT (element) = next;
2551   /* mark busy, we need to check that there is actually a state change
2552    * to be done else we could accidentally override SUCCESS/NO_PREROLL and
2553    * the default element change_state function has no way to know what the
2554    * old value was... could consider this a FIXME...*/
2555   if (current != next)
2556     GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
2557
2558   transition = (GstStateChange) GST_STATE_TRANSITION (current, next);
2559
2560   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2561       "%s: setting state from %s to %s",
2562       (next != state ? "intermediate" : "final"),
2563       gst_element_state_get_name (current), gst_element_state_get_name (next));
2564
2565   /* now signal any waiters, they will error since the cookie was incremented */
2566   GST_STATE_BROADCAST (element);
2567
2568   GST_OBJECT_UNLOCK (element);
2569
2570   ret = gst_element_change_state (element, transition);
2571
2572   GST_STATE_UNLOCK (element);
2573
2574   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "returned %s",
2575       gst_element_state_change_return_get_name (ret));
2576
2577   return ret;
2578
2579 was_busy:
2580   {
2581     GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
2582     GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2583         "element was busy with async state change");
2584     GST_OBJECT_UNLOCK (element);
2585
2586     GST_STATE_UNLOCK (element);
2587
2588     return GST_STATE_CHANGE_ASYNC;
2589   }
2590 }
2591
2592 /**
2593  * gst_element_change_state:
2594  * @element: a #GstElement
2595  * @transition: the requested transition
2596  *
2597  * Perform @transition on @element.
2598  *
2599  * This function must be called with STATE_LOCK held and is mainly used
2600  * internally.
2601  *
2602  * Returns: the #GstStateChangeReturn of the state transition.
2603  */
2604 GstStateChangeReturn
2605 gst_element_change_state (GstElement * element, GstStateChange transition)
2606 {
2607   GstElementClass *oclass;
2608   GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
2609
2610   oclass = GST_ELEMENT_GET_CLASS (element);
2611
2612   /* call the state change function so it can set the state */
2613   if (oclass->change_state)
2614     ret = (oclass->change_state) (element, transition);
2615   else
2616     ret = GST_STATE_CHANGE_FAILURE;
2617
2618   switch (ret) {
2619     case GST_STATE_CHANGE_FAILURE:
2620       GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
2621           "have FAILURE change_state return");
2622       /* state change failure */
2623       gst_element_abort_state (element);
2624       break;
2625     case GST_STATE_CHANGE_ASYNC:
2626     {
2627       GstState target;
2628
2629       GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2630           "element will change state ASYNC");
2631
2632       target = GST_STATE_TARGET (element);
2633
2634       if (target > GST_STATE_READY)
2635         goto async;
2636
2637       /* else we just continue the state change downwards */
2638       GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
2639           "forcing commit state %s <= %s",
2640           gst_element_state_get_name (target),
2641           gst_element_state_get_name (GST_STATE_READY));
2642
2643       ret = gst_element_continue_state (element, GST_STATE_CHANGE_SUCCESS);
2644       break;
2645     }
2646     case GST_STATE_CHANGE_SUCCESS:
2647       GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2648           "element changed state SUCCESS");
2649       /* we can commit the state now which will proceeed to
2650        * the next state */
2651       ret = gst_element_continue_state (element, ret);
2652       break;
2653     case GST_STATE_CHANGE_NO_PREROLL:
2654       GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2655           "element changed state NO_PREROLL");
2656       /* we can commit the state now which will proceeed to
2657        * the next state */
2658       ret = gst_element_continue_state (element, ret);
2659       break;
2660     default:
2661       goto invalid_return;
2662   }
2663
2664   GST_CAT_LOG_OBJECT (GST_CAT_STATES, element, "exit state change %d", ret);
2665
2666   return ret;
2667
2668 async:
2669   GST_CAT_LOG_OBJECT (GST_CAT_STATES, element, "exit async state change %d",
2670       ret);
2671
2672   return ret;
2673
2674   /* ERROR */
2675 invalid_return:
2676   {
2677     GST_OBJECT_LOCK (element);
2678     /* somebody added a GST_STATE_ and forgot to do stuff here ! */
2679     g_critical ("%s: unknown return value %d from a state change function",
2680         GST_ELEMENT_NAME (element), ret);
2681
2682     /* we are in error now */
2683     ret = GST_STATE_CHANGE_FAILURE;
2684     GST_STATE_RETURN (element) = ret;
2685     GST_OBJECT_UNLOCK (element);
2686
2687     return ret;
2688   }
2689 }
2690
2691 /* gst_iterator_fold functions for pads_activate
2692  * Stop the iterator if activating one pad failed. */
2693 static gboolean
2694 activate_pads (const GValue * vpad, GValue * ret, gboolean * active)
2695 {
2696   GstPad *pad = g_value_get_object (vpad);
2697   gboolean cont = TRUE;
2698
2699   if (!(cont = gst_pad_set_active (pad, *active)))
2700     g_value_set_boolean (ret, FALSE);
2701
2702   return cont;
2703 }
2704
2705 /* returns false on error or early cutout of the fold, true if all
2706  * pads in @iter were (de)activated successfully. */
2707 static gboolean
2708 iterator_activate_fold_with_resync (GstIterator * iter,
2709     GstIteratorFoldFunction func, gpointer user_data)
2710 {
2711   GstIteratorResult ires;
2712   GValue ret = { 0 };
2713
2714   /* no need to unset this later, it's just a boolean */
2715   g_value_init (&ret, G_TYPE_BOOLEAN);
2716   g_value_set_boolean (&ret, TRUE);
2717
2718   while (1) {
2719     ires = gst_iterator_fold (iter, func, &ret, user_data);
2720     switch (ires) {
2721       case GST_ITERATOR_RESYNC:
2722         /* need to reset the result again */
2723         g_value_set_boolean (&ret, TRUE);
2724         gst_iterator_resync (iter);
2725         break;
2726       case GST_ITERATOR_DONE:
2727         /* all pads iterated, return collected value */
2728         goto done;
2729       default:
2730         /* iterator returned _ERROR or premature end with _OK,
2731          * mark an error and exit */
2732         g_value_set_boolean (&ret, FALSE);
2733         goto done;
2734     }
2735   }
2736 done:
2737   /* return collected value */
2738   return g_value_get_boolean (&ret);
2739 }
2740
2741 /* is called with STATE_LOCK
2742  *
2743  * Pads are activated from source pads to sinkpads.
2744  */
2745 static gboolean
2746 gst_element_pads_activate (GstElement * element, gboolean active)
2747 {
2748   GstIterator *iter;
2749   gboolean res;
2750
2751   GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
2752       "pads_activate with active %d", active);
2753
2754   iter = gst_element_iterate_src_pads (element);
2755   res =
2756       iterator_activate_fold_with_resync (iter,
2757       (GstIteratorFoldFunction) activate_pads, &active);
2758   gst_iterator_free (iter);
2759   if (G_UNLIKELY (!res))
2760     goto src_failed;
2761
2762   iter = gst_element_iterate_sink_pads (element);
2763   res =
2764       iterator_activate_fold_with_resync (iter,
2765       (GstIteratorFoldFunction) activate_pads, &active);
2766   gst_iterator_free (iter);
2767   if (G_UNLIKELY (!res))
2768     goto sink_failed;
2769
2770   GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
2771       "pads_activate successful");
2772
2773   return TRUE;
2774
2775   /* ERRORS */
2776 src_failed:
2777   {
2778     GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
2779         "source pads_activate failed");
2780     return FALSE;
2781   }
2782 sink_failed:
2783   {
2784     GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
2785         "sink pads_activate failed");
2786     return FALSE;
2787   }
2788 }
2789
2790 /* is called with STATE_LOCK */
2791 static GstStateChangeReturn
2792 gst_element_change_state_func (GstElement * element, GstStateChange transition)
2793 {
2794   GstState state, next;
2795   GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS;
2796
2797   g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE);
2798
2799   state = (GstState) GST_STATE_TRANSITION_CURRENT (transition);
2800   next = GST_STATE_TRANSITION_NEXT (transition);
2801
2802   /* if the element already is in the given state, we just return success */
2803   if (next == GST_STATE_VOID_PENDING || state == next)
2804     goto was_ok;
2805
2806   GST_CAT_LOG_OBJECT (GST_CAT_STATES, element,
2807       "default handler tries setting state from %s to %s (%04x)",
2808       gst_element_state_get_name (state),
2809       gst_element_state_get_name (next), transition);
2810
2811   switch (transition) {
2812     case GST_STATE_CHANGE_NULL_TO_READY:
2813       break;
2814     case GST_STATE_CHANGE_READY_TO_PAUSED:
2815       if (!gst_element_pads_activate (element, TRUE)) {
2816         result = GST_STATE_CHANGE_FAILURE;
2817       }
2818       break;
2819     case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
2820       break;
2821     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
2822       break;
2823     case GST_STATE_CHANGE_PAUSED_TO_READY:
2824     case GST_STATE_CHANGE_READY_TO_NULL:
2825       /* deactivate pads in both cases, since they are activated on
2826          ready->paused but the element might not have made it to paused */
2827       if (!gst_element_pads_activate (element, FALSE)) {
2828         result = GST_STATE_CHANGE_FAILURE;
2829       }
2830       break;
2831     default:
2832       /* this will catch real but unhandled state changes;
2833        * can only be caused by:
2834        * - a new state was added
2835        * - somehow the element was asked to jump across an intermediate state
2836        */
2837       g_warning ("Unhandled state change from %s to %s",
2838           gst_element_state_get_name (state),
2839           gst_element_state_get_name (next));
2840       break;
2841   }
2842   return result;
2843
2844 was_ok:
2845   {
2846     GST_OBJECT_LOCK (element);
2847     result = GST_STATE_RETURN (element);
2848     GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
2849         "element is already in the %s state",
2850         gst_element_state_get_name (state));
2851     GST_OBJECT_UNLOCK (element);
2852
2853     return result;
2854   }
2855 }
2856
2857 /**
2858  * gst_element_get_factory:
2859  * @element: a #GstElement to request the element factory of.
2860  *
2861  * Retrieves the factory that was used to create this element.
2862  *
2863  * Returns: (transfer none): the #GstElementFactory used for creating this
2864  *     element. no refcounting is needed.
2865  */
2866 GstElementFactory *
2867 gst_element_get_factory (GstElement * element)
2868 {
2869   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
2870
2871   return GST_ELEMENT_GET_CLASS (element)->elementfactory;
2872 }
2873
2874 static void
2875 gst_element_dispose (GObject * object)
2876 {
2877   GstElement *element = GST_ELEMENT_CAST (object);
2878   GstClock **clock_p;
2879   GstBus **bus_p;
2880
2881   GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "dispose");
2882
2883   if (GST_STATE (element) != GST_STATE_NULL)
2884     goto not_null;
2885
2886   GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
2887       "removing %d pads", g_list_length (element->pads));
2888   /* first we break all our links with the outside */
2889   while (element->pads && element->pads->data) {
2890     /* don't call _remove_pad with NULL */
2891     gst_element_remove_pad (element, GST_PAD_CAST (element->pads->data));
2892   }
2893   if (G_UNLIKELY (element->pads != NULL)) {
2894     g_critical ("could not remove pads from element %s",
2895         GST_STR_NULL (GST_OBJECT_NAME (object)));
2896   }
2897
2898   GST_OBJECT_LOCK (element);
2899   clock_p = &element->clock;
2900   bus_p = &element->bus;
2901   gst_object_replace ((GstObject **) clock_p, NULL);
2902   gst_object_replace ((GstObject **) bus_p, NULL);
2903   GST_OBJECT_UNLOCK (element);
2904
2905   GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "parent class dispose");
2906
2907   G_OBJECT_CLASS (parent_class)->dispose (object);
2908
2909   return;
2910
2911   /* ERRORS */
2912 not_null:
2913   {
2914     gboolean is_locked;
2915
2916     is_locked = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
2917     g_critical
2918         ("\nTrying to dispose element %s, but it is in %s%s instead of the NULL"
2919         " state.\n"
2920         "You need to explicitly set elements to the NULL state before\n"
2921         "dropping the final reference, to allow them to clean up.\n"
2922         "This problem may also be caused by a refcounting bug in the\n"
2923         "application or some element.\n",
2924         GST_OBJECT_NAME (element),
2925         gst_element_state_get_name (GST_STATE (element)),
2926         is_locked ? " (locked)" : "");
2927     return;
2928   }
2929 }
2930
2931 static void
2932 gst_element_finalize (GObject * object)
2933 {
2934   GstElement *element = GST_ELEMENT_CAST (object);
2935
2936   GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "finalize");
2937
2938   GST_STATE_LOCK (element);
2939   if (element->state_cond)
2940     g_cond_free (element->state_cond);
2941   element->state_cond = NULL;
2942   GST_STATE_UNLOCK (element);
2943   g_static_rec_mutex_free (element->state_lock);
2944   g_slice_free (GStaticRecMutex, element->state_lock);
2945   element->state_lock = NULL;
2946
2947   GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "finalize parent");
2948
2949   G_OBJECT_CLASS (parent_class)->finalize (object);
2950 }
2951
2952 static void
2953 gst_element_set_bus_func (GstElement * element, GstBus * bus)
2954 {
2955   GstBus **bus_p;
2956
2957   g_return_if_fail (GST_IS_ELEMENT (element));
2958
2959   GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, element, "setting bus to %p", bus);
2960
2961   GST_OBJECT_LOCK (element);
2962   bus_p = &GST_ELEMENT_BUS (element);
2963   gst_object_replace ((GstObject **) bus_p, GST_OBJECT_CAST (bus));
2964   GST_OBJECT_UNLOCK (element);
2965 }
2966
2967 /**
2968  * gst_element_set_bus:
2969  * @element: a #GstElement to set the bus of.
2970  * @bus: (transfer none): the #GstBus to set.
2971  *
2972  * Sets the bus of the element. Increases the refcount on the bus.
2973  * For internal use only, unless you're testing elements.
2974  *
2975  * MT safe.
2976  */
2977 void
2978 gst_element_set_bus (GstElement * element, GstBus * bus)
2979 {
2980   GstElementClass *oclass;
2981
2982   g_return_if_fail (GST_IS_ELEMENT (element));
2983
2984   oclass = GST_ELEMENT_GET_CLASS (element);
2985
2986   if (oclass->set_bus)
2987     oclass->set_bus (element, bus);
2988 }
2989
2990 /**
2991  * gst_element_get_bus:
2992  * @element: a #GstElement to get the bus of.
2993  *
2994  * Returns the bus of the element. Note that only a #GstPipeline will provide a
2995  * bus for the application.
2996  *
2997  * Returns: (transfer full): the element's #GstBus. unref after usage.
2998  *
2999  * MT safe.
3000  */
3001 GstBus *
3002 gst_element_get_bus (GstElement * element)
3003 {
3004   GstBus *result = NULL;
3005
3006   g_return_val_if_fail (GST_IS_ELEMENT (element), result);
3007
3008   GST_OBJECT_LOCK (element);
3009   if ((result = GST_ELEMENT_BUS (element)))
3010     gst_object_ref (result);
3011   GST_OBJECT_UNLOCK (element);
3012
3013   GST_CAT_DEBUG_OBJECT (GST_CAT_BUS, element, "got bus %" GST_PTR_FORMAT,
3014       result);
3015
3016   return result;
3017 }