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