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