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