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