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