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