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