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