gstpad: fix gst_pad_can_link()
[platform/upstream/gstreamer.git] / gst / gstutils.c
1 /* GStreamer
2  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3  *                    2000 Wim Taymans <wtay@chello.be>
4  *                    2002 Thomas Vander Stichele <thomas@apestaart.org>
5  *
6  * gstutils.c: Utility functions
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 /**
25  * SECTION:gstutils
26  * @short_description: Various utility functions
27  *
28  * When defining own plugins, use the GST_BOILERPLATE ease gobject creation.
29  */
30
31 #include "gst_private.h"
32 #include <stdio.h>
33 #include <string.h>
34
35 #include "gstghostpad.h"
36 #include "gstutils.h"
37 #include "gsterror.h"
38 #include "gstinfo.h"
39 #include "gstparse.h"
40 #include "gst-i18n-lib.h"
41
42 /**
43  * gst_util_dump_mem:
44  * @mem: a pointer to the memory to dump
45  * @size: the size of the memory block to dump
46  *
47  * Dumps the memory block into a hex representation. Useful for debugging.
48  */
49 void
50 gst_util_dump_mem (const guchar * mem, guint size)
51 {
52   guint i, j;
53   GString *string = g_string_sized_new (50);
54   GString *chars = g_string_sized_new (18);
55
56   i = j = 0;
57   while (i < size) {
58     if (g_ascii_isprint (mem[i]))
59       g_string_append_c (chars, mem[i]);
60     else
61       g_string_append_c (chars, '.');
62
63     g_string_append_printf (string, "%02x ", mem[i]);
64
65     j++;
66     i++;
67
68     if (j == 16 || i == size) {
69       g_print ("%08x (%p): %-48.48s %-16.16s\n", i - j, mem + i - j,
70           string->str, chars->str);
71       g_string_set_size (string, 0);
72       g_string_set_size (chars, 0);
73       j = 0;
74     }
75   }
76   g_string_free (string, TRUE);
77   g_string_free (chars, TRUE);
78 }
79
80
81 /**
82  * gst_util_set_value_from_string:
83  * @value: the value to set
84  * @value_str: the string to get the value from
85  *
86  * Converts the string to the type of the value and
87  * sets the value with it.
88  */
89 void
90 gst_util_set_value_from_string (GValue * value, const gchar * value_str)
91 {
92   gint sscanf_ret;
93
94   g_return_if_fail (value != NULL);
95   g_return_if_fail (value_str != NULL);
96
97   GST_CAT_DEBUG (GST_CAT_PARAMS, "parsing '%s' to type %s", value_str,
98       g_type_name (G_VALUE_TYPE (value)));
99
100   switch (G_VALUE_TYPE (value)) {
101     case G_TYPE_STRING:
102       g_value_set_string (value, value_str);
103       break;
104     case G_TYPE_ENUM:
105     case G_TYPE_INT:{
106       gint i;
107
108       sscanf_ret = sscanf (value_str, "%d", &i);
109       g_return_if_fail (sscanf_ret == 1);
110       g_value_set_int (value, i);
111       break;
112     }
113     case G_TYPE_UINT:{
114       guint i;
115
116       sscanf_ret = sscanf (value_str, "%u", &i);
117       g_return_if_fail (sscanf_ret == 1);
118       g_value_set_uint (value, i);
119       break;
120     }
121     case G_TYPE_LONG:{
122       glong i;
123
124       sscanf_ret = sscanf (value_str, "%ld", &i);
125       g_return_if_fail (sscanf_ret == 1);
126       g_value_set_long (value, i);
127       break;
128     }
129     case G_TYPE_ULONG:{
130       gulong i;
131
132       sscanf_ret = sscanf (value_str, "%lu", &i);
133       g_return_if_fail (sscanf_ret == 1);
134       g_value_set_ulong (value, i);
135       break;
136     }
137     case G_TYPE_BOOLEAN:{
138       gboolean i = FALSE;
139
140       if (!g_ascii_strncasecmp ("true", value_str, 4))
141         i = TRUE;
142       g_value_set_boolean (value, i);
143       break;
144     }
145     case G_TYPE_CHAR:{
146       gchar i;
147
148       sscanf_ret = sscanf (value_str, "%c", &i);
149       g_return_if_fail (sscanf_ret == 1);
150       g_value_set_char (value, i);
151       break;
152     }
153     case G_TYPE_UCHAR:{
154       guchar i;
155
156       sscanf_ret = sscanf (value_str, "%c", &i);
157       g_return_if_fail (sscanf_ret == 1);
158       g_value_set_uchar (value, i);
159       break;
160     }
161     case G_TYPE_FLOAT:{
162       gfloat i;
163
164       sscanf_ret = sscanf (value_str, "%f", &i);
165       g_return_if_fail (sscanf_ret == 1);
166       g_value_set_float (value, i);
167       break;
168     }
169     case G_TYPE_DOUBLE:{
170       gfloat i;
171
172       sscanf_ret = sscanf (value_str, "%g", &i);
173       g_return_if_fail (sscanf_ret == 1);
174       g_value_set_double (value, (gdouble) i);
175       break;
176     }
177     default:
178       break;
179   }
180 }
181
182 /**
183  * gst_util_set_object_arg:
184  * @object: the object to set the argument of
185  * @name: the name of the argument to set
186  * @value: the string value to set
187  *
188  * Convertes the string value to the type of the objects argument and
189  * sets the argument with it.
190  */
191 void
192 gst_util_set_object_arg (GObject * object, const gchar * name,
193     const gchar * value)
194 {
195   gboolean sscanf_ret;
196
197   if (name && value) {
198     GParamSpec *paramspec;
199
200     paramspec =
201         g_object_class_find_property (G_OBJECT_GET_CLASS (object), name);
202
203     if (!paramspec) {
204       return;
205     }
206
207     GST_DEBUG ("paramspec->flags is %d, paramspec->value_type is %d",
208         paramspec->flags, (gint) paramspec->value_type);
209
210     if (paramspec->flags & G_PARAM_WRITABLE) {
211       switch (paramspec->value_type) {
212         case G_TYPE_STRING:
213           g_object_set (G_OBJECT (object), name, value, NULL);
214           break;
215         case G_TYPE_ENUM:
216         case G_TYPE_INT:{
217           gint i;
218
219           sscanf_ret = sscanf (value, "%d", &i);
220           g_return_if_fail (sscanf_ret == 1);
221           g_object_set (G_OBJECT (object), name, i, NULL);
222           break;
223         }
224         case G_TYPE_UINT:{
225           guint i;
226
227           sscanf_ret = sscanf (value, "%u", &i);
228           g_return_if_fail (sscanf_ret == 1);
229           g_object_set (G_OBJECT (object), name, i, NULL);
230           break;
231         }
232         case G_TYPE_LONG:{
233           glong i;
234
235           sscanf_ret = sscanf (value, "%ld", &i);
236           g_return_if_fail (sscanf_ret == 1);
237           g_object_set (G_OBJECT (object), name, i, NULL);
238           break;
239         }
240         case G_TYPE_ULONG:{
241           gulong i;
242
243           sscanf_ret = sscanf (value, "%lu", &i);
244           g_return_if_fail (sscanf_ret == 1);
245           g_object_set (G_OBJECT (object), name, i, NULL);
246           break;
247         }
248         case G_TYPE_BOOLEAN:{
249           gboolean i = FALSE;
250
251           if (!g_ascii_strncasecmp ("true", value, 4))
252             i = TRUE;
253           g_object_set (G_OBJECT (object), name, i, NULL);
254           break;
255         }
256         case G_TYPE_CHAR:{
257           gchar i;
258
259           sscanf_ret = sscanf (value, "%c", &i);
260           g_return_if_fail (sscanf_ret == 1);
261           g_object_set (G_OBJECT (object), name, i, NULL);
262           break;
263         }
264         case G_TYPE_UCHAR:{
265           guchar i;
266
267           sscanf_ret = sscanf (value, "%c", &i);
268           g_return_if_fail (sscanf_ret == 1);
269           g_object_set (G_OBJECT (object), name, i, NULL);
270           break;
271         }
272         case G_TYPE_FLOAT:{
273           gfloat i;
274
275           sscanf_ret = sscanf (value, "%f", &i);
276           g_return_if_fail (sscanf_ret == 1);
277           g_object_set (G_OBJECT (object), name, i, NULL);
278           break;
279         }
280         case G_TYPE_DOUBLE:{
281           gfloat i;
282
283           sscanf_ret = sscanf (value, "%g", &i);
284           g_return_if_fail (sscanf_ret == 1);
285           g_object_set (G_OBJECT (object), name, (gdouble) i, NULL);
286           break;
287         }
288         default:
289           if (G_IS_PARAM_SPEC_ENUM (paramspec)) {
290             gint i;
291
292             sscanf_ret = sscanf (value, "%d", &i);
293             g_return_if_fail (sscanf_ret == 1);
294             g_object_set (G_OBJECT (object), name, i, NULL);
295           }
296           break;
297       }
298     }
299   }
300 }
301
302 /* work around error C2520: conversion from unsigned __int64 to double
303  * not implemented, use signed __int64
304  *
305  * These are implemented as functions because on some platforms a 64bit int to
306  * double conversion is not defined/implemented.
307  */
308
309 gdouble
310 gst_util_guint64_to_gdouble (guint64 value)
311 {
312   if (value & G_GINT64_CONSTANT (0x8000000000000000))
313     return (gdouble) ((gint64) value) + (gdouble) 18446744073709551616.;
314   else
315     return (gdouble) ((gint64) value);
316 }
317
318 guint64
319 gst_util_gdouble_to_guint64 (gdouble value)
320 {
321   if (value < (gdouble) 9223372036854775808.)   /* 1 << 63 */
322     return ((guint64) ((gint64) value));
323
324   value -= (gdouble) 18446744073709551616.;
325   return ((guint64) ((gint64) value));
326 }
327
328 /* convenience struct for getting high and low uint32 parts of
329  * a guint64 */
330 typedef union
331 {
332   guint64 ll;
333   struct
334   {
335 #if G_BYTE_ORDER == G_BIG_ENDIAN
336     guint32 high, low;
337 #else
338     guint32 low, high;
339 #endif
340   } l;
341 } GstUInt64;
342
343 /* based on Hacker's Delight p152 */
344 static guint64
345 gst_util_div128_64 (GstUInt64 c1, GstUInt64 c0, guint64 denom)
346 {
347   GstUInt64 q1, q0, rhat;
348   GstUInt64 v, cmp1, cmp2;
349   guint s;
350
351   v.ll = denom;
352
353   /* count number of leading zeroes, we know they must be in the high
354    * part of denom since denom > G_MAXUINT32. */
355   s = v.l.high | (v.l.high >> 1);
356   s |= (s >> 2);
357   s |= (s >> 4);
358   s |= (s >> 8);
359   s = ~(s | (s >> 16));
360   s = s - ((s >> 1) & 0x55555555);
361   s = (s & 0x33333333) + ((s >> 2) & 0x33333333);
362   s = (s + (s >> 4)) & 0x0f0f0f0f;
363   s += (s >> 8);
364   s = (s + (s >> 16)) & 0x3f;
365
366   if (s > 0) {
367     /* normalize divisor and dividend */
368     v.ll <<= s;
369     c1.ll = (c1.ll << s) | (c0.l.high >> (32 - s));
370     c0.ll <<= s;
371   }
372
373   q1.ll = c1.ll / v.l.high;
374   rhat.ll = c1.ll - q1.ll * v.l.high;
375
376   cmp1.l.high = rhat.l.low;
377   cmp1.l.low = c0.l.high;
378   cmp2.ll = q1.ll * v.l.low;
379
380   while (q1.l.high || cmp2.ll > cmp1.ll) {
381     q1.ll--;
382     rhat.ll += v.l.high;
383     if (rhat.l.high)
384       break;
385     cmp1.l.high = rhat.l.low;
386     cmp2.ll -= v.l.low;
387   }
388   c1.l.high = c1.l.low;
389   c1.l.low = c0.l.high;
390   c1.ll -= q1.ll * v.ll;
391   q0.ll = c1.ll / v.l.high;
392   rhat.ll = c1.ll - q0.ll * v.l.high;
393
394   cmp1.l.high = rhat.l.low;
395   cmp1.l.low = c0.l.low;
396   cmp2.ll = q0.ll * v.l.low;
397
398   while (q0.l.high || cmp2.ll > cmp1.ll) {
399     q0.ll--;
400     rhat.ll += v.l.high;
401     if (rhat.l.high)
402       break;
403     cmp1.l.high = rhat.l.low;
404     cmp2.ll -= v.l.low;
405   }
406   q0.l.high += q1.l.low;
407
408   return q0.ll;
409 }
410
411 static guint64
412 gst_util_uint64_scale_int64 (guint64 val, guint64 num, guint64 denom)
413 {
414   GstUInt64 a0, a1, b0, b1, c0, ct, c1, result;
415   GstUInt64 v, n;
416
417   /* prepare input */
418   v.ll = val;
419   n.ll = num;
420
421   /* do 128 bits multiply
422    *                   nh   nl
423    *                *  vh   vl
424    *                ----------
425    * a0 =              vl * nl
426    * a1 =         vl * nh
427    * b0 =         vh * nl
428    * b1 =  + vh * nh
429    *       -------------------
430    * c1,c0
431    */
432   a0.ll = (guint64) v.l.low * n.l.low;
433   a1.ll = (guint64) v.l.low * n.l.high;
434   b0.ll = (guint64) v.l.high * n.l.low;
435   b1.ll = (guint64) v.l.high * n.l.high;
436
437   /* and sum together with carry into 128 bits c1, c0 */
438   c0.l.low = a0.l.low;
439   ct.ll = (guint64) a0.l.high + a1.l.low + b0.l.low;
440   c0.l.high = ct.l.low;
441   c1.ll = (guint64) a1.l.high + b0.l.high + ct.l.high + b1.ll;
442
443   /* if high bits bigger than denom, we overflow */
444   if (c1.ll >= denom)
445     goto overflow;
446
447   /* shortcut for division by 1, c1.ll should be 0 because of the
448    * overflow check above. */
449   if (denom == 1)
450     return c0.ll;
451
452   /* and 128/64 bits division, result fits 64 bits */
453   if (denom <= G_MAXUINT32) {
454     guint32 den = (guint32) denom;
455
456     /* easy case, (c1,c0)128/(den)32 division */
457     c1.l.high %= den;
458     c1.l.high = c1.ll % den;
459     c1.l.low = c0.l.high;
460     c0.l.high = c1.ll % den;
461     result.l.high = c1.ll / den;
462     result.l.low = c0.ll / den;
463   } else {
464     result.ll = gst_util_div128_64 (c1, c0, denom);
465   }
466   return result.ll;
467
468 overflow:
469   {
470     return G_MAXUINT64;
471   }
472 }
473
474 /**
475  * gst_util_uint64_scale:
476  * @val: the number to scale
477  * @num: the numerator of the scale ratio
478  * @denom: the denominator of the scale ratio
479  *
480  * Scale @val by @num / @denom, trying to avoid overflows.
481  *
482  * This function can potentially be very slow if denom > G_MAXUINT32.
483  *
484  * Returns: @val * @num / @denom, trying to avoid overflows.
485  * In the case of an overflow, this function returns G_MAXUINT64.
486  */
487 guint64
488 gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom)
489 {
490   g_return_val_if_fail (denom != 0, G_MAXUINT64);
491
492   if (num == 0)
493     return 0;
494
495   if (num == 1 && denom == 1)
496     return val;
497
498   /* if the denom is high, we need to do a 64 muldiv */
499   if (denom > G_MAXINT32)
500     goto do_int64;
501
502   /* if num and denom are low we can do a 32 bit muldiv */
503   if (num <= G_MAXINT32)
504     goto do_int32;
505
506   /* val and num are high, we need 64 muldiv */
507   if (val > G_MAXINT32)
508     goto do_int64;
509
510   /* val is low and num is high, we can swap them and do 32 muldiv */
511   return gst_util_uint64_scale_int (num, (gint) val, (gint) denom);
512
513 do_int32:
514   return gst_util_uint64_scale_int (val, (gint) num, (gint) denom);
515
516 do_int64:
517   /* to the more heavy implementations... */
518   return gst_util_uint64_scale_int64 (val, num, denom);
519 }
520
521 /**
522  * gst_util_uint64_scale_int:
523  * @val: guint64 (such as a #GstClockTime) to scale.
524  * @num: numerator of the scale factor.
525  * @denom: denominator of the scale factor.
526  *
527  * Scale a guint64 by a factor expressed as a fraction (num/denom), avoiding
528  * overflows and loss of precision.
529  *
530  * @num and @denom must be positive integers. @denom cannot be 0.
531  *
532  * Returns: @val * @num / @denom, avoiding overflow and loss of precision.
533  * In the case of an overflow, this function returns G_MAXUINT64.
534  */
535 guint64
536 gst_util_uint64_scale_int (guint64 val, gint num, gint denom)
537 {
538   GstUInt64 result;
539   GstUInt64 low, high;
540
541   g_return_val_if_fail (denom > 0, G_MAXUINT64);
542   g_return_val_if_fail (num >= 0, G_MAXUINT64);
543
544   if (num == 0)
545     return 0;
546
547   if (num == 1 && denom == 1)
548     return val;
549
550   if (val <= G_MAXUINT32)
551     /* simple case */
552     return val * num / denom;
553
554   /* do 96 bits mult/div */
555   low.ll = val;
556   result.ll = ((guint64) low.l.low) * num;
557   high.ll = ((guint64) low.l.high) * num + (result.l.high);
558
559   low.ll = high.ll / denom;
560   result.l.high = high.ll % denom;
561   result.ll /= denom;
562
563   /* avoid overflow */
564   if (low.ll + result.l.high > G_MAXUINT32)
565     goto overflow;
566
567   result.l.high += low.l.low;
568
569   return result.ll;
570
571 overflow:
572   {
573     return G_MAXUINT64;
574   }
575 }
576
577 /**
578  * gst_util_seqnum_next:
579  *
580  * Return a constantly incrementing sequence number.
581  *
582  * This function is used internally to GStreamer to be able to determine which
583  * events and messages are "the same". For example, elements may set the seqnum
584  * on a segment-done message to be the same as that of the last seek event, to
585  * indicate that event and the message correspond to the same segment.
586  *
587  * Returns: A constantly incrementing 32-bit unsigned integer, which might
588  * overflow back to 0 at some point. Use gst_util_seqnum_compare() to make sure
589  * you handle wraparound correctly.
590  *
591  * Since: 0.10.22
592  */
593 guint32
594 gst_util_seqnum_next (void)
595 {
596   static gint counter = 0;
597   return g_atomic_int_exchange_and_add (&counter, 1);
598 }
599
600 /**
601  * gst_util_seqnum_compare:
602  * @s1: A sequence number.
603  * @s2: Another sequence number.
604  *
605  * Compare two sequence numbers, handling wraparound.
606  * 
607  * The current implementation just returns (gint32)(@s1 - @s2).
608  *
609  * Returns: A negative number if @s1 is before @s2, 0 if they are equal, or a
610  * positive number if @s1 is after @s2.
611  *
612  * Since: 0.10.22
613  */
614 gint32
615 gst_util_seqnum_compare (guint32 s1, guint32 s2)
616 {
617   return (gint32) (s1 - s2);
618 }
619
620 /* -----------------------------------------------------
621  *
622  *  The following code will be moved out of the main
623  * gstreamer library someday.
624  */
625
626 #include "gstpad.h"
627
628 static void
629 string_append_indent (GString * str, gint count)
630 {
631   gint xx;
632
633   for (xx = 0; xx < count; xx++)
634     g_string_append_c (str, ' ');
635 }
636
637 /**
638  * gst_print_pad_caps:
639  * @buf: the buffer to print the caps in
640  * @indent: initial indentation
641  * @pad: the pad to print the caps from
642  *
643  * Write the pad capabilities in a human readable format into
644  * the given GString.
645  */
646 void
647 gst_print_pad_caps (GString * buf, gint indent, GstPad * pad)
648 {
649   GstCaps *caps;
650
651   caps = pad->caps;
652
653   if (!caps) {
654     string_append_indent (buf, indent);
655     g_string_printf (buf, "%s:%s has no capabilities",
656         GST_DEBUG_PAD_NAME (pad));
657   } else {
658     char *s;
659
660     s = gst_caps_to_string (caps);
661     g_string_append (buf, s);
662     g_free (s);
663   }
664 }
665
666 /**
667  * gst_print_element_args:
668  * @buf: the buffer to print the args in
669  * @indent: initial indentation
670  * @element: the element to print the args of
671  *
672  * Print the element argument in a human readable format in the given
673  * GString.
674  */
675 void
676 gst_print_element_args (GString * buf, gint indent, GstElement * element)
677 {
678   guint width;
679   GValue value = { 0, };        /* the important thing is that value.type = 0 */
680   gchar *str = NULL;
681   GParamSpec *spec, **specs, **walk;
682
683   specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (element), NULL);
684
685   width = 0;
686   for (walk = specs; *walk; walk++) {
687     spec = *walk;
688     if (width < strlen (spec->name))
689       width = strlen (spec->name);
690   }
691
692   for (walk = specs; *walk; walk++) {
693     spec = *walk;
694
695     if (spec->flags & G_PARAM_READABLE) {
696       g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (spec));
697       g_object_get_property (G_OBJECT (element), spec->name, &value);
698       str = g_strdup_value_contents (&value);
699       g_value_unset (&value);
700     } else {
701       str = g_strdup ("Parameter not readable.");
702     }
703
704     string_append_indent (buf, indent);
705     g_string_append (buf, spec->name);
706     string_append_indent (buf, 2 + width - strlen (spec->name));
707     g_string_append (buf, str);
708     g_string_append_c (buf, '\n');
709
710     g_free (str);
711   }
712
713   g_free (specs);
714 }
715
716 /**
717  * gst_element_create_all_pads:
718  * @element: a #GstElement to create pads for
719  *
720  * Creates a pad for each pad template that is always available.
721  * This function is only useful during object intialization of
722  * subclasses of #GstElement.
723  */
724 void
725 gst_element_create_all_pads (GstElement * element)
726 {
727   GList *padlist;
728
729   /* FIXME: lock element */
730
731   padlist =
732       gst_element_class_get_pad_template_list (GST_ELEMENT_CLASS
733       (G_OBJECT_GET_CLASS (element)));
734
735   while (padlist) {
736     GstPadTemplate *padtempl = (GstPadTemplate *) padlist->data;
737
738     if (padtempl->presence == GST_PAD_ALWAYS) {
739       GstPad *pad;
740
741       pad = gst_pad_new_from_template (padtempl, padtempl->name_template);
742
743       gst_element_add_pad (element, pad);
744     }
745     padlist = padlist->next;
746   }
747 }
748
749 /**
750  * gst_element_get_compatible_pad_template:
751  * @element: a #GstElement to get a compatible pad template for.
752  * @compattempl: the #GstPadTemplate to find a compatible template for.
753  *
754  * Retrieves a pad template from @element that is compatible with @compattempl.
755  * Pads from compatible templates can be linked together.
756  *
757  * Returns: a compatible #GstPadTemplate, or NULL if none was found. No
758  * unreferencing is necessary.
759  */
760 GstPadTemplate *
761 gst_element_get_compatible_pad_template (GstElement * element,
762     GstPadTemplate * compattempl)
763 {
764   GstPadTemplate *newtempl = NULL;
765   GList *padlist;
766   GstElementClass *class;
767
768   g_return_val_if_fail (element != NULL, NULL);
769   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
770   g_return_val_if_fail (compattempl != NULL, NULL);
771
772   class = GST_ELEMENT_GET_CLASS (element);
773
774   padlist = gst_element_class_get_pad_template_list (class);
775
776   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
777       "Looking for a suitable pad template in %s out of %d templates...",
778       GST_ELEMENT_NAME (element), g_list_length (padlist));
779
780   while (padlist) {
781     GstPadTemplate *padtempl = (GstPadTemplate *) padlist->data;
782     GstCaps *intersection;
783
784     /* Ignore name
785      * Ignore presence
786      * Check direction (must be opposite)
787      * Check caps
788      */
789     GST_CAT_LOG (GST_CAT_CAPS,
790         "checking pad template %s", padtempl->name_template);
791     if (padtempl->direction != compattempl->direction) {
792       GST_CAT_DEBUG (GST_CAT_CAPS,
793           "compatible direction: found %s pad template \"%s\"",
794           padtempl->direction == GST_PAD_SRC ? "src" : "sink",
795           padtempl->name_template);
796
797       GST_CAT_DEBUG (GST_CAT_CAPS,
798           "intersecting %" GST_PTR_FORMAT, GST_PAD_TEMPLATE_CAPS (compattempl));
799       GST_CAT_DEBUG (GST_CAT_CAPS,
800           "..and %" GST_PTR_FORMAT, GST_PAD_TEMPLATE_CAPS (padtempl));
801
802       intersection = gst_caps_intersect (GST_PAD_TEMPLATE_CAPS (compattempl),
803           GST_PAD_TEMPLATE_CAPS (padtempl));
804
805       GST_CAT_DEBUG (GST_CAT_CAPS, "caps are %scompatible %" GST_PTR_FORMAT,
806           (intersection ? "" : "not "), intersection);
807
808       if (!gst_caps_is_empty (intersection))
809         newtempl = padtempl;
810       gst_caps_unref (intersection);
811       if (newtempl)
812         break;
813     }
814
815     padlist = g_list_next (padlist);
816   }
817   if (newtempl)
818     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
819         "Returning new pad template %p", newtempl);
820   else
821     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "No compatible pad template found");
822
823   return newtempl;
824 }
825
826 static GstPad *
827 gst_element_request_pad (GstElement * element, GstPadTemplate * templ,
828     const gchar * name)
829 {
830   GstPad *newpad = NULL;
831   GstElementClass *oclass;
832
833   oclass = GST_ELEMENT_GET_CLASS (element);
834
835   if (oclass->request_new_pad)
836     newpad = (oclass->request_new_pad) (element, templ, name);
837
838   if (newpad)
839     gst_object_ref (newpad);
840
841   return newpad;
842 }
843
844
845
846 /**
847  * gst_element_get_pad_from_template:
848  * @element: a #GstElement.
849  * @templ: a #GstPadTemplate belonging to @element.
850  *
851  * Gets a pad from @element described by @templ. If the presence of @templ is
852  * #GST_PAD_REQUEST, requests a new pad. Can return %NULL for #GST_PAD_SOMETIMES
853  * templates.
854  *
855  * Returns: the #GstPad, or NULL if one could not be found or created.
856  */
857 static GstPad *
858 gst_element_get_pad_from_template (GstElement * element, GstPadTemplate * templ)
859 {
860   GstPad *ret = NULL;
861   GstPadPresence presence;
862
863   /* If this function is ever exported, we need check the validity of `element'
864    * and `templ', and to make sure the template actually belongs to the
865    * element. */
866
867   presence = GST_PAD_TEMPLATE_PRESENCE (templ);
868
869   switch (presence) {
870     case GST_PAD_ALWAYS:
871     case GST_PAD_SOMETIMES:
872       ret = gst_element_get_static_pad (element, templ->name_template);
873       if (!ret && presence == GST_PAD_ALWAYS)
874         g_warning
875             ("Element %s has an ALWAYS template %s, but no pad of the same name",
876             GST_OBJECT_NAME (element), templ->name_template);
877       break;
878
879     case GST_PAD_REQUEST:
880       ret = gst_element_request_pad (element, templ, NULL);
881       break;
882   }
883
884   return ret;
885 }
886
887 /**
888  * gst_element_request_compatible_pad:
889  * @element: a #GstElement.
890  * @templ: the #GstPadTemplate to which the new pad should be able to link.
891  *
892  * Requests a pad from @element. The returned pad should be unlinked and
893  * compatible with @templ. Might return an existing pad, or request a new one.
894  *
895  * Returns: a #GstPad, or %NULL if one could not be found or created.
896  */
897 GstPad *
898 gst_element_request_compatible_pad (GstElement * element,
899     GstPadTemplate * templ)
900 {
901   GstPadTemplate *templ_new;
902   GstPad *pad = NULL;
903
904   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
905   g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
906
907   /* FIXME: should really loop through the templates, testing each for
908    *      compatibility and pad availability. */
909   templ_new = gst_element_get_compatible_pad_template (element, templ);
910   if (templ_new)
911     pad = gst_element_get_pad_from_template (element, templ_new);
912
913   /* This can happen for non-request pads. No need to unref. */
914   if (pad && GST_PAD_PEER (pad))
915     pad = NULL;
916
917   return pad;
918 }
919
920 /**
921  * Checks if the source pad and the sink pad can be linked.
922  * Both @srcpad and @sinkpad must be unlinked and have a parent.
923  */
924 static gboolean
925 gst_pad_check_link (GstPad * srcpad, GstPad * sinkpad)
926 {
927   /* FIXME This function is gross.  It's almost a direct copy of
928    * gst_pad_link_filtered().  Any decent programmer would attempt
929    * to merge the two functions, which I will do some day. --ds
930    */
931
932   /* generic checks */
933   g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
934   g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
935
936   GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
937       GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
938
939   /* FIXME: shouldn't we convert this to g_return_val_if_fail? */
940   if (GST_PAD_PEER (srcpad) != NULL) {
941     GST_CAT_INFO (GST_CAT_PADS, "Source pad %s:%s has a peer, failed",
942         GST_DEBUG_PAD_NAME (srcpad));
943     return FALSE;
944   }
945   if (GST_PAD_PEER (sinkpad) != NULL) {
946     GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s has a peer, failed",
947         GST_DEBUG_PAD_NAME (sinkpad));
948     return FALSE;
949   }
950   if (!GST_PAD_IS_SRC (srcpad)) {
951     GST_CAT_INFO (GST_CAT_PADS, "Src pad %s:%s is not source pad, failed",
952         GST_DEBUG_PAD_NAME (srcpad));
953     return FALSE;
954   }
955   if (!GST_PAD_IS_SINK (sinkpad)) {
956     GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s is not sink pad, failed",
957         GST_DEBUG_PAD_NAME (sinkpad));
958     return FALSE;
959   }
960   if (GST_PAD_PARENT (srcpad) == NULL) {
961     GST_CAT_INFO (GST_CAT_PADS, "Src pad %s:%s has no parent, failed",
962         GST_DEBUG_PAD_NAME (srcpad));
963     return FALSE;
964   }
965   if (GST_PAD_PARENT (sinkpad) == NULL) {
966     GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s has no parent, failed",
967         GST_DEBUG_PAD_NAME (srcpad));
968     return FALSE;
969   }
970
971   return TRUE;
972 }
973
974 /**
975  * gst_element_get_compatible_pad:
976  * @element: a #GstElement in which the pad should be found.
977  * @pad: the #GstPad to find a compatible one for.
978  * @caps: the #GstCaps to use as a filter.
979  *
980  * Looks for an unlinked pad to which the given pad can link. It is not
981  * guaranteed that linking the pads will work, though it should work in most
982  * cases.
983  *
984  * Returns: the #GstPad to which a link can be made, or %NULL if one cannot be
985  * found. gst_object_unref() after usage.
986  */
987 GstPad *
988 gst_element_get_compatible_pad (GstElement * element, GstPad * pad,
989     const GstCaps * caps)
990 {
991   GstIterator *pads;
992   GstPadTemplate *templ;
993   GstCaps *templcaps;
994   GstPad *foundpad = NULL;
995   gboolean done;
996
997   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
998   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
999
1000   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1001       "finding pad in %s compatible with %s:%s",
1002       GST_ELEMENT_NAME (element), GST_DEBUG_PAD_NAME (pad));
1003
1004   g_return_val_if_fail (GST_PAD_PEER (pad) == NULL, NULL);
1005
1006   done = FALSE;
1007   /* try to get an existing unlinked pad */
1008   pads = gst_element_iterate_pads (element);
1009   while (!done) {
1010     gpointer padptr;
1011
1012     switch (gst_iterator_next (pads, &padptr)) {
1013       case GST_ITERATOR_OK:
1014       {
1015         GstPad *peer;
1016         GstPad *current;
1017
1018         current = GST_PAD (padptr);
1019
1020         GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
1021             GST_DEBUG_PAD_NAME (current));
1022
1023         peer = gst_pad_get_peer (current);
1024
1025         if (peer == NULL && gst_pad_check_link (pad, current)) {
1026           GstCaps *temp, *temp2, *intersection;
1027
1028           /* Now check if the two pads' caps are compatible */
1029           temp = gst_pad_get_caps (pad);
1030           if (caps) {
1031             intersection = gst_caps_intersect (temp, caps);
1032             gst_caps_unref (temp);
1033           } else {
1034             intersection = temp;
1035           }
1036
1037           temp = gst_pad_get_caps (current);
1038           temp2 = gst_caps_intersect (temp, intersection);
1039           gst_caps_unref (temp);
1040           gst_caps_unref (intersection);
1041
1042           intersection = temp2;
1043
1044           if (!gst_caps_is_empty (intersection)) {
1045             gst_caps_unref (intersection);
1046
1047             GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1048                 "found existing unlinked compatible pad %s:%s",
1049                 GST_DEBUG_PAD_NAME (current));
1050             gst_iterator_free (pads);
1051
1052             return current;
1053           } else {
1054             GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "incompatible pads");
1055           }
1056           gst_caps_unref (intersection);
1057         } else {
1058           GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1059               "already linked or cannot be linked (peer = %p)", peer);
1060         }
1061         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "unreffing pads");
1062
1063         gst_object_unref (current);
1064         if (peer)
1065           gst_object_unref (peer);
1066         break;
1067       }
1068       case GST_ITERATOR_DONE:
1069         done = TRUE;
1070         break;
1071       case GST_ITERATOR_RESYNC:
1072         gst_iterator_resync (pads);
1073         break;
1074       case GST_ITERATOR_ERROR:
1075         g_assert_not_reached ();
1076         break;
1077     }
1078   }
1079   gst_iterator_free (pads);
1080
1081   GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
1082       "Could not find a compatible unlinked always pad to link to %s:%s, now checking request pads",
1083       GST_DEBUG_PAD_NAME (pad));
1084
1085   /* try to create a new one */
1086   /* requesting is a little crazy, we need a template. Let's create one */
1087   /* FIXME: why not gst_pad_get_pad_template (pad); */
1088   templcaps = gst_pad_get_caps (pad);
1089
1090   templ = gst_pad_template_new ((gchar *) GST_PAD_NAME (pad),
1091       GST_PAD_DIRECTION (pad), GST_PAD_ALWAYS, templcaps);
1092
1093   /* FIXME : Because of a bug in gst_pad_template_new() by which is does not
1094    * properly steal the refcount of the given caps, we have to unref these caps
1095    * REVERT THIS WHEN FIXED !*/
1096   gst_caps_unref (templcaps);
1097
1098   foundpad = gst_element_request_compatible_pad (element, templ);
1099   gst_object_unref (templ);
1100
1101   if (foundpad) {
1102     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1103         "found existing request pad %s:%s", GST_DEBUG_PAD_NAME (foundpad));
1104     return foundpad;
1105   }
1106
1107   GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element,
1108       "Could not find a compatible pad to link to %s:%s",
1109       GST_DEBUG_PAD_NAME (pad));
1110   return NULL;
1111 }
1112
1113 /**
1114  * gst_element_state_get_name:
1115  * @state: a #GstState to get the name of.
1116  *
1117  * Gets a string representing the given state.
1118  *
1119  * Returns: a string with the name of the state.
1120  */
1121 G_CONST_RETURN gchar *
1122 gst_element_state_get_name (GstState state)
1123 {
1124   switch (state) {
1125 #ifdef GST_DEBUG_COLOR
1126     case GST_STATE_VOID_PENDING:
1127       return "VOID_PENDING";
1128     case GST_STATE_NULL:
1129       return "\033[01;34mNULL\033[00m";
1130     case GST_STATE_READY:
1131       return "\033[01;31mREADY\033[00m";
1132     case GST_STATE_PLAYING:
1133       return "\033[01;32mPLAYING\033[00m";
1134     case GST_STATE_PAUSED:
1135       return "\033[01;33mPAUSED\033[00m";
1136     default:
1137       /* This is a memory leak */
1138       return g_strdup_printf ("\033[01;35;41mUNKNOWN!\033[00m(%d)", state);
1139 #else
1140     case GST_STATE_VOID_PENDING:
1141       return "VOID_PENDING";
1142     case GST_STATE_NULL:
1143       return "NULL";
1144     case GST_STATE_READY:
1145       return "READY";
1146     case GST_STATE_PLAYING:
1147       return "PLAYING";
1148     case GST_STATE_PAUSED:
1149       return "PAUSED";
1150     default:
1151       /* This is a memory leak */
1152       return g_strdup_printf ("UNKNOWN!(%d)", state);
1153 #endif
1154   }
1155 }
1156
1157 /**
1158  * gst_element_state_change_return_get_name:
1159  * @state_ret: a #GstStateChangeReturn to get the name of.
1160  *
1161  * Gets a string representing the given state change result.
1162  *
1163  * Returns: a string with the name of the state change result.
1164  *
1165  * Since: 0.10.11
1166  */
1167 G_CONST_RETURN gchar *
1168 gst_element_state_change_return_get_name (GstStateChangeReturn state_ret)
1169 {
1170   switch (state_ret) {
1171 #ifdef GST_DEBUG_COLOR
1172     case GST_STATE_CHANGE_FAILURE:
1173       return "\033[01;31mFAILURE\033[00m";
1174     case GST_STATE_CHANGE_SUCCESS:
1175       return "\033[01;32mSUCCESS\033[00m";
1176     case GST_STATE_CHANGE_ASYNC:
1177       return "\033[01;33mASYNC\033[00m";
1178     case GST_STATE_CHANGE_NO_PREROLL:
1179       return "\033[01;34mNO_PREROLL\033[00m";
1180     default:
1181       /* This is a memory leak */
1182       return g_strdup_printf ("\033[01;35;41mUNKNOWN!\033[00m(%d)", state_ret);
1183 #else
1184     case GST_STATE_CHANGE_FAILURE:
1185       return "FAILURE";
1186     case GST_STATE_CHANGE_SUCCESS:
1187       return "SUCCESS";
1188     case GST_STATE_CHANGE_ASYNC:
1189       return "ASYNC";
1190     case GST_STATE_CHANGE_NO_PREROLL:
1191       return "NO PREROLL";
1192     default:
1193       /* This is a memory leak */
1194       return g_strdup_printf ("UNKNOWN!(%d)", state_ret);
1195 #endif
1196   }
1197 }
1198
1199
1200 /**
1201  * gst_element_factory_can_src_caps :
1202  * @factory: factory to query
1203  * @caps: the caps to check
1204  *
1205  * Checks if the factory can source the given capability.
1206  *
1207  * Returns: true if it can src the capabilities
1208  */
1209 gboolean
1210 gst_element_factory_can_src_caps (GstElementFactory * factory,
1211     const GstCaps * caps)
1212 {
1213   GList *templates;
1214
1215   g_return_val_if_fail (factory != NULL, FALSE);
1216   g_return_val_if_fail (caps != NULL, FALSE);
1217
1218   templates = factory->staticpadtemplates;
1219
1220   while (templates) {
1221     GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data;
1222
1223     if (template->direction == GST_PAD_SRC) {
1224       if (gst_caps_is_always_compatible (gst_static_caps_get
1225               (&template->static_caps), caps))
1226         return TRUE;
1227     }
1228     templates = g_list_next (templates);
1229   }
1230
1231   return FALSE;
1232 }
1233
1234 /**
1235  * gst_element_factory_can_sink_caps :
1236  * @factory: factory to query
1237  * @caps: the caps to check
1238  *
1239  * Checks if the factory can sink the given capability.
1240  *
1241  * Returns: true if it can sink the capabilities
1242  */
1243 gboolean
1244 gst_element_factory_can_sink_caps (GstElementFactory * factory,
1245     const GstCaps * caps)
1246 {
1247   GList *templates;
1248
1249   g_return_val_if_fail (factory != NULL, FALSE);
1250   g_return_val_if_fail (caps != NULL, FALSE);
1251
1252   templates = factory->staticpadtemplates;
1253
1254   while (templates) {
1255     GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data;
1256
1257     if (template->direction == GST_PAD_SINK) {
1258       if (gst_caps_is_always_compatible (caps,
1259               gst_static_caps_get (&template->static_caps)))
1260         return TRUE;
1261     }
1262     templates = g_list_next (templates);
1263   }
1264
1265   return FALSE;
1266 }
1267
1268
1269 /* if return val is true, *direct_child is a caller-owned ref on the direct
1270  * child of ancestor that is part of object's ancestry */
1271 static gboolean
1272 object_has_ancestor (GstObject * object, GstObject * ancestor,
1273     GstObject ** direct_child)
1274 {
1275   GstObject *child, *parent;
1276
1277   if (direct_child)
1278     *direct_child = NULL;
1279
1280   child = gst_object_ref (object);
1281   parent = gst_object_get_parent (object);
1282
1283   while (parent) {
1284     if (ancestor == parent) {
1285       if (direct_child)
1286         *direct_child = child;
1287       else
1288         gst_object_unref (child);
1289       gst_object_unref (parent);
1290       return TRUE;
1291     }
1292
1293     gst_object_unref (child);
1294     child = parent;
1295     parent = gst_object_get_parent (parent);
1296   }
1297
1298   gst_object_unref (child);
1299
1300   return FALSE;
1301 }
1302
1303 /* caller owns return */
1304 static GstObject *
1305 find_common_root (GstObject * o1, GstObject * o2)
1306 {
1307   GstObject *top = o1;
1308   GstObject *kid1, *kid2;
1309   GstObject *root = NULL;
1310
1311   while (GST_OBJECT_PARENT (top))
1312     top = GST_OBJECT_PARENT (top);
1313
1314   /* the itsy-bitsy spider... */
1315
1316   if (!object_has_ancestor (o2, top, &kid2))
1317     return NULL;
1318
1319   root = gst_object_ref (top);
1320   while (TRUE) {
1321     if (!object_has_ancestor (o1, kid2, &kid1)) {
1322       gst_object_unref (kid2);
1323       return root;
1324     }
1325     root = kid2;
1326     if (!object_has_ancestor (o2, kid1, &kid2)) {
1327       gst_object_unref (kid1);
1328       return root;
1329     }
1330     root = kid1;
1331   }
1332 }
1333
1334 /* caller does not own return */
1335 static GstPad *
1336 ghost_up (GstElement * e, GstPad * pad)
1337 {
1338   static gint ghost_pad_index = 0;
1339   GstPad *gpad;
1340   gchar *name;
1341   GstObject *parent = GST_OBJECT_PARENT (e);
1342
1343   name = g_strdup_printf ("ghost%d", ghost_pad_index++);
1344   gpad = gst_ghost_pad_new (name, pad);
1345   g_free (name);
1346
1347   if (!gst_element_add_pad ((GstElement *) parent, gpad)) {
1348     g_warning ("Pad named %s already exists in element %s\n",
1349         GST_OBJECT_NAME (gpad), GST_OBJECT_NAME (parent));
1350     gst_object_unref ((GstObject *) gpad);
1351     return NULL;
1352   }
1353
1354   return gpad;
1355 }
1356
1357 static void
1358 remove_pad (gpointer ppad, gpointer unused)
1359 {
1360   GstPad *pad = ppad;
1361
1362   if (!gst_element_remove_pad ((GstElement *) GST_OBJECT_PARENT (pad), pad))
1363     g_warning ("Couldn't remove pad %s from element %s",
1364         GST_OBJECT_NAME (pad), GST_OBJECT_NAME (GST_OBJECT_PARENT (pad)));
1365 }
1366
1367 static gboolean
1368 prepare_link_maybe_ghosting (GstPad ** src, GstPad ** sink,
1369     GSList ** pads_created)
1370 {
1371   GstObject *root;
1372   GstObject *e1, *e2;
1373   GSList *pads_created_local = NULL;
1374
1375   g_assert (pads_created);
1376
1377   e1 = GST_OBJECT_PARENT (*src);
1378   e2 = GST_OBJECT_PARENT (*sink);
1379
1380   if (G_UNLIKELY (e1 == NULL)) {
1381     GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
1382         GST_PTR_FORMAT, *src);
1383     return FALSE;
1384   }
1385   if (G_UNLIKELY (e2 == NULL)) {
1386     GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
1387         GST_PTR_FORMAT, *sink);
1388     return FALSE;
1389   }
1390
1391   if (GST_OBJECT_PARENT (e1) == GST_OBJECT_PARENT (e2)) {
1392     GST_CAT_INFO (GST_CAT_PADS, "%s and %s in same bin, no need for ghost pads",
1393         GST_OBJECT_NAME (e1), GST_OBJECT_NAME (e2));
1394     return TRUE;
1395   }
1396
1397   GST_CAT_INFO (GST_CAT_PADS, "%s and %s not in same bin, making ghost pads",
1398       GST_OBJECT_NAME (e1), GST_OBJECT_NAME (e2));
1399
1400   /* we need to setup some ghost pads */
1401   root = find_common_root (e1, e2);
1402   if (!root) {
1403     g_warning ("Trying to connect elements that don't share a common "
1404         "ancestor: %s and %s", GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (e2));
1405     return FALSE;
1406   }
1407
1408   while (GST_OBJECT_PARENT (e1) != root) {
1409     *src = ghost_up ((GstElement *) e1, *src);
1410     if (!*src)
1411       goto cleanup_fail;
1412     e1 = GST_OBJECT_PARENT (*src);
1413     pads_created_local = g_slist_prepend (pads_created_local, *src);
1414   }
1415   while (GST_OBJECT_PARENT (e2) != root) {
1416     *sink = ghost_up ((GstElement *) e2, *sink);
1417     if (!*sink)
1418       goto cleanup_fail;
1419     e2 = GST_OBJECT_PARENT (*sink);
1420     pads_created_local = g_slist_prepend (pads_created_local, *sink);
1421   }
1422
1423   gst_object_unref (root);
1424   *pads_created = g_slist_concat (*pads_created, pads_created_local);
1425   return TRUE;
1426
1427 cleanup_fail:
1428   gst_object_unref (root);
1429   g_slist_foreach (pads_created_local, remove_pad, NULL);
1430   g_slist_free (pads_created_local);
1431   return FALSE;
1432 }
1433
1434 static gboolean
1435 pad_link_maybe_ghosting (GstPad * src, GstPad * sink)
1436 {
1437   GSList *pads_created = NULL;
1438   gboolean ret;
1439
1440   if (!prepare_link_maybe_ghosting (&src, &sink, &pads_created)) {
1441     ret = FALSE;
1442   } else {
1443     ret = (gst_pad_link (src, sink) == GST_PAD_LINK_OK);
1444   }
1445
1446   if (!ret) {
1447     g_slist_foreach (pads_created, remove_pad, NULL);
1448   }
1449   g_slist_free (pads_created);
1450
1451   return ret;
1452 }
1453
1454 /**
1455  * gst_element_link_pads:
1456  * @src: a #GstElement containing the source pad.
1457  * @srcpadname: the name of the #GstPad in source element or NULL for any pad.
1458  * @dest: the #GstElement containing the destination pad.
1459  * @destpadname: the name of the #GstPad in destination element,
1460  * or NULL for any pad.
1461  *
1462  * Links the two named pads of the source and destination elements.
1463  * Side effect is that if one of the pads has no parent, it becomes a
1464  * child of the parent of the other element.  If they have different
1465  * parents, the link fails.
1466  *
1467  * Returns: TRUE if the pads could be linked, FALSE otherwise.
1468  */
1469 gboolean
1470 gst_element_link_pads (GstElement * src, const gchar * srcpadname,
1471     GstElement * dest, const gchar * destpadname)
1472 {
1473   const GList *srcpads, *destpads, *srctempls, *desttempls, *l;
1474   GstPad *srcpad, *destpad;
1475   GstPadTemplate *srctempl, *desttempl;
1476   GstElementClass *srcclass, *destclass;
1477
1478   /* checks */
1479   g_return_val_if_fail (GST_IS_ELEMENT (src), FALSE);
1480   g_return_val_if_fail (GST_IS_ELEMENT (dest), FALSE);
1481
1482   srcclass = GST_ELEMENT_GET_CLASS (src);
1483   destclass = GST_ELEMENT_GET_CLASS (dest);
1484
1485   GST_CAT_INFO (GST_CAT_ELEMENT_PADS,
1486       "trying to link element %s:%s to element %s:%s", GST_ELEMENT_NAME (src),
1487       srcpadname ? srcpadname : "(any)", GST_ELEMENT_NAME (dest),
1488       destpadname ? destpadname : "(any)");
1489
1490   /* get a src pad */
1491   if (srcpadname) {
1492     /* name specified, look it up */
1493     if (!(srcpad = gst_element_get_static_pad (src, srcpadname)))
1494       srcpad = gst_element_get_request_pad (src, srcpadname);
1495     if (!srcpad) {
1496       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s",
1497           GST_ELEMENT_NAME (src), srcpadname);
1498       return FALSE;
1499     } else {
1500       if (!(GST_PAD_DIRECTION (srcpad) == GST_PAD_SRC)) {
1501         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is no src pad",
1502             GST_DEBUG_PAD_NAME (srcpad));
1503         gst_object_unref (srcpad);
1504         return FALSE;
1505       }
1506       if (GST_PAD_PEER (srcpad) != NULL) {
1507         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is already linked",
1508             GST_DEBUG_PAD_NAME (srcpad));
1509         gst_object_unref (srcpad);
1510         return FALSE;
1511       }
1512     }
1513     srcpads = NULL;
1514   } else {
1515     /* no name given, get the first available pad */
1516     GST_OBJECT_LOCK (src);
1517     srcpads = GST_ELEMENT_PADS (src);
1518     srcpad = srcpads ? GST_PAD_CAST (srcpads->data) : NULL;
1519     if (srcpad)
1520       gst_object_ref (srcpad);
1521     GST_OBJECT_UNLOCK (src);
1522   }
1523
1524   /* get a destination pad */
1525   if (destpadname) {
1526     /* name specified, look it up */
1527     if (!(destpad = gst_element_get_static_pad (dest, destpadname)))
1528       destpad = gst_element_get_request_pad (dest, destpadname);
1529     if (!destpad) {
1530       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s",
1531           GST_ELEMENT_NAME (dest), destpadname);
1532       return FALSE;
1533     } else {
1534       if (!(GST_PAD_DIRECTION (destpad) == GST_PAD_SINK)) {
1535         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is no sink pad",
1536             GST_DEBUG_PAD_NAME (destpad));
1537         gst_object_unref (destpad);
1538         return FALSE;
1539       }
1540       if (GST_PAD_PEER (destpad) != NULL) {
1541         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is already linked",
1542             GST_DEBUG_PAD_NAME (destpad));
1543         gst_object_unref (destpad);
1544         return FALSE;
1545       }
1546     }
1547     destpads = NULL;
1548   } else {
1549     /* no name given, get the first available pad */
1550     GST_OBJECT_LOCK (dest);
1551     destpads = GST_ELEMENT_PADS (dest);
1552     destpad = destpads ? GST_PAD_CAST (destpads->data) : NULL;
1553     if (destpad)
1554       gst_object_ref (destpad);
1555     GST_OBJECT_UNLOCK (dest);
1556   }
1557
1558   if (srcpadname && destpadname) {
1559     gboolean result;
1560
1561     /* two explicitly specified pads */
1562     result = pad_link_maybe_ghosting (srcpad, destpad);
1563
1564     gst_object_unref (srcpad);
1565     gst_object_unref (destpad);
1566
1567     return result;
1568   }
1569
1570   if (srcpad) {
1571     /* loop through the allowed pads in the source, trying to find a
1572      * compatible destination pad */
1573     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1574         "looping through allowed src and dest pads");
1575     do {
1576       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "trying src pad %s:%s",
1577           GST_DEBUG_PAD_NAME (srcpad));
1578       if ((GST_PAD_DIRECTION (srcpad) == GST_PAD_SRC) &&
1579           (GST_PAD_PEER (srcpad) == NULL)) {
1580         GstPad *temp;
1581
1582         if (destpadname) {
1583           temp = destpad;
1584           gst_object_ref (temp);
1585         } else {
1586           temp = gst_element_get_compatible_pad (dest, srcpad, NULL);
1587         }
1588
1589         if (temp && pad_link_maybe_ghosting (srcpad, temp)) {
1590           GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "linked pad %s:%s to pad %s:%s",
1591               GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (temp));
1592           if (destpad)
1593             gst_object_unref (destpad);
1594           gst_object_unref (srcpad);
1595           gst_object_unref (temp);
1596           return TRUE;
1597         }
1598
1599         if (temp) {
1600           gst_object_unref (temp);
1601         }
1602       }
1603       /* find a better way for this mess */
1604       if (srcpads) {
1605         srcpads = g_list_next (srcpads);
1606         if (srcpads) {
1607           gst_object_unref (srcpad);
1608           srcpad = GST_PAD_CAST (srcpads->data);
1609           gst_object_ref (srcpad);
1610         }
1611       }
1612     } while (srcpads);
1613   }
1614   if (srcpadname) {
1615     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s:%s to %s",
1616         GST_DEBUG_PAD_NAME (srcpad), GST_ELEMENT_NAME (dest));
1617     if (destpad)
1618       gst_object_unref (destpad);
1619     destpad = NULL;
1620   }
1621   if (srcpad)
1622     gst_object_unref (srcpad);
1623   srcpad = NULL;
1624
1625   if (destpad) {
1626     /* loop through the existing pads in the destination */
1627     do {
1628       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "trying dest pad %s:%s",
1629           GST_DEBUG_PAD_NAME (destpad));
1630       if ((GST_PAD_DIRECTION (destpad) == GST_PAD_SINK) &&
1631           (GST_PAD_PEER (destpad) == NULL)) {
1632         GstPad *temp = gst_element_get_compatible_pad (src, destpad, NULL);
1633
1634         if (temp && pad_link_maybe_ghosting (temp, destpad)) {
1635           GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "linked pad %s:%s to pad %s:%s",
1636               GST_DEBUG_PAD_NAME (temp), GST_DEBUG_PAD_NAME (destpad));
1637           gst_object_unref (temp);
1638           gst_object_unref (destpad);
1639           return TRUE;
1640         }
1641         if (temp) {
1642           gst_object_unref (temp);
1643         }
1644       }
1645       if (destpads) {
1646         destpads = g_list_next (destpads);
1647         if (destpads) {
1648           gst_object_unref (destpad);
1649           destpad = GST_PAD_CAST (destpads->data);
1650           gst_object_ref (destpad);
1651         }
1652       }
1653     } while (destpads);
1654   }
1655
1656   if (destpadname) {
1657     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s to %s:%s",
1658         GST_ELEMENT_NAME (src), GST_DEBUG_PAD_NAME (destpad));
1659     gst_object_unref (destpad);
1660     return FALSE;
1661   } else {
1662     if (destpad)
1663       gst_object_unref (destpad);
1664     destpad = NULL;
1665   }
1666
1667   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1668       "we might have request pads on both sides, checking...");
1669   srctempls = gst_element_class_get_pad_template_list (srcclass);
1670   desttempls = gst_element_class_get_pad_template_list (destclass);
1671
1672   if (srctempls && desttempls) {
1673     while (srctempls) {
1674       srctempl = (GstPadTemplate *) srctempls->data;
1675       if (srctempl->presence == GST_PAD_REQUEST) {
1676         for (l = desttempls; l; l = l->next) {
1677           desttempl = (GstPadTemplate *) l->data;
1678           if (desttempl->presence == GST_PAD_REQUEST &&
1679               desttempl->direction != srctempl->direction) {
1680             if (gst_caps_is_always_compatible (gst_pad_template_get_caps
1681                     (srctempl), gst_pad_template_get_caps (desttempl))) {
1682               srcpad =
1683                   gst_element_get_request_pad (src, srctempl->name_template);
1684               destpad =
1685                   gst_element_get_request_pad (dest, desttempl->name_template);
1686               if (srcpad && destpad
1687                   && pad_link_maybe_ghosting (srcpad, destpad)) {
1688                 GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1689                     "linked pad %s:%s to pad %s:%s",
1690                     GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (destpad));
1691                 gst_object_unref (srcpad);
1692                 gst_object_unref (destpad);
1693                 return TRUE;
1694               }
1695               /* it failed, so we release the request pads */
1696               if (srcpad)
1697                 gst_element_release_request_pad (src, srcpad);
1698               if (destpad)
1699                 gst_element_release_request_pad (dest, destpad);
1700             }
1701           }
1702         }
1703       }
1704       srctempls = srctempls->next;
1705     }
1706   }
1707
1708   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s to %s",
1709       GST_ELEMENT_NAME (src), GST_ELEMENT_NAME (dest));
1710   return FALSE;
1711 }
1712
1713 /**
1714  * gst_element_link_pads_filtered:
1715  * @src: a #GstElement containing the source pad.
1716  * @srcpadname: the name of the #GstPad in source element or NULL for any pad.
1717  * @dest: the #GstElement containing the destination pad.
1718  * @destpadname: the name of the #GstPad in destination element or NULL for any pad.
1719  * @filter: the #GstCaps to filter the link, or #NULL for no filter.
1720  *
1721  * Links the two named pads of the source and destination elements. Side effect
1722  * is that if one of the pads has no parent, it becomes a child of the parent of
1723  * the other element. If they have different parents, the link fails. If @caps
1724  * is not #NULL, makes sure that the caps of the link is a subset of @caps.
1725  *
1726  * Returns: TRUE if the pads could be linked, FALSE otherwise.
1727  */
1728 gboolean
1729 gst_element_link_pads_filtered (GstElement * src, const gchar * srcpadname,
1730     GstElement * dest, const gchar * destpadname, GstCaps * filter)
1731 {
1732   /* checks */
1733   g_return_val_if_fail (GST_IS_ELEMENT (src), FALSE);
1734   g_return_val_if_fail (GST_IS_ELEMENT (dest), FALSE);
1735   g_return_val_if_fail (filter == NULL || GST_IS_CAPS (filter), FALSE);
1736
1737   if (filter) {
1738     GstElement *capsfilter;
1739     GstObject *parent;
1740     GstState state, pending;
1741
1742     capsfilter = gst_element_factory_make ("capsfilter", NULL);
1743     if (!capsfilter) {
1744       GST_ERROR ("Could not make a capsfilter");
1745       return FALSE;
1746     }
1747
1748     parent = gst_object_get_parent (GST_OBJECT (src));
1749     g_return_val_if_fail (GST_IS_BIN (parent), FALSE);
1750
1751     gst_element_get_state (GST_ELEMENT_CAST (parent), &state, &pending, 0);
1752
1753     if (!gst_bin_add (GST_BIN (parent), capsfilter)) {
1754       GST_ERROR ("Could not add capsfilter");
1755       gst_object_unref (capsfilter);
1756       gst_object_unref (parent);
1757       return FALSE;
1758     }
1759
1760     if (pending != GST_STATE_VOID_PENDING)
1761       state = pending;
1762
1763     gst_element_set_state (capsfilter, state);
1764
1765     gst_object_unref (parent);
1766
1767     g_object_set (capsfilter, "caps", filter, NULL);
1768
1769     if (gst_element_link_pads (src, srcpadname, capsfilter, "sink")
1770         && gst_element_link_pads (capsfilter, "src", dest, destpadname)) {
1771       return TRUE;
1772     } else {
1773       GST_INFO ("Could not link elements");
1774       gst_element_set_state (capsfilter, GST_STATE_NULL);
1775       /* this will unlink and unref as appropriate */
1776       gst_bin_remove (GST_BIN (GST_OBJECT_PARENT (capsfilter)), capsfilter);
1777       return FALSE;
1778     }
1779   } else {
1780     return gst_element_link_pads (src, srcpadname, dest, destpadname);
1781   }
1782 }
1783
1784 /**
1785  * gst_element_link:
1786  * @src: a #GstElement containing the source pad.
1787  * @dest: the #GstElement containing the destination pad.
1788  *
1789  * Links @src to @dest. The link must be from source to
1790  * destination; the other direction will not be tried. The function looks for
1791  * existing pads that aren't linked yet. It will request new pads if necessary.
1792  * Such pads need to be released manualy when unlinking.
1793  * If multiple links are possible, only one is established.
1794  *
1795  * Make sure you have added your elements to a bin or pipeline with
1796  * gst_bin_add() before trying to link them.
1797  *
1798  * Returns: TRUE if the elements could be linked, FALSE otherwise.
1799  */
1800 gboolean
1801 gst_element_link (GstElement * src, GstElement * dest)
1802 {
1803   return gst_element_link_pads_filtered (src, NULL, dest, NULL, NULL);
1804 }
1805
1806 /**
1807  * gst_element_link_many:
1808  * @element_1: the first #GstElement in the link chain.
1809  * @element_2: the second #GstElement in the link chain.
1810  * @...: the NULL-terminated list of elements to link in order.
1811  *
1812  * Chain together a series of elements. Uses gst_element_link().
1813  * Make sure you have added your elements to a bin or pipeline with
1814  * gst_bin_add() before trying to link them.
1815  *
1816  * Returns: TRUE on success, FALSE otherwise.
1817  */
1818 gboolean
1819 gst_element_link_many (GstElement * element_1, GstElement * element_2, ...)
1820 {
1821   gboolean res = TRUE;
1822   va_list args;
1823
1824   g_return_val_if_fail (GST_IS_ELEMENT (element_1), FALSE);
1825   g_return_val_if_fail (GST_IS_ELEMENT (element_2), FALSE);
1826
1827   va_start (args, element_2);
1828
1829   while (element_2) {
1830     if (!gst_element_link (element_1, element_2)) {
1831       res = FALSE;
1832       break;
1833     }
1834
1835     element_1 = element_2;
1836     element_2 = va_arg (args, GstElement *);
1837   }
1838
1839   va_end (args);
1840
1841   return res;
1842 }
1843
1844 /**
1845  * gst_element_link_filtered:
1846  * @src: a #GstElement containing the source pad.
1847  * @dest: the #GstElement containing the destination pad.
1848  * @filter: the #GstCaps to filter the link, or #NULL for no filter.
1849  *
1850  * Links @src to @dest using the given caps as filtercaps.
1851  * The link must be from source to
1852  * destination; the other direction will not be tried. The function looks for
1853  * existing pads that aren't linked yet. It will request new pads if necessary.
1854  * If multiple links are possible, only one is established.
1855  *
1856  * Make sure you have added your elements to a bin or pipeline with
1857  * gst_bin_add() before trying to link them.
1858  *
1859  * Returns: TRUE if the pads could be linked, FALSE otherwise.
1860  */
1861 gboolean
1862 gst_element_link_filtered (GstElement * src, GstElement * dest,
1863     GstCaps * filter)
1864 {
1865   return gst_element_link_pads_filtered (src, NULL, dest, NULL, filter);
1866 }
1867
1868 /**
1869  * gst_element_unlink_pads:
1870  * @src: a #GstElement containing the source pad.
1871  * @srcpadname: the name of the #GstPad in source element.
1872  * @dest: a #GstElement containing the destination pad.
1873  * @destpadname: the name of the #GstPad in destination element.
1874  *
1875  * Unlinks the two named pads of the source and destination elements.
1876  */
1877 void
1878 gst_element_unlink_pads (GstElement * src, const gchar * srcpadname,
1879     GstElement * dest, const gchar * destpadname)
1880 {
1881   GstPad *srcpad, *destpad;
1882   gboolean srcrequest, destrequest;
1883
1884   srcrequest = destrequest = FALSE;
1885
1886   g_return_if_fail (src != NULL);
1887   g_return_if_fail (GST_IS_ELEMENT (src));
1888   g_return_if_fail (srcpadname != NULL);
1889   g_return_if_fail (dest != NULL);
1890   g_return_if_fail (GST_IS_ELEMENT (dest));
1891   g_return_if_fail (destpadname != NULL);
1892
1893   /* obtain the pads requested */
1894   if (!(srcpad = gst_element_get_static_pad (src, srcpadname)))
1895     if ((srcpad = gst_element_get_request_pad (src, srcpadname)))
1896       srcrequest = TRUE;
1897   if (srcpad == NULL) {
1898     GST_WARNING_OBJECT (src, "source element has no pad \"%s\"", srcpadname);
1899     return;
1900   }
1901   if (!(destpad = gst_element_get_static_pad (dest, destpadname)))
1902     if ((destpad = gst_element_get_request_pad (dest, destpadname)))
1903       destrequest = TRUE;
1904   if (destpad == NULL) {
1905     GST_WARNING_OBJECT (dest, "destination element has no pad \"%s\"",
1906         destpadname);
1907     goto free_src;
1908   }
1909
1910   /* we're satisified they can be unlinked, let's do it */
1911   gst_pad_unlink (srcpad, destpad);
1912
1913   if (destrequest)
1914     gst_element_release_request_pad (dest, destpad);
1915   gst_object_unref (destpad);
1916
1917 free_src:
1918   if (srcrequest)
1919     gst_element_release_request_pad (src, srcpad);
1920   gst_object_unref (srcpad);
1921 }
1922
1923 /**
1924  * gst_element_unlink_many:
1925  * @element_1: the first #GstElement in the link chain.
1926  * @element_2: the second #GstElement in the link chain.
1927  * @...: the NULL-terminated list of elements to unlink in order.
1928  *
1929  * Unlinks a series of elements. Uses gst_element_unlink().
1930  */
1931 void
1932 gst_element_unlink_many (GstElement * element_1, GstElement * element_2, ...)
1933 {
1934   va_list args;
1935
1936   g_return_if_fail (element_1 != NULL && element_2 != NULL);
1937   g_return_if_fail (GST_IS_ELEMENT (element_1) && GST_IS_ELEMENT (element_2));
1938
1939   va_start (args, element_2);
1940
1941   while (element_2) {
1942     gst_element_unlink (element_1, element_2);
1943
1944     element_1 = element_2;
1945     element_2 = va_arg (args, GstElement *);
1946   }
1947
1948   va_end (args);
1949 }
1950
1951 /**
1952  * gst_element_unlink:
1953  * @src: the source #GstElement to unlink.
1954  * @dest: the sink #GstElement to unlink.
1955  *
1956  * Unlinks all source pads of the source element with all sink pads
1957  * of the sink element to which they are linked.
1958  *
1959  * If the link has been made using gst_element_link(), it could have created an
1960  * requestpad, which has to be released using gst_element_release_request_pad().
1961  */
1962 void
1963 gst_element_unlink (GstElement * src, GstElement * dest)
1964 {
1965   GstIterator *pads;
1966   gboolean done = FALSE;
1967
1968   g_return_if_fail (GST_IS_ELEMENT (src));
1969   g_return_if_fail (GST_IS_ELEMENT (dest));
1970
1971   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "unlinking \"%s\" and \"%s\"",
1972       GST_ELEMENT_NAME (src), GST_ELEMENT_NAME (dest));
1973
1974   pads = gst_element_iterate_pads (src);
1975   while (!done) {
1976     gpointer data;
1977
1978     switch (gst_iterator_next (pads, &data)) {
1979       case GST_ITERATOR_OK:
1980       {
1981         GstPad *pad = GST_PAD_CAST (data);
1982
1983         if (GST_PAD_IS_SRC (pad)) {
1984           GstPad *peerpad = gst_pad_get_peer (pad);
1985
1986           /* see if the pad is linked and is really a pad of dest */
1987           if (peerpad) {
1988             GstElement *peerelem;
1989
1990             peerelem = gst_pad_get_parent_element (peerpad);
1991
1992             if (peerelem == dest) {
1993               gst_pad_unlink (pad, peerpad);
1994             }
1995             if (peerelem)
1996               gst_object_unref (peerelem);
1997
1998             gst_object_unref (peerpad);
1999           }
2000         }
2001         gst_object_unref (pad);
2002         break;
2003       }
2004       case GST_ITERATOR_RESYNC:
2005         gst_iterator_resync (pads);
2006         break;
2007       case GST_ITERATOR_DONE:
2008         done = TRUE;
2009         break;
2010       default:
2011         g_assert_not_reached ();
2012         break;
2013     }
2014   }
2015   gst_iterator_free (pads);
2016 }
2017
2018 /**
2019  * gst_element_query_position:
2020  * @element: a #GstElement to invoke the position query on.
2021  * @format: a pointer to the #GstFormat asked for.
2022  *          On return contains the #GstFormat used.
2023  * @cur: A location in which to store the current position, or NULL.
2024  *
2025  * Queries an element for the stream position.
2026  *
2027  * Returns: TRUE if the query could be performed.
2028  */
2029 gboolean
2030 gst_element_query_position (GstElement * element, GstFormat * format,
2031     gint64 * cur)
2032 {
2033   GstQuery *query;
2034   gboolean ret;
2035
2036   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
2037   g_return_val_if_fail (format != NULL, FALSE);
2038
2039   query = gst_query_new_position (*format);
2040   ret = gst_element_query (element, query);
2041
2042   if (ret)
2043     gst_query_parse_position (query, format, cur);
2044
2045   gst_query_unref (query);
2046
2047   return ret;
2048 }
2049
2050 /**
2051  * gst_element_query_duration:
2052  * @element: a #GstElement to invoke the duration query on.
2053  * @format: a pointer to the #GstFormat asked for.
2054  *          On return contains the #GstFormat used.
2055  * @duration: A location in which to store the total duration, or NULL.
2056  *
2057  * Queries an element for the total stream duration.
2058  *
2059  * Returns: TRUE if the query could be performed.
2060  */
2061 gboolean
2062 gst_element_query_duration (GstElement * element, GstFormat * format,
2063     gint64 * duration)
2064 {
2065   GstQuery *query;
2066   gboolean ret;
2067
2068   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
2069   g_return_val_if_fail (format != NULL, FALSE);
2070
2071   query = gst_query_new_duration (*format);
2072   ret = gst_element_query (element, query);
2073
2074   if (ret)
2075     gst_query_parse_duration (query, format, duration);
2076
2077   gst_query_unref (query);
2078
2079   return ret;
2080 }
2081
2082 /**
2083  * gst_element_query_convert:
2084  * @element: a #GstElement to invoke the convert query on.
2085  * @src_format: a #GstFormat to convert from.
2086  * @src_val: a value to convert.
2087  * @dest_format: a pointer to the #GstFormat to convert to.
2088  * @dest_val: a pointer to the result.
2089  *
2090  * Queries an element to convert @src_val in @src_format to @dest_format.
2091  *
2092  * Returns: TRUE if the query could be performed.
2093  */
2094 gboolean
2095 gst_element_query_convert (GstElement * element, GstFormat src_format,
2096     gint64 src_val, GstFormat * dest_format, gint64 * dest_val)
2097 {
2098   GstQuery *query;
2099   gboolean ret;
2100
2101   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
2102   g_return_val_if_fail (dest_format != NULL, FALSE);
2103   g_return_val_if_fail (dest_val != NULL, FALSE);
2104
2105   if (*dest_format == src_format) {
2106     *dest_val = src_val;
2107     return TRUE;
2108   }
2109
2110   query = gst_query_new_convert (src_format, src_val, *dest_format);
2111   ret = gst_element_query (element, query);
2112
2113   if (ret)
2114     gst_query_parse_convert (query, NULL, NULL, dest_format, dest_val);
2115
2116   gst_query_unref (query);
2117
2118   return ret;
2119 }
2120
2121 /**
2122  * gst_element_seek_simple
2123  * @element: a #GstElement to seek on
2124  * @format: a #GstFormat to execute the seek in, such as #GST_FORMAT_TIME
2125  * @seek_flags: seek options; playback applications will usually want to use
2126  *            GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT here
2127  * @seek_pos: position to seek to (relative to the start); if you are doing
2128  *            a seek in #GST_FORMAT_TIME this value is in nanoseconds -
2129  *            multiply with #GST_SECOND to convert seconds to nanoseconds or
2130  *            with #GST_MSECOND to convert milliseconds to nanoseconds.
2131  *
2132  * Simple API to perform a seek on the given element, meaning it just seeks
2133  * to the given position relative to the start of the stream. For more complex
2134  * operations like segment seeks (e.g. for looping) or changing the playback
2135  * rate or seeking relative to the last configured playback segment you should
2136  * use gst_element_seek().
2137  *
2138  * In a completely prerolled PAUSED or PLAYING pipeline, seeking is always
2139  * guaranteed to return %TRUE on a seekable media type or %FALSE when the media
2140  * type is certainly not seekable (such as a live stream).
2141  *
2142  * Some elements allow for seeking in the READY state, in this
2143  * case they will store the seek event and execute it when they are put to
2144  * PAUSED. If the element supports seek in READY, it will always return %TRUE when
2145  * it receives the event in the READY state.
2146  *
2147  * Returns: %TRUE if the seek operation succeeded (the seek might not always be
2148  * executed instantly though)
2149  *
2150  * Since: 0.10.7
2151  */
2152 gboolean
2153 gst_element_seek_simple (GstElement * element, GstFormat format,
2154     GstSeekFlags seek_flags, gint64 seek_pos)
2155 {
2156   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
2157   g_return_val_if_fail (seek_pos >= 0, FALSE);
2158
2159   return gst_element_seek (element, 1.0, format, seek_flags,
2160       GST_SEEK_TYPE_SET, seek_pos, GST_SEEK_TYPE_NONE, 0);
2161 }
2162
2163 /**
2164  * gst_pad_use_fixed_caps:
2165  * @pad: the pad to use
2166  *
2167  * A helper function you can use that sets the
2168  * @gst_pad_get_fixed_caps_func as the getcaps function for the
2169  * pad. This way the function will always return the negotiated caps
2170  * or in case the pad is not negotiated, the padtemplate caps.
2171  *
2172  * Use this function on a pad that, once _set_caps() has been called
2173  * on it, cannot be renegotiated to something else.
2174  */
2175 void
2176 gst_pad_use_fixed_caps (GstPad * pad)
2177 {
2178   gst_pad_set_getcaps_function (pad, gst_pad_get_fixed_caps_func);
2179 }
2180
2181 /**
2182  * gst_pad_get_fixed_caps_func:
2183  * @pad: the pad to use
2184  *
2185  * A helper function you can use as a GetCaps function that
2186  * will return the currently negotiated caps or the padtemplate
2187  * when NULL.
2188  *
2189  * Returns: The currently negotiated caps or the padtemplate.
2190  */
2191 GstCaps *
2192 gst_pad_get_fixed_caps_func (GstPad * pad)
2193 {
2194   GstCaps *result;
2195
2196   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2197
2198   GST_OBJECT_LOCK (pad);
2199   if (GST_PAD_CAPS (pad)) {
2200     result = GST_PAD_CAPS (pad);
2201
2202     GST_CAT_DEBUG (GST_CAT_CAPS,
2203         "using pad caps %p %" GST_PTR_FORMAT, result, result);
2204
2205     result = gst_caps_ref (result);
2206   } else if (GST_PAD_PAD_TEMPLATE (pad)) {
2207     GstPadTemplate *templ = GST_PAD_PAD_TEMPLATE (pad);
2208
2209     result = GST_PAD_TEMPLATE_CAPS (templ);
2210     GST_CAT_DEBUG (GST_CAT_CAPS,
2211         "using pad template %p with caps %p %" GST_PTR_FORMAT, templ, result,
2212         result);
2213
2214     result = gst_caps_ref (result);
2215   } else {
2216     GST_CAT_DEBUG (GST_CAT_CAPS, "pad has no caps");
2217     result = gst_caps_new_empty ();
2218   }
2219   GST_OBJECT_UNLOCK (pad);
2220
2221   return result;
2222 }
2223
2224 /**
2225  * gst_pad_get_parent_element:
2226  * @pad: a pad
2227  *
2228  * Gets the parent of @pad, cast to a #GstElement. If a @pad has no parent or
2229  * its parent is not an element, return NULL.
2230  *
2231  * Returns: The parent of the pad. The caller has a reference on the parent, so
2232  * unref when you're finished with it.
2233  *
2234  * MT safe.
2235  */
2236 GstElement *
2237 gst_pad_get_parent_element (GstPad * pad)
2238 {
2239   GstObject *p;
2240
2241   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2242
2243   p = gst_object_get_parent (GST_OBJECT_CAST (pad));
2244
2245   if (p && !GST_IS_ELEMENT (p)) {
2246     gst_object_unref (p);
2247     p = NULL;
2248   }
2249   return GST_ELEMENT_CAST (p);
2250 }
2251
2252 /**
2253  * gst_object_default_error:
2254  * @source: the #GstObject that initiated the error.
2255  * @error: the GError.
2256  * @debug: an additional debug information string, or NULL.
2257  *
2258  * A default error function.
2259  *
2260  * The default handler will simply print the error string using g_print.
2261  */
2262 void
2263 gst_object_default_error (GstObject * source, GError * error, gchar * debug)
2264 {
2265   gchar *name = gst_object_get_path_string (source);
2266
2267   g_print (_("ERROR: from element %s: %s\n"), name, error->message);
2268   if (debug)
2269     g_print (_("Additional debug info:\n%s\n"), debug);
2270
2271   g_free (name);
2272 }
2273
2274 /**
2275  * gst_bin_add_many:
2276  * @bin: a #GstBin
2277  * @element_1: the #GstElement element to add to the bin
2278  * @...: additional elements to add to the bin
2279  *
2280  * Adds a NULL-terminated list of elements to a bin.  This function is
2281  * equivalent to calling gst_bin_add() for each member of the list. The return
2282  * value of each gst_bin_add() is ignored.
2283  */
2284 void
2285 gst_bin_add_many (GstBin * bin, GstElement * element_1, ...)
2286 {
2287   va_list args;
2288
2289   g_return_if_fail (GST_IS_BIN (bin));
2290   g_return_if_fail (GST_IS_ELEMENT (element_1));
2291
2292   va_start (args, element_1);
2293
2294   while (element_1) {
2295     gst_bin_add (bin, element_1);
2296
2297     element_1 = va_arg (args, GstElement *);
2298   }
2299
2300   va_end (args);
2301 }
2302
2303 /**
2304  * gst_bin_remove_many:
2305  * @bin: a #GstBin
2306  * @element_1: the first #GstElement to remove from the bin
2307  * @...: NULL-terminated list of elements to remove from the bin
2308  *
2309  * Remove a list of elements from a bin. This function is equivalent
2310  * to calling gst_bin_remove() with each member of the list.
2311  */
2312 void
2313 gst_bin_remove_many (GstBin * bin, GstElement * element_1, ...)
2314 {
2315   va_list args;
2316
2317   g_return_if_fail (GST_IS_BIN (bin));
2318   g_return_if_fail (GST_IS_ELEMENT (element_1));
2319
2320   va_start (args, element_1);
2321
2322   while (element_1) {
2323     gst_bin_remove (bin, element_1);
2324
2325     element_1 = va_arg (args, GstElement *);
2326   }
2327
2328   va_end (args);
2329 }
2330
2331 static void
2332 gst_element_populate_std_props (GObjectClass * klass, const gchar * prop_name,
2333     guint arg_id, GParamFlags flags)
2334 {
2335   GQuark prop_id = g_quark_from_string (prop_name);
2336   GParamSpec *pspec;
2337
2338   static GQuark fd_id = 0;
2339   static GQuark blocksize_id;
2340   static GQuark bytesperread_id;
2341   static GQuark dump_id;
2342   static GQuark filesize_id;
2343   static GQuark mmapsize_id;
2344   static GQuark location_id;
2345   static GQuark offset_id;
2346   static GQuark silent_id;
2347   static GQuark touch_id;
2348
2349   if (!fd_id) {
2350     fd_id = g_quark_from_static_string ("fd");
2351     blocksize_id = g_quark_from_static_string ("blocksize");
2352     bytesperread_id = g_quark_from_static_string ("bytesperread");
2353     dump_id = g_quark_from_static_string ("dump");
2354     filesize_id = g_quark_from_static_string ("filesize");
2355     mmapsize_id = g_quark_from_static_string ("mmapsize");
2356     location_id = g_quark_from_static_string ("location");
2357     offset_id = g_quark_from_static_string ("offset");
2358     silent_id = g_quark_from_static_string ("silent");
2359     touch_id = g_quark_from_static_string ("touch");
2360   }
2361
2362   if (prop_id == fd_id) {
2363     pspec = g_param_spec_int ("fd", "File-descriptor",
2364         "File-descriptor for the file being read", 0, G_MAXINT, 0, flags);
2365   } else if (prop_id == blocksize_id) {
2366     pspec = g_param_spec_ulong ("blocksize", "Block Size",
2367         "Block size to read per buffer", 0, G_MAXULONG, 4096, flags);
2368
2369   } else if (prop_id == bytesperread_id) {
2370     pspec = g_param_spec_int ("bytesperread", "Bytes per read",
2371         "Number of bytes to read per buffer", G_MININT, G_MAXINT, 0, flags);
2372
2373   } else if (prop_id == dump_id) {
2374     pspec = g_param_spec_boolean ("dump", "Dump",
2375         "Dump bytes to stdout", FALSE, flags);
2376
2377   } else if (prop_id == filesize_id) {
2378     pspec = g_param_spec_int64 ("filesize", "File Size",
2379         "Size of the file being read", 0, G_MAXINT64, 0, flags);
2380
2381   } else if (prop_id == mmapsize_id) {
2382     pspec = g_param_spec_ulong ("mmapsize", "mmap() Block Size",
2383         "Size in bytes of mmap()d regions", 0, G_MAXULONG, 4 * 1048576, flags);
2384
2385   } else if (prop_id == location_id) {
2386     pspec = g_param_spec_string ("location", "File Location",
2387         "Location of the file to read", NULL, flags);
2388
2389   } else if (prop_id == offset_id) {
2390     pspec = g_param_spec_int64 ("offset", "File Offset",
2391         "Byte offset of current read pointer", 0, G_MAXINT64, 0, flags);
2392
2393   } else if (prop_id == silent_id) {
2394     pspec = g_param_spec_boolean ("silent", "Silent", "Don't produce events",
2395         FALSE, flags);
2396
2397   } else if (prop_id == touch_id) {
2398     pspec = g_param_spec_boolean ("touch", "Touch read data",
2399         "Touch data to force disk read before " "push ()", TRUE, flags);
2400   } else {
2401     g_warning ("Unknown - 'standard' property '%s' id %d from klass %s",
2402         prop_name, arg_id, g_type_name (G_OBJECT_CLASS_TYPE (klass)));
2403     pspec = NULL;
2404   }
2405
2406   if (pspec) {
2407     g_object_class_install_property (klass, arg_id, pspec);
2408   }
2409 }
2410
2411 /**
2412  * gst_element_class_install_std_props:
2413  * @klass: the #GstElementClass to add the properties to.
2414  * @first_name: the name of the first property.
2415  * in a NULL terminated
2416  * @...: the id and flags of the first property, followed by
2417  * further 'name', 'id', 'flags' triplets and terminated by NULL.
2418  *
2419  * Adds a list of standardized properties with types to the @klass.
2420  * the id is for the property switch in your get_prop method, and
2421  * the flags determine readability / writeability.
2422  **/
2423 void
2424 gst_element_class_install_std_props (GstElementClass * klass,
2425     const gchar * first_name, ...)
2426 {
2427   const char *name;
2428
2429   va_list args;
2430
2431   g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
2432
2433   va_start (args, first_name);
2434
2435   name = first_name;
2436
2437   while (name) {
2438     int arg_id = va_arg (args, int);
2439     int flags = va_arg (args, int);
2440
2441     gst_element_populate_std_props ((GObjectClass *) klass, name, arg_id,
2442         flags);
2443
2444     name = va_arg (args, char *);
2445   }
2446
2447   va_end (args);
2448 }
2449
2450
2451 /**
2452  * gst_buffer_merge:
2453  * @buf1: the first source #GstBuffer to merge.
2454  * @buf2: the second source #GstBuffer to merge.
2455  *
2456  * Create a new buffer that is the concatenation of the two source
2457  * buffers.  The original source buffers will not be modified or
2458  * unref'd.  Make sure you unref the source buffers if they are not used
2459  * anymore afterwards.
2460  *
2461  * If the buffers point to contiguous areas of memory, the buffer
2462  * is created without copying the data.
2463  *
2464  * Returns: the new #GstBuffer which is the concatenation of the source buffers.
2465  */
2466 GstBuffer *
2467 gst_buffer_merge (GstBuffer * buf1, GstBuffer * buf2)
2468 {
2469   GstBuffer *result;
2470
2471   /* we're just a specific case of the more general gst_buffer_span() */
2472   result = gst_buffer_span (buf1, 0, buf2, buf1->size + buf2->size);
2473
2474   return result;
2475 }
2476
2477 /**
2478  * gst_buffer_join:
2479  * @buf1: the first source #GstBuffer.
2480  * @buf2: the second source #GstBuffer.
2481  *
2482  * Create a new buffer that is the concatenation of the two source
2483  * buffers, and unrefs the original source buffers.
2484  *
2485  * If the buffers point to contiguous areas of memory, the buffer
2486  * is created without copying the data.
2487  *
2488  * This is a convenience function for C programmers. See also 
2489  * gst_buffer_merge(), which does the same thing without 
2490  * unreffing the input parameters. Language bindings without 
2491  * explicit reference counting should not wrap this function.
2492  *
2493  * Returns: the new #GstBuffer which is the concatenation of the source buffers.
2494  */
2495 GstBuffer *
2496 gst_buffer_join (GstBuffer * buf1, GstBuffer * buf2)
2497 {
2498   GstBuffer *result;
2499
2500   result = gst_buffer_span (buf1, 0, buf2, buf1->size + buf2->size);
2501   gst_buffer_unref (buf1);
2502   gst_buffer_unref (buf2);
2503
2504   return result;
2505 }
2506
2507
2508 /**
2509  * gst_buffer_stamp:
2510  * @dest: buffer to stamp
2511  * @src: buffer to stamp from
2512  *
2513  * Copies additional information (the timestamp, duration, and offset start
2514  * and end) from one buffer to the other.
2515  *
2516  * This function does not copy any buffer flags or caps and is equivalent to
2517  * gst_buffer_copy_metadata(@dest, @src, GST_BUFFER_COPY_TIMESTAMPS).
2518  *
2519  * Deprecated: use gst_buffer_copy_metadata() instead, it provides more
2520  * control.
2521  */
2522 #ifndef GST_REMOVE_DEPRECATED
2523 void
2524 gst_buffer_stamp (GstBuffer * dest, const GstBuffer * src)
2525 {
2526   gst_buffer_copy_metadata (dest, src, GST_BUFFER_COPY_TIMESTAMPS);
2527 }
2528 #endif /* GST_REMOVE_DEPRECATED */
2529
2530 static gboolean
2531 intersect_caps_func (GstPad * pad, GValue * ret, GstPad * orig)
2532 {
2533   /* skip the pad, the request came from */
2534   if (pad != orig) {
2535     GstCaps *peercaps, *existing;
2536
2537     existing = g_value_get_pointer (ret);
2538     peercaps = gst_pad_peer_get_caps (pad);
2539     if (peercaps == NULL)
2540       peercaps = gst_caps_new_any ();
2541     g_value_set_pointer (ret, gst_caps_intersect (existing, peercaps));
2542     gst_caps_unref (existing);
2543     gst_caps_unref (peercaps);
2544   }
2545   gst_object_unref (pad);
2546   return TRUE;
2547 }
2548
2549 /**
2550  * gst_pad_proxy_getcaps:
2551  * @pad: a #GstPad to proxy.
2552  *
2553  * Calls gst_pad_get_allowed_caps() for every other pad belonging to the
2554  * same element as @pad, and returns the intersection of the results.
2555  *
2556  * This function is useful as a default getcaps function for an element
2557  * that can handle any stream format, but requires all its pads to have
2558  * the same caps.  Two such elements are tee and aggregator.
2559  *
2560  * Returns: the intersection of the other pads' allowed caps.
2561  */
2562 GstCaps *
2563 gst_pad_proxy_getcaps (GstPad * pad)
2564 {
2565   GstElement *element;
2566   GstCaps *caps, *intersected;
2567   GstIterator *iter;
2568   GstIteratorResult res;
2569   GValue ret = { 0, };
2570
2571   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2572
2573   GST_CAT_DEBUG (GST_CAT_PADS, "proxying getcaps for %s:%s",
2574       GST_DEBUG_PAD_NAME (pad));
2575
2576   element = gst_pad_get_parent_element (pad);
2577   if (element == NULL)
2578     return NULL;
2579
2580   /* value to hold the return, by default it holds ANY, the ref is taken by
2581    * the GValue. */
2582   g_value_init (&ret, G_TYPE_POINTER);
2583   g_value_set_pointer (&ret, gst_caps_new_any ());
2584
2585   iter = gst_element_iterate_pads (element);
2586   while (1) {
2587     res =
2588         gst_iterator_fold (iter, (GstIteratorFoldFunction) intersect_caps_func,
2589         &ret, pad);
2590     switch (res) {
2591       case GST_ITERATOR_RESYNC:
2592         /* unref any value stored */
2593         if ((caps = g_value_get_pointer (&ret)))
2594           gst_caps_unref (caps);
2595         /* need to reset the result again to ANY */
2596         g_value_set_pointer (&ret, gst_caps_new_any ());
2597         gst_iterator_resync (iter);
2598         break;
2599       case GST_ITERATOR_DONE:
2600         /* all pads iterated, return collected value */
2601         goto done;
2602       default:
2603         /* iterator returned _ERROR or premature end with _OK,
2604          * mark an error and exit */
2605         if ((caps = g_value_get_pointer (&ret)))
2606           gst_caps_unref (caps);
2607         g_value_set_pointer (&ret, NULL);
2608         goto error;
2609     }
2610   }
2611 done:
2612   gst_iterator_free (iter);
2613
2614   gst_object_unref (element);
2615
2616   caps = g_value_get_pointer (&ret);
2617   g_value_unset (&ret);
2618
2619   intersected = gst_caps_intersect (caps, gst_pad_get_pad_template_caps (pad));
2620   gst_caps_unref (caps);
2621
2622   return intersected;
2623
2624   /* ERRORS */
2625 error:
2626   {
2627     g_warning ("Pad list returned error on element %s",
2628         GST_ELEMENT_NAME (element));
2629     gst_iterator_free (iter);
2630     gst_object_unref (element);
2631     return NULL;
2632   }
2633 }
2634
2635 typedef struct
2636 {
2637   GstPad *orig;
2638   GstCaps *caps;
2639 } LinkData;
2640
2641 static gboolean
2642 link_fold_func (GstPad * pad, GValue * ret, LinkData * data)
2643 {
2644   gboolean success = TRUE;
2645
2646   if (pad != data->orig) {
2647     success = gst_pad_set_caps (pad, data->caps);
2648     g_value_set_boolean (ret, success);
2649   }
2650   gst_object_unref (pad);
2651
2652   return success;
2653 }
2654
2655 /**
2656  * gst_pad_proxy_setcaps
2657  * @pad: a #GstPad to proxy from
2658  * @caps: the #GstCaps to link with
2659  *
2660  * Calls gst_pad_set_caps() for every other pad belonging to the
2661  * same element as @pad.  If gst_pad_set_caps() fails on any pad,
2662  * the proxy setcaps fails. May be used only during negotiation.
2663  *
2664  * Returns: TRUE if sucessful
2665  */
2666 gboolean
2667 gst_pad_proxy_setcaps (GstPad * pad, GstCaps * caps)
2668 {
2669   GstElement *element;
2670   GstIterator *iter;
2671   GstIteratorResult res;
2672   GValue ret = { 0, };
2673   LinkData data;
2674
2675   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2676   g_return_val_if_fail (caps != NULL, FALSE);
2677
2678   GST_CAT_DEBUG (GST_CAT_PADS, "proxying pad link for %s:%s",
2679       GST_DEBUG_PAD_NAME (pad));
2680
2681   element = gst_pad_get_parent_element (pad);
2682   if (element == NULL)
2683     return FALSE;
2684
2685   iter = gst_element_iterate_pads (element);
2686
2687   g_value_init (&ret, G_TYPE_BOOLEAN);
2688   g_value_set_boolean (&ret, TRUE);
2689   data.orig = pad;
2690   data.caps = caps;
2691
2692   res = gst_iterator_fold (iter, (GstIteratorFoldFunction) link_fold_func,
2693       &ret, &data);
2694   gst_iterator_free (iter);
2695
2696   if (res != GST_ITERATOR_DONE)
2697     goto pads_changed;
2698
2699   gst_object_unref (element);
2700
2701   /* ok not to unset the gvalue */
2702   return g_value_get_boolean (&ret);
2703
2704   /* ERRORS */
2705 pads_changed:
2706   {
2707     g_warning ("Pad list changed during proxy_pad_link for element %s",
2708         GST_ELEMENT_NAME (element));
2709     gst_object_unref (element);
2710     return FALSE;
2711   }
2712 }
2713
2714 /**
2715  * gst_pad_query_position:
2716  * @pad: a #GstPad to invoke the position query on.
2717  * @format: a pointer to the #GstFormat asked for.
2718  *          On return contains the #GstFormat used.
2719  * @cur: A location in which to store the current position, or NULL.
2720  *
2721  * Queries a pad for the stream position.
2722  *
2723  * Returns: TRUE if the query could be performed.
2724  */
2725 gboolean
2726 gst_pad_query_position (GstPad * pad, GstFormat * format, gint64 * cur)
2727 {
2728   GstQuery *query;
2729   gboolean ret;
2730
2731   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2732   g_return_val_if_fail (format != NULL, FALSE);
2733
2734   query = gst_query_new_position (*format);
2735   ret = gst_pad_query (pad, query);
2736
2737   if (ret)
2738     gst_query_parse_position (query, format, cur);
2739
2740   gst_query_unref (query);
2741
2742   return ret;
2743 }
2744
2745 /**
2746  * gst_pad_query_peer_position:
2747  * @pad: a #GstPad on whose peer to invoke the position query on.
2748  *       Must be a sink pad.
2749  * @format: a pointer to the #GstFormat asked for.
2750  *          On return contains the #GstFormat used.
2751  * @cur: A location in which to store the current position, or NULL.
2752  *
2753  * Queries the peer of a given sink pad for the stream position.
2754  *
2755  * Returns: TRUE if the query could be performed.
2756  */
2757 gboolean
2758 gst_pad_query_peer_position (GstPad * pad, GstFormat * format, gint64 * cur)
2759 {
2760   gboolean ret = FALSE;
2761   GstPad *peer;
2762
2763   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2764   g_return_val_if_fail (GST_PAD_IS_SINK (pad), FALSE);
2765   g_return_val_if_fail (format != NULL, FALSE);
2766
2767   peer = gst_pad_get_peer (pad);
2768   if (peer) {
2769     ret = gst_pad_query_position (peer, format, cur);
2770     gst_object_unref (peer);
2771   }
2772
2773   return ret;
2774 }
2775
2776 /**
2777  * gst_pad_query_duration:
2778  * @pad: a #GstPad to invoke the duration query on.
2779  * @format: a pointer to the #GstFormat asked for.
2780  *          On return contains the #GstFormat used.
2781  * @duration: A location in which to store the total duration, or NULL.
2782  *
2783  * Queries a pad for the total stream duration.
2784  *
2785  * Returns: TRUE if the query could be performed.
2786  */
2787 gboolean
2788 gst_pad_query_duration (GstPad * pad, GstFormat * format, gint64 * duration)
2789 {
2790   GstQuery *query;
2791   gboolean ret;
2792
2793   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2794   g_return_val_if_fail (format != NULL, FALSE);
2795
2796   query = gst_query_new_duration (*format);
2797   ret = gst_pad_query (pad, query);
2798
2799   if (ret)
2800     gst_query_parse_duration (query, format, duration);
2801
2802   gst_query_unref (query);
2803
2804   return ret;
2805 }
2806
2807 /**
2808  * gst_pad_query_peer_duration:
2809  * @pad: a #GstPad on whose peer pad to invoke the duration query on.
2810  *       Must be a sink pad.
2811  * @format: a pointer to the #GstFormat asked for.
2812  *          On return contains the #GstFormat used.
2813  * @duration: A location in which to store the total duration, or NULL.
2814  *
2815  * Queries the peer pad of a given sink pad for the total stream duration.
2816  *
2817  * Returns: TRUE if the query could be performed.
2818  */
2819 gboolean
2820 gst_pad_query_peer_duration (GstPad * pad, GstFormat * format,
2821     gint64 * duration)
2822 {
2823   gboolean ret = FALSE;
2824   GstPad *peer;
2825
2826   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2827   g_return_val_if_fail (GST_PAD_IS_SINK (pad), FALSE);
2828   g_return_val_if_fail (format != NULL, FALSE);
2829
2830   peer = gst_pad_get_peer (pad);
2831   if (peer) {
2832     ret = gst_pad_query_duration (peer, format, duration);
2833     gst_object_unref (peer);
2834   }
2835
2836   return ret;
2837 }
2838
2839 /**
2840  * gst_pad_query_convert:
2841  * @pad: a #GstPad to invoke the convert query on.
2842  * @src_format: a #GstFormat to convert from.
2843  * @src_val: a value to convert.
2844  * @dest_format: a pointer to the #GstFormat to convert to.
2845  * @dest_val: a pointer to the result.
2846  *
2847  * Queries a pad to convert @src_val in @src_format to @dest_format.
2848  *
2849  * Returns: TRUE if the query could be performed.
2850  */
2851 gboolean
2852 gst_pad_query_convert (GstPad * pad, GstFormat src_format, gint64 src_val,
2853     GstFormat * dest_format, gint64 * dest_val)
2854 {
2855   GstQuery *query;
2856   gboolean ret;
2857
2858   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2859   g_return_val_if_fail (dest_format != NULL, FALSE);
2860   g_return_val_if_fail (dest_val != NULL, FALSE);
2861
2862   if (*dest_format == src_format) {
2863     *dest_val = src_val;
2864     return TRUE;
2865   }
2866
2867   query = gst_query_new_convert (src_format, src_val, *dest_format);
2868   ret = gst_pad_query (pad, query);
2869
2870   if (ret)
2871     gst_query_parse_convert (query, NULL, NULL, dest_format, dest_val);
2872
2873   gst_query_unref (query);
2874
2875   return ret;
2876 }
2877
2878 /**
2879  * gst_pad_query_peer_convert:
2880  * @pad: a #GstPad, on whose peer pad to invoke the convert query on.
2881  *       Must be a sink pad.
2882  * @src_format: a #GstFormat to convert from.
2883  * @src_val: a value to convert.
2884  * @dest_format: a pointer to the #GstFormat to convert to.
2885  * @dest_val: a pointer to the result.
2886  *
2887  * Queries the peer pad of a given sink pad to convert @src_val in @src_format
2888  * to @dest_format.
2889  *
2890  * Returns: TRUE if the query could be performed.
2891  */
2892 gboolean
2893 gst_pad_query_peer_convert (GstPad * pad, GstFormat src_format, gint64 src_val,
2894     GstFormat * dest_format, gint64 * dest_val)
2895 {
2896   gboolean ret = FALSE;
2897   GstPad *peer;
2898
2899   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2900   g_return_val_if_fail (GST_PAD_IS_SINK (pad), FALSE);
2901   g_return_val_if_fail (src_val >= 0, FALSE);
2902   g_return_val_if_fail (dest_format != NULL, FALSE);
2903   g_return_val_if_fail (dest_val != NULL, FALSE);
2904
2905   peer = gst_pad_get_peer (pad);
2906   if (peer) {
2907     ret = gst_pad_query_convert (peer, src_format, src_val, dest_format,
2908         dest_val);
2909     gst_object_unref (peer);
2910   }
2911
2912   return ret;
2913 }
2914
2915 /**
2916  * gst_atomic_int_set:
2917  * @atomic_int: pointer to an atomic integer
2918  * @value: value to set
2919  *
2920  * Unconditionally sets the atomic integer to @value.
2921  * 
2922  * Deprecated: Use g_atomic_int_set().
2923  *
2924  */
2925 #ifndef GST_REMOVE_DEPRECATED
2926 void
2927 gst_atomic_int_set (gint * atomic_int, gint value)
2928 {
2929   g_atomic_int_set (atomic_int, value);
2930 }
2931 #endif
2932
2933 /**
2934  * gst_pad_add_data_probe:
2935  * @pad: pad to add the data probe handler to
2936  * @handler: function to call when data is passed over pad
2937  * @data: data to pass along with the handler
2938  *
2939  * Adds a "data probe" to a pad. This function will be called whenever data
2940  * passes through a pad. In this case data means both events and buffers. The
2941  * probe will be called with the data as an argument, meaning @handler should
2942  * have the same callback signature as the #GstPad::have-data signal.
2943  * Note that the data will have a reference count greater than 1, so it will
2944  * be immutable -- you must not change it.
2945  *
2946  * For source pads, the probe will be called after the blocking function, if any
2947  * (see gst_pad_set_blocked_async()), but before looking up the peer to chain
2948  * to. For sink pads, the probe function will be called before configuring the
2949  * sink with new caps, if any, and before calling the pad's chain function.
2950  *
2951  * Your data probe should return TRUE to let the data continue to flow, or FALSE
2952  * to drop it. Dropping data is rarely useful, but occasionally comes in handy
2953  * with events.
2954  *
2955  * Although probes are implemented internally by connecting @handler to the
2956  * have-data signal on the pad, if you want to remove a probe it is insufficient
2957  * to only call g_signal_handler_disconnect on the returned handler id. To
2958  * remove a probe, use the appropriate function, such as
2959  * gst_pad_remove_data_probe().
2960  *
2961  * Returns: The handler id.
2962  */
2963 gulong
2964 gst_pad_add_data_probe (GstPad * pad, GCallback handler, gpointer data)
2965 {
2966   return gst_pad_add_data_probe_full (pad, handler, data, NULL);
2967 }
2968
2969 /**
2970  * gst_pad_add_data_probe_full:
2971  * @pad: pad to add the data probe handler to
2972  * @handler: function to call when data is passed over pad
2973  * @data: data to pass along with the handler
2974  * @notify: function to call when the probe is disconnected, or NULL
2975  *
2976  * Adds a "data probe" to a pad. This function will be called whenever data
2977  * passes through a pad. In this case data means both events and buffers. The
2978  * probe will be called with the data as an argument, meaning @handler should
2979  * have the same callback signature as the #GstPad::have-data signal.
2980  * Note that the data will have a reference count greater than 1, so it will
2981  * be immutable -- you must not change it.
2982  *
2983  * For source pads, the probe will be called after the blocking function, if any
2984  * (see gst_pad_set_blocked_async()), but before looking up the peer to chain
2985  * to. For sink pads, the probe function will be called before configuring the
2986  * sink with new caps, if any, and before calling the pad's chain function.
2987  *
2988  * Your data probe should return TRUE to let the data continue to flow, or FALSE
2989  * to drop it. Dropping data is rarely useful, but occasionally comes in handy
2990  * with events.
2991  *
2992  * Although probes are implemented internally by connecting @handler to the
2993  * have-data signal on the pad, if you want to remove a probe it is insufficient
2994  * to only call g_signal_handler_disconnect on the returned handler id. To
2995  * remove a probe, use the appropriate function, such as
2996  * gst_pad_remove_data_probe().
2997  *
2998  * The @notify function is called when the probe is disconnected and usually
2999  * used to free @data.
3000  *
3001  * Returns: The handler id.
3002  *
3003  * Since: 0.10.20
3004  */
3005 gulong
3006 gst_pad_add_data_probe_full (GstPad * pad, GCallback handler,
3007     gpointer data, GDestroyNotify notify)
3008 {
3009   gulong sigid;
3010
3011   g_return_val_if_fail (GST_IS_PAD (pad), 0);
3012   g_return_val_if_fail (handler != NULL, 0);
3013
3014   GST_OBJECT_LOCK (pad);
3015
3016   /* we only expose a GDestroyNotify in our API because that's less confusing */
3017   sigid = g_signal_connect_data (pad, "have-data", handler, data,
3018       (GClosureNotify) notify, 0);
3019
3020   GST_PAD_DO_EVENT_SIGNALS (pad)++;
3021   GST_PAD_DO_BUFFER_SIGNALS (pad)++;
3022   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
3023       "adding data probe, now %d data, %d event probes",
3024       GST_PAD_DO_BUFFER_SIGNALS (pad), GST_PAD_DO_EVENT_SIGNALS (pad));
3025   GST_OBJECT_UNLOCK (pad);
3026
3027   return sigid;
3028 }
3029
3030 /**
3031  * gst_pad_add_event_probe:
3032  * @pad: pad to add the event probe handler to
3033  * @handler: function to call when events are passed over pad
3034  * @data: data to pass along with the handler
3035  *
3036  * Adds a probe that will be called for all events passing through a pad. See
3037  * gst_pad_add_data_probe() for more information.
3038  *
3039  * Returns: The handler id
3040  */
3041 gulong
3042 gst_pad_add_event_probe (GstPad * pad, GCallback handler, gpointer data)
3043 {
3044   return gst_pad_add_event_probe_full (pad, handler, data, NULL);
3045 }
3046
3047 /**
3048  * gst_pad_add_event_probe_full:
3049  * @pad: pad to add the event probe handler to
3050  * @handler: function to call when events are passed over pad
3051  * @data: data to pass along with the handler, or NULL
3052  * @notify: function to call when probe is disconnected, or NULL
3053  *
3054  * Adds a probe that will be called for all events passing through a pad. See
3055  * gst_pad_add_data_probe() for more information.
3056  *
3057  * The @notify function is called when the probe is disconnected and usually
3058  * used to free @data.
3059  *
3060  * Returns: The handler id
3061  *
3062  * Since: 0.10.20
3063  */
3064 gulong
3065 gst_pad_add_event_probe_full (GstPad * pad, GCallback handler,
3066     gpointer data, GDestroyNotify notify)
3067 {
3068   gulong sigid;
3069
3070   g_return_val_if_fail (GST_IS_PAD (pad), 0);
3071   g_return_val_if_fail (handler != NULL, 0);
3072
3073   GST_OBJECT_LOCK (pad);
3074
3075   /* we only expose a GDestroyNotify in our API because that's less confusing */
3076   sigid = g_signal_connect_data (pad, "have-data::event", handler, data,
3077       (GClosureNotify) notify, 0);
3078
3079   GST_PAD_DO_EVENT_SIGNALS (pad)++;
3080   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "adding event probe, now %d probes",
3081       GST_PAD_DO_EVENT_SIGNALS (pad));
3082   GST_OBJECT_UNLOCK (pad);
3083
3084   return sigid;
3085 }
3086
3087 /**
3088  * gst_pad_add_buffer_probe:
3089  * @pad: pad to add the buffer probe handler to
3090  * @handler: function to call when buffers are passed over pad
3091  * @data: data to pass along with the handler
3092  *
3093  * Adds a probe that will be called for all buffers passing through a pad. See
3094  * gst_pad_add_data_probe() for more information.
3095  *
3096  * Returns: The handler id
3097  */
3098 gulong
3099 gst_pad_add_buffer_probe (GstPad * pad, GCallback handler, gpointer data)
3100 {
3101   return gst_pad_add_buffer_probe_full (pad, handler, data, NULL);
3102 }
3103
3104 /**
3105  * gst_pad_add_buffer_probe_full:
3106  * @pad: pad to add the buffer probe handler to
3107  * @handler: function to call when buffer are passed over pad
3108  * @data: data to pass along with the handler
3109  * @notify: function to call when the probe is disconnected, or NULL
3110  *
3111  * Adds a probe that will be called for all buffers passing through a pad. See
3112  * gst_pad_add_data_probe() for more information.
3113  *
3114  * The @notify function is called when the probe is disconnected and usually
3115  * used to free @data.
3116  *
3117  * Returns: The handler id
3118  *
3119  * Since: 0.10.20
3120  */
3121 gulong
3122 gst_pad_add_buffer_probe_full (GstPad * pad, GCallback handler,
3123     gpointer data, GDestroyNotify notify)
3124 {
3125   gulong sigid;
3126
3127   g_return_val_if_fail (GST_IS_PAD (pad), 0);
3128   g_return_val_if_fail (handler != NULL, 0);
3129
3130   GST_OBJECT_LOCK (pad);
3131
3132   /* we only expose a GDestroyNotify in our API because that's less confusing */
3133   sigid = g_signal_connect_data (pad, "have-data::buffer", handler, data,
3134       (GClosureNotify) notify, 0);
3135
3136   GST_PAD_DO_BUFFER_SIGNALS (pad)++;
3137   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "adding buffer probe, now %d probes",
3138       GST_PAD_DO_BUFFER_SIGNALS (pad));
3139   GST_OBJECT_UNLOCK (pad);
3140
3141   return sigid;
3142 }
3143
3144 /**
3145  * gst_pad_remove_data_probe:
3146  * @pad: pad to remove the data probe handler from
3147  * @handler_id: handler id returned from gst_pad_add_data_probe
3148  *
3149  * Removes a data probe from @pad.
3150  */
3151 void
3152 gst_pad_remove_data_probe (GstPad * pad, guint handler_id)
3153 {
3154   g_return_if_fail (GST_IS_PAD (pad));
3155   g_return_if_fail (handler_id > 0);
3156
3157   GST_OBJECT_LOCK (pad);
3158   g_signal_handler_disconnect (pad, handler_id);
3159   GST_PAD_DO_BUFFER_SIGNALS (pad)--;
3160   GST_PAD_DO_EVENT_SIGNALS (pad)--;
3161   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
3162       "removed data probe, now %d event, %d buffer probes",
3163       GST_PAD_DO_EVENT_SIGNALS (pad), GST_PAD_DO_BUFFER_SIGNALS (pad));
3164   GST_OBJECT_UNLOCK (pad);
3165
3166 }
3167
3168 /**
3169  * gst_pad_remove_event_probe:
3170  * @pad: pad to remove the event probe handler from
3171  * @handler_id: handler id returned from gst_pad_add_event_probe
3172  *
3173  * Removes an event probe from @pad.
3174  */
3175 void
3176 gst_pad_remove_event_probe (GstPad * pad, guint handler_id)
3177 {
3178   g_return_if_fail (GST_IS_PAD (pad));
3179   g_return_if_fail (handler_id > 0);
3180
3181   GST_OBJECT_LOCK (pad);
3182   g_signal_handler_disconnect (pad, handler_id);
3183   GST_PAD_DO_EVENT_SIGNALS (pad)--;
3184   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
3185       "removed event probe, now %d event probes",
3186       GST_PAD_DO_EVENT_SIGNALS (pad));
3187   GST_OBJECT_UNLOCK (pad);
3188 }
3189
3190 /**
3191  * gst_pad_remove_buffer_probe:
3192  * @pad: pad to remove the buffer probe handler from
3193  * @handler_id: handler id returned from gst_pad_add_buffer_probe
3194  *
3195  * Removes a buffer probe from @pad.
3196  */
3197 void
3198 gst_pad_remove_buffer_probe (GstPad * pad, guint handler_id)
3199 {
3200   g_return_if_fail (GST_IS_PAD (pad));
3201   g_return_if_fail (handler_id > 0);
3202
3203   GST_OBJECT_LOCK (pad);
3204   g_signal_handler_disconnect (pad, handler_id);
3205   GST_PAD_DO_BUFFER_SIGNALS (pad)--;
3206   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
3207       "removed buffer probe, now %d buffer probes",
3208       GST_PAD_DO_BUFFER_SIGNALS (pad));
3209   GST_OBJECT_UNLOCK (pad);
3210
3211 }
3212
3213 /**
3214  * gst_element_found_tags_for_pad:
3215  * @element: element for which to post taglist to bus.
3216  * @pad: pad on which to push tag-event.
3217  * @list: the taglist to post on the bus and create event from.
3218  *
3219  * Posts a message to the bus that new tags were found and pushes the
3220  * tags as event. Takes ownership of the @list.
3221  *
3222  * This is a utility method for elements. Applications should use the
3223  * #GstTagSetter interface.
3224  */
3225 void
3226 gst_element_found_tags_for_pad (GstElement * element,
3227     GstPad * pad, GstTagList * list)
3228 {
3229   g_return_if_fail (element != NULL);
3230   g_return_if_fail (pad != NULL);
3231   g_return_if_fail (list != NULL);
3232
3233   gst_pad_push_event (pad, gst_event_new_tag (gst_tag_list_copy (list)));
3234   /* FIXME 0.11: Set the pad as source to make it possible to detect for
3235    * which pad the tags are actually found.
3236    */
3237   gst_element_post_message (element,
3238       gst_message_new_tag (GST_OBJECT (element), list));
3239 }
3240
3241 static void
3242 push_and_ref (GstPad * pad, GstEvent * event)
3243 {
3244   gst_pad_push_event (pad, gst_event_ref (event));
3245   /* iterator refs pad, we unref when we are done with it */
3246   gst_object_unref (pad);
3247 }
3248
3249 /**
3250  * gst_element_found_tags:
3251  * @element: element for which we found the tags.
3252  * @list: list of tags.
3253  *
3254  * Posts a message to the bus that new tags were found, and pushes an event
3255  * to all sourcepads. Takes ownership of the @list.
3256  *
3257  * This is a utility method for elements. Applications should use the
3258  * #GstTagSetter interface.
3259  */
3260 void
3261 gst_element_found_tags (GstElement * element, GstTagList * list)
3262 {
3263   GstIterator *iter;
3264   GstEvent *event;
3265
3266   g_return_if_fail (element != NULL);
3267   g_return_if_fail (list != NULL);
3268
3269   iter = gst_element_iterate_src_pads (element);
3270   event = gst_event_new_tag (gst_tag_list_copy (list));
3271   gst_iterator_foreach (iter, (GFunc) push_and_ref, event);
3272   gst_iterator_free (iter);
3273   gst_event_unref (event);
3274
3275   gst_element_post_message (element,
3276       gst_message_new_tag (GST_OBJECT (element), list));
3277 }
3278
3279 static GstPad *
3280 element_find_unlinked_pad (GstElement * element, GstPadDirection direction)
3281 {
3282   GstIterator *iter;
3283   GstPad *unlinked_pad = NULL;
3284   gboolean done;
3285
3286   switch (direction) {
3287     case GST_PAD_SRC:
3288       iter = gst_element_iterate_src_pads (element);
3289       break;
3290     case GST_PAD_SINK:
3291       iter = gst_element_iterate_sink_pads (element);
3292       break;
3293     default:
3294       g_return_val_if_reached (NULL);
3295   }
3296
3297   done = FALSE;
3298   while (!done) {
3299     gpointer pad;
3300
3301     switch (gst_iterator_next (iter, &pad)) {
3302       case GST_ITERATOR_OK:{
3303         GstPad *peer;
3304
3305         GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
3306             GST_DEBUG_PAD_NAME (pad));
3307
3308         peer = gst_pad_get_peer (GST_PAD (pad));
3309         if (peer == NULL) {
3310           unlinked_pad = pad;
3311           done = TRUE;
3312           GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
3313               "found existing unlinked pad %s:%s",
3314               GST_DEBUG_PAD_NAME (unlinked_pad));
3315         } else {
3316           gst_object_unref (pad);
3317           gst_object_unref (peer);
3318         }
3319         break;
3320       }
3321       case GST_ITERATOR_DONE:
3322         done = TRUE;
3323         break;
3324       case GST_ITERATOR_RESYNC:
3325         gst_iterator_resync (iter);
3326         break;
3327       case GST_ITERATOR_ERROR:
3328         g_return_val_if_reached (NULL);
3329         break;
3330     }
3331   }
3332
3333   gst_iterator_free (iter);
3334
3335   return unlinked_pad;
3336 }
3337
3338 /**
3339  * gst_bin_find_unlinked_pad:
3340  * @bin: bin in which to look for elements with unlinked pads
3341  * @direction: whether to look for an unlinked source or sink pad
3342  *
3343  * Recursively looks for elements with an unlinked pad of the given
3344  * direction within the specified bin and returns an unlinked pad
3345  * if one is found, or NULL otherwise. If a pad is found, the caller
3346  * owns a reference to it and should use gst_object_unref() on the
3347  * pad when it is not needed any longer.
3348  *
3349  * Returns: unlinked pad of the given direction, or NULL.
3350  *
3351  * Since: 0.10.20
3352  */
3353 GstPad *
3354 gst_bin_find_unlinked_pad (GstBin * bin, GstPadDirection direction)
3355 {
3356   GstIterator *iter;
3357   gboolean done;
3358   GstPad *pad = NULL;
3359
3360   g_return_val_if_fail (GST_IS_BIN (bin), NULL);
3361   g_return_val_if_fail (direction != GST_PAD_UNKNOWN, NULL);
3362
3363   done = FALSE;
3364   iter = gst_bin_iterate_recurse (bin);
3365   while (!done) {
3366     gpointer element;
3367
3368     switch (gst_iterator_next (iter, &element)) {
3369       case GST_ITERATOR_OK:
3370         pad = element_find_unlinked_pad (GST_ELEMENT (element), direction);
3371         gst_object_unref (element);
3372         if (pad != NULL)
3373           done = TRUE;
3374         break;
3375       case GST_ITERATOR_DONE:
3376         done = TRUE;
3377         break;
3378       case GST_ITERATOR_RESYNC:
3379         gst_iterator_resync (iter);
3380         break;
3381       case GST_ITERATOR_ERROR:
3382         g_return_val_if_reached (NULL);
3383         break;
3384     }
3385   }
3386
3387   gst_iterator_free (iter);
3388
3389   return pad;
3390 }
3391
3392 /**
3393  * gst_bin_find_unconnected_pad:
3394  * @bin: bin in which to look for elements with unlinked pads
3395  * @direction: whether to look for an unlinked source or sink pad
3396  *
3397  * Recursively looks for elements with an unlinked pad of the given
3398  * direction within the specified bin and returns an unlinked pad
3399  * if one is found, or NULL otherwise. If a pad is found, the caller
3400  * owns a reference to it and should use gst_object_unref() on the
3401  * pad when it is not needed any longer.
3402  *
3403  * Returns: unlinked pad of the given direction, or NULL.
3404  *
3405  * Since: 0.10.3
3406  *
3407  * Deprecated: use gst_bin_find_unlinked_pad() instead.
3408  */
3409 #ifndef GST_REMOVE_DEPRECATED
3410 GstPad *
3411 gst_bin_find_unconnected_pad (GstBin * bin, GstPadDirection direction)
3412 {
3413   return gst_bin_find_unlinked_pad (bin, direction);
3414 }
3415 #endif
3416
3417 /**
3418  * gst_parse_bin_from_description:
3419  * @bin_description: command line describing the bin
3420  * @ghost_unlinked_pads: whether to automatically create ghost pads
3421  *     for unlinked source or sink pads within the bin
3422  * @err: where to store the error message in case of an error, or NULL
3423  *
3424  * This is a convenience wrapper around gst_parse_launch() to create a
3425  * #GstBin from a gst-launch-style pipeline description. See
3426  * gst_parse_launch() and the gst-launch man page for details about the
3427  * syntax. Ghost pads on the bin for unlinked source or sink pads
3428  * within the bin can automatically be created (but only a maximum of
3429  * one ghost pad for each direction will be created; if you expect
3430  * multiple unlinked source pads or multiple unlinked sink pads
3431  * and want them all ghosted, you will have to create the ghost pads
3432  * yourself).
3433  *
3434  * Returns: a newly-created bin, or NULL if an error occurred.
3435  *
3436  * Since: 0.10.3
3437  */
3438 GstElement *
3439 gst_parse_bin_from_description (const gchar * bin_description,
3440     gboolean ghost_unlinked_pads, GError ** err)
3441 {
3442   return gst_parse_bin_from_description_full (bin_description,
3443       ghost_unlinked_pads, NULL, 0, err);
3444 }
3445
3446 /**
3447  * gst_parse_bin_from_description_full:
3448  * @bin_description: command line describing the bin
3449  * @ghost_unlinked_pads: whether to automatically create ghost pads
3450  *     for unlinked source or sink pads within the bin
3451  * @context: a parse context allocated with gst_parse_context_new(), or %NULL
3452  * @flags: parsing options, or #GST_PARSE_FLAG_NONE
3453  * @err: where to store the error message in case of an error, or NULL
3454  *
3455  * This is a convenience wrapper around gst_parse_launch() to create a
3456  * #GstBin from a gst-launch-style pipeline description. See
3457  * gst_parse_launch() and the gst-launch man page for details about the
3458  * syntax. Ghost pads on the bin for unlinked source or sink pads
3459  * within the bin can automatically be created (but only a maximum of
3460  * one ghost pad for each direction will be created; if you expect
3461  * multiple unlinked source pads or multiple unlinked sink pads
3462  * and want them all ghosted, you will have to create the ghost pads
3463  * yourself).
3464  *
3465  * Returns: a newly-created bin, or NULL if an error occurred.
3466  *
3467  * Since: 0.10.20
3468  */
3469 GstElement *
3470 gst_parse_bin_from_description_full (const gchar * bin_description,
3471     gboolean ghost_unlinked_pads, GstParseContext * context,
3472     GstParseFlags flags, GError ** err)
3473 {
3474 #ifndef GST_DISABLE_PARSE
3475   GstPad *pad = NULL;
3476   GstBin *bin;
3477   gchar *desc;
3478
3479   g_return_val_if_fail (bin_description != NULL, NULL);
3480   g_return_val_if_fail (err == NULL || *err == NULL, NULL);
3481
3482   GST_DEBUG ("Making bin from description '%s'", bin_description);
3483
3484   /* parse the pipeline to a bin */
3485   desc = g_strdup_printf ("bin.( %s )", bin_description);
3486   bin = (GstBin *) gst_parse_launch_full (desc, context, flags, err);
3487   g_free (desc);
3488
3489   if (bin == NULL || (err && *err != NULL)) {
3490     if (bin)
3491       gst_object_unref (bin);
3492     return NULL;
3493   }
3494
3495   /* find pads and ghost them if necessary */
3496   if (ghost_unlinked_pads) {
3497     if ((pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SRC))) {
3498       gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("src", pad));
3499       gst_object_unref (pad);
3500     }
3501     if ((pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SINK))) {
3502       gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad));
3503       gst_object_unref (pad);
3504     }
3505   }
3506
3507   return GST_ELEMENT (bin);
3508 #else
3509   gchar *msg;
3510
3511   GST_WARNING ("Disabled API called");
3512
3513   msg = gst_error_get_message (GST_CORE_ERROR, GST_CORE_ERROR_DISABLED);
3514   g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_DISABLED, "%s", msg);
3515   g_free (msg);
3516
3517   return NULL;
3518 #endif
3519 }
3520
3521 /**
3522  * gst_type_register_static_full:
3523  * @parent_type: The GType of the parent type the newly registered type will 
3524  *   derive from
3525  * @type_name: NULL-terminated string used as the name of the new type
3526  * @class_size: Size of the class structure.
3527  * @base_init: Location of the base initialization function (optional).
3528  * @base_finalize: Location of the base finalization function (optional).
3529  * @class_init: Location of the class initialization function for class types 
3530  *   Location of the default vtable inititalization function for interface 
3531  *   types. (optional)
3532  * @class_finalize: Location of the class finalization function for class types.
3533  *   Location of the default vtable finalization function for interface types. 
3534  *   (optional)
3535  * @class_data: User-supplied data passed to the class init/finalize functions.
3536  * @instance_size: Size of the instance (object) structure (required for 
3537  *   instantiatable types only).
3538  * @n_preallocs: The number of pre-allocated (cached) instances to reserve 
3539  *   memory for (0 indicates no caching). Ignored on recent GLib's.
3540  * @instance_init: Location of the instance initialization function (optional, 
3541  *   for instantiatable types only).
3542  * @value_table: A GTypeValueTable function table for generic handling of 
3543  *   GValues of this type (usually only useful for fundamental types). 
3544  * @flags: #GTypeFlags for this GType. E.g: G_TYPE_FLAG_ABSTRACT
3545  *
3546  * Helper function which constructs a #GTypeInfo structure and registers a 
3547  * GType, but which generates less linker overhead than a static const 
3548  * #GTypeInfo structure. For further details of the parameters, please see
3549  * #GTypeInfo in the GLib documentation.
3550  *
3551  * Registers type_name as the name of a new static type derived from 
3552  * parent_type. The value of flags determines the nature (e.g. abstract or 
3553  * not) of the type. It works by filling a GTypeInfo struct and calling 
3554  * g_type_info_register_static().
3555  *
3556  * Returns: A #GType for the newly-registered type.
3557  *
3558  * Since: 0.10.14
3559  */
3560 GType
3561 gst_type_register_static_full (GType parent_type,
3562     const gchar * type_name,
3563     guint class_size,
3564     GBaseInitFunc base_init,
3565     GBaseFinalizeFunc base_finalize,
3566     GClassInitFunc class_init,
3567     GClassFinalizeFunc class_finalize,
3568     gconstpointer class_data,
3569     guint instance_size,
3570     guint16 n_preallocs,
3571     GInstanceInitFunc instance_init,
3572     const GTypeValueTable * value_table, GTypeFlags flags)
3573 {
3574   GTypeInfo info;
3575
3576   info.class_size = class_size;
3577   info.base_init = base_init;
3578   info.base_finalize = base_finalize;
3579   info.class_init = class_init;
3580   info.class_finalize = class_finalize;
3581   info.class_data = class_data;
3582   info.instance_size = instance_size;
3583   info.n_preallocs = n_preallocs;
3584   info.instance_init = instance_init;
3585   info.value_table = value_table;
3586
3587   return g_type_register_static (parent_type, type_name, &info, flags);
3588 }
3589
3590
3591 /**
3592  * gst_util_get_timestamp:
3593  *
3594  * Get a timestamp as GstClockTime to be used for interval meassurements.
3595  * The timestamp should not be interpreted in any other way.
3596  *
3597  * Returns: the timestamp
3598  *
3599  * Since: 0.10.16
3600  */
3601 GstClockTime
3602 gst_util_get_timestamp (void)
3603 {
3604 #if defined (HAVE_POSIX_TIMERS) && defined(HAVE_MONOTONIC_CLOCK)
3605   struct timespec now;
3606
3607   clock_gettime (CLOCK_MONOTONIC, &now);
3608   return GST_TIMESPEC_TO_TIME (now);
3609 #else
3610   GTimeVal now;
3611
3612   g_get_current_time (&now);
3613   return GST_TIMEVAL_TO_TIME (now);
3614 #endif
3615 }
3616
3617 /**
3618  * gst_util_array_binary_search:
3619  * @array: the sorted input array
3620  * @num_elements: number of elements in the array
3621  * @element_size: size of every element in bytes
3622  * @search_func: function to compare two elements, @search_data will always be passed as second argument
3623  * @mode: search mode that should be used
3624  * @search_data: element that should be found
3625  * @user_data: data to pass to @search_func
3626  *
3627  * Searches inside @array for @search_data by using the comparison function
3628  * @search_func. @array must be sorted ascending.
3629  *
3630  * As @search_data is always passed as second argument to @search_func it's
3631  * not required that @search_data has the same type as the array elements.
3632  *
3633  * The complexity of this search function is O(log (num_elements)).
3634  *
3635  * Returns: The address of the found element or %NULL if nothing was found
3636  *
3637  * Since: 0.10.23
3638  */
3639 gpointer
3640 gst_util_array_binary_search (gpointer array, guint num_elements,
3641     gsize element_size, GCompareDataFunc search_func, GstSearchMode mode,
3642     gconstpointer search_data, gpointer user_data)
3643 {
3644   glong left = 0, right = num_elements - 1, m;
3645   gint ret;
3646   guint8 *data = (guint8 *) array;
3647
3648   g_return_val_if_fail (array != NULL, NULL);
3649   g_return_val_if_fail (element_size > 0, NULL);
3650   g_return_val_if_fail (search_func != NULL, NULL);
3651
3652   /* 0. No elements => return NULL */
3653   if (num_elements == 0)
3654     return NULL;
3655
3656   /* 1. If search_data is before the 0th element return the 0th element */
3657   ret = search_func (data, search_data, user_data);
3658   if ((ret >= 0 && mode == GST_SEARCH_MODE_AFTER) || ret == 0)
3659     return data;
3660   else if (ret > 0)
3661     return NULL;
3662
3663   /* 2. If search_data is after the last element return the last element */
3664   ret =
3665       search_func (data + (num_elements - 1) * element_size, search_data,
3666       user_data);
3667   if ((ret <= 0 && mode == GST_SEARCH_MODE_BEFORE) || ret == 0)
3668     return data + (num_elements - 1) * element_size;
3669   else if (ret < 0)
3670     return NULL;
3671
3672   /* 3. else binary search */
3673   while (TRUE) {
3674     m = left + (right - left) / 2;
3675
3676     ret = search_func (data + m * element_size, search_data, user_data);
3677
3678     if (ret == 0) {
3679       return data + m * element_size;
3680     } else if (ret < 0) {
3681       left = m + 1;
3682     } else {
3683       right = m - 1;
3684     }
3685
3686     /* No exact match found */
3687     if (right < left) {
3688       if (mode == GST_SEARCH_MODE_EXACT) {
3689         return NULL;
3690       } else if (mode == GST_SEARCH_MODE_AFTER) {
3691         if (ret < 0)
3692           return (m < num_elements) ? data + (m + 1) * element_size : NULL;
3693         else
3694           return data + m * element_size;
3695       } else {
3696         if (ret < 0)
3697           return data + m * element_size;
3698         else
3699           return (m > 0) ? data + (m - 1) * element_size : NULL;
3700       }
3701     }
3702   }
3703 }