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