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