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