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