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