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