gstpad: Fix non-serialized sticky event push
[platform/upstream/gstreamer.git] / subprojects / gstreamer / 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  *                    2004 Wim Taymans <wim@fluendo.com>
6  *                    2015 Jan Schmidt <jan@centricular.com>
7  *
8  * gstutils.c: Utility functions
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public
21  * License along with this library; if not, write to the
22  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23  * Boston, MA 02110-1301, USA.
24  */
25
26 /**
27  * SECTION:gstutils
28  * @title: GstUtils
29  * @short_description: Various utility functions
30  *
31  */
32
33 /* FIXME 2.0: suppress warnings for deprecated API such as GValueArray
34  * with newer GLib versions (>= 2.31.0) */
35 #define GLIB_DISABLE_DEPRECATION_WARNINGS
36
37 #include "gst_private.h"
38 #include <stdio.h>
39 #include <string.h>
40
41 #include "gstghostpad.h"
42 #include "gstutils.h"
43 #include "gsterror.h"
44 #include "gstinfo.h"
45 #include "gstparse.h"
46 #include "gstvalue.h"
47 #include "gstquark.h"
48 #include <glib/gi18n-lib.h>
49 #include "glib-compat-private.h"
50 #include <math.h>
51
52
53 static void
54 gst_util_dump_mem_offset (const guchar * mem, guint size, guint offset)
55 {
56   guint i, j;
57   GString *string = g_string_sized_new (50);
58   GString *chars = g_string_sized_new (18);
59
60   i = j = 0;
61   while (i < size) {
62     if (g_ascii_isprint (mem[i]))
63       g_string_append_c (chars, mem[i]);
64     else
65       g_string_append_c (chars, '.');
66
67     g_string_append_printf (string, "%02x ", mem[i]);
68
69     j++;
70     i++;
71
72     if (j == 16 || i == size) {
73       g_print ("%08x (%p): %-48.48s %-16.16s\n", i - j + offset, mem + i - j,
74           string->str, chars->str);
75       g_string_set_size (string, 0);
76       g_string_set_size (chars, 0);
77       j = 0;
78     }
79   }
80   g_string_free (string, TRUE);
81   g_string_free (chars, TRUE);
82 }
83
84 /**
85  * gst_util_dump_mem:
86  * @mem: (array length=size): a pointer to the memory to dump
87  * @size: the size of the memory block to dump
88  *
89  * Dumps the memory block into a hex representation. Useful for debugging.
90  */
91 void
92 gst_util_dump_mem (const guchar * mem, guint size)
93 {
94   gst_util_dump_mem_offset (mem, size, 0);
95 }
96
97 /**
98  * gst_util_dump_buffer:
99  * @buf: a #GstBuffer whose memory to dump
100  *
101  * Dumps the buffer memory into a hex representation. Useful for debugging.
102  *
103  * Since: 1.14
104  */
105 void
106 gst_util_dump_buffer (GstBuffer * buf)
107 {
108   GstMapInfo map;
109   GstMemory *mem;
110   guint n_memory;
111   guint i;
112   guint offset;
113
114   n_memory = gst_buffer_n_memory (buf);
115
116   if (n_memory == 1) {
117     if (gst_buffer_map (buf, &map, GST_MAP_READ)) {
118       gst_util_dump_mem (map.data, map.size);
119       gst_buffer_unmap (buf, &map);
120     }
121   } else if (n_memory > 1) {
122     /* gst_buffer_map() will merge multiple memory segments into one contiguous
123      * area so we need to use gst_memory_map() in order not to affect the
124      * contents of buf */
125     offset = 0;
126     for (i = 0; i < n_memory; ++i) {
127       g_print ("[Memory #%u]\n", i);
128       mem = gst_buffer_get_memory (buf, i);
129       if (gst_memory_map (mem, &map, GST_MAP_READ)) {
130         gst_util_dump_mem_offset (map.data, map.size, offset);
131         offset += map.size;
132         gst_memory_unmap (mem, &map);
133       }
134       gst_memory_unref (mem);
135     }
136   } else {
137     g_print ("[Empty]\n");
138   }
139 }
140
141 /**
142  * gst_util_set_value_from_string:
143  * @value: (out caller-allocates): the value to set
144  * @value_str: the string to get the value from
145  *
146  * Converts the string to the type of the value and
147  * sets the value with it.
148  *
149  * Note that this function is dangerous as it does not return any indication
150  * if the conversion worked or not.
151  */
152 void
153 gst_util_set_value_from_string (GValue * value, const gchar * value_str)
154 {
155   gboolean res;
156
157   g_return_if_fail (value != NULL);
158   g_return_if_fail (value_str != NULL);
159
160   GST_CAT_DEBUG (GST_CAT_PARAMS, "parsing '%s' to type %s", value_str,
161       g_type_name (G_VALUE_TYPE (value)));
162
163   res = gst_value_deserialize (value, value_str);
164   if (!res && G_VALUE_TYPE (value) == G_TYPE_BOOLEAN) {
165     /* backwards compat, all booleans that fail to parse are false */
166     g_value_set_boolean (value, FALSE);
167     res = TRUE;
168   }
169   g_return_if_fail (res);
170 }
171
172 /**
173  * gst_util_set_object_arg:
174  * @object: the object to set the argument of
175  * @name: the name of the argument to set
176  * @value: the string value to set
177  *
178  * Converts the string value to the type of the objects argument and
179  * sets the argument with it.
180  *
181  * Note that this function silently returns if @object has no property named
182  * @name or when @value cannot be converted to the type of the property.
183  */
184 void
185 gst_util_set_object_arg (GObject * object, const gchar * name,
186     const gchar * value)
187 {
188   GParamSpec *pspec;
189   GType value_type;
190   GValue v = { 0, };
191
192   g_return_if_fail (G_IS_OBJECT (object));
193   g_return_if_fail (name != NULL);
194   g_return_if_fail (value != NULL);
195
196   pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), name);
197   if (!pspec)
198     return;
199
200   value_type = pspec->value_type;
201
202   GST_DEBUG ("pspec->flags is %d, pspec->value_type is %s",
203       pspec->flags, g_type_name (value_type));
204
205   if (!(pspec->flags & G_PARAM_WRITABLE))
206     return;
207
208   g_value_init (&v, value_type);
209
210   /* special case for element <-> xml (de)serialisation */
211   if (value_type == GST_TYPE_STRUCTURE && strcmp (value, "NULL") == 0) {
212     g_value_set_boxed (&v, NULL);
213     goto done;
214   }
215
216   if (!gst_value_deserialize_with_pspec (&v, value, pspec))
217     return;
218
219 done:
220
221   g_object_set_property (object, pspec->name, &v);
222   g_value_unset (&v);
223 }
224
225 /**
226  * gst_util_set_object_array:
227  * @object: the object to set the array to
228  * @name: the name of the property to set
229  * @array: a #GValueArray containing the values
230  *
231  * Transfer a #GValueArray to %GST_TYPE_ARRAY and set this value on the
232  * specified property name. This allow language bindings to set GST_TYPE_ARRAY
233  * properties which are otherwise not an accessible type.
234  *
235  * Since: 1.12
236  */
237 gboolean
238 gst_util_set_object_array (GObject * object, const gchar * name,
239     const GValueArray * array)
240 {
241   GValue v1 = G_VALUE_INIT, v2 = G_VALUE_INIT;
242   gboolean ret = FALSE;
243
244   g_value_init (&v1, G_TYPE_VALUE_ARRAY);
245   g_value_init (&v2, GST_TYPE_ARRAY);
246
247   g_value_set_static_boxed (&v1, array);
248
249   if (g_value_transform (&v1, &v2)) {
250     g_object_set_property (object, name, &v2);
251     ret = TRUE;
252   }
253
254   g_value_unset (&v1);
255   g_value_unset (&v2);
256
257   return ret;
258 }
259
260 /**
261  * gst_util_get_object_array:
262  * @object: the object to set the array to
263  * @name: the name of the property to set
264  * @array: (out): a return #GValueArray
265  *
266  * Get a property of type %GST_TYPE_ARRAY and transform it into a
267  * #GValueArray. This allow language bindings to get GST_TYPE_ARRAY
268  * properties which are otherwise not an accessible type.
269  *
270  * Since: 1.12
271  */
272 gboolean
273 gst_util_get_object_array (GObject * object, const gchar * name,
274     GValueArray ** array)
275 {
276   GValue v1 = G_VALUE_INIT, v2 = G_VALUE_INIT;
277   gboolean ret = FALSE;
278
279   g_value_init (&v1, G_TYPE_VALUE_ARRAY);
280   g_value_init (&v2, GST_TYPE_ARRAY);
281
282   g_object_get_property (object, name, &v2);
283
284   if (g_value_transform (&v2, &v1)) {
285     *array = g_value_get_boxed (&v1);
286     ret = TRUE;
287   }
288
289   g_value_unset (&v2);
290
291   return ret;
292 }
293
294 /* work around error C2520: conversion from unsigned __int64 to double
295  * not implemented, use signed __int64
296  *
297  * These are implemented as functions because on some platforms a 64bit int to
298  * double conversion is not defined/implemented.
299  */
300
301 /**
302  * gst_util_guint64_to_gdouble:
303  * @value: The #guint64 value to convert to double
304  *
305  * Returns: @value casted to #gdouble
306  */
307 gdouble
308 gst_util_guint64_to_gdouble (guint64 value)
309 {
310   if (value & G_GINT64_CONSTANT (0x8000000000000000))
311     return (gdouble) ((gint64) value) + (gdouble) 18446744073709551616.;
312   else
313     return (gdouble) ((gint64) value);
314 }
315
316 /**
317  * gst_util_gdouble_to_guint64:
318  * @value: The #gdouble value to convert guint64 double
319  *
320  * Returns: @value casted to #guint64
321  */
322 guint64
323 gst_util_gdouble_to_guint64 (gdouble value)
324 {
325   if (value < (gdouble) 9223372036854775808.)   /* 1 << 63 */
326     return ((guint64) ((gint64) value));
327
328   value -= (gdouble) 18446744073709551616.;
329   return ((guint64) ((gint64) value));
330 }
331
332 #ifndef HAVE_UINT128_T
333 /* convenience struct for getting high and low uint32 parts of
334  * a guint64 */
335 typedef union
336 {
337   guint64 ll;
338   struct
339   {
340 #if G_BYTE_ORDER == G_BIG_ENDIAN
341     guint32 high, low;
342 #else
343     guint32 low, high;
344 #endif
345   } l;
346 } GstUInt64;
347
348 #if defined (__x86_64__) && defined (__GNUC__)
349 static inline void
350 gst_util_uint64_mul_uint64 (GstUInt64 * c1, GstUInt64 * c0, guint64 arg1,
351     guint64 arg2)
352 {
353   __asm__ __volatile__ ("mulq %3":"=a" (c0->ll), "=d" (c1->ll)
354       :"a" (arg1), "g" (arg2)
355       );
356 }
357 #else /* defined (__x86_64__) */
358 /* multiply two 64-bit unsigned ints into a 128-bit unsigned int.  the high
359  * and low 64 bits of the product are placed in c1 and c0 respectively.
360  * this operation cannot overflow. */
361 static inline void
362 gst_util_uint64_mul_uint64 (GstUInt64 * c1, GstUInt64 * c0, guint64 arg1,
363     guint64 arg2)
364 {
365   GstUInt64 a1, b0;
366   GstUInt64 v, n;
367
368   /* prepare input */
369   v.ll = arg1;
370   n.ll = arg2;
371
372   /* do 128 bits multiply
373    *                   nh   nl
374    *                *  vh   vl
375    *                ----------
376    * a0 =              vl * nl
377    * a1 =         vl * nh
378    * b0 =         vh * nl
379    * b1 =  + vh * nh
380    *       -------------------
381    *        c1h  c1l  c0h  c0l
382    *
383    * "a0" is optimized away, result is stored directly in c0.  "b1" is
384    * optimized away, result is stored directly in c1.
385    */
386   c0->ll = (guint64) v.l.low * n.l.low;
387   a1.ll = (guint64) v.l.low * n.l.high;
388   b0.ll = (guint64) v.l.high * n.l.low;
389
390   /* add the high word of a0 to the low words of a1 and b0 using c1 as
391    * scratch space to capture the carry.  the low word of the result becomes
392    * the final high word of c0 */
393   c1->ll = (guint64) c0->l.high + a1.l.low + b0.l.low;
394   c0->l.high = c1->l.low;
395
396   /* add the carry from the result above (found in the high word of c1) and
397    * the high words of a1 and b0 to b1, the result is c1. */
398   c1->ll = (guint64) v.l.high * n.l.high + c1->l.high + a1.l.high + b0.l.high;
399 }
400 #endif /* defined (__x86_64__) */
401
402 #if defined (__x86_64__) && defined (__GNUC__)
403 static inline guint64
404 gst_util_div128_64 (GstUInt64 c1, GstUInt64 c0, guint64 denom)
405 {
406   guint64 res;
407
408   __asm__ __volatile__ ("divq %3":"=a" (res)
409       :"d" (c1.ll), "a" (c0.ll), "g" (denom)
410       );
411
412   return res;
413 }
414 #else
415 /* count leading zeros */
416 static inline guint
417 gst_util_clz (guint32 val)
418 {
419   guint s;
420
421   s = val | (val >> 1);
422   s |= (s >> 2);
423   s |= (s >> 4);
424   s |= (s >> 8);
425   s = ~(s | (s >> 16));
426   s = s - ((s >> 1) & 0x55555555);
427   s = (s & 0x33333333) + ((s >> 2) & 0x33333333);
428   s = (s + (s >> 4)) & 0x0f0f0f0f;
429   s += (s >> 8);
430   s = (s + (s >> 16)) & 0x3f;
431
432   return s;
433 }
434
435 /* based on Hacker's Delight p152 */
436 static inline guint64
437 gst_util_div128_64 (GstUInt64 c1, GstUInt64 c0, guint64 denom)
438 {
439   GstUInt64 q1, q0, rhat;
440   GstUInt64 v, cmp1, cmp2;
441   guint s;
442
443   v.ll = denom;
444
445   /* count number of leading zeroes, we know they must be in the high
446    * part of denom since denom > G_MAXUINT32. */
447   s = gst_util_clz (v.l.high);
448
449   if (s > 0) {
450     /* normalize divisor and dividend */
451     v.ll <<= s;
452     c1.ll = (c1.ll << s) | (c0.l.high >> (32 - s));
453     c0.ll <<= s;
454   }
455
456   q1.ll = c1.ll / v.l.high;
457   rhat.ll = c1.ll - q1.ll * v.l.high;
458
459   cmp1.l.high = rhat.l.low;
460   cmp1.l.low = c0.l.high;
461   cmp2.ll = q1.ll * v.l.low;
462
463   while (q1.l.high || cmp2.ll > cmp1.ll) {
464     q1.ll--;
465     rhat.ll += v.l.high;
466     if (rhat.l.high)
467       break;
468     cmp1.l.high = rhat.l.low;
469     cmp2.ll -= v.l.low;
470   }
471   c1.l.high = c1.l.low;
472   c1.l.low = c0.l.high;
473   c1.ll -= q1.ll * v.ll;
474   q0.ll = c1.ll / v.l.high;
475   rhat.ll = c1.ll - q0.ll * v.l.high;
476
477   cmp1.l.high = rhat.l.low;
478   cmp1.l.low = c0.l.low;
479   cmp2.ll = q0.ll * v.l.low;
480
481   while (q0.l.high || cmp2.ll > cmp1.ll) {
482     q0.ll--;
483     rhat.ll += v.l.high;
484     if (rhat.l.high)
485       break;
486     cmp1.l.high = rhat.l.low;
487     cmp2.ll -= v.l.low;
488   }
489   q0.l.high += q1.l.low;
490
491   return q0.ll;
492 }
493 #endif /* defined (__GNUC__) */
494
495 /* This always gives the correct result because:
496  * a) val <= G_MAXUINT64-1
497  * b) (c0,c1) <= G_MAXUINT64 * (G_MAXUINT64-1)
498  *    or
499  *    (c0,c1) == G_MAXUINT64 * G_MAXUINT64 and denom < G_MAXUINT64
500  *    (note: num==denom case is handled by short path)
501  * This means that (c0,c1) either has enough space for val
502  * or that the overall result will overflow anyway.
503  */
504
505 /* add correction with carry */
506 #define CORRECT(c0,c1,val)                    \
507   if (val) {                                  \
508     if (G_MAXUINT64 - c0.ll < val) {          \
509       if (G_UNLIKELY (c1.ll == G_MAXUINT64))  \
510         /* overflow */                        \
511         return G_MAXUINT64;                   \
512       c1.ll++;                                \
513     }                                         \
514     c0.ll += val;                             \
515   }
516
517 static guint64
518 gst_util_uint64_scale_uint64_unchecked (guint64 val, guint64 num,
519     guint64 denom, guint64 correct)
520 {
521   GstUInt64 c1, c0;
522
523   /* compute 128-bit numerator product */
524   gst_util_uint64_mul_uint64 (&c1, &c0, val, num);
525
526   /* perform rounding correction */
527   CORRECT (c0, c1, correct);
528
529   /* high word as big as or bigger than denom --> overflow */
530   if (G_UNLIKELY (c1.ll >= denom))
531     return G_MAXUINT64;
532
533   /* compute quotient, fits in 64 bits */
534   return gst_util_div128_64 (c1, c0, denom);
535 }
536 #else
537
538 #define GST_MAXUINT128 ((__uint128_t) -1)
539 static guint64
540 gst_util_uint64_scale_uint64_unchecked (guint64 val, guint64 num,
541     guint64 denom, guint64 correct)
542 {
543   __uint128_t tmp;
544
545   /* Calculate val * num */
546   tmp = ((__uint128_t) val) * ((__uint128_t) num);
547
548   /* overflow checks */
549   if (G_UNLIKELY (GST_MAXUINT128 - correct < tmp))
550     return G_MAXUINT64;
551
552   /* perform rounding correction */
553   tmp += correct;
554
555   /* Divide by denom */
556   tmp /= denom;
557
558   /* if larger than G_MAXUINT64 --> overflow */
559   if (G_UNLIKELY (tmp > G_MAXUINT64))
560     return G_MAXUINT64;
561
562   /* compute quotient, fits in 64 bits */
563   return (guint64) tmp;
564 }
565
566 #endif
567
568 #if !defined (__x86_64__) && !defined (HAVE_UINT128_T)
569 static inline void
570 gst_util_uint64_mul_uint32 (GstUInt64 * c1, GstUInt64 * c0, guint64 arg1,
571     guint32 arg2)
572 {
573   GstUInt64 a;
574
575   a.ll = arg1;
576
577   c0->ll = (guint64) a.l.low * arg2;
578   c1->ll = (guint64) a.l.high * arg2 + c0->l.high;
579   c0->l.high = 0;
580 }
581
582 /* divide a 96-bit unsigned int by a 32-bit unsigned int when we know the
583  * quotient fits into 64 bits.  the high 64 bits and low 32 bits of the
584  * numerator are expected in c1 and c0 respectively. */
585 static inline guint64
586 gst_util_div96_32 (guint64 c1, guint64 c0, guint32 denom)
587 {
588   c0 += (c1 % denom) << 32;
589   return ((c1 / denom) << 32) + (c0 / denom);
590 }
591
592 static inline guint64
593 gst_util_uint64_scale_uint32_unchecked (guint64 val, guint32 num,
594     guint32 denom, guint32 correct)
595 {
596   GstUInt64 c1, c0;
597
598   /* compute 96-bit numerator product */
599   gst_util_uint64_mul_uint32 (&c1, &c0, val, num);
600
601   /* condition numerator based on rounding mode */
602   CORRECT (c0, c1, correct);
603
604   /* high 32 bits as big as or bigger than denom --> overflow */
605   if (G_UNLIKELY (c1.l.high >= denom))
606     return G_MAXUINT64;
607
608   /* compute quotient, fits in 64 bits */
609   return gst_util_div96_32 (c1.ll, c0.ll, denom);
610 }
611 #endif
612
613 /* the guts of the gst_util_uint64_scale() variants */
614 static guint64
615 _gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom,
616     guint64 correct)
617 {
618   g_return_val_if_fail (denom != 0, G_MAXUINT64);
619
620   if (G_UNLIKELY (num == 0))
621     return 0;
622
623   if (G_UNLIKELY (num == denom))
624     return val;
625
626   /* on 64bits we always use a full 128bits multiply/division */
627 #if !defined (__x86_64__) && !defined (HAVE_UINT128_T)
628   /* denom is low --> try to use 96 bit muldiv */
629   if (G_LIKELY (denom <= G_MAXUINT32)) {
630     /* num is low --> use 96 bit muldiv */
631     if (G_LIKELY (num <= G_MAXUINT32))
632       return gst_util_uint64_scale_uint32_unchecked (val, (guint32) num,
633           (guint32) denom, correct);
634
635     /* num is high but val is low --> swap and use 96-bit muldiv */
636     if (G_LIKELY (val <= G_MAXUINT32))
637       return gst_util_uint64_scale_uint32_unchecked (num, (guint32) val,
638           (guint32) denom, correct);
639   }
640 #endif /* !defined (__x86_64__) && !defined (HAVE_UINT128_T) */
641
642   /* val is high and num is high --> use 128-bit muldiv */
643   return gst_util_uint64_scale_uint64_unchecked (val, num, denom, correct);
644 }
645
646 /**
647  * gst_util_uint64_scale:
648  * @val: the number to scale
649  * @num: the numerator of the scale ratio
650  * @denom: the denominator of the scale ratio
651  *
652  * Scale @val by the rational number @num / @denom, avoiding overflows and
653  * underflows and without loss of precision.
654  *
655  * This function can potentially be very slow if val and num are both
656  * greater than G_MAXUINT32.
657  *
658  * Returns: @val * @num / @denom.  In the case of an overflow, this
659  * function returns G_MAXUINT64.  If the result is not exactly
660  * representable as an integer it is truncated.  See also
661  * gst_util_uint64_scale_round(), gst_util_uint64_scale_ceil(),
662  * gst_util_uint64_scale_int(), gst_util_uint64_scale_int_round(),
663  * gst_util_uint64_scale_int_ceil().
664  */
665 guint64
666 gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom)
667 {
668   return _gst_util_uint64_scale (val, num, denom, 0);
669 }
670
671 /**
672  * gst_util_uint64_scale_round:
673  * @val: the number to scale
674  * @num: the numerator of the scale ratio
675  * @denom: the denominator of the scale ratio
676  *
677  * Scale @val by the rational number @num / @denom, avoiding overflows and
678  * underflows and without loss of precision.
679  *
680  * This function can potentially be very slow if val and num are both
681  * greater than G_MAXUINT32.
682  *
683  * Returns: @val * @num / @denom.  In the case of an overflow, this
684  * function returns G_MAXUINT64.  If the result is not exactly
685  * representable as an integer, it is rounded to the nearest integer
686  * (half-way cases are rounded up).  See also gst_util_uint64_scale(),
687  * gst_util_uint64_scale_ceil(), gst_util_uint64_scale_int(),
688  * gst_util_uint64_scale_int_round(), gst_util_uint64_scale_int_ceil().
689  */
690 guint64
691 gst_util_uint64_scale_round (guint64 val, guint64 num, guint64 denom)
692 {
693   return _gst_util_uint64_scale (val, num, denom, denom >> 1);
694 }
695
696 /**
697  * gst_util_uint64_scale_ceil:
698  * @val: the number to scale
699  * @num: the numerator of the scale ratio
700  * @denom: the denominator of the scale ratio
701  *
702  * Scale @val by the rational number @num / @denom, avoiding overflows and
703  * underflows and without loss of precision.
704  *
705  * This function can potentially be very slow if val and num are both
706  * greater than G_MAXUINT32.
707  *
708  * Returns: @val * @num / @denom.  In the case of an overflow, this
709  * function returns G_MAXUINT64.  If the result is not exactly
710  * representable as an integer, it is rounded up.  See also
711  * gst_util_uint64_scale(), gst_util_uint64_scale_round(),
712  * gst_util_uint64_scale_int(), gst_util_uint64_scale_int_round(),
713  * gst_util_uint64_scale_int_ceil().
714  */
715 guint64
716 gst_util_uint64_scale_ceil (guint64 val, guint64 num, guint64 denom)
717 {
718   return _gst_util_uint64_scale (val, num, denom, denom - 1);
719 }
720
721 /* the guts of the gst_util_uint64_scale_int() variants */
722 static guint64
723 _gst_util_uint64_scale_int (guint64 val, gint num, gint denom, gint correct)
724 {
725   g_return_val_if_fail (denom > 0, G_MAXUINT64);
726   g_return_val_if_fail (num >= 0, G_MAXUINT64);
727
728   if (G_UNLIKELY (num == 0))
729     return 0;
730
731   if (G_UNLIKELY (num == denom))
732     return val;
733
734   if (val <= G_MAXUINT32) {
735     /* simple case.  num and denom are not negative so casts are OK.  when
736      * not truncating, the additions to the numerator cannot overflow
737      * because val*num <= G_MAXUINT32 * G_MAXINT32 < G_MAXUINT64 -
738      * G_MAXINT32, so there's room to add another gint32. */
739     val *= (guint64) num;
740     /* add rounding correction */
741     val += correct;
742
743     return val / (guint64) denom;
744   }
745 #if !defined (__x86_64__) && !defined (HAVE_UINT128_T)
746   /* num and denom are not negative so casts are OK */
747   return gst_util_uint64_scale_uint32_unchecked (val, (guint32) num,
748       (guint32) denom, (guint32) correct);
749 #else
750   /* always use full 128bits scale */
751   return gst_util_uint64_scale_uint64_unchecked (val, num, denom, correct);
752 #endif
753 }
754
755 /**
756  * gst_util_uint64_scale_int:
757  * @val: guint64 (such as a #GstClockTime) to scale.
758  * @num: numerator of the scale factor.
759  * @denom: denominator of the scale factor.
760  *
761  * Scale @val by the rational number @num / @denom, avoiding overflows and
762  * underflows and without loss of precision.  @num must be non-negative and
763  * @denom must be positive.
764  *
765  * Returns: @val * @num / @denom.  In the case of an overflow, this
766  * function returns G_MAXUINT64.  If the result is not exactly
767  * representable as an integer, it is truncated.  See also
768  * gst_util_uint64_scale_int_round(), gst_util_uint64_scale_int_ceil(),
769  * gst_util_uint64_scale(), gst_util_uint64_scale_round(),
770  * gst_util_uint64_scale_ceil().
771  */
772 guint64
773 gst_util_uint64_scale_int (guint64 val, gint num, gint denom)
774 {
775   return _gst_util_uint64_scale_int (val, num, denom, 0);
776 }
777
778 /**
779  * gst_util_uint64_scale_int_round:
780  * @val: guint64 (such as a #GstClockTime) to scale.
781  * @num: numerator of the scale factor.
782  * @denom: denominator of the scale factor.
783  *
784  * Scale @val by the rational number @num / @denom, avoiding overflows and
785  * underflows and without loss of precision.  @num must be non-negative and
786  * @denom must be positive.
787  *
788  * Returns: @val * @num / @denom.  In the case of an overflow, this
789  * function returns G_MAXUINT64.  If the result is not exactly
790  * representable as an integer, it is rounded to the nearest integer
791  * (half-way cases are rounded up).  See also gst_util_uint64_scale_int(),
792  * gst_util_uint64_scale_int_ceil(), gst_util_uint64_scale(),
793  * gst_util_uint64_scale_round(), gst_util_uint64_scale_ceil().
794  */
795 guint64
796 gst_util_uint64_scale_int_round (guint64 val, gint num, gint denom)
797 {
798   /* we can use a shift to divide by 2 because denom is required to be
799    * positive. */
800   return _gst_util_uint64_scale_int (val, num, denom, denom >> 1);
801 }
802
803 /**
804  * gst_util_uint64_scale_int_ceil:
805  * @val: guint64 (such as a #GstClockTime) to scale.
806  * @num: numerator of the scale factor.
807  * @denom: denominator of the scale factor.
808  *
809  * Scale @val by the rational number @num / @denom, avoiding overflows and
810  * underflows and without loss of precision.  @num must be non-negative and
811  * @denom must be positive.
812  *
813  * Returns: @val * @num / @denom.  In the case of an overflow, this
814  * function returns G_MAXUINT64.  If the result is not exactly
815  * representable as an integer, it is rounded up.  See also
816  * gst_util_uint64_scale_int(), gst_util_uint64_scale_int_round(),
817  * gst_util_uint64_scale(), gst_util_uint64_scale_round(),
818  * gst_util_uint64_scale_ceil().
819  */
820 guint64
821 gst_util_uint64_scale_int_ceil (guint64 val, gint num, gint denom)
822 {
823   return _gst_util_uint64_scale_int (val, num, denom, denom - 1);
824 }
825
826 /**
827  * gst_util_seqnum_next:
828  *
829  * Return a constantly incrementing sequence number.
830  *
831  * This function is used internally to GStreamer to be able to determine which
832  * events and messages are "the same". For example, elements may set the seqnum
833  * on a segment-done message to be the same as that of the last seek event, to
834  * indicate that event and the message correspond to the same segment.
835  *
836  * This function never returns %GST_SEQNUM_INVALID (which is 0).
837  *
838  * Returns: A constantly incrementing 32-bit unsigned integer, which might
839  * overflow at some point. Use gst_util_seqnum_compare() to make sure
840  * you handle wraparound correctly.
841  */
842 guint32
843 gst_util_seqnum_next (void)
844 {
845   static gint counter = 1;
846   gint ret = g_atomic_int_add (&counter, 1);
847
848   /* Make sure we don't return 0 */
849   if (G_UNLIKELY (ret == GST_SEQNUM_INVALID))
850     ret = g_atomic_int_add (&counter, 1);
851
852   return ret;
853 }
854
855 /**
856  * gst_util_seqnum_compare:
857  * @s1: A sequence number.
858  * @s2: Another sequence number.
859  *
860  * Compare two sequence numbers, handling wraparound.
861  *
862  * The current implementation just returns (gint32)(@s1 - @s2).
863  *
864  * Returns: A negative number if @s1 is before @s2, 0 if they are equal, or a
865  * positive number if @s1 is after @s2.
866  */
867 gint32
868 gst_util_seqnum_compare (guint32 s1, guint32 s2)
869 {
870   return (gint32) (s1 - s2);
871 }
872
873 /* -----------------------------------------------------
874  *
875  *  The following code will be moved out of the main
876  * gstreamer library someday.
877  */
878
879 #include "gstpad.h"
880
881 /**
882  * gst_element_create_all_pads:
883  * @element: (transfer none): a #GstElement to create pads for
884  *
885  * Creates a pad for each pad template that is always available.
886  * This function is only useful during object initialization of
887  * subclasses of #GstElement.
888  */
889 void
890 gst_element_create_all_pads (GstElement * element)
891 {
892   GList *padlist;
893
894   /* FIXME: lock element */
895
896   padlist =
897       gst_element_class_get_pad_template_list (GST_ELEMENT_CLASS
898       (G_OBJECT_GET_CLASS (element)));
899
900   while (padlist) {
901     GstPadTemplate *padtempl = (GstPadTemplate *) padlist->data;
902
903     if (padtempl->presence == GST_PAD_ALWAYS) {
904       GstPad *pad;
905
906       pad = gst_pad_new_from_template (padtempl, padtempl->name_template);
907
908       gst_element_add_pad (element, pad);
909     }
910     padlist = padlist->next;
911   }
912 }
913
914 /**
915  * gst_element_get_compatible_pad_template:
916  * @element: (transfer none): a #GstElement to get a compatible pad template for
917  * @compattempl: (transfer none): the #GstPadTemplate to find a compatible
918  *     template for
919  *
920  * Retrieves a pad template from @element that is compatible with @compattempl.
921  * Pads from compatible templates can be linked together.
922  *
923  * Returns: (transfer none) (nullable): a compatible #GstPadTemplate,
924  *   or %NULL if none was found. No unreferencing is necessary.
925  */
926 GstPadTemplate *
927 gst_element_get_compatible_pad_template (GstElement * element,
928     GstPadTemplate * compattempl)
929 {
930   GstPadTemplate *newtempl = NULL;
931   GList *padlist;
932   GstElementClass *class;
933   gboolean compatible;
934
935   g_return_val_if_fail (element != NULL, NULL);
936   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
937   g_return_val_if_fail (compattempl != NULL, NULL);
938
939   class = GST_ELEMENT_GET_CLASS (element);
940
941   padlist = gst_element_class_get_pad_template_list (class);
942
943   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
944       "Looking for a suitable pad template in %s out of %d templates...",
945       GST_ELEMENT_NAME (element), g_list_length (padlist));
946
947   while (padlist) {
948     GstPadTemplate *padtempl = (GstPadTemplate *) padlist->data;
949
950     /* Ignore name
951      * Ignore presence
952      * Check direction (must be opposite)
953      * Check caps
954      */
955     GST_CAT_LOG (GST_CAT_CAPS,
956         "checking pad template %s", padtempl->name_template);
957     if (padtempl->direction != compattempl->direction) {
958       GST_CAT_DEBUG (GST_CAT_CAPS,
959           "compatible direction: found %s pad template \"%s\"",
960           padtempl->direction == GST_PAD_SRC ? "src" : "sink",
961           padtempl->name_template);
962
963       GST_CAT_DEBUG (GST_CAT_CAPS,
964           "intersecting %" GST_PTR_FORMAT, GST_PAD_TEMPLATE_CAPS (compattempl));
965       GST_CAT_DEBUG (GST_CAT_CAPS,
966           "..and %" GST_PTR_FORMAT, GST_PAD_TEMPLATE_CAPS (padtempl));
967
968       compatible = gst_caps_can_intersect (GST_PAD_TEMPLATE_CAPS (compattempl),
969           GST_PAD_TEMPLATE_CAPS (padtempl));
970
971       GST_CAT_DEBUG (GST_CAT_CAPS, "caps are %scompatible",
972           (compatible ? "" : "not "));
973
974       if (compatible) {
975         newtempl = padtempl;
976         break;
977       }
978     }
979
980     padlist = g_list_next (padlist);
981   }
982   if (newtempl)
983     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
984         "Returning new pad template %p", newtempl);
985   else
986     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "No compatible pad template found");
987
988   return newtempl;
989 }
990
991 /**
992  * gst_element_get_pad_from_template:
993  * @element: (transfer none): a #GstElement.
994  * @templ: (transfer none): a #GstPadTemplate belonging to @element.
995  *
996  * Gets a pad from @element described by @templ. If the presence of @templ is
997  * #GST_PAD_REQUEST, requests a new pad. Can return %NULL for #GST_PAD_SOMETIMES
998  * templates.
999  *
1000  * Returns: (transfer full) (nullable): the #GstPad, or %NULL if one
1001  *   could not be found or created.
1002  */
1003 static GstPad *
1004 gst_element_get_pad_from_template (GstElement * element, GstPadTemplate * templ)
1005 {
1006   GstPad *ret = NULL;
1007   GstPadPresence presence;
1008
1009   /* If this function is ever exported, we need check the validity of `element'
1010    * and `templ', and to make sure the template actually belongs to the
1011    * element. */
1012
1013   presence = GST_PAD_TEMPLATE_PRESENCE (templ);
1014
1015   switch (presence) {
1016     case GST_PAD_ALWAYS:
1017     case GST_PAD_SOMETIMES:
1018       ret = gst_element_get_static_pad (element, templ->name_template);
1019       if (!ret && presence == GST_PAD_ALWAYS)
1020         g_warning
1021             ("Element %s has an ALWAYS template %s, but no pad of the same name",
1022             GST_OBJECT_NAME (element), templ->name_template);
1023       break;
1024
1025     case GST_PAD_REQUEST:
1026       ret = gst_element_request_pad (element, templ, NULL, NULL);
1027       break;
1028   }
1029
1030   return ret;
1031 }
1032
1033 /*
1034  * gst_element_request_compatible_pad:
1035  * @element: a #GstElement.
1036  * @templ: the #GstPadTemplate to which the new pad should be able to link.
1037  *
1038  * Requests a pad from @element. The returned pad should be unlinked and
1039  * compatible with @templ. Might return an existing pad, or request a new one.
1040  *
1041  * Returns: (nullable): a #GstPad, or %NULL if one could not be found
1042  *   or created.
1043  */
1044 static GstPad *
1045 gst_element_request_compatible_pad (GstElement * element,
1046     GstPadTemplate * templ)
1047 {
1048   GstPadTemplate *templ_new;
1049   GstPad *pad = NULL;
1050
1051   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1052   g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
1053
1054   /* FIXME: should really loop through the templates, testing each for
1055    *      compatibility and pad availability. */
1056   templ_new = gst_element_get_compatible_pad_template (element, templ);
1057   if (templ_new)
1058     pad = gst_element_get_pad_from_template (element, templ_new);
1059   /* This can happen for non-request pads. */
1060   if (pad && GST_PAD_PEER (pad)) {
1061     gst_object_unref (pad);
1062     pad = NULL;
1063   }
1064
1065   return pad;
1066 }
1067
1068 /*
1069  * Checks if the source pad and the sink pad can be linked.
1070  * Both @srcpad and @sinkpad must be unlinked and have a parent.
1071  */
1072 static gboolean
1073 gst_pad_check_link (GstPad * srcpad, GstPad * sinkpad)
1074 {
1075   /* generic checks */
1076   g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
1077   g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
1078
1079   GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
1080       GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
1081
1082   if (GST_PAD_PEER (srcpad) != NULL) {
1083     GST_CAT_INFO (GST_CAT_PADS, "Source pad %s:%s has a peer, failed",
1084         GST_DEBUG_PAD_NAME (srcpad));
1085     return FALSE;
1086   }
1087   if (GST_PAD_PEER (sinkpad) != NULL) {
1088     GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s has a peer, failed",
1089         GST_DEBUG_PAD_NAME (sinkpad));
1090     return FALSE;
1091   }
1092   if (!GST_PAD_IS_SRC (srcpad)) {
1093     GST_CAT_INFO (GST_CAT_PADS, "Src pad %s:%s is not source pad, failed",
1094         GST_DEBUG_PAD_NAME (srcpad));
1095     return FALSE;
1096   }
1097   if (!GST_PAD_IS_SINK (sinkpad)) {
1098     GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s is not sink pad, failed",
1099         GST_DEBUG_PAD_NAME (sinkpad));
1100     return FALSE;
1101   }
1102   if (GST_PAD_PARENT (srcpad) == NULL) {
1103     GST_CAT_INFO (GST_CAT_PADS, "Src pad %s:%s has no parent, failed",
1104         GST_DEBUG_PAD_NAME (srcpad));
1105     return FALSE;
1106   }
1107   if (GST_PAD_PARENT (sinkpad) == NULL) {
1108     GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s has no parent, failed",
1109         GST_DEBUG_PAD_NAME (srcpad));
1110     return FALSE;
1111   }
1112
1113   return TRUE;
1114 }
1115
1116 /**
1117  * gst_element_get_compatible_pad:
1118  * @element: (transfer none): a #GstElement in which the pad should be found.
1119  * @pad: (transfer none): the #GstPad to find a compatible one for.
1120  * @caps: (nullable): the #GstCaps to use as a filter.
1121  *
1122  * Looks for an unlinked pad to which the given pad can link. It is not
1123  * guaranteed that linking the pads will work, though it should work in most
1124  * cases.
1125  *
1126  * This function will first attempt to find a compatible unlinked ALWAYS pad,
1127  * and if none can be found, it will request a compatible REQUEST pad by looking
1128  * at the templates of @element.
1129  *
1130  * Returns: (transfer full) (nullable): the #GstPad to which a link
1131  *   can be made, or %NULL if one cannot be found. gst_object_unref()
1132  *   after usage.
1133  */
1134 GstPad *
1135 gst_element_get_compatible_pad (GstElement * element, GstPad * pad,
1136     GstCaps * caps)
1137 {
1138   GstIterator *pads;
1139   GstPadTemplate *templ;
1140   GstCaps *templcaps;
1141   GstPad *foundpad = NULL;
1142   gboolean done;
1143   GValue padptr = { 0, };
1144
1145   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
1146   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
1147
1148   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1149       "finding pad in %s compatible with %s:%s",
1150       GST_ELEMENT_NAME (element), GST_DEBUG_PAD_NAME (pad));
1151
1152   g_return_val_if_fail (GST_PAD_PEER (pad) == NULL, NULL);
1153
1154   done = FALSE;
1155
1156   /* try to get an existing unlinked pad */
1157   if (GST_PAD_IS_SRC (pad)) {
1158     pads = gst_element_iterate_sink_pads (element);
1159   } else if (GST_PAD_IS_SINK (pad)) {
1160     pads = gst_element_iterate_src_pads (element);
1161   } else {
1162     pads = gst_element_iterate_pads (element);
1163   }
1164
1165   while (!done) {
1166     switch (gst_iterator_next (pads, &padptr)) {
1167       case GST_ITERATOR_OK:
1168       {
1169         GstPad *peer;
1170         GstPad *current;
1171         GstPad *srcpad;
1172         GstPad *sinkpad;
1173
1174         current = g_value_get_object (&padptr);
1175
1176         GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
1177             GST_DEBUG_PAD_NAME (current));
1178
1179         if (GST_PAD_IS_SRC (current)) {
1180           srcpad = current;
1181           sinkpad = pad;
1182         } else {
1183           srcpad = pad;
1184           sinkpad = current;
1185         }
1186         peer = gst_pad_get_peer (current);
1187
1188         if (peer == NULL && gst_pad_check_link (srcpad, sinkpad)) {
1189           GstCaps *temp, *intersection;
1190           gboolean compatible;
1191
1192           /* Now check if the two pads' caps are compatible */
1193           temp = gst_pad_query_caps (pad, NULL);
1194           if (caps) {
1195             intersection = gst_caps_intersect (temp, caps);
1196             gst_caps_unref (temp);
1197           } else {
1198             intersection = temp;
1199           }
1200
1201           temp = gst_pad_query_caps (current, NULL);
1202           compatible = gst_caps_can_intersect (temp, intersection);
1203           gst_caps_unref (temp);
1204           gst_caps_unref (intersection);
1205
1206           if (compatible) {
1207             GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1208                 "found existing unlinked compatible pad %s:%s",
1209                 GST_DEBUG_PAD_NAME (current));
1210             gst_iterator_free (pads);
1211
1212             current = gst_object_ref (current);
1213             g_value_unset (&padptr);
1214
1215             return current;
1216           } else {
1217             GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "incompatible pads");
1218           }
1219         } else {
1220           GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1221               "already linked or cannot be linked (peer = %p)", peer);
1222         }
1223         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "unreffing pads");
1224
1225         g_value_reset (&padptr);
1226         if (peer)
1227           gst_object_unref (peer);
1228         break;
1229       }
1230       case GST_ITERATOR_DONE:
1231         done = TRUE;
1232         break;
1233       case GST_ITERATOR_RESYNC:
1234         gst_iterator_resync (pads);
1235         break;
1236       case GST_ITERATOR_ERROR:
1237         g_assert_not_reached ();
1238         break;
1239     }
1240   }
1241   g_value_unset (&padptr);
1242   gst_iterator_free (pads);
1243
1244   GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
1245       "Could not find a compatible unlinked always pad to link to %s:%s, now checking request pads",
1246       GST_DEBUG_PAD_NAME (pad));
1247
1248   /* try to create a new one */
1249   /* requesting is a little crazy, we need a template. Let's create one */
1250   templcaps = gst_pad_query_caps (pad, NULL);
1251   if (caps) {
1252     GstCaps *inter = gst_caps_intersect (templcaps, caps);
1253
1254     gst_caps_unref (templcaps);
1255     templcaps = inter;
1256   }
1257   templ = gst_pad_template_new ((gchar *) GST_PAD_NAME (pad),
1258       GST_PAD_DIRECTION (pad), GST_PAD_ALWAYS, templcaps);
1259   gst_caps_unref (templcaps);
1260
1261   foundpad = gst_element_request_compatible_pad (element, templ);
1262   gst_object_unref (templ);
1263
1264   if (foundpad) {
1265     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1266         "found existing request pad %s:%s", GST_DEBUG_PAD_NAME (foundpad));
1267     return foundpad;
1268   }
1269
1270   GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element,
1271       "Could not find a compatible pad to link to %s:%s",
1272       GST_DEBUG_PAD_NAME (pad));
1273   return NULL;
1274 }
1275
1276 /**
1277  * gst_element_state_get_name:
1278  * @state: a #GstState to get the name of.
1279  *
1280  * Gets a string representing the given state.
1281  *
1282  * Returns: (transfer none): a string with the name of the state.
1283  */
1284 const gchar *
1285 gst_element_state_get_name (GstState state)
1286 {
1287   switch (state) {
1288     case GST_STATE_VOID_PENDING:
1289       return "VOID_PENDING";
1290     case GST_STATE_NULL:
1291       return "NULL";
1292     case GST_STATE_READY:
1293       return "READY";
1294     case GST_STATE_PLAYING:
1295       return "PLAYING";
1296     case GST_STATE_PAUSED:
1297       return "PAUSED";
1298     default:
1299       /* This is a memory leak */
1300       return g_strdup_printf ("UNKNOWN!(%d)", state);
1301   }
1302 }
1303
1304 /**
1305  * gst_element_state_change_return_get_name:
1306  * @state_ret: a #GstStateChangeReturn to get the name of.
1307  *
1308  * Gets a string representing the given state change result.
1309  *
1310  * Returns: (transfer none): a string with the name of the state
1311  *    result.
1312  */
1313 const gchar *
1314 gst_element_state_change_return_get_name (GstStateChangeReturn state_ret)
1315 {
1316   switch (state_ret) {
1317     case GST_STATE_CHANGE_FAILURE:
1318       return "FAILURE";
1319     case GST_STATE_CHANGE_SUCCESS:
1320       return "SUCCESS";
1321     case GST_STATE_CHANGE_ASYNC:
1322       return "ASYNC";
1323     case GST_STATE_CHANGE_NO_PREROLL:
1324       return "NO PREROLL";
1325     default:
1326       /* This is a memory leak */
1327       return g_strdup_printf ("UNKNOWN!(%d)", state_ret);
1328   }
1329 }
1330
1331 /**
1332  * gst_state_change_get_name:
1333  * @transition: a #GstStateChange to get the name of.
1334  *
1335  * Gets a string representing the given state transition.
1336  *
1337  * Returns: (transfer none): a string with the name of the state
1338  *    result.
1339  *
1340  * Since: 1.14
1341  */
1342 const gchar *
1343 gst_state_change_get_name (GstStateChange transition)
1344 {
1345   switch (transition) {
1346     case GST_STATE_CHANGE_NULL_TO_READY:
1347       return "NULL->READY";
1348     case GST_STATE_CHANGE_READY_TO_PAUSED:
1349       return "READY->PAUSED";
1350     case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
1351       return "PAUSED->PLAYING";
1352     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
1353       return "PLAYING->PAUSED";
1354     case GST_STATE_CHANGE_PAUSED_TO_READY:
1355       return "PAUSED->READY";
1356     case GST_STATE_CHANGE_READY_TO_NULL:
1357       return "READY->NULL";
1358     case GST_STATE_CHANGE_NULL_TO_NULL:
1359       return "NULL->NULL";
1360     case GST_STATE_CHANGE_READY_TO_READY:
1361       return "READY->READY";
1362     case GST_STATE_CHANGE_PAUSED_TO_PAUSED:
1363       return "PAUSED->PAUSED";
1364     case GST_STATE_CHANGE_PLAYING_TO_PLAYING:
1365       return "PLAYING->PLAYING";
1366   }
1367
1368   return "Unknown state return";
1369 }
1370
1371
1372 static gboolean
1373 gst_element_factory_can_accept_all_caps_in_direction (GstElementFactory *
1374     factory, const GstCaps * caps, GstPadDirection direction)
1375 {
1376   GList *templates;
1377
1378   g_return_val_if_fail (factory != NULL, FALSE);
1379   g_return_val_if_fail (caps != NULL, FALSE);
1380
1381   templates = factory->staticpadtemplates;
1382
1383   while (templates) {
1384     GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data;
1385
1386     if (template->direction == direction) {
1387       GstCaps *templcaps = gst_static_caps_get (&template->static_caps);
1388
1389       if (gst_caps_is_always_compatible (caps, templcaps)) {
1390         gst_caps_unref (templcaps);
1391         return TRUE;
1392       }
1393       gst_caps_unref (templcaps);
1394     }
1395     templates = g_list_next (templates);
1396   }
1397
1398   return FALSE;
1399 }
1400
1401 static gboolean
1402 gst_element_factory_can_accept_any_caps_in_direction (GstElementFactory *
1403     factory, const GstCaps * caps, GstPadDirection direction)
1404 {
1405   GList *templates;
1406
1407   g_return_val_if_fail (factory != NULL, FALSE);
1408   g_return_val_if_fail (caps != NULL, FALSE);
1409
1410   templates = factory->staticpadtemplates;
1411
1412   while (templates) {
1413     GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data;
1414
1415     if (template->direction == direction) {
1416       GstCaps *templcaps = gst_static_caps_get (&template->static_caps);
1417
1418       if (gst_caps_can_intersect (caps, templcaps)) {
1419         gst_caps_unref (templcaps);
1420         return TRUE;
1421       }
1422       gst_caps_unref (templcaps);
1423     }
1424     templates = g_list_next (templates);
1425   }
1426
1427   return FALSE;
1428 }
1429
1430 /**
1431  * gst_element_factory_can_sink_all_caps:
1432  * @factory: factory to query
1433  * @caps: the caps to check
1434  *
1435  * Checks if the factory can sink all possible capabilities.
1436  *
1437  * Returns: %TRUE if the caps are fully compatible.
1438  */
1439 gboolean
1440 gst_element_factory_can_sink_all_caps (GstElementFactory * factory,
1441     const GstCaps * caps)
1442 {
1443   return gst_element_factory_can_accept_all_caps_in_direction (factory, caps,
1444       GST_PAD_SINK);
1445 }
1446
1447 /**
1448  * gst_element_factory_can_src_all_caps:
1449  * @factory: factory to query
1450  * @caps: the caps to check
1451  *
1452  * Checks if the factory can src all possible capabilities.
1453  *
1454  * Returns: %TRUE if the caps are fully compatible.
1455  */
1456 gboolean
1457 gst_element_factory_can_src_all_caps (GstElementFactory * factory,
1458     const GstCaps * caps)
1459 {
1460   return gst_element_factory_can_accept_all_caps_in_direction (factory, caps,
1461       GST_PAD_SRC);
1462 }
1463
1464 /**
1465  * gst_element_factory_can_sink_any_caps:
1466  * @factory: factory to query
1467  * @caps: the caps to check
1468  *
1469  * Checks if the factory can sink any possible capability.
1470  *
1471  * Returns: %TRUE if the caps have a common subset.
1472  */
1473 gboolean
1474 gst_element_factory_can_sink_any_caps (GstElementFactory * factory,
1475     const GstCaps * caps)
1476 {
1477   return gst_element_factory_can_accept_any_caps_in_direction (factory, caps,
1478       GST_PAD_SINK);
1479 }
1480
1481 /**
1482  * gst_element_factory_can_src_any_caps:
1483  * @factory: factory to query
1484  * @caps: the caps to check
1485  *
1486  * Checks if the factory can src any possible capability.
1487  *
1488  * Returns: %TRUE if the caps have a common subset.
1489  */
1490 gboolean
1491 gst_element_factory_can_src_any_caps (GstElementFactory * factory,
1492     const GstCaps * caps)
1493 {
1494   return gst_element_factory_can_accept_any_caps_in_direction (factory, caps,
1495       GST_PAD_SRC);
1496 }
1497
1498 /* if return val is true, *direct_child is a caller-owned ref on the direct
1499  * child of ancestor that is part of object's ancestry */
1500 static gboolean
1501 object_has_ancestor (GstObject * object, GstObject * ancestor,
1502     GstObject ** direct_child)
1503 {
1504   GstObject *child, *parent;
1505
1506   if (direct_child)
1507     *direct_child = NULL;
1508
1509   child = gst_object_ref (object);
1510   parent = gst_object_get_parent (object);
1511
1512   while (parent) {
1513     if (ancestor == parent) {
1514       if (direct_child)
1515         *direct_child = child;
1516       else
1517         gst_object_unref (child);
1518       gst_object_unref (parent);
1519       return TRUE;
1520     }
1521
1522     gst_object_unref (child);
1523     child = parent;
1524     parent = gst_object_get_parent (parent);
1525   }
1526
1527   gst_object_unref (child);
1528
1529   return FALSE;
1530 }
1531
1532 /* caller owns return */
1533 static GstObject *
1534 find_common_root (GstObject * o1, GstObject * o2)
1535 {
1536   GstObject *top = o1;
1537   GstObject *kid1, *kid2;
1538   GstObject *root = NULL;
1539
1540   while (GST_OBJECT_PARENT (top))
1541     top = GST_OBJECT_PARENT (top);
1542
1543   /* the itsy-bitsy spider... */
1544
1545   if (!object_has_ancestor (o2, top, &kid2))
1546     return NULL;
1547
1548   root = gst_object_ref (top);
1549   while (TRUE) {
1550     if (!object_has_ancestor (o1, kid2, &kid1)) {
1551       gst_object_unref (kid2);
1552       return root;
1553     }
1554     gst_object_unref (root);
1555     root = kid2;
1556     if (!object_has_ancestor (o2, kid1, &kid2)) {
1557       gst_object_unref (kid1);
1558       return root;
1559     }
1560     gst_object_unref (root);
1561     root = kid1;
1562   }
1563 }
1564
1565 /* caller does not own return */
1566 static GstPad *
1567 ghost_up (GstElement * e, GstPad * pad)
1568 {
1569   static gint ghost_pad_index = 0;
1570   GstPad *gpad;
1571   gchar *name;
1572   GstState current;
1573   GstState next;
1574   GstObject *parent = GST_OBJECT_PARENT (e);
1575
1576   name = g_strdup_printf ("ghost%d", ghost_pad_index++);
1577   gpad = gst_ghost_pad_new (name, pad);
1578   g_free (name);
1579
1580   GST_STATE_LOCK (parent);
1581   gst_element_get_state (GST_ELEMENT (parent), &current, &next, 0);
1582
1583   if (current > GST_STATE_READY || next >= GST_STATE_PAUSED)
1584     gst_pad_set_active (gpad, TRUE);
1585
1586   if (!gst_element_add_pad ((GstElement *) parent, gpad)) {
1587     g_warning ("Pad named %s already exists in element %s\n",
1588         GST_OBJECT_NAME (gpad), GST_OBJECT_NAME (parent));
1589     GST_STATE_UNLOCK (parent);
1590     return NULL;
1591   }
1592   GST_STATE_UNLOCK (parent);
1593
1594   return gpad;
1595 }
1596
1597 static void
1598 remove_pad (gpointer ppad, gpointer unused)
1599 {
1600   GstPad *pad = ppad;
1601
1602   if (!gst_element_remove_pad ((GstElement *) GST_OBJECT_PARENT (pad), pad))
1603     g_warning ("Couldn't remove pad %s from element %s",
1604         GST_OBJECT_NAME (pad), GST_OBJECT_NAME (GST_OBJECT_PARENT (pad)));
1605 }
1606
1607 static gboolean
1608 prepare_link_maybe_ghosting (GstPad ** src, GstPad ** sink,
1609     GSList ** pads_created)
1610 {
1611   GstObject *root;
1612   GstObject *e1, *e2;
1613   GSList *pads_created_local = NULL;
1614
1615   g_assert (pads_created);
1616
1617   e1 = GST_OBJECT_PARENT (*src);
1618   e2 = GST_OBJECT_PARENT (*sink);
1619
1620   if (G_UNLIKELY (e1 == NULL)) {
1621     GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
1622         GST_PTR_FORMAT, *src);
1623     return FALSE;
1624   }
1625   if (G_UNLIKELY (e2 == NULL)) {
1626     GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
1627         GST_PTR_FORMAT, *sink);
1628     return FALSE;
1629   }
1630
1631   if (GST_OBJECT_PARENT (e1) == GST_OBJECT_PARENT (e2)) {
1632     GST_CAT_INFO (GST_CAT_PADS, "%s and %s in same bin, no need for ghost pads",
1633         GST_OBJECT_NAME (e1), GST_OBJECT_NAME (e2));
1634     return TRUE;
1635   }
1636
1637   GST_CAT_INFO (GST_CAT_PADS, "%s and %s not in same bin, making ghost pads",
1638       GST_OBJECT_NAME (e1), GST_OBJECT_NAME (e2));
1639
1640   /* we need to setup some ghost pads */
1641   root = find_common_root (e1, e2);
1642   if (!root) {
1643     if (GST_OBJECT_PARENT (e1) == NULL)
1644       g_warning ("Trying to link elements %s and %s that don't share a common "
1645           "ancestor: %s hasn't been added to a bin or pipeline, but %s is in %s",
1646           GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (e2),
1647           GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (e2),
1648           GST_ELEMENT_NAME (GST_OBJECT_PARENT (e2)));
1649     else if (GST_OBJECT_PARENT (e2) == NULL)
1650       g_warning ("Trying to link elements %s and %s that don't share a common "
1651           "ancestor: %s hasn't been added to a bin or pipeline, and %s is in %s",
1652           GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (e2),
1653           GST_ELEMENT_NAME (e2), GST_ELEMENT_NAME (e1),
1654           GST_ELEMENT_NAME (GST_OBJECT_PARENT (e1)));
1655     else
1656       g_warning ("Trying to link elements %s and %s that don't share a common "
1657           "ancestor: %s is in %s, and %s is in %s",
1658           GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (e2),
1659           GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (GST_OBJECT_PARENT (e1)),
1660           GST_ELEMENT_NAME (e2), GST_ELEMENT_NAME (GST_OBJECT_PARENT (e2)));
1661     return FALSE;
1662   }
1663
1664   while (GST_OBJECT_PARENT (e1) != root) {
1665     *src = ghost_up ((GstElement *) e1, *src);
1666     if (!*src)
1667       goto cleanup_fail;
1668     e1 = GST_OBJECT_PARENT (*src);
1669     pads_created_local = g_slist_prepend (pads_created_local, *src);
1670   }
1671   while (GST_OBJECT_PARENT (e2) != root) {
1672     *sink = ghost_up ((GstElement *) e2, *sink);
1673     if (!*sink)
1674       goto cleanup_fail;
1675     e2 = GST_OBJECT_PARENT (*sink);
1676     pads_created_local = g_slist_prepend (pads_created_local, *sink);
1677   }
1678
1679   gst_object_unref (root);
1680   *pads_created = g_slist_concat (*pads_created, pads_created_local);
1681   return TRUE;
1682
1683 cleanup_fail:
1684   gst_object_unref (root);
1685   g_slist_foreach (pads_created_local, remove_pad, NULL);
1686   g_slist_free (pads_created_local);
1687   return FALSE;
1688 }
1689
1690 static gboolean
1691 pad_link_maybe_ghosting (GstPad * src, GstPad * sink, GstPadLinkCheck flags)
1692 {
1693   GSList *pads_created = NULL;
1694   gboolean ret;
1695
1696   if (!prepare_link_maybe_ghosting (&src, &sink, &pads_created)) {
1697     ret = FALSE;
1698   } else {
1699     ret = (gst_pad_link_full (src, sink, flags) == GST_PAD_LINK_OK);
1700   }
1701
1702   if (!ret) {
1703     g_slist_foreach (pads_created, remove_pad, NULL);
1704   }
1705   g_slist_free (pads_created);
1706
1707   return ret;
1708 }
1709
1710 /**
1711  * gst_pad_link_maybe_ghosting_full:
1712  * @src: a #GstPad
1713  * @sink: a #GstPad
1714  * @flags: some #GstPadLinkCheck flags
1715  *
1716  * Links @src to @sink, creating any #GstGhostPad's in between as necessary.
1717  *
1718  * This is a convenience function to save having to create and add intermediate
1719  * #GstGhostPad's as required for linking across #GstBin boundaries.
1720  *
1721  * If @src or @sink pads don't have parent elements or do not share a common
1722  * ancestor, the link will fail.
1723  *
1724  * Calling gst_pad_link_maybe_ghosting_full() with
1725  * @flags == %GST_PAD_LINK_CHECK_DEFAULT is the recommended way of linking
1726  * pads with safety checks applied.
1727  *
1728  * Returns: whether the link succeeded.
1729  *
1730  * Since: 1.10
1731  */
1732 gboolean
1733 gst_pad_link_maybe_ghosting_full (GstPad * src, GstPad * sink,
1734     GstPadLinkCheck flags)
1735 {
1736   g_return_val_if_fail (GST_IS_PAD (src), FALSE);
1737   g_return_val_if_fail (GST_IS_PAD (sink), FALSE);
1738
1739   return pad_link_maybe_ghosting (src, sink, flags);
1740 }
1741
1742 /**
1743  * gst_pad_link_maybe_ghosting:
1744  * @src: a #GstPad
1745  * @sink: a #GstPad
1746  *
1747  * Links @src to @sink, creating any #GstGhostPad's in between as necessary.
1748  *
1749  * This is a convenience function to save having to create and add intermediate
1750  * #GstGhostPad's as required for linking across #GstBin boundaries.
1751  *
1752  * If @src or @sink pads don't have parent elements or do not share a common
1753  * ancestor, the link will fail.
1754  *
1755  * Returns: whether the link succeeded.
1756  *
1757  * Since: 1.10
1758  */
1759 gboolean
1760 gst_pad_link_maybe_ghosting (GstPad * src, GstPad * sink)
1761 {
1762   g_return_val_if_fail (GST_IS_PAD (src), FALSE);
1763   g_return_val_if_fail (GST_IS_PAD (sink), FALSE);
1764
1765   return gst_pad_link_maybe_ghosting_full (src, sink,
1766       GST_PAD_LINK_CHECK_DEFAULT);
1767 }
1768
1769 static void
1770 release_and_unref_pad (GstElement * element, GstPad * pad, gboolean requestpad)
1771 {
1772   if (pad) {
1773     if (requestpad)
1774       gst_element_release_request_pad (element, pad);
1775     gst_object_unref (pad);
1776   }
1777 }
1778
1779 /**
1780  * gst_element_link_pads_full:
1781  * @src: a #GstElement containing the source pad.
1782  * @srcpadname: (nullable): the name of the #GstPad in source element
1783  *     or %NULL for any pad.
1784  * @dest: (transfer none): the #GstElement containing the destination pad.
1785  * @destpadname: (nullable): the name of the #GstPad in destination element,
1786  * or %NULL for any pad.
1787  * @flags: the #GstPadLinkCheck to be performed when linking pads.
1788  *
1789  * Links the two named pads of the source and destination elements.
1790  * Side effect is that if one of the pads has no parent, it becomes a
1791  * child of the parent of the other element.  If they have different
1792  * parents, the link fails.
1793  *
1794  * Calling gst_element_link_pads_full() with @flags == %GST_PAD_LINK_CHECK_DEFAULT
1795  * is the same as calling gst_element_link_pads() and the recommended way of
1796  * linking pads with safety checks applied.
1797  *
1798  * This is a convenience function for gst_pad_link_full().
1799  *
1800  * Returns: %TRUE if the pads could be linked, %FALSE otherwise.
1801  */
1802 gboolean
1803 gst_element_link_pads_full (GstElement * src, const gchar * srcpadname,
1804     GstElement * dest, const gchar * destpadname, GstPadLinkCheck flags)
1805 {
1806   const GList *srcpads, *destpads, *srctempls, *desttempls, *l;
1807   GstPad *srcpad, *destpad;
1808   GstPadTemplate *srctempl, *desttempl;
1809   GstElementClass *srcclass, *destclass;
1810   gboolean srcrequest, destrequest;
1811
1812   /* checks */
1813   g_return_val_if_fail (GST_IS_ELEMENT (src), FALSE);
1814   g_return_val_if_fail (GST_IS_ELEMENT (dest), FALSE);
1815
1816   GST_CAT_INFO (GST_CAT_ELEMENT_PADS,
1817       "trying to link element %s:%s to element %s:%s", GST_ELEMENT_NAME (src),
1818       srcpadname ? srcpadname : "(any)", GST_ELEMENT_NAME (dest),
1819       destpadname ? destpadname : "(any)");
1820
1821   srcrequest = FALSE;
1822   destrequest = FALSE;
1823
1824   /* get a src pad */
1825   if (srcpadname) {
1826     /* name specified, look it up */
1827     if (!(srcpad = gst_element_get_static_pad (src, srcpadname))) {
1828       if ((srcpad = gst_element_request_pad_simple (src, srcpadname)))
1829         srcrequest = TRUE;
1830     }
1831     if (!srcpad) {
1832       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s",
1833           GST_ELEMENT_NAME (src), srcpadname);
1834       return FALSE;
1835     } else {
1836       if (!(GST_PAD_DIRECTION (srcpad) == GST_PAD_SRC)) {
1837         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is no src pad",
1838             GST_DEBUG_PAD_NAME (srcpad));
1839         release_and_unref_pad (src, srcpad, srcrequest);
1840         return FALSE;
1841       }
1842       if (GST_PAD_PEER (srcpad) != NULL) {
1843         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1844             "pad %s:%s is already linked to %s:%s", GST_DEBUG_PAD_NAME (srcpad),
1845             GST_DEBUG_PAD_NAME (GST_PAD_PEER (srcpad)));
1846         /* already linked request pads look like static pads, so the request pad
1847          * was never requested a second time above, so no need to release it */
1848         gst_object_unref (srcpad);
1849         return FALSE;
1850       }
1851     }
1852     srcpads = NULL;
1853   } else {
1854     /* no name given, get the first available pad */
1855     GST_OBJECT_LOCK (src);
1856     srcpads = GST_ELEMENT_PADS (src);
1857     srcpad = srcpads ? GST_PAD_CAST (srcpads->data) : NULL;
1858     if (srcpad)
1859       gst_object_ref (srcpad);
1860     GST_OBJECT_UNLOCK (src);
1861   }
1862
1863   /* get a destination pad */
1864   if (destpadname) {
1865     /* name specified, look it up */
1866     if (!(destpad = gst_element_get_static_pad (dest, destpadname))) {
1867       if ((destpad = gst_element_request_pad_simple (dest, destpadname)))
1868         destrequest = TRUE;
1869     }
1870     if (!destpad) {
1871       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s",
1872           GST_ELEMENT_NAME (dest), destpadname);
1873       release_and_unref_pad (src, srcpad, srcrequest);
1874       return FALSE;
1875     } else {
1876       if (!(GST_PAD_DIRECTION (destpad) == GST_PAD_SINK)) {
1877         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is no sink pad",
1878             GST_DEBUG_PAD_NAME (destpad));
1879         release_and_unref_pad (src, srcpad, srcrequest);
1880         release_and_unref_pad (dest, destpad, destrequest);
1881         return FALSE;
1882       }
1883       if (GST_PAD_PEER (destpad) != NULL) {
1884         GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1885             "pad %s:%s is already linked to %s:%s",
1886             GST_DEBUG_PAD_NAME (destpad),
1887             GST_DEBUG_PAD_NAME (GST_PAD_PEER (destpad)));
1888         release_and_unref_pad (src, srcpad, srcrequest);
1889         /* already linked request pads look like static pads, so the request pad
1890          * was never requested a second time above, so no need to release it */
1891         gst_object_unref (destpad);
1892         return FALSE;
1893       }
1894     }
1895     destpads = NULL;
1896   } else {
1897     /* no name given, get the first available pad */
1898     GST_OBJECT_LOCK (dest);
1899     destpads = GST_ELEMENT_PADS (dest);
1900     destpad = destpads ? GST_PAD_CAST (destpads->data) : NULL;
1901     if (destpad)
1902       gst_object_ref (destpad);
1903     GST_OBJECT_UNLOCK (dest);
1904   }
1905
1906   if (srcpadname && destpadname) {
1907     gboolean result;
1908
1909     /* two explicitly specified pads */
1910     result = pad_link_maybe_ghosting (srcpad, destpad, flags);
1911
1912     if (result) {
1913       gst_object_unref (srcpad);
1914       gst_object_unref (destpad);
1915     } else {
1916       release_and_unref_pad (src, srcpad, srcrequest);
1917       release_and_unref_pad (dest, destpad, destrequest);
1918     }
1919     return result;
1920   }
1921
1922   if (srcpad) {
1923     /* loop through the allowed pads in the source, trying to find a
1924      * compatible destination pad */
1925     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
1926         "looping through allowed src and dest pads");
1927     do {
1928       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "trying src pad %s:%s",
1929           GST_DEBUG_PAD_NAME (srcpad));
1930       if ((GST_PAD_DIRECTION (srcpad) == GST_PAD_SRC) &&
1931           (GST_PAD_PEER (srcpad) == NULL)) {
1932         gboolean temprequest = FALSE;
1933         GstPad *temp;
1934
1935         if (destpadname) {
1936           temp = destpad;
1937           gst_object_ref (temp);
1938         } else {
1939           temp = gst_element_get_compatible_pad (dest, srcpad, NULL);
1940           if (temp && GST_PAD_PAD_TEMPLATE (temp)
1941               && GST_PAD_TEMPLATE_PRESENCE (GST_PAD_PAD_TEMPLATE (temp)) ==
1942               GST_PAD_REQUEST) {
1943             temprequest = TRUE;
1944           }
1945         }
1946
1947         if (temp && pad_link_maybe_ghosting (srcpad, temp, flags)) {
1948           GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "linked pad %s:%s to pad %s:%s",
1949               GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (temp));
1950           if (destpad)
1951             gst_object_unref (destpad);
1952           gst_object_unref (srcpad);
1953           gst_object_unref (temp);
1954           return TRUE;
1955         }
1956
1957         if (temp) {
1958           if (temprequest)
1959             gst_element_release_request_pad (dest, temp);
1960           gst_object_unref (temp);
1961         }
1962       }
1963       /* find a better way for this mess */
1964       if (srcpads) {
1965         srcpads = g_list_next (srcpads);
1966         if (srcpads) {
1967           gst_object_unref (srcpad);
1968           srcpad = GST_PAD_CAST (srcpads->data);
1969           gst_object_ref (srcpad);
1970         }
1971       }
1972     } while (srcpads);
1973   }
1974   if (srcpadname) {
1975     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s:%s to %s",
1976         GST_DEBUG_PAD_NAME (srcpad), GST_ELEMENT_NAME (dest));
1977     /* no need to release any request pad as both src- and destpadname must be
1978      * set to end up here, but this case has already been taken care of above */
1979     if (destpad)
1980       gst_object_unref (destpad);
1981     destpad = NULL;
1982   }
1983   if (srcpad) {
1984     release_and_unref_pad (src, srcpad, srcrequest);
1985     srcpad = NULL;
1986   }
1987
1988   if (destpad) {
1989     /* loop through the existing pads in the destination */
1990     do {
1991       GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "trying dest pad %s:%s",
1992           GST_DEBUG_PAD_NAME (destpad));
1993       if ((GST_PAD_DIRECTION (destpad) == GST_PAD_SINK) &&
1994           (GST_PAD_PEER (destpad) == NULL)) {
1995         GstPad *temp = gst_element_get_compatible_pad (src, destpad, NULL);
1996         gboolean temprequest = FALSE;
1997
1998         if (temp && GST_PAD_PAD_TEMPLATE (temp)
1999             && GST_PAD_TEMPLATE_PRESENCE (GST_PAD_PAD_TEMPLATE (temp)) ==
2000             GST_PAD_REQUEST) {
2001           temprequest = TRUE;
2002         }
2003
2004         if (temp && pad_link_maybe_ghosting (temp, destpad, flags)) {
2005           GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "linked pad %s:%s to pad %s:%s",
2006               GST_DEBUG_PAD_NAME (temp), GST_DEBUG_PAD_NAME (destpad));
2007           gst_object_unref (temp);
2008           gst_object_unref (destpad);
2009           return TRUE;
2010         }
2011
2012         release_and_unref_pad (src, temp, temprequest);
2013       }
2014       if (destpads) {
2015         destpads = g_list_next (destpads);
2016         if (destpads) {
2017           gst_object_unref (destpad);
2018           destpad = GST_PAD_CAST (destpads->data);
2019           gst_object_ref (destpad);
2020         }
2021       }
2022     } while (destpads);
2023   }
2024
2025   if (destpadname) {
2026     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s to %s:%s",
2027         GST_ELEMENT_NAME (src), GST_DEBUG_PAD_NAME (destpad));
2028     release_and_unref_pad (dest, destpad, destrequest);
2029     return FALSE;
2030   } else {
2031     /* no need to release any request pad as the case of unset destpatname and
2032      * destpad being a request pad has already been taken care of when looking
2033      * though the destination pads above */
2034     if (destpad) {
2035       gst_object_unref (destpad);
2036     }
2037     destpad = NULL;
2038   }
2039
2040   srcclass = GST_ELEMENT_GET_CLASS (src);
2041   destclass = GST_ELEMENT_GET_CLASS (dest);
2042
2043   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
2044       "we might have request pads on both sides, checking...");
2045   srctempls = gst_element_class_get_pad_template_list (srcclass);
2046   desttempls = gst_element_class_get_pad_template_list (destclass);
2047
2048   if (srctempls && desttempls) {
2049     while (srctempls) {
2050       srctempl = (GstPadTemplate *) srctempls->data;
2051       if (srctempl->presence == GST_PAD_REQUEST) {
2052         for (l = desttempls; l; l = l->next) {
2053           desttempl = (GstPadTemplate *) l->data;
2054           if (desttempl->presence == GST_PAD_REQUEST &&
2055               desttempl->direction != srctempl->direction) {
2056             GstCaps *srccaps, *destcaps;
2057
2058             srccaps = gst_pad_template_get_caps (srctempl);
2059             destcaps = gst_pad_template_get_caps (desttempl);
2060             if (gst_caps_is_always_compatible (srccaps, destcaps)) {
2061               srcpad =
2062                   gst_element_request_pad (src, srctempl,
2063                   srctempl->name_template, NULL);
2064               destpad =
2065                   gst_element_request_pad (dest, desttempl,
2066                   desttempl->name_template, NULL);
2067               if (srcpad && destpad
2068                   && pad_link_maybe_ghosting (srcpad, destpad, flags)) {
2069                 GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
2070                     "linked pad %s:%s to pad %s:%s",
2071                     GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (destpad));
2072                 gst_object_unref (srcpad);
2073                 gst_object_unref (destpad);
2074                 gst_caps_unref (srccaps);
2075                 gst_caps_unref (destcaps);
2076                 return TRUE;
2077               }
2078               /* it failed, so we release the request pads */
2079               if (srcpad) {
2080                 gst_element_release_request_pad (src, srcpad);
2081                 gst_object_unref (srcpad);
2082               }
2083               if (destpad) {
2084                 gst_element_release_request_pad (dest, destpad);
2085                 gst_object_unref (destpad);
2086               }
2087             }
2088             gst_caps_unref (srccaps);
2089             gst_caps_unref (destcaps);
2090           }
2091         }
2092       }
2093       srctempls = srctempls->next;
2094     }
2095   }
2096
2097   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s to %s",
2098       GST_ELEMENT_NAME (src), GST_ELEMENT_NAME (dest));
2099   return FALSE;
2100 }
2101
2102 /**
2103  * gst_element_link_pads:
2104  * @src: a #GstElement containing the source pad.
2105  * @srcpadname: (nullable): the name of the #GstPad in source element
2106  *     or %NULL for any pad.
2107  * @dest: (transfer none): the #GstElement containing the destination pad.
2108  * @destpadname: (nullable): the name of the #GstPad in destination element,
2109  * or %NULL for any pad.
2110  *
2111  * Links the two named pads of the source and destination elements.
2112  * Side effect is that if one of the pads has no parent, it becomes a
2113  * child of the parent of the other element.  If they have different
2114  * parents, the link fails.
2115  *
2116  * Returns: %TRUE if the pads could be linked, %FALSE otherwise.
2117  */
2118 gboolean
2119 gst_element_link_pads (GstElement * src, const gchar * srcpadname,
2120     GstElement * dest, const gchar * destpadname)
2121 {
2122   return gst_element_link_pads_full (src, srcpadname, dest, destpadname,
2123       GST_PAD_LINK_CHECK_DEFAULT);
2124 }
2125
2126 /**
2127  * gst_element_link_pads_filtered:
2128  * @src: a #GstElement containing the source pad.
2129  * @srcpadname: (nullable): the name of the #GstPad in source element
2130  *     or %NULL for any pad.
2131  * @dest: (transfer none): the #GstElement containing the destination pad.
2132  * @destpadname: (nullable): the name of the #GstPad in destination element
2133  *     or %NULL for any pad.
2134  * @filter: (transfer none) (nullable): the #GstCaps to filter the link,
2135  *     or %NULL for no filter.
2136  *
2137  * Links the two named pads of the source and destination elements. Side effect
2138  * is that if one of the pads has no parent, it becomes a child of the parent of
2139  * the other element. If they have different parents, the link fails. If @caps
2140  * is not %NULL, makes sure that the caps of the link is a subset of @caps.
2141  *
2142  * Returns: %TRUE if the pads could be linked, %FALSE otherwise.
2143  */
2144 gboolean
2145 gst_element_link_pads_filtered (GstElement * src, const gchar * srcpadname,
2146     GstElement * dest, const gchar * destpadname, GstCaps * filter)
2147 {
2148   /* checks */
2149   g_return_val_if_fail (GST_IS_ELEMENT (src), FALSE);
2150   g_return_val_if_fail (GST_IS_ELEMENT (dest), FALSE);
2151   g_return_val_if_fail (filter == NULL || GST_IS_CAPS (filter), FALSE);
2152
2153   if (filter) {
2154     GstElement *capsfilter;
2155     GstObject *parent;
2156     GstState state, pending;
2157     gboolean lr1, lr2;
2158
2159     capsfilter = gst_element_factory_make ("capsfilter", NULL);
2160     if (!capsfilter) {
2161       GST_ERROR ("Could not make a capsfilter");
2162       return FALSE;
2163     }
2164
2165     parent = gst_object_get_parent (GST_OBJECT (src));
2166     g_return_val_if_fail (GST_IS_BIN (parent), FALSE);
2167
2168     gst_element_get_state (GST_ELEMENT_CAST (parent), &state, &pending, 0);
2169
2170     if (!gst_bin_add (GST_BIN (parent), capsfilter)) {
2171       GST_ERROR ("Could not add capsfilter");
2172       gst_object_unref (parent);
2173       return FALSE;
2174     }
2175
2176     if (pending != GST_STATE_VOID_PENDING)
2177       state = pending;
2178
2179     gst_element_set_state (capsfilter, state);
2180
2181     gst_object_unref (parent);
2182
2183     g_object_set (capsfilter, "caps", filter, NULL);
2184
2185     lr1 = gst_element_link_pads (src, srcpadname, capsfilter, "sink");
2186     lr2 = gst_element_link_pads (capsfilter, "src", dest, destpadname);
2187     if (lr1 && lr2) {
2188       return TRUE;
2189     } else {
2190       if (!lr1) {
2191         GST_INFO ("Could not link pads: %s:%s - capsfilter:sink",
2192             GST_ELEMENT_NAME (src), srcpadname);
2193       } else {
2194         GST_INFO ("Could not link pads: capsfilter:src - %s:%s",
2195             GST_ELEMENT_NAME (dest), destpadname);
2196       }
2197       gst_element_set_state (capsfilter, GST_STATE_NULL);
2198       /* this will unlink and unref as appropriate */
2199       gst_bin_remove (GST_BIN (GST_OBJECT_PARENT (capsfilter)), capsfilter);
2200       return FALSE;
2201     }
2202   } else {
2203     if (gst_element_link_pads (src, srcpadname, dest, destpadname)) {
2204       return TRUE;
2205     } else {
2206       GST_INFO ("Could not link pads: %s:%s - %s:%s", GST_ELEMENT_NAME (src),
2207           srcpadname, GST_ELEMENT_NAME (dest), destpadname);
2208       return FALSE;
2209     }
2210   }
2211 }
2212
2213 /**
2214  * gst_element_link:
2215  * @src: (transfer none): a #GstElement containing the source pad.
2216  * @dest: (transfer none): the #GstElement containing the destination pad.
2217  *
2218  * Links @src to @dest. The link must be from source to
2219  * destination; the other direction will not be tried. The function looks for
2220  * existing pads that aren't linked yet. It will request new pads if necessary.
2221  * Such pads need to be released manually when unlinking.
2222  * If multiple links are possible, only one is established.
2223  *
2224  * Make sure you have added your elements to a bin or pipeline with
2225  * gst_bin_add() before trying to link them.
2226  *
2227  * Returns: %TRUE if the elements could be linked, %FALSE otherwise.
2228  */
2229 gboolean
2230 gst_element_link (GstElement * src, GstElement * dest)
2231 {
2232   return gst_element_link_pads (src, NULL, dest, NULL);
2233 }
2234
2235 /**
2236  * gst_element_link_many:
2237  * @element_1: (transfer none): the first #GstElement in the link chain.
2238  * @element_2: (transfer none): the second #GstElement in the link chain.
2239  * @...: the %NULL-terminated list of elements to link in order.
2240  *
2241  * Chain together a series of elements. Uses gst_element_link().
2242  * Make sure you have added your elements to a bin or pipeline with
2243  * gst_bin_add() before trying to link them.
2244  *
2245  * Returns: %TRUE on success, %FALSE otherwise.
2246  */
2247 gboolean
2248 gst_element_link_many (GstElement * element_1, GstElement * element_2, ...)
2249 {
2250   gboolean res = TRUE;
2251   va_list args;
2252
2253   g_return_val_if_fail (GST_IS_ELEMENT (element_1), FALSE);
2254   g_return_val_if_fail (GST_IS_ELEMENT (element_2), FALSE);
2255
2256   va_start (args, element_2);
2257
2258   while (element_2) {
2259     if (!gst_element_link (element_1, element_2)) {
2260       res = FALSE;
2261       break;
2262     }
2263
2264     element_1 = element_2;
2265     element_2 = va_arg (args, GstElement *);
2266   }
2267
2268   va_end (args);
2269
2270   return res;
2271 }
2272
2273 /**
2274  * gst_element_link_filtered:
2275  * @src: a #GstElement containing the source pad.
2276  * @dest: (transfer none): the #GstElement containing the destination pad.
2277  * @filter: (transfer none) (nullable): the #GstCaps to filter the link,
2278  *     or %NULL for no filter.
2279  *
2280  * Links @src to @dest using the given caps as filtercaps.
2281  * The link must be from source to
2282  * destination; the other direction will not be tried. The function looks for
2283  * existing pads that aren't linked yet. It will request new pads if necessary.
2284  * If multiple links are possible, only one is established.
2285  *
2286  * Make sure you have added your elements to a bin or pipeline with
2287  * gst_bin_add() before trying to link them.
2288  *
2289  * Returns: %TRUE if the pads could be linked, %FALSE otherwise.
2290  */
2291 gboolean
2292 gst_element_link_filtered (GstElement * src, GstElement * dest,
2293     GstCaps * filter)
2294 {
2295   return gst_element_link_pads_filtered (src, NULL, dest, NULL, filter);
2296 }
2297
2298 /**
2299  * gst_element_unlink_pads:
2300  * @src: a (transfer none): #GstElement containing the source pad.
2301  * @srcpadname: the name of the #GstPad in source element.
2302  * @dest: (transfer none): a #GstElement containing the destination pad.
2303  * @destpadname: the name of the #GstPad in destination element.
2304  *
2305  * Unlinks the two named pads of the source and destination elements.
2306  *
2307  * This is a convenience function for gst_pad_unlink().
2308  */
2309 void
2310 gst_element_unlink_pads (GstElement * src, const gchar * srcpadname,
2311     GstElement * dest, const gchar * destpadname)
2312 {
2313   GstPad *srcpad, *destpad;
2314   gboolean srcrequest, destrequest;
2315
2316   srcrequest = destrequest = FALSE;
2317
2318   g_return_if_fail (src != NULL);
2319   g_return_if_fail (GST_IS_ELEMENT (src));
2320   g_return_if_fail (srcpadname != NULL);
2321   g_return_if_fail (dest != NULL);
2322   g_return_if_fail (GST_IS_ELEMENT (dest));
2323   g_return_if_fail (destpadname != NULL);
2324
2325   /* obtain the pads requested */
2326   if (!(srcpad = gst_element_get_static_pad (src, srcpadname)))
2327     if ((srcpad = gst_element_request_pad_simple (src, srcpadname)))
2328       srcrequest = TRUE;
2329   if (srcpad == NULL) {
2330     GST_WARNING_OBJECT (src, "source element has no pad \"%s\"", srcpadname);
2331     return;
2332   }
2333   if (!(destpad = gst_element_get_static_pad (dest, destpadname)))
2334     if ((destpad = gst_element_request_pad_simple (dest, destpadname)))
2335       destrequest = TRUE;
2336   if (destpad == NULL) {
2337     GST_WARNING_OBJECT (dest, "destination element has no pad \"%s\"",
2338         destpadname);
2339     goto free_src;
2340   }
2341
2342   /* we're satisfied they can be unlinked, let's do it */
2343   gst_pad_unlink (srcpad, destpad);
2344
2345   if (destrequest)
2346     gst_element_release_request_pad (dest, destpad);
2347   gst_object_unref (destpad);
2348
2349 free_src:
2350   if (srcrequest)
2351     gst_element_release_request_pad (src, srcpad);
2352   gst_object_unref (srcpad);
2353 }
2354
2355 /**
2356  * gst_element_unlink_many:
2357  * @element_1: (transfer none): the first #GstElement in the link chain.
2358  * @element_2: (transfer none): the second #GstElement in the link chain.
2359  * @...: the %NULL-terminated list of elements to unlink in order.
2360  *
2361  * Unlinks a series of elements. Uses gst_element_unlink().
2362  */
2363 void
2364 gst_element_unlink_many (GstElement * element_1, GstElement * element_2, ...)
2365 {
2366   va_list args;
2367
2368   g_return_if_fail (element_1 != NULL && element_2 != NULL);
2369   g_return_if_fail (GST_IS_ELEMENT (element_1) && GST_IS_ELEMENT (element_2));
2370
2371   va_start (args, element_2);
2372
2373   while (element_2) {
2374     gst_element_unlink (element_1, element_2);
2375
2376     element_1 = element_2;
2377     element_2 = va_arg (args, GstElement *);
2378   }
2379
2380   va_end (args);
2381 }
2382
2383 /**
2384  * gst_element_unlink:
2385  * @src: (transfer none): the source #GstElement to unlink.
2386  * @dest: (transfer none): the sink #GstElement to unlink.
2387  *
2388  * Unlinks all source pads of the source element with all sink pads
2389  * of the sink element to which they are linked.
2390  *
2391  * If the link has been made using gst_element_link(), it could have created an
2392  * requestpad, which has to be released using gst_element_release_request_pad().
2393  */
2394 void
2395 gst_element_unlink (GstElement * src, GstElement * dest)
2396 {
2397   GstIterator *pads;
2398   gboolean done = FALSE;
2399   GValue data = { 0, };
2400
2401   g_return_if_fail (GST_IS_ELEMENT (src));
2402   g_return_if_fail (GST_IS_ELEMENT (dest));
2403
2404   GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "unlinking \"%s\" and \"%s\"",
2405       GST_ELEMENT_NAME (src), GST_ELEMENT_NAME (dest));
2406
2407   pads = gst_element_iterate_pads (src);
2408   while (!done) {
2409     switch (gst_iterator_next (pads, &data)) {
2410       case GST_ITERATOR_OK:
2411       {
2412         GstPad *pad = g_value_get_object (&data);
2413
2414         if (GST_PAD_IS_SRC (pad)) {
2415           GstPad *peerpad = gst_pad_get_peer (pad);
2416
2417           /* see if the pad is linked and is really a pad of dest */
2418           if (peerpad) {
2419             GstElement *peerelem;
2420
2421             peerelem = gst_pad_get_parent_element (peerpad);
2422
2423             if (peerelem == dest) {
2424               gst_pad_unlink (pad, peerpad);
2425             }
2426             if (peerelem)
2427               gst_object_unref (peerelem);
2428
2429             gst_object_unref (peerpad);
2430           }
2431         }
2432         g_value_reset (&data);
2433         break;
2434       }
2435       case GST_ITERATOR_RESYNC:
2436         gst_iterator_resync (pads);
2437         break;
2438       case GST_ITERATOR_DONE:
2439         done = TRUE;
2440         break;
2441       default:
2442         g_assert_not_reached ();
2443         break;
2444     }
2445   }
2446   g_value_unset (&data);
2447   gst_iterator_free (pads);
2448 }
2449
2450 /**
2451  * gst_element_query_position:
2452  * @element: a #GstElement to invoke the position query on.
2453  * @format: the #GstFormat requested
2454  * @cur: (out) (optional): a location in which to store the current
2455  *     position, or %NULL.
2456  *
2457  * Queries an element (usually top-level pipeline or playbin element) for the
2458  * stream position in nanoseconds. This will be a value between 0 and the
2459  * stream duration (if the stream duration is known). This query will usually
2460  * only work once the pipeline is prerolled (i.e. reached PAUSED or PLAYING
2461  * state). The application will receive an ASYNC_DONE message on the pipeline
2462  * bus when that is the case.
2463  *
2464  * If one repeatedly calls this function one can also create a query and reuse
2465  * it in gst_element_query().
2466  *
2467  * Returns: %TRUE if the query could be performed.
2468  */
2469 gboolean
2470 gst_element_query_position (GstElement * element, GstFormat format,
2471     gint64 * cur)
2472 {
2473   GstQuery *query;
2474   gboolean ret;
2475
2476   if (cur != NULL)
2477     *cur = GST_CLOCK_TIME_NONE;
2478
2479   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
2480   g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
2481
2482   query = gst_query_new_position (format);
2483   ret = gst_element_query (element, query);
2484
2485   if (ret)
2486     gst_query_parse_position (query, NULL, cur);
2487
2488   gst_query_unref (query);
2489
2490   return ret;
2491 }
2492
2493 /**
2494  * gst_element_query_duration:
2495  * @element: a #GstElement to invoke the duration query on.
2496  * @format: the #GstFormat requested
2497  * @duration: (out) (optional): A location in which to store the total duration, or %NULL.
2498  *
2499  * Queries an element (usually top-level pipeline or playbin element) for the
2500  * total stream duration in nanoseconds. This query will only work once the
2501  * pipeline is prerolled (i.e. reached PAUSED or PLAYING state). The application
2502  * will receive an ASYNC_DONE message on the pipeline bus when that is the case.
2503  *
2504  * If the duration changes for some reason, you will get a DURATION_CHANGED
2505  * message on the pipeline bus, in which case you should re-query the duration
2506  * using this function.
2507  *
2508  * Returns: %TRUE if the query could be performed.
2509  */
2510 gboolean
2511 gst_element_query_duration (GstElement * element, GstFormat format,
2512     gint64 * duration)
2513 {
2514   GstQuery *query;
2515   gboolean ret;
2516
2517   if (duration != NULL)
2518     *duration = GST_CLOCK_TIME_NONE;
2519
2520   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
2521   g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
2522
2523   query = gst_query_new_duration (format);
2524   ret = gst_element_query (element, query);
2525
2526   if (ret)
2527     gst_query_parse_duration (query, NULL, duration);
2528
2529   gst_query_unref (query);
2530
2531   return ret;
2532 }
2533
2534 /**
2535  * gst_element_query_convert:
2536  * @element: a #GstElement to invoke the convert query on.
2537  * @src_format: a #GstFormat to convert from.
2538  * @src_val: a value to convert.
2539  * @dest_format: the #GstFormat to convert to.
2540  * @dest_val: (out): a pointer to the result.
2541  *
2542  * Queries an element to convert @src_val in @src_format to @dest_format.
2543  *
2544  * Returns: %TRUE if the query could be performed.
2545  */
2546 gboolean
2547 gst_element_query_convert (GstElement * element, GstFormat src_format,
2548     gint64 src_val, GstFormat dest_format, gint64 * dest_val)
2549 {
2550   GstQuery *query;
2551   gboolean ret;
2552
2553   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
2554   g_return_val_if_fail (dest_format != GST_FORMAT_UNDEFINED, FALSE);
2555   g_return_val_if_fail (dest_val != NULL, FALSE);
2556
2557   if (dest_format == src_format || src_val == -1) {
2558     *dest_val = src_val;
2559     return TRUE;
2560   }
2561
2562   *dest_val = -1;
2563
2564   query = gst_query_new_convert (src_format, src_val, dest_format);
2565   ret = gst_element_query (element, query);
2566
2567   if (ret)
2568     gst_query_parse_convert (query, NULL, NULL, NULL, dest_val);
2569
2570   gst_query_unref (query);
2571
2572   return ret;
2573 }
2574
2575 /**
2576  * gst_element_seek_simple:
2577  * @element: a #GstElement to seek on
2578  * @format: a #GstFormat to execute the seek in, such as #GST_FORMAT_TIME
2579  * @seek_flags: seek options; playback applications will usually want to use
2580  *            GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT here
2581  * @seek_pos: position to seek to (relative to the start); if you are doing
2582  *            a seek in #GST_FORMAT_TIME this value is in nanoseconds -
2583  *            multiply with #GST_SECOND to convert seconds to nanoseconds or
2584  *            with #GST_MSECOND to convert milliseconds to nanoseconds.
2585  *
2586  * Simple API to perform a seek on the given element, meaning it just seeks
2587  * to the given position relative to the start of the stream. For more complex
2588  * operations like segment seeks (e.g. for looping) or changing the playback
2589  * rate or seeking relative to the last configured playback segment you should
2590  * use gst_element_seek().
2591  *
2592  * In a completely prerolled PAUSED or PLAYING pipeline, seeking is always
2593  * guaranteed to return %TRUE on a seekable media type or %FALSE when the media
2594  * type is certainly not seekable (such as a live stream).
2595  *
2596  * Some elements allow for seeking in the READY state, in this
2597  * case they will store the seek event and execute it when they are put to
2598  * PAUSED. If the element supports seek in READY, it will always return %TRUE when
2599  * it receives the event in the READY state.
2600  *
2601  * Returns: %TRUE if the seek operation succeeded. Flushing seeks will trigger a
2602  * preroll, which will emit %GST_MESSAGE_ASYNC_DONE.
2603  */
2604 gboolean
2605 gst_element_seek_simple (GstElement * element, GstFormat format,
2606     GstSeekFlags seek_flags, gint64 seek_pos)
2607 {
2608   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
2609   g_return_val_if_fail (seek_pos >= 0, FALSE);
2610
2611   return gst_element_seek (element, 1.0, format, seek_flags,
2612       GST_SEEK_TYPE_SET, seek_pos, GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);
2613 }
2614
2615 /**
2616  * gst_pad_use_fixed_caps:
2617  * @pad: the pad to use
2618  *
2619  * A helper function you can use that sets the FIXED_CAPS flag
2620  * This way the default CAPS query will always return the negotiated caps
2621  * or in case the pad is not negotiated, the padtemplate caps.
2622  *
2623  * The negotiated caps are the caps of the last CAPS event that passed on the
2624  * pad. Use this function on a pad that, once it negotiated to a CAPS, cannot
2625  * be renegotiated to something else.
2626  */
2627 void
2628 gst_pad_use_fixed_caps (GstPad * pad)
2629 {
2630   GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_FIXED_CAPS);
2631 }
2632
2633 /**
2634  * gst_pad_get_parent_element:
2635  * @pad: a pad
2636  *
2637  * Gets the parent of @pad, cast to a #GstElement. If a @pad has no parent or
2638  * its parent is not an element, return %NULL.
2639  *
2640  * Returns: (transfer full) (nullable): the parent of the pad. The
2641  * caller has a reference on the parent, so unref when you're finished
2642  * with it.
2643  *
2644  * MT safe.
2645  */
2646 GstElement *
2647 gst_pad_get_parent_element (GstPad * pad)
2648 {
2649   GstObject *p;
2650
2651   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
2652
2653   p = gst_object_get_parent (GST_OBJECT_CAST (pad));
2654
2655   if (p && !GST_IS_ELEMENT (p)) {
2656     gst_object_unref (p);
2657     p = NULL;
2658   }
2659   return GST_ELEMENT_CAST (p);
2660 }
2661
2662 /**
2663  * gst_object_default_error:
2664  * @source: the #GstObject that initiated the error.
2665  * @error: (in): the GError.
2666  * @debug: (in) (nullable): an additional debug information string, or %NULL
2667  *
2668  * A default error function that uses g_printerr() to display the error message
2669  * and the optional debug string..
2670  *
2671  * The default handler will simply print the error string using g_print.
2672  */
2673 void
2674 gst_object_default_error (GstObject * source, const GError * error,
2675     const gchar * debug)
2676 {
2677   gchar *name = gst_object_get_path_string (source);
2678
2679   g_printerr (_("ERROR: from element %s: %s\n"), name, error->message);
2680   if (debug)
2681     g_printerr (_("Additional debug info:\n%s\n"), debug);
2682
2683   g_free (name);
2684 }
2685
2686 /**
2687  * gst_bin_add_many: (skip)
2688  * @bin: a #GstBin
2689  * @element_1: (transfer floating): the #GstElement element to add to the bin
2690  * @...: additional elements to add to the bin
2691  *
2692  * Adds a %NULL-terminated list of elements to a bin.  This function is
2693  * equivalent to calling gst_bin_add() for each member of the list. The return
2694  * value of each gst_bin_add() is ignored.
2695  */
2696 void
2697 gst_bin_add_many (GstBin * bin, GstElement * element_1, ...)
2698 {
2699   va_list args;
2700
2701   g_return_if_fail (GST_IS_BIN (bin));
2702   g_return_if_fail (GST_IS_ELEMENT (element_1));
2703
2704   va_start (args, element_1);
2705
2706   while (element_1) {
2707     gst_bin_add (bin, element_1);
2708
2709     element_1 = va_arg (args, GstElement *);
2710   }
2711
2712   va_end (args);
2713 }
2714
2715 /**
2716  * gst_bin_remove_many: (skip)
2717  * @bin: a #GstBin
2718  * @element_1: (transfer none): the first #GstElement to remove from the bin
2719  * @...: (transfer none): %NULL-terminated list of elements to remove from the bin
2720  *
2721  * Removes a list of elements from a bin. This function is equivalent
2722  * to calling gst_bin_remove() with each member of the list.
2723  */
2724 void
2725 gst_bin_remove_many (GstBin * bin, GstElement * element_1, ...)
2726 {
2727   va_list args;
2728
2729   g_return_if_fail (GST_IS_BIN (bin));
2730   g_return_if_fail (GST_IS_ELEMENT (element_1));
2731
2732   va_start (args, element_1);
2733
2734   while (element_1) {
2735     gst_bin_remove (bin, element_1);
2736
2737     element_1 = va_arg (args, GstElement *);
2738   }
2739
2740   va_end (args);
2741 }
2742
2743 typedef struct
2744 {
2745   GstQuery *query;
2746   gboolean ret;
2747 } QueryAcceptCapsData;
2748
2749 static gboolean
2750 query_accept_caps_func (GstPad * pad, QueryAcceptCapsData * data)
2751 {
2752   if (G_LIKELY (gst_pad_peer_query (pad, data->query))) {
2753     gboolean result;
2754
2755     gst_query_parse_accept_caps_result (data->query, &result);
2756     data->ret &= result;
2757   }
2758   return FALSE;
2759 }
2760
2761 /**
2762  * gst_pad_proxy_query_accept_caps:
2763  * @pad: a #GstPad to proxy.
2764  * @query: an ACCEPT_CAPS #GstQuery.
2765  *
2766  * Checks if all internally linked pads of @pad accepts the caps in @query and
2767  * returns the intersection of the results.
2768  *
2769  * This function is useful as a default accept caps query function for an element
2770  * that can handle any stream format, but requires caps that are acceptable for
2771  * all opposite pads.
2772  *
2773  * Returns: %TRUE if @query could be executed
2774  */
2775 gboolean
2776 gst_pad_proxy_query_accept_caps (GstPad * pad, GstQuery * query)
2777 {
2778   QueryAcceptCapsData data;
2779
2780   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2781   g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
2782   g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ACCEPT_CAPS, FALSE);
2783
2784   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
2785       "proxying accept caps query for %s:%s", GST_DEBUG_PAD_NAME (pad));
2786
2787   data.query = query;
2788   /* value to hold the return, by default it holds TRUE */
2789   /* FIXME: TRUE is wrong when there are no pads */
2790   data.ret = TRUE;
2791
2792   gst_pad_forward (pad, (GstPadForwardFunction) query_accept_caps_func, &data);
2793   gst_query_set_accept_caps_result (query, data.ret);
2794
2795   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "proxying accept caps query: %d",
2796       data.ret);
2797
2798   return data.ret;
2799 }
2800
2801 typedef struct
2802 {
2803   GstQuery *query;
2804   GstCaps *ret;
2805 } QueryCapsData;
2806
2807 static gboolean
2808 query_caps_func (GstPad * pad, QueryCapsData * data)
2809 {
2810   gboolean empty = FALSE;
2811
2812   if (G_LIKELY (gst_pad_peer_query (pad, data->query))) {
2813     GstCaps *peercaps, *intersection;
2814
2815     gst_query_parse_caps_result (data->query, &peercaps);
2816     GST_DEBUG_OBJECT (pad, "intersect with result %" GST_PTR_FORMAT, peercaps);
2817     intersection = gst_caps_intersect (data->ret, peercaps);
2818     GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, intersection);
2819
2820     gst_caps_unref (data->ret);
2821     data->ret = intersection;
2822
2823     /* stop when empty */
2824     empty = gst_caps_is_empty (intersection);
2825   }
2826   return empty;
2827 }
2828
2829 /**
2830  * gst_pad_proxy_query_caps:
2831  * @pad: a #GstPad to proxy.
2832  * @query: a CAPS #GstQuery.
2833  *
2834  * Calls gst_pad_query_caps() for all internally linked pads of @pad and returns
2835  * the intersection of the results.
2836  *
2837  * This function is useful as a default caps query function for an element
2838  * that can handle any stream format, but requires all its pads to have
2839  * the same caps.  Two such elements are tee and adder.
2840  *
2841  * Returns: %TRUE if @query could be executed
2842  */
2843 gboolean
2844 gst_pad_proxy_query_caps (GstPad * pad, GstQuery * query)
2845 {
2846   GstCaps *filter, *templ, *result;
2847   QueryCapsData data;
2848
2849   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2850   g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
2851   g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_CAPS, FALSE);
2852
2853   GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "proxying caps query for %s:%s",
2854       GST_DEBUG_PAD_NAME (pad));
2855
2856   data.query = query;
2857
2858   /* value to hold the return, by default it holds the filter or ANY */
2859   gst_query_parse_caps (query, &filter);
2860   data.ret = filter ? gst_caps_ref (filter) : gst_caps_new_any ();
2861
2862   gst_pad_forward (pad, (GstPadForwardFunction) query_caps_func, &data);
2863
2864   templ = gst_pad_get_pad_template_caps (pad);
2865   result = gst_caps_intersect (data.ret, templ);
2866   gst_caps_unref (data.ret);
2867   gst_caps_unref (templ);
2868
2869   gst_query_set_caps_result (query, result);
2870   gst_caps_unref (result);
2871
2872   /* FIXME: return something depending on the processing */
2873   return TRUE;
2874 }
2875
2876 /**
2877  * gst_pad_query_position:
2878  * @pad: a #GstPad to invoke the position query on.
2879  * @format: the #GstFormat requested
2880  * @cur: (out) (optional): A location in which to store the current position, or %NULL.
2881  *
2882  * Queries a pad for the stream position.
2883  *
2884  * Returns: %TRUE if the query could be performed.
2885  */
2886 gboolean
2887 gst_pad_query_position (GstPad * pad, GstFormat format, gint64 * cur)
2888 {
2889   GstQuery *query;
2890   gboolean ret;
2891
2892   if (cur != NULL)
2893     *cur = GST_CLOCK_TIME_NONE;
2894
2895   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2896   g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
2897
2898   query = gst_query_new_position (format);
2899   if ((ret = gst_pad_query (pad, query)))
2900     gst_query_parse_position (query, NULL, cur);
2901   gst_query_unref (query);
2902
2903   return ret;
2904 }
2905
2906 /**
2907  * gst_pad_peer_query_position:
2908  * @pad: a #GstPad on whose peer to invoke the position query on.
2909  *       Must be a sink pad.
2910  * @format: the #GstFormat requested
2911  * @cur: (out) (optional): a location in which to store the current
2912  *     position, or %NULL.
2913  *
2914  * Queries the peer of a given sink pad for the stream position.
2915  *
2916  * Returns: %TRUE if the query could be performed.
2917  */
2918 gboolean
2919 gst_pad_peer_query_position (GstPad * pad, GstFormat format, gint64 * cur)
2920 {
2921   GstQuery *query;
2922   gboolean ret = FALSE;
2923
2924   if (cur != NULL)
2925     *cur = GST_CLOCK_TIME_NONE;
2926
2927   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2928   g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
2929
2930   query = gst_query_new_position (format);
2931   if ((ret = gst_pad_peer_query (pad, query)))
2932     gst_query_parse_position (query, NULL, cur);
2933   gst_query_unref (query);
2934
2935   return ret;
2936 }
2937
2938 /**
2939  * gst_pad_query_duration:
2940  * @pad: a #GstPad to invoke the duration query on.
2941  * @format: the #GstFormat requested
2942  * @duration: (out) (optional): a location in which to store the total
2943  *     duration, or %NULL.
2944  *
2945  * Queries a pad for the total stream duration.
2946  *
2947  * Returns: %TRUE if the query could be performed.
2948  */
2949 gboolean
2950 gst_pad_query_duration (GstPad * pad, GstFormat format, gint64 * duration)
2951 {
2952   GstQuery *query;
2953   gboolean ret;
2954
2955   if (duration != NULL)
2956     *duration = GST_CLOCK_TIME_NONE;
2957
2958   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2959   g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
2960
2961   query = gst_query_new_duration (format);
2962   if ((ret = gst_pad_query (pad, query)))
2963     gst_query_parse_duration (query, NULL, duration);
2964   gst_query_unref (query);
2965
2966   return ret;
2967 }
2968
2969 /**
2970  * gst_pad_peer_query_duration:
2971  * @pad: a #GstPad on whose peer pad to invoke the duration query on.
2972  *       Must be a sink pad.
2973  * @format: the #GstFormat requested
2974  * @duration: (out) (optional): a location in which to store the total
2975  *     duration, or %NULL.
2976  *
2977  * Queries the peer pad of a given sink pad for the total stream duration.
2978  *
2979  * Returns: %TRUE if the query could be performed.
2980  */
2981 gboolean
2982 gst_pad_peer_query_duration (GstPad * pad, GstFormat format, gint64 * duration)
2983 {
2984   GstQuery *query;
2985   gboolean ret = FALSE;
2986
2987   if (duration != NULL)
2988     *duration = GST_CLOCK_TIME_NONE;
2989
2990   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
2991   g_return_val_if_fail (GST_PAD_IS_SINK (pad), FALSE);
2992   g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
2993
2994   query = gst_query_new_duration (format);
2995   if ((ret = gst_pad_peer_query (pad, query)))
2996     gst_query_parse_duration (query, NULL, duration);
2997   gst_query_unref (query);
2998
2999   return ret;
3000 }
3001
3002 /**
3003  * gst_pad_query_convert:
3004  * @pad: a #GstPad to invoke the convert query on.
3005  * @src_format: a #GstFormat to convert from.
3006  * @src_val: a value to convert.
3007  * @dest_format: the #GstFormat to convert to.
3008  * @dest_val: (out): a pointer to the result.
3009  *
3010  * Queries a pad to convert @src_val in @src_format to @dest_format.
3011  *
3012  * Returns: %TRUE if the query could be performed.
3013  */
3014 gboolean
3015 gst_pad_query_convert (GstPad * pad, GstFormat src_format, gint64 src_val,
3016     GstFormat dest_format, gint64 * dest_val)
3017 {
3018   GstQuery *query;
3019   gboolean ret;
3020
3021   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3022   g_return_val_if_fail (dest_format != GST_FORMAT_UNDEFINED, FALSE);
3023   g_return_val_if_fail (dest_val != NULL, FALSE);
3024
3025   if (dest_format == src_format || src_val == -1) {
3026     *dest_val = src_val;
3027     return TRUE;
3028   }
3029
3030   *dest_val = -1;
3031
3032   query = gst_query_new_convert (src_format, src_val, dest_format);
3033   if ((ret = gst_pad_query (pad, query)))
3034     gst_query_parse_convert (query, NULL, NULL, NULL, dest_val);
3035   gst_query_unref (query);
3036
3037   return ret;
3038 }
3039
3040 /**
3041  * gst_pad_peer_query_convert:
3042  * @pad: a #GstPad, on whose peer pad to invoke the convert query on.
3043  *       Must be a sink pad.
3044  * @src_format: a #GstFormat to convert from.
3045  * @src_val: a value to convert.
3046  * @dest_format: the #GstFormat to convert to.
3047  * @dest_val: (out): a pointer to the result.
3048  *
3049  * Queries the peer pad of a given sink pad to convert @src_val in @src_format
3050  * to @dest_format.
3051  *
3052  * Returns: %TRUE if the query could be performed.
3053  */
3054 gboolean
3055 gst_pad_peer_query_convert (GstPad * pad, GstFormat src_format, gint64 src_val,
3056     GstFormat dest_format, gint64 * dest_val)
3057 {
3058   GstQuery *query;
3059   gboolean ret = FALSE;
3060
3061   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3062   g_return_val_if_fail (GST_PAD_IS_SINK (pad), FALSE);
3063   g_return_val_if_fail (dest_format != GST_FORMAT_UNDEFINED, FALSE);
3064   g_return_val_if_fail (dest_val != NULL, FALSE);
3065
3066   *dest_val = -1;
3067
3068   query = gst_query_new_convert (src_format, src_val, dest_format);
3069   if ((ret = gst_pad_peer_query (pad, query)))
3070     gst_query_parse_convert (query, NULL, NULL, NULL, dest_val);
3071   gst_query_unref (query);
3072
3073   return ret;
3074 }
3075
3076 /**
3077  * gst_pad_query_caps:
3078  * @pad: a  #GstPad to get the capabilities of.
3079  * @filter: (nullable): suggested #GstCaps, or %NULL
3080  *
3081  * Gets the capabilities this pad can produce or consume.
3082  * Note that this method doesn't necessarily return the caps set by sending a
3083  * gst_event_new_caps() - use gst_pad_get_current_caps() for that instead.
3084  * gst_pad_query_caps returns all possible caps a pad can operate with, using
3085  * the pad's CAPS query function, If the query fails, this function will return
3086  * @filter, if not %NULL, otherwise ANY.
3087  *
3088  * When called on sinkpads @filter contains the caps that
3089  * upstream could produce in the order preferred by upstream. When
3090  * called on srcpads @filter contains the caps accepted by
3091  * downstream in the preferred order. @filter might be %NULL but
3092  * if it is not %NULL the returned caps will be a subset of @filter.
3093  *
3094  * Note that this function does not return writable #GstCaps, use
3095  * gst_caps_make_writable() before modifying the caps.
3096  *
3097  * Returns: (transfer full): the caps of the pad with incremented ref-count.
3098  */
3099 GstCaps *
3100 gst_pad_query_caps (GstPad * pad, GstCaps * filter)
3101 {
3102   GstCaps *result = NULL;
3103   GstQuery *query;
3104
3105   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
3106   g_return_val_if_fail (filter == NULL || GST_IS_CAPS (filter), NULL);
3107
3108   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
3109       "get pad caps with filter %" GST_PTR_FORMAT, filter);
3110
3111   query = gst_query_new_caps (filter);
3112   if (gst_pad_query (pad, query)) {
3113     gst_query_parse_caps_result (query, &result);
3114     gst_caps_ref (result);
3115     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
3116         "query returned %" GST_PTR_FORMAT, result);
3117   } else if (filter) {
3118     result = gst_caps_ref (filter);
3119   } else {
3120     result = gst_caps_new_any ();
3121   }
3122   gst_query_unref (query);
3123
3124   return result;
3125 }
3126
3127 /**
3128  * gst_pad_peer_query_caps:
3129  * @pad: a  #GstPad to get the capabilities of.
3130  * @filter: (nullable): a #GstCaps filter, or %NULL.
3131  *
3132  * Gets the capabilities of the peer connected to this pad. Similar to
3133  * gst_pad_query_caps().
3134  *
3135  * When called on srcpads @filter contains the caps that
3136  * upstream could produce in the order preferred by upstream. When
3137  * called on sinkpads @filter contains the caps accepted by
3138  * downstream in the preferred order. @filter might be %NULL but
3139  * if it is not %NULL the returned caps will be a subset of @filter.
3140  *
3141  * Returns: (transfer full): the caps of the peer pad with incremented
3142  * ref-count. When there is no peer pad, this function returns @filter or,
3143  * when @filter is %NULL, ANY caps.
3144  */
3145 GstCaps *
3146 gst_pad_peer_query_caps (GstPad * pad, GstCaps * filter)
3147 {
3148   GstCaps *result = NULL;
3149   GstQuery *query;
3150
3151   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
3152   g_return_val_if_fail (filter == NULL || GST_IS_CAPS (filter), NULL);
3153
3154   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
3155       "get pad peer caps with filter %" GST_PTR_FORMAT, filter);
3156
3157   query = gst_query_new_caps (filter);
3158   if (gst_pad_peer_query (pad, query)) {
3159     gst_query_parse_caps_result (query, &result);
3160     gst_caps_ref (result);
3161     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
3162         "peer query returned %" GST_PTR_FORMAT, result);
3163   } else if (filter) {
3164     result = gst_caps_ref (filter);
3165   } else {
3166     result = gst_caps_new_any ();
3167   }
3168   gst_query_unref (query);
3169
3170   return result;
3171 }
3172
3173 /**
3174  * gst_pad_query_accept_caps:
3175  * @pad: a #GstPad to check
3176  * @caps: a #GstCaps to check on the pad
3177  *
3178  * Check if the given pad accepts the caps.
3179  *
3180  * Returns: %TRUE if the pad can accept the caps.
3181  */
3182 gboolean
3183 gst_pad_query_accept_caps (GstPad * pad, GstCaps * caps)
3184 {
3185   gboolean res = TRUE;
3186   GstQuery *query;
3187
3188   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3189   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
3190
3191   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "accept caps of %"
3192       GST_PTR_FORMAT, caps);
3193
3194   query = gst_query_new_accept_caps (caps);
3195   if (gst_pad_query (pad, query)) {
3196     gst_query_parse_accept_caps_result (query, &res);
3197     GST_DEBUG_OBJECT (pad, "query returned %d", res);
3198   }
3199   gst_query_unref (query);
3200
3201   return res;
3202 }
3203
3204 /**
3205  * gst_pad_peer_query_accept_caps:
3206  * @pad: a  #GstPad to check the peer of
3207  * @caps: a #GstCaps to check on the pad
3208  *
3209  * Check if the peer of @pad accepts @caps. If @pad has no peer, this function
3210  * returns %TRUE.
3211  *
3212  * Returns: %TRUE if the peer of @pad can accept the caps or @pad has no peer.
3213  */
3214 gboolean
3215 gst_pad_peer_query_accept_caps (GstPad * pad, GstCaps * caps)
3216 {
3217   gboolean res = TRUE;
3218   GstQuery *query;
3219
3220   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
3221   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
3222
3223   query = gst_query_new_accept_caps (caps);
3224   if (gst_pad_peer_query (pad, query)) {
3225     gst_query_parse_accept_caps_result (query, &res);
3226     GST_DEBUG_OBJECT (pad, "query returned %d", res);
3227   }
3228   gst_query_unref (query);
3229
3230   return res;
3231 }
3232
3233 static GstPad *
3234 element_find_unlinked_pad (GstElement * element, GstPadDirection direction)
3235 {
3236   GstIterator *iter;
3237   GstPad *unlinked_pad = NULL;
3238   gboolean done;
3239   GValue data = { 0, };
3240
3241   switch (direction) {
3242     case GST_PAD_SRC:
3243       iter = gst_element_iterate_src_pads (element);
3244       break;
3245     case GST_PAD_SINK:
3246       iter = gst_element_iterate_sink_pads (element);
3247       break;
3248     default:
3249       g_return_val_if_reached (NULL);
3250   }
3251
3252   done = FALSE;
3253   while (!done) {
3254     switch (gst_iterator_next (iter, &data)) {
3255       case GST_ITERATOR_OK:{
3256         GstPad *peer;
3257         GstPad *pad = g_value_get_object (&data);
3258
3259         GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
3260             GST_DEBUG_PAD_NAME (pad));
3261
3262         peer = gst_pad_get_peer (pad);
3263         if (peer == NULL) {
3264           unlinked_pad = gst_object_ref (pad);
3265           done = TRUE;
3266           GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
3267               "found existing unlinked pad %s:%s",
3268               GST_DEBUG_PAD_NAME (unlinked_pad));
3269         } else {
3270           gst_object_unref (peer);
3271         }
3272         g_value_reset (&data);
3273         break;
3274       }
3275       case GST_ITERATOR_DONE:
3276         done = TRUE;
3277         break;
3278       case GST_ITERATOR_RESYNC:
3279         gst_iterator_resync (iter);
3280         break;
3281       case GST_ITERATOR_ERROR:
3282         g_return_val_if_reached (NULL);
3283         break;
3284     }
3285   }
3286   g_value_unset (&data);
3287   gst_iterator_free (iter);
3288
3289   return unlinked_pad;
3290 }
3291
3292 /**
3293  * gst_bin_find_unlinked_pad:
3294  * @bin: bin in which to look for elements with unlinked pads
3295  * @direction: whether to look for an unlinked source or sink pad
3296  *
3297  * Recursively looks for elements with an unlinked pad of the given
3298  * direction within the specified bin and returns an unlinked pad
3299  * if one is found, or %NULL otherwise. If a pad is found, the caller
3300  * owns a reference to it and should use gst_object_unref() on the
3301  * pad when it is not needed any longer.
3302  *
3303  * Returns: (transfer full) (nullable): unlinked pad of the given
3304  * direction.
3305  */
3306 GstPad *
3307 gst_bin_find_unlinked_pad (GstBin * bin, GstPadDirection direction)
3308 {
3309   GstIterator *iter;
3310   gboolean done;
3311   GstPad *pad = NULL;
3312   GValue data = { 0, };
3313
3314   g_return_val_if_fail (GST_IS_BIN (bin), NULL);
3315   g_return_val_if_fail (direction != GST_PAD_UNKNOWN, NULL);
3316
3317   done = FALSE;
3318   iter = gst_bin_iterate_recurse (bin);
3319   while (!done) {
3320     switch (gst_iterator_next (iter, &data)) {
3321       case GST_ITERATOR_OK:{
3322         GstElement *element = g_value_get_object (&data);
3323
3324         pad = element_find_unlinked_pad (element, direction);
3325         if (pad != NULL)
3326           done = TRUE;
3327         g_value_reset (&data);
3328         break;
3329       }
3330       case GST_ITERATOR_DONE:
3331         done = TRUE;
3332         break;
3333       case GST_ITERATOR_RESYNC:
3334         gst_iterator_resync (iter);
3335         break;
3336       case GST_ITERATOR_ERROR:
3337         g_return_val_if_reached (NULL);
3338         break;
3339     }
3340   }
3341   g_value_unset (&data);
3342   gst_iterator_free (iter);
3343
3344   return pad;
3345 }
3346
3347 static void
3348 gst_bin_sync_children_states_foreach (const GValue * value, gpointer user_data)
3349 {
3350   gboolean *success = user_data;
3351   GstElement *element = g_value_get_object (value);
3352
3353   if (gst_element_is_locked_state (element)) {
3354     *success = TRUE;
3355   } else {
3356     *success = *success && gst_element_sync_state_with_parent (element);
3357
3358     if (GST_IS_BIN (element))
3359       *success = *success
3360           && gst_bin_sync_children_states (GST_BIN_CAST (element));
3361   }
3362 }
3363
3364 /**
3365  * gst_bin_sync_children_states:
3366  * @bin: a #GstBin
3367  *
3368  * Synchronizes the state of every child of @bin with the state
3369  * of @bin. See also gst_element_sync_state_with_parent().
3370  *
3371  * Returns: %TRUE if syncing the state was successful for all children,
3372  *  otherwise %FALSE.
3373  *
3374  * Since: 1.6
3375  */
3376 gboolean
3377 gst_bin_sync_children_states (GstBin * bin)
3378 {
3379   GstIterator *it;
3380   GstIteratorResult res = GST_ITERATOR_OK;
3381   gboolean success = TRUE;
3382
3383   it = gst_bin_iterate_sorted (bin);
3384
3385   do {
3386     if (res == GST_ITERATOR_RESYNC) {
3387       success = TRUE;
3388       gst_iterator_resync (it);
3389     }
3390     res =
3391         gst_iterator_foreach (it, gst_bin_sync_children_states_foreach,
3392         &success);
3393   } while (res == GST_ITERATOR_RESYNC);
3394   gst_iterator_free (it);
3395
3396   return success;
3397 }
3398
3399 /**
3400  * gst_parse_bin_from_description:
3401  * @bin_description: command line describing the bin
3402  * @ghost_unlinked_pads: whether to automatically create ghost pads
3403  *     for unlinked source or sink pads within the bin
3404  * @err: where to store the error message in case of an error, or %NULL
3405  *
3406  * This is a convenience wrapper around gst_parse_launch() to create a
3407  * #GstBin from a gst-launch-style pipeline description. See
3408  * gst_parse_launch() and the gst-launch man page for details about the
3409  * syntax. Ghost pads on the bin for unlinked source or sink pads
3410  * within the bin can automatically be created (but only a maximum of
3411  * one ghost pad for each direction will be created; if you expect
3412  * multiple unlinked source pads or multiple unlinked sink pads
3413  * and want them all ghosted, you will have to create the ghost pads
3414  * yourself).
3415  *
3416  * Returns: (transfer floating) (type Gst.Bin): a
3417  *   newly-created bin, or %NULL if an error occurred.
3418  */
3419 GstElement *
3420 gst_parse_bin_from_description (const gchar * bin_description,
3421     gboolean ghost_unlinked_pads, GError ** err)
3422 {
3423   return gst_parse_bin_from_description_full (bin_description,
3424       ghost_unlinked_pads, NULL, GST_PARSE_FLAG_NONE, err);
3425 }
3426
3427 /**
3428  * gst_parse_bin_from_description_full:
3429  * @bin_description: command line describing the bin
3430  * @ghost_unlinked_pads: whether to automatically create ghost pads
3431  *     for unlinked source or sink pads within the bin
3432  * @context: (transfer none) (nullable): a parse context allocated with
3433  *     gst_parse_context_new(), or %NULL
3434  * @flags: parsing options, or #GST_PARSE_FLAG_NONE
3435  * @err: where to store the error message in case of an error, or %NULL
3436  *
3437  * This is a convenience wrapper around gst_parse_launch() to create a
3438  * #GstBin from a gst-launch-style pipeline description. See
3439  * gst_parse_launch() and the gst-launch man page for details about the
3440  * syntax. Ghost pads on the bin for unlinked source or sink pads
3441  * within the bin can automatically be created (but only a maximum of
3442  * one ghost pad for each direction will be created; if you expect
3443  * multiple unlinked source pads or multiple unlinked sink pads
3444  * and want them all ghosted, you will have to create the ghost pads
3445  * yourself).
3446  *
3447  * Returns: (transfer floating) (type Gst.Element): a newly-created
3448  *   element, which is guaranteed to be a bin unless
3449  *   #GST_PARSE_FLAG_NO_SINGLE_ELEMENT_BINS was passed, or %NULL if an error
3450  *   occurred.
3451  */
3452 GstElement *
3453 gst_parse_bin_from_description_full (const gchar * bin_description,
3454     gboolean ghost_unlinked_pads, GstParseContext * context,
3455     GstParseFlags flags, GError ** err)
3456 {
3457 #ifndef GST_DISABLE_PARSE
3458   GstPad *pad = NULL;
3459   GstElement *element;
3460   GstBin *bin;
3461   gchar *desc;
3462
3463   g_return_val_if_fail (bin_description != NULL, NULL);
3464   g_return_val_if_fail (err == NULL || *err == NULL, NULL);
3465
3466   GST_DEBUG ("Making bin from description '%s'", bin_description);
3467
3468   /* parse the pipeline to a bin */
3469   if (flags & GST_PARSE_FLAG_NO_SINGLE_ELEMENT_BINS) {
3470     element = gst_parse_launch_full (bin_description, context, flags, err);
3471   } else {
3472     desc = g_strdup_printf ("bin.( %s )", bin_description);
3473     element = gst_parse_launch_full (desc, context, flags, err);
3474     g_free (desc);
3475   }
3476
3477   if (element == NULL || (err && *err != NULL)) {
3478     if (element)
3479       gst_object_unref (element);
3480     return NULL;
3481   }
3482
3483   if (GST_IS_BIN (element)) {
3484     bin = GST_BIN (element);
3485   } else {
3486     return element;
3487   }
3488
3489   /* find pads and ghost them if necessary */
3490   if (ghost_unlinked_pads) {
3491     if ((pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SRC))) {
3492       gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("src", pad));
3493       gst_object_unref (pad);
3494     }
3495     if ((pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SINK))) {
3496       gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad));
3497       gst_object_unref (pad);
3498     }
3499   }
3500
3501   return GST_ELEMENT (bin);
3502 #else
3503   gchar *msg;
3504
3505   GST_WARNING ("Disabled API called");
3506
3507   msg = gst_error_get_message (GST_CORE_ERROR, GST_CORE_ERROR_DISABLED);
3508   g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_DISABLED, "%s", msg);
3509   g_free (msg);
3510
3511   return NULL;
3512 #endif
3513 }
3514
3515 /**
3516  * gst_util_get_timestamp:
3517  *
3518  * Get a timestamp as GstClockTime to be used for interval measurements.
3519  * The timestamp should not be interpreted in any other way.
3520  *
3521  * Returns: the timestamp
3522  */
3523 GstClockTime
3524 gst_util_get_timestamp (void)
3525 {
3526 #if defined (HAVE_POSIX_TIMERS) && defined(HAVE_MONOTONIC_CLOCK) &&\
3527     defined (HAVE_CLOCK_GETTIME)
3528   struct timespec now;
3529
3530   clock_gettime (CLOCK_MONOTONIC, &now);
3531   return GST_TIMESPEC_TO_TIME (now);
3532 #else
3533   return g_get_monotonic_time () * 1000;
3534 #endif
3535 }
3536
3537 /**
3538  * gst_util_array_binary_search:
3539  * @array: the sorted input array
3540  * @num_elements: number of elements in the array
3541  * @element_size: size of every element in bytes
3542  * @search_func: (scope call): function to compare two elements, @search_data will always be passed as second argument
3543  * @mode: search mode that should be used
3544  * @search_data: element that should be found
3545  * @user_data: (closure): data to pass to @search_func
3546  *
3547  * Searches inside @array for @search_data by using the comparison function
3548  * @search_func. @array must be sorted ascending.
3549  *
3550  * As @search_data is always passed as second argument to @search_func it's
3551  * not required that @search_data has the same type as the array elements.
3552  *
3553  * The complexity of this search function is O(log (num_elements)).
3554  *
3555  * Returns: (transfer none) (nullable): The address of the found
3556  * element or %NULL if nothing was found
3557  */
3558 gpointer
3559 gst_util_array_binary_search (gpointer array, guint num_elements,
3560     gsize element_size, GCompareDataFunc search_func, GstSearchMode mode,
3561     gconstpointer search_data, gpointer user_data)
3562 {
3563   glong left = 0, right = num_elements - 1, m;
3564   gint ret;
3565   guint8 *data = (guint8 *) array;
3566
3567   g_return_val_if_fail (array != NULL, NULL);
3568   g_return_val_if_fail (element_size > 0, NULL);
3569   g_return_val_if_fail (search_func != NULL, NULL);
3570
3571   /* 0. No elements => return NULL */
3572   if (num_elements == 0)
3573     return NULL;
3574
3575   /* 1. If search_data is before the 0th element return the 0th element */
3576   ret = search_func (data, search_data, user_data);
3577   if ((ret >= 0 && mode == GST_SEARCH_MODE_AFTER) || ret == 0)
3578     return data;
3579   else if (ret > 0)
3580     return NULL;
3581
3582   /* 2. If search_data is after the last element return the last element */
3583   ret =
3584       search_func (data + (num_elements - 1) * element_size, search_data,
3585       user_data);
3586   if ((ret <= 0 && mode == GST_SEARCH_MODE_BEFORE) || ret == 0)
3587     return data + (num_elements - 1) * element_size;
3588   else if (ret < 0)
3589     return NULL;
3590
3591   /* 3. else binary search */
3592   while (TRUE) {
3593     m = left + (right - left) / 2;
3594
3595     ret = search_func (data + m * element_size, search_data, user_data);
3596
3597     if (ret == 0) {
3598       return data + m * element_size;
3599     } else if (ret < 0) {
3600       left = m + 1;
3601     } else {
3602       right = m - 1;
3603     }
3604
3605     /* No exact match found */
3606     if (right < left) {
3607       if (mode == GST_SEARCH_MODE_EXACT) {
3608         return NULL;
3609       } else if (mode == GST_SEARCH_MODE_AFTER) {
3610         if (ret < 0)
3611           return (m < num_elements) ? data + (m + 1) * element_size : NULL;
3612         else
3613           return data + m * element_size;
3614       } else {
3615         if (ret < 0)
3616           return data + m * element_size;
3617         else
3618           return (m > 0) ? data + (m - 1) * element_size : NULL;
3619       }
3620     }
3621   }
3622 }
3623
3624 /* Finds the greatest common divisor.
3625  * Returns 1 if none other found.
3626  * This is Euclid's algorithm. */
3627
3628 /**
3629  * gst_util_greatest_common_divisor:
3630  * @a: First value as #gint
3631  * @b: Second value as #gint
3632  *
3633  * Calculates the greatest common divisor of @a
3634  * and @b.
3635  *
3636  * Returns: Greatest common divisor of @a and @b
3637  */
3638 gint
3639 gst_util_greatest_common_divisor (gint a, gint b)
3640 {
3641   while (b != 0) {
3642     int temp = a;
3643
3644     a = b;
3645     b = temp % b;
3646   }
3647
3648   return ABS (a);
3649 }
3650
3651 /**
3652  * gst_util_greatest_common_divisor_int64:
3653  * @a: First value as #gint64
3654  * @b: Second value as #gint64
3655  *
3656  * Calculates the greatest common divisor of @a
3657  * and @b.
3658  *
3659  * Returns: Greatest common divisor of @a and @b
3660  */
3661 gint64
3662 gst_util_greatest_common_divisor_int64 (gint64 a, gint64 b)
3663 {
3664   while (b != 0) {
3665     gint64 temp = a;
3666
3667     a = b;
3668     b = temp % b;
3669   }
3670
3671   return ABS (a);
3672 }
3673
3674
3675 /**
3676  * gst_util_fraction_to_double:
3677  * @src_n: Fraction numerator as #gint
3678  * @src_d: Fraction denominator #gint
3679  * @dest: (out): pointer to a #gdouble for the result
3680  *
3681  * Transforms a fraction to a #gdouble.
3682  */
3683 void
3684 gst_util_fraction_to_double (gint src_n, gint src_d, gdouble * dest)
3685 {
3686   g_return_if_fail (dest != NULL);
3687   g_return_if_fail (src_d != 0);
3688
3689   *dest = ((gdouble) src_n) / ((gdouble) src_d);
3690 }
3691
3692 #define MAX_TERMS       30
3693 #define MIN_DIVISOR     1.0e-10
3694 #define MAX_ERROR       1.0e-20
3695
3696 /* use continued fractions to transform a double into a fraction,
3697  * see http://mathforum.org/dr.math/faq/faq.fractions.html#decfrac.
3698  * This algorithm takes care of overflows.
3699  */
3700
3701 /**
3702  * gst_util_double_to_fraction:
3703  * @src: #gdouble to transform
3704  * @dest_n: (out): pointer to a #gint to hold the result numerator
3705  * @dest_d: (out): pointer to a #gint to hold the result denominator
3706  *
3707  * Transforms a #gdouble to a fraction and simplifies
3708  * the result.
3709  */
3710 void
3711 gst_util_double_to_fraction (gdouble src, gint * dest_n, gint * dest_d)
3712 {
3713
3714   gdouble V, F;                 /* double being converted */
3715   gint N, D;                    /* will contain the result */
3716   gint A;                       /* current term in continued fraction */
3717   gint64 N1, D1;                /* numerator, denominator of last approx */
3718   gint64 N2, D2;                /* numerator, denominator of previous approx */
3719   gint i;
3720   gint gcd;
3721   gboolean negative = FALSE;
3722
3723   g_return_if_fail (dest_n != NULL);
3724   g_return_if_fail (dest_d != NULL);
3725
3726   /* initialize fraction being converted */
3727   F = src;
3728   if (F < 0.0) {
3729     F = -F;
3730     negative = TRUE;
3731   }
3732
3733   V = F;
3734   /* initialize fractions with 1/0, 0/1 */
3735   N1 = 1;
3736   D1 = 0;
3737   N2 = 0;
3738   D2 = 1;
3739   N = 1;
3740   D = 1;
3741
3742   for (i = 0; i < MAX_TERMS; i++) {
3743     /* get next term */
3744     A = (gint) F;               /* no floor() needed, F is always >= 0 */
3745     /* get new divisor */
3746     F = F - A;
3747
3748     /* calculate new fraction in temp */
3749     N2 = N1 * A + N2;
3750     D2 = D1 * A + D2;
3751
3752     /* guard against overflow */
3753     if (N2 > G_MAXINT || D2 > G_MAXINT) {
3754       break;
3755     }
3756
3757     N = N2;
3758     D = D2;
3759
3760     /* save last two fractions */
3761     N2 = N1;
3762     D2 = D1;
3763     N1 = N;
3764     D1 = D;
3765
3766     /* quit if dividing by zero or close enough to target */
3767     if (F < MIN_DIVISOR || fabs (V - ((gdouble) N) / D) < MAX_ERROR) {
3768       break;
3769     }
3770
3771     /* Take reciprocal */
3772     F = 1 / F;
3773   }
3774   /* fix for overflow */
3775   if (D == 0) {
3776     N = G_MAXINT;
3777     D = 1;
3778   }
3779   /* fix for negative */
3780   if (negative)
3781     N = -N;
3782
3783   /* simplify */
3784   gcd = gst_util_greatest_common_divisor (N, D);
3785   if (gcd) {
3786     N /= gcd;
3787     D /= gcd;
3788   }
3789
3790   /* set results */
3791   *dest_n = N;
3792   *dest_d = D;
3793 }
3794
3795 /**
3796  * gst_util_fraction_multiply:
3797  * @a_n: Numerator of first value
3798  * @a_d: Denominator of first value
3799  * @b_n: Numerator of second value
3800  * @b_d: Denominator of second value
3801  * @res_n: (out): Pointer to #gint to hold the result numerator
3802  * @res_d: (out): Pointer to #gint to hold the result denominator
3803  *
3804  * Multiplies the fractions @a_n/@a_d and @b_n/@b_d and stores
3805  * the result in @res_n and @res_d.
3806  *
3807  * Returns: %FALSE on overflow, %TRUE otherwise.
3808  */
3809 gboolean
3810 gst_util_fraction_multiply (gint a_n, gint a_d, gint b_n, gint b_d,
3811     gint * res_n, gint * res_d)
3812 {
3813   gint gcd;
3814
3815   g_return_val_if_fail (res_n != NULL, FALSE);
3816   g_return_val_if_fail (res_d != NULL, FALSE);
3817   g_return_val_if_fail (a_d != 0, FALSE);
3818   g_return_val_if_fail (b_d != 0, FALSE);
3819
3820   /* early out if either is 0, as its gcd would be 0 */
3821   if (a_n == 0 || b_n == 0) {
3822     *res_n = 0;
3823     *res_d = 1;
3824     return TRUE;
3825   }
3826
3827   gcd = gst_util_greatest_common_divisor (a_n, a_d);
3828   a_n /= gcd;
3829   a_d /= gcd;
3830
3831   gcd = gst_util_greatest_common_divisor (b_n, b_d);
3832   b_n /= gcd;
3833   b_d /= gcd;
3834
3835   gcd = gst_util_greatest_common_divisor (a_n, b_d);
3836   a_n /= gcd;
3837   b_d /= gcd;
3838
3839   gcd = gst_util_greatest_common_divisor (a_d, b_n);
3840   a_d /= gcd;
3841   b_n /= gcd;
3842
3843   /* This would result in overflow */
3844   if (a_n != 0 && G_MAXINT / ABS (a_n) < ABS (b_n))
3845     return FALSE;
3846   if (G_MAXINT / ABS (a_d) < ABS (b_d))
3847     return FALSE;
3848
3849   *res_n = a_n * b_n;
3850   *res_d = a_d * b_d;
3851
3852   gcd = gst_util_greatest_common_divisor (*res_n, *res_d);
3853   *res_n /= gcd;
3854   *res_d /= gcd;
3855
3856   return TRUE;
3857 }
3858
3859 /**
3860  * gst_util_fraction_add:
3861  * @a_n: Numerator of first value
3862  * @a_d: Denominator of first value
3863  * @b_n: Numerator of second value
3864  * @b_d: Denominator of second value
3865  * @res_n: (out): Pointer to #gint to hold the result numerator
3866  * @res_d: (out): Pointer to #gint to hold the result denominator
3867  *
3868  * Adds the fractions @a_n/@a_d and @b_n/@b_d and stores
3869  * the result in @res_n and @res_d.
3870  *
3871  * Returns: %FALSE on overflow, %TRUE otherwise.
3872  */
3873 gboolean
3874 gst_util_fraction_add (gint a_n, gint a_d, gint b_n, gint b_d, gint * res_n,
3875     gint * res_d)
3876 {
3877   gint gcd;
3878
3879   g_return_val_if_fail (res_n != NULL, FALSE);
3880   g_return_val_if_fail (res_d != NULL, FALSE);
3881   g_return_val_if_fail (a_d != 0, FALSE);
3882   g_return_val_if_fail (b_d != 0, FALSE);
3883
3884   gcd = gst_util_greatest_common_divisor (a_n, a_d);
3885   a_n /= gcd;
3886   a_d /= gcd;
3887
3888   gcd = gst_util_greatest_common_divisor (b_n, b_d);
3889   b_n /= gcd;
3890   b_d /= gcd;
3891
3892   if (a_n == 0) {
3893     *res_n = b_n;
3894     *res_d = b_d;
3895     return TRUE;
3896   }
3897   if (b_n == 0) {
3898     *res_n = a_n;
3899     *res_d = a_d;
3900     return TRUE;
3901   }
3902
3903   /* This would result in overflow */
3904   if (G_MAXINT / ABS (a_n) < ABS (b_n))
3905     return FALSE;
3906   if (G_MAXINT / ABS (a_d) < ABS (b_d))
3907     return FALSE;
3908
3909   *res_n = (a_n * b_d) + (a_d * b_n);
3910   *res_d = a_d * b_d;
3911
3912   gcd = gst_util_greatest_common_divisor (*res_n, *res_d);
3913   if (gcd) {
3914     *res_n /= gcd;
3915     *res_d /= gcd;
3916   } else {
3917     /* res_n == 0 */
3918     *res_d = 1;
3919   }
3920
3921   return TRUE;
3922 }
3923
3924 /**
3925  * gst_util_fraction_compare:
3926  * @a_n: Numerator of first value
3927  * @a_d: Denominator of first value
3928  * @b_n: Numerator of second value
3929  * @b_d: Denominator of second value
3930  *
3931  * Compares the fractions @a_n/@a_d and @b_n/@b_d and returns
3932  * -1 if a < b, 0 if a = b and 1 if a > b.
3933  *
3934  * Returns: -1 if a < b; 0 if a = b; 1 if a > b.
3935  */
3936 gint
3937 gst_util_fraction_compare (gint a_n, gint a_d, gint b_n, gint b_d)
3938 {
3939   gint64 new_num_1;
3940   gint64 new_num_2;
3941   gint gcd;
3942
3943   g_return_val_if_fail (a_d != 0 && b_d != 0, 0);
3944
3945   /* Simplify */
3946   gcd = gst_util_greatest_common_divisor (a_n, a_d);
3947   a_n /= gcd;
3948   a_d /= gcd;
3949
3950   gcd = gst_util_greatest_common_divisor (b_n, b_d);
3951   b_n /= gcd;
3952   b_d /= gcd;
3953
3954   /* fractions are reduced when set, so we can quickly see if they're equal */
3955   if (a_n == b_n && a_d == b_d)
3956     return 0;
3957
3958   /* extend to 64 bits */
3959   new_num_1 = ((gint64) a_n) * b_d;
3960   new_num_2 = ((gint64) b_n) * a_d;
3961   if (new_num_1 < new_num_2)
3962     return -1;
3963   if (new_num_1 > new_num_2)
3964     return 1;
3965
3966   /* Should not happen because a_d and b_d are not 0 */
3967   g_return_val_if_reached (0);
3968 }
3969
3970 static gchar *
3971 gst_pad_create_stream_id_internal (GstPad * pad, GstElement * parent,
3972     const gchar * stream_id)
3973 {
3974   GstEvent *upstream_event;
3975   gchar *upstream_stream_id = NULL, *new_stream_id;
3976   GstPad *sinkpad;
3977
3978   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
3979   g_return_val_if_fail (GST_PAD_IS_SRC (pad), NULL);
3980   g_return_val_if_fail (GST_IS_ELEMENT (parent), NULL);
3981
3982   g_return_val_if_fail (parent->numsinkpads <= 1, NULL);
3983
3984   /* If the element has multiple source pads it must
3985    * provide a stream-id for every source pad, otherwise
3986    * all source pads will have the same and are not
3987    * distinguishable */
3988   g_return_val_if_fail (parent->numsrcpads <= 1 || stream_id, NULL);
3989
3990   /* First try to get the upstream stream-start stream-id from the sinkpad.
3991    * This will only work for non-source elements */
3992   sinkpad = gst_element_get_static_pad (parent, "sink");
3993   if (sinkpad) {
3994     upstream_event =
3995         gst_pad_get_sticky_event (sinkpad, GST_EVENT_STREAM_START, 0);
3996     if (upstream_event) {
3997       const gchar *tmp;
3998
3999       gst_event_parse_stream_start (upstream_event, &tmp);
4000       if (tmp)
4001         upstream_stream_id = g_strdup (tmp);
4002       gst_event_unref (upstream_event);
4003     }
4004     gst_object_unref (sinkpad);
4005   }
4006
4007   /* The only case where we don't have an upstream stream-start event
4008    * here is for source elements */
4009   if (!upstream_stream_id) {
4010     GstQuery *query;
4011     gchar *uri = NULL;
4012
4013     /* Try to generate one from the URI query and
4014      * if it fails take a random number instead */
4015     query = gst_query_new_uri ();
4016     if (gst_element_query (parent, query)) {
4017       gst_query_parse_uri (query, &uri);
4018     }
4019
4020     if (uri) {
4021       GChecksum *cs;
4022
4023       /* And then generate an SHA256 sum of the URI */
4024       cs = g_checksum_new (G_CHECKSUM_SHA256);
4025       g_checksum_update (cs, (const guchar *) uri, strlen (uri));
4026       g_free (uri);
4027       upstream_stream_id = g_strdup (g_checksum_get_string (cs));
4028       g_checksum_free (cs);
4029     } else {
4030       /* Just get some random number if the URI query fails */
4031       GST_FIXME_OBJECT (pad, "Creating random stream-id, consider "
4032           "implementing a deterministic way of creating a stream-id");
4033       upstream_stream_id =
4034           g_strdup_printf ("%08x%08x%08x%08x", g_random_int (), g_random_int (),
4035           g_random_int (), g_random_int ());
4036     }
4037
4038     gst_query_unref (query);
4039   }
4040
4041   if (stream_id) {
4042     new_stream_id = g_strconcat (upstream_stream_id, "/", stream_id, NULL);
4043   } else {
4044     new_stream_id = g_strdup (upstream_stream_id);
4045   }
4046
4047   g_free (upstream_stream_id);
4048
4049   return new_stream_id;
4050 }
4051
4052 /**
4053  * gst_pad_create_stream_id_printf_valist:
4054  * @pad: A source #GstPad
4055  * @parent: Parent #GstElement of @pad
4056  * @stream_id: (nullable): The stream-id
4057  * @var_args: parameters for the @stream_id format string
4058  *
4059  * Creates a stream-id for the source #GstPad @pad by combining the
4060  * upstream information with the optional @stream_id of the stream
4061  * of @pad. @pad must have a parent #GstElement and which must have zero
4062  * or one sinkpad. @stream_id can only be %NULL if the parent element
4063  * of @pad has only a single source pad.
4064  *
4065  * This function generates an unique stream-id by getting the upstream
4066  * stream-start event stream ID and appending @stream_id to it. If the
4067  * element has no sinkpad it will generate an upstream stream-id by
4068  * doing an URI query on the element and in the worst case just uses
4069  * a random number. Source elements that don't implement the URI
4070  * handler interface should ideally generate a unique, deterministic
4071  * stream-id manually instead.
4072  *
4073  * Returns: A stream-id for @pad. g_free() after usage.
4074  */
4075 gchar *
4076 gst_pad_create_stream_id_printf_valist (GstPad * pad, GstElement * parent,
4077     const gchar * stream_id, va_list var_args)
4078 {
4079   gchar *expanded = NULL, *new_stream_id;
4080
4081   if (stream_id)
4082     expanded = g_strdup_vprintf (stream_id, var_args);
4083
4084   new_stream_id = gst_pad_create_stream_id_internal (pad, parent, expanded);
4085
4086   g_free (expanded);
4087
4088   return new_stream_id;
4089 }
4090
4091 /**
4092  * gst_pad_create_stream_id_printf:
4093  * @pad: A source #GstPad
4094  * @parent: Parent #GstElement of @pad
4095  * @stream_id: (nullable): The stream-id
4096  * @...: parameters for the @stream_id format string
4097  *
4098  * Creates a stream-id for the source #GstPad @pad by combining the
4099  * upstream information with the optional @stream_id of the stream
4100  * of @pad. @pad must have a parent #GstElement and which must have zero
4101  * or one sinkpad. @stream_id can only be %NULL if the parent element
4102  * of @pad has only a single source pad.
4103  *
4104  * This function generates an unique stream-id by getting the upstream
4105  * stream-start event stream ID and appending @stream_id to it. If the
4106  * element has no sinkpad it will generate an upstream stream-id by
4107  * doing an URI query on the element and in the worst case just uses
4108  * a random number. Source elements that don't implement the URI
4109  * handler interface should ideally generate a unique, deterministic
4110  * stream-id manually instead.
4111  *
4112  * Returns: A stream-id for @pad. g_free() after usage.
4113  */
4114 gchar *
4115 gst_pad_create_stream_id_printf (GstPad * pad, GstElement * parent,
4116     const gchar * stream_id, ...)
4117 {
4118   va_list var_args;
4119   gchar *new_stream_id;
4120
4121   va_start (var_args, stream_id);
4122   new_stream_id =
4123       gst_pad_create_stream_id_printf_valist (pad, parent, stream_id, var_args);
4124   va_end (var_args);
4125
4126   return new_stream_id;
4127 }
4128
4129 /**
4130  * gst_pad_create_stream_id:
4131  * @pad: A source #GstPad
4132  * @parent: Parent #GstElement of @pad
4133  * @stream_id: (nullable): The stream-id
4134  *
4135  * Creates a stream-id for the source #GstPad @pad by combining the
4136  * upstream information with the optional @stream_id of the stream
4137  * of @pad. @pad must have a parent #GstElement and which must have zero
4138  * or one sinkpad. @stream_id can only be %NULL if the parent element
4139  * of @pad has only a single source pad.
4140  *
4141  * This function generates an unique stream-id by getting the upstream
4142  * stream-start event stream ID and appending @stream_id to it. If the
4143  * element has no sinkpad it will generate an upstream stream-id by
4144  * doing an URI query on the element and in the worst case just uses
4145  * a random number. Source elements that don't implement the URI
4146  * handler interface should ideally generate a unique, deterministic
4147  * stream-id manually instead.
4148  *
4149  * Since stream IDs are sorted alphabetically, any numbers in the
4150  * stream ID should be printed with a fixed number of characters,
4151  * preceded by 0's, such as by using the format \%03u instead of \%u.
4152  *
4153  * Returns: A stream-id for @pad. g_free() after usage.
4154  */
4155 gchar *
4156 gst_pad_create_stream_id (GstPad * pad, GstElement * parent,
4157     const gchar * stream_id)
4158 {
4159   return gst_pad_create_stream_id_internal (pad, parent, stream_id);
4160 }
4161
4162 /**
4163  * gst_pad_get_stream_id:
4164  * @pad: A source #GstPad
4165  *
4166  * Returns the current stream-id for the @pad, or %NULL if none has been
4167  * set yet, i.e. the pad has not received a stream-start event yet.
4168  *
4169  * This is a convenience wrapper around gst_pad_get_sticky_event() and
4170  * gst_event_parse_stream_start().
4171  *
4172  * The returned stream-id string should be treated as an opaque string, its
4173  * contents should not be interpreted.
4174  *
4175  * Returns: (nullable): a newly-allocated copy of the stream-id for
4176  *     @pad, or %NULL.  g_free() the returned string when no longer
4177  *     needed.
4178  *
4179  * Since: 1.2
4180  */
4181 gchar *
4182 gst_pad_get_stream_id (GstPad * pad)
4183 {
4184   const gchar *stream_id = NULL;
4185   GstEvent *event;
4186   gchar *ret = NULL;
4187
4188   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
4189
4190   event = gst_pad_get_sticky_event (pad, GST_EVENT_STREAM_START, 0);
4191   if (event != NULL) {
4192     gst_event_parse_stream_start (event, &stream_id);
4193     ret = g_strdup (stream_id);
4194     gst_event_unref (event);
4195     GST_LOG_OBJECT (pad, "pad has stream-id '%s'", ret);
4196   } else {
4197     GST_DEBUG_OBJECT (pad, "pad has not received a stream-start event yet");
4198   }
4199
4200   return ret;
4201 }
4202
4203 /**
4204  * gst_pad_get_stream:
4205  * @pad: A source #GstPad
4206  *
4207  * Returns the current #GstStream for the @pad, or %NULL if none has been
4208  * set yet, i.e. the pad has not received a stream-start event yet.
4209  *
4210  * This is a convenience wrapper around gst_pad_get_sticky_event() and
4211  * gst_event_parse_stream().
4212  *
4213  * Returns: (nullable) (transfer full): the current #GstStream for @pad, or %NULL.
4214  *     unref the returned stream when no longer needed.
4215  *
4216  * Since: 1.10
4217  */
4218 GstStream *
4219 gst_pad_get_stream (GstPad * pad)
4220 {
4221   GstStream *stream = NULL;
4222   GstEvent *event;
4223
4224   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
4225
4226   event = gst_pad_get_sticky_event (pad, GST_EVENT_STREAM_START, 0);
4227   if (event != NULL) {
4228     gst_event_parse_stream (event, &stream);
4229     gst_event_unref (event);
4230     GST_LOG_OBJECT (pad, "pad has stream object %p", stream);
4231   } else {
4232     GST_DEBUG_OBJECT (pad, "pad has not received a stream-start event yet");
4233   }
4234
4235   return stream;
4236 }
4237
4238 /**
4239  * gst_util_group_id_next:
4240  *
4241  * Return a constantly incrementing group id.
4242  *
4243  * This function is used to generate a new group-id for the
4244  * stream-start event.
4245  *
4246  * This function never returns %GST_GROUP_ID_INVALID (which is 0)
4247  *
4248  * Returns: A constantly incrementing unsigned integer, which might
4249  * overflow back to 0 at some point.
4250  */
4251 guint
4252 gst_util_group_id_next (void)
4253 {
4254   static gint counter = 1;
4255   gint ret = g_atomic_int_add (&counter, 1);
4256
4257   /* Make sure we don't return GST_GROUP_ID_INVALID */
4258   if (G_UNLIKELY (ret == GST_GROUP_ID_INVALID))
4259     ret = g_atomic_int_add (&counter, 1);
4260
4261   return ret;
4262 }
4263
4264 /* Compute log2 of the passed 64-bit number by finding the highest set bit */
4265 static guint
4266 gst_log2 (GstClockTime in)
4267 {
4268   const guint64 b[] =
4269       { 0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000, 0xFFFFFFFF00000000LL };
4270   const guint64 S[] = { 1, 2, 4, 8, 16, 32 };
4271   int i;
4272
4273   guint count = 0;
4274   for (i = 5; i >= 0; i--) {
4275     if (in & b[i]) {
4276       in >>= S[i];
4277       count |= S[i];
4278     }
4279   }
4280
4281   return count;
4282 }
4283
4284 /**
4285  * gst_calculate_linear_regression: (skip)
4286  * @xy: Pairs of (x,y) values
4287  * @temp: Temporary scratch space used by the function
4288  * @n: number of (x,y) pairs
4289  * @m_num: (out): numerator of calculated slope
4290  * @m_denom: (out): denominator of calculated slope
4291  * @b: (out): Offset at Y-axis
4292  * @xbase: (out): Offset at X-axis
4293  * @r_squared: (out): R-squared
4294  *
4295  * Calculates the linear regression of the values @xy and places the
4296  * result in @m_num, @m_denom, @b and @xbase, representing the function
4297  *   y(x) = m_num/m_denom * (x - xbase) + b
4298  * that has the least-square distance from all points @x and @y.
4299  *
4300  * @r_squared will contain the remaining error.
4301  *
4302  * If @temp is not %NULL, it will be used as temporary space for the function,
4303  * in which case the function works without any allocation at all. If @temp is
4304  * %NULL, an allocation will take place. @temp should have at least the same
4305  * amount of memory allocated as @xy, i.e. 2*n*sizeof(GstClockTime).
4306  *
4307  * > This function assumes (x,y) values with reasonable large differences
4308  * > between them. It will not calculate the exact results if the differences
4309  * > between neighbouring values are too small due to not being able to
4310  * > represent sub-integer values during the calculations.
4311  *
4312  * Returns: %TRUE if the linear regression was successfully calculated
4313  *
4314  * Since: 1.12
4315  */
4316 /* http://mathworld.wolfram.com/LeastSquaresFitting.html
4317  * with SLAVE_LOCK
4318  */
4319 gboolean
4320 gst_calculate_linear_regression (const GstClockTime * xy,
4321     GstClockTime * temp, guint n,
4322     GstClockTime * m_num, GstClockTime * m_denom,
4323     GstClockTime * b, GstClockTime * xbase, gdouble * r_squared)
4324 {
4325   const GstClockTime *x, *y;
4326   GstClockTime *newx, *newy;
4327   GstClockTime xmin, ymin, xbar, ybar, xbar4, ybar4;
4328   GstClockTime xmax, ymax;
4329   GstClockTimeDiff sxx, sxy, syy;
4330   gint i, j;
4331   gint pshift = 0;
4332   gint max_bits;
4333
4334   g_return_val_if_fail (xy != NULL, FALSE);
4335   g_return_val_if_fail (m_num != NULL, FALSE);
4336   g_return_val_if_fail (m_denom != NULL, FALSE);
4337   g_return_val_if_fail (b != NULL, FALSE);
4338   g_return_val_if_fail (xbase != NULL, FALSE);
4339   g_return_val_if_fail (r_squared != NULL, FALSE);
4340
4341   x = xy;
4342   y = xy + 1;
4343
4344   xbar = ybar = sxx = syy = sxy = 0;
4345
4346   xmin = ymin = G_MAXUINT64;
4347   xmax = ymax = 0;
4348   for (i = j = 0; i < n; i++, j += 2) {
4349     xmin = MIN (xmin, x[j]);
4350     ymin = MIN (ymin, y[j]);
4351
4352     xmax = MAX (xmax, x[j]);
4353     ymax = MAX (ymax, y[j]);
4354   }
4355
4356   if (temp == NULL) {
4357     /* Allocate up to 1kb on the stack, otherwise heap */
4358     newx = n > 64 ? g_new (GstClockTime, 2 * n) : g_newa (GstClockTime, 2 * n);
4359     newy = newx + 1;
4360   } else {
4361     newx = temp;
4362     newy = temp + 1;
4363   }
4364
4365   /* strip off unnecessary bits of precision */
4366   for (i = j = 0; i < n; i++, j += 2) {
4367     newx[j] = x[j] - xmin;
4368     newy[j] = y[j] - ymin;
4369   }
4370
4371 #ifdef DEBUGGING_ENABLED
4372   GST_CAT_DEBUG (GST_CAT_CLOCK, "reduced numbers:");
4373   for (i = j = 0; i < n; i++, j += 2)
4374     GST_CAT_DEBUG (GST_CAT_CLOCK,
4375         "  %" G_GUINT64_FORMAT "  %" G_GUINT64_FORMAT, newx[j], newy[j]);
4376 #endif
4377
4378   /* have to do this precisely otherwise the results are pretty much useless.
4379    * should guarantee that none of these accumulators can overflow */
4380
4381   /* quantities on the order of 1e10 to 1e13 -> 30-35 bits;
4382    * window size a max of 2^10, so
4383    this addition could end up around 2^45 or so -- ample headroom */
4384   for (i = j = 0; i < n; i++, j += 2) {
4385     /* Just in case assumptions about headroom prove false, let's check */
4386     if ((newx[j] > 0 && G_MAXUINT64 - xbar <= newx[j]) ||
4387         (newy[j] > 0 && G_MAXUINT64 - ybar <= newy[j])) {
4388       GST_CAT_WARNING (GST_CAT_CLOCK,
4389           "Regression overflowed in clock slaving! xbar %"
4390           G_GUINT64_FORMAT " newx[j] %" G_GUINT64_FORMAT " ybar %"
4391           G_GUINT64_FORMAT " newy[j] %" G_GUINT64_FORMAT, xbar, newx[j], ybar,
4392           newy[j]);
4393       if (temp == NULL && n > 64)
4394         g_free (newx);
4395       return FALSE;
4396     }
4397
4398     xbar += newx[j];
4399     ybar += newy[j];
4400   }
4401   xbar /= n;
4402   ybar /= n;
4403
4404   /* multiplying directly would give quantities on the order of 1e20-1e26 ->
4405    * 60 bits to 70 bits times the window size that's 80 which is too much.
4406    * Instead we (1) subtract off the xbar*ybar in the loop instead of after,
4407    * to avoid accumulation; (2) shift off some estimated number of bits from
4408    * each multiplicand to limit the expected ceiling. For strange
4409    * distributions of input values, things can still overflow, in which
4410    * case we drop precision and retry - at most a few times, in practice rarely
4411    */
4412
4413   /* Guess how many bits we might need for the usual distribution of input,
4414    * with a fallback loop that drops precision if things go pear-shaped */
4415   max_bits = gst_log2 (MAX (xmax - xmin, ymax - ymin)) * 7 / 8 + gst_log2 (n);
4416   if (max_bits > 64)
4417     pshift = max_bits - 64;
4418
4419   i = 0;
4420   do {
4421 #ifdef DEBUGGING_ENABLED
4422     GST_CAT_DEBUG (GST_CAT_CLOCK,
4423         "Restarting regression with precision shift %u", pshift);
4424 #endif
4425
4426     xbar4 = xbar >> pshift;
4427     ybar4 = ybar >> pshift;
4428     sxx = syy = sxy = 0;
4429     for (i = j = 0; i < n; i++, j += 2) {
4430       GstClockTime newx4, newy4;
4431       GstClockTimeDiff tmp;
4432
4433       newx4 = newx[j] >> pshift;
4434       newy4 = newy[j] >> pshift;
4435
4436       tmp = (newx4 + xbar4) * (newx4 - xbar4);
4437       if (G_UNLIKELY (tmp > 0 && sxx > 0 && (G_MAXINT64 - sxx <= tmp))) {
4438         do {
4439           /* Drop some precision and restart */
4440           pshift++;
4441           sxx /= 4;
4442           tmp /= 4;
4443         } while (G_MAXINT64 - sxx <= tmp);
4444         break;
4445       } else if (G_UNLIKELY (tmp < 0 && sxx < 0 && (G_MININT64 - sxx >= tmp))) {
4446         do {
4447           /* Drop some precision and restart */
4448           pshift++;
4449           sxx /= 4;
4450           tmp /= 4;
4451         } while (G_MININT64 - sxx >= tmp);
4452         break;
4453       }
4454       sxx += tmp;
4455
4456       tmp = newy4 * newy4 - ybar4 * ybar4;
4457       if (G_UNLIKELY (tmp > 0 && syy > 0 && (G_MAXINT64 - syy <= tmp))) {
4458         do {
4459           pshift++;
4460           syy /= 4;
4461           tmp /= 4;
4462         } while (G_MAXINT64 - syy <= tmp);
4463         break;
4464       } else if (G_UNLIKELY (tmp < 0 && syy < 0 && (G_MININT64 - syy >= tmp))) {
4465         do {
4466           pshift++;
4467           syy /= 4;
4468           tmp /= 4;
4469         } while (G_MININT64 - syy >= tmp);
4470         break;
4471       }
4472       syy += tmp;
4473
4474       tmp = newx4 * newy4 - xbar4 * ybar4;
4475       if (G_UNLIKELY (tmp > 0 && sxy > 0 && (G_MAXINT64 - sxy <= tmp))) {
4476         do {
4477           pshift++;
4478           sxy /= 4;
4479           tmp /= 4;
4480         } while (G_MAXINT64 - sxy <= tmp);
4481         break;
4482       } else if (G_UNLIKELY (tmp < 0 && sxy < 0 && (G_MININT64 - sxy >= tmp))) {
4483         do {
4484           pshift++;
4485           sxy /= 4;
4486           tmp /= 4;
4487         } while (G_MININT64 - sxy >= tmp);
4488         break;
4489       }
4490       sxy += tmp;
4491     }
4492   } while (i < n);
4493
4494   if (G_UNLIKELY (sxx == 0))
4495     goto invalid;
4496
4497   *m_num = sxy;
4498   *m_denom = sxx;
4499   *b = (ymin + ybar) - gst_util_uint64_scale_round (xbar, *m_num, *m_denom);
4500   /* Report base starting from the most recent observation */
4501   *xbase = xmax;
4502   *b += gst_util_uint64_scale_round (xmax - xmin, *m_num, *m_denom);
4503
4504   *r_squared = ((double) sxy * (double) sxy) / ((double) sxx * (double) syy);
4505
4506 #ifdef DEBUGGING_ENABLED
4507   GST_CAT_DEBUG (GST_CAT_CLOCK, "  m      = %g", ((double) *m_num) / *m_denom);
4508   GST_CAT_DEBUG (GST_CAT_CLOCK, "  b      = %" G_GUINT64_FORMAT, *b);
4509   GST_CAT_DEBUG (GST_CAT_CLOCK, "  xbase  = %" G_GUINT64_FORMAT, *xbase);
4510   GST_CAT_DEBUG (GST_CAT_CLOCK, "  r2     = %g", *r_squared);
4511 #endif
4512
4513   if (temp == NULL && n > 64)
4514     g_free (newx);
4515
4516   return TRUE;
4517
4518 invalid:
4519   {
4520     GST_CAT_DEBUG (GST_CAT_CLOCK, "sxx == 0, regression failed");
4521     if (temp == NULL && n > 64)
4522       g_free (newx);
4523     return FALSE;
4524   }
4525 }
4526
4527 /**
4528  * gst_type_mark_as_plugin_api:
4529  * @type: a GType
4530  * @flags: a set of #GstPluginAPIFlags to further inform cache generation.
4531  *
4532  * Marks @type as plugin API. This should be called in `class_init` of
4533  * elements that expose new types (i.e. enums, flags or internal GObjects) via
4534  * properties, signals or pad templates.
4535  *
4536  * Types exposed by plugins are not automatically added to the documentation
4537  * as they might originate from another library and should in that case be
4538  * documented via that library instead.
4539  *
4540  * By marking a type as plugin API it will be included in the documentation of
4541  * the plugin that defines it.
4542  *
4543  * Since: 1.18
4544  */
4545 void
4546 gst_type_mark_as_plugin_api (GType type, GstPluginAPIFlags flags)
4547 {
4548   g_type_set_qdata (type, GST_QUARK (PLUGIN_API), GINT_TO_POINTER (TRUE));
4549   g_type_set_qdata (type, GST_QUARK (PLUGIN_API_FLAGS),
4550       GINT_TO_POINTER (flags));
4551 }
4552
4553 /**
4554  * gst_type_is_plugin_api:
4555  * @type: a GType
4556  * @flags: (out) (optional): What #GstPluginAPIFlags the plugin was marked with
4557  *
4558  * Checks if @type is plugin API. See gst_type_mark_as_plugin_api() for
4559  * details.
4560  *
4561  * Returns: %TRUE if @type is plugin API or %FALSE otherwise.
4562  *
4563  * Since: 1.18
4564  */
4565 gboolean
4566 gst_type_is_plugin_api (GType type, GstPluginAPIFlags * flags)
4567 {
4568   gboolean ret =
4569       ! !GPOINTER_TO_INT (g_type_get_qdata (type, GST_QUARK (PLUGIN_API)));
4570
4571   if (ret && flags) {
4572     *flags =
4573         GPOINTER_TO_INT (g_type_get_qdata (type, GST_QUARK (PLUGIN_API_FLAGS)));
4574   }
4575
4576   return ret;
4577 }