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