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