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