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