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