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