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