remove deprecated symbols and methods
[platform/upstream/gstreamer.git] / gst / gstcaps.c
1 /* GStreamer
2  * Copyright (C) <2003> David A. Schleef <ds@schleef.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /**
21  * SECTION:gstcaps
22  * @short_description: Structure describing sets of media formats
23  * @see_also: #GstStructure
24  *
25  * Caps (capabilities) are lighweight refcounted objects describing media types.
26  * They are composed of an array of #GstStructure.
27  *
28  * Caps are exposed on #GstPadTemplate to describe all possible types a
29  * given pad can handle. They are also stored in the #GstRegistry along with
30  * a description of the #GstElement.
31  *
32  * Caps are exposed on the element pads using the gst_pad_get_caps() pad
33  * function. This function describes the possible types that the pad can
34  * handle or produce at runtime.
35  *
36  * Caps are also attached to buffers to describe to content of the data
37  * pointed to by the buffer with gst_buffer_set_caps(). Caps attached to
38  * a #GstBuffer allow for format negotiation upstream and downstream.
39  *
40  * A #GstCaps can be constructed with the following code fragment:
41  *
42  * <example>
43  *  <title>Creating caps</title>
44  *  <programlisting>
45  *  GstCaps *caps;
46  *  caps = gst_caps_new_simple ("video/x-raw-yuv",
47  *       "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
48  *       "framerate", GST_TYPE_FRACTION, 25, 1,
49  *       "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
50  *       "width", G_TYPE_INT, 320,
51  *       "height", G_TYPE_INT, 240,
52  *       NULL);
53  *  </programlisting>
54  * </example>
55  *
56  * A #GstCaps is fixed when it has no properties with ranges or lists. Use
57  * gst_caps_is_fixed() to test for fixed caps. Only fixed caps can be
58  * set on a #GstPad or #GstBuffer.
59  *
60  * Various methods exist to work with the media types such as subtracting
61  * or intersecting.
62  *
63  * Last reviewed on 2007-02-13 (0.10.10)
64  */
65
66 #ifdef HAVE_CONFIG_H
67 #include "config.h"
68 #endif
69 #include <string.h>
70 #include <signal.h>
71
72 #include "gst_private.h"
73 #include <gst/gst.h>
74 #include <gobject/gvaluecollector.h>
75
76 #define DEBUG_REFCOUNT
77
78 #define CAPS_POISON(caps) G_STMT_START{ \
79   if (caps) { \
80     GstCaps *_newcaps = gst_caps_copy (caps); \
81     gst_caps_unref(caps); \
82     caps = _newcaps; \
83   } \
84 } G_STMT_END
85 #define STRUCTURE_POISON(structure) G_STMT_START{ \
86   if (structure) { \
87     GstStructure *_newstruct = gst_structure_copy (structure); \
88     gst_structure_free(structure); \
89     structure = _newstruct; \
90   } \
91 } G_STMT_END
92 #define IS_WRITABLE(caps) \
93   (g_atomic_int_get (&(caps)->refcount) == 1)
94
95 /* same as gst_caps_is_any () */
96 #define CAPS_IS_ANY(caps)                               \
97   ((caps)->flags & GST_CAPS_FLAGS_ANY)
98
99 /* same as gst_caps_is_empty () */
100 #define CAPS_IS_EMPTY(caps)                             \
101   (!CAPS_IS_ANY(caps) && CAPS_IS_EMPTY_SIMPLE(caps))
102
103 #define CAPS_IS_EMPTY_SIMPLE(caps)                                      \
104   (((caps)->structs == NULL) || ((caps)->structs->len == 0))
105
106 /* quick way to get a caps structure at an index without doing a type or array
107  * length check */
108 #define gst_caps_get_structure_unchecked(caps, index) \
109      ((GstStructure *)g_ptr_array_index ((caps)->structs, (index)))
110 /* quick way to append a structure without checking the args */
111 #define gst_caps_append_structure_unchecked(caps, structure) G_STMT_START{\
112   GstStructure *__s=structure;                                      \
113   gst_structure_set_parent_refcount (__s, &caps->refcount);         \
114   g_ptr_array_add (caps->structs, __s);                             \
115 }G_STMT_END
116
117 /* lock to protect multiple invocations of static caps to caps conversion */
118 G_LOCK_DEFINE_STATIC (static_caps_lock);
119
120 static void gst_caps_transform_to_string (const GValue * src_value,
121     GValue * dest_value);
122 static gboolean gst_caps_from_string_inplace (GstCaps * caps,
123     const gchar * string);
124 static GstCaps *gst_caps_copy_conditional (GstCaps * src);
125
126 GType
127 gst_caps_get_type (void)
128 {
129   static GType gst_caps_type = 0;
130
131   if (G_UNLIKELY (gst_caps_type == 0)) {
132     gst_caps_type = g_boxed_type_register_static ("GstCaps",
133         (GBoxedCopyFunc) gst_caps_copy_conditional,
134         (GBoxedFreeFunc) gst_caps_unref);
135
136     g_value_register_transform_func (gst_caps_type,
137         G_TYPE_STRING, gst_caps_transform_to_string);
138   }
139
140   return gst_caps_type;
141 }
142
143 /* creation/deletion */
144
145 /**
146  * gst_caps_new_empty:
147  *
148  * Creates a new #GstCaps that is empty.  That is, the returned
149  * #GstCaps contains no media formats.
150  * Caller is responsible for unreffing the returned caps.
151  *
152  * Returns: the new #GstCaps
153  */
154 GstCaps *
155 gst_caps_new_empty (void)
156 {
157   GstCaps *caps = g_slice_new (GstCaps);
158
159   caps->type = GST_TYPE_CAPS;
160   caps->refcount = 1;
161   caps->flags = 0;
162   caps->structs = g_ptr_array_new ();
163   /* the 32 has been determined by logging caps sizes in _gst_caps_free
164    * but g_ptr_array uses 16 anyway if it expands once, so this does not help
165    * in practise
166    * caps->structs = g_ptr_array_sized_new (32);
167    */
168
169 #ifdef DEBUG_REFCOUNT
170   GST_CAT_LOG (GST_CAT_CAPS, "created caps %p", caps);
171 #endif
172
173   return caps;
174 }
175
176 /**
177  * gst_caps_new_any:
178  *
179  * Creates a new #GstCaps that indicates that it is compatible with
180  * any media format.
181  *
182  * Returns: the new #GstCaps
183  */
184 GstCaps *
185 gst_caps_new_any (void)
186 {
187   GstCaps *caps = gst_caps_new_empty ();
188
189   caps->flags = GST_CAPS_FLAGS_ANY;
190
191   return caps;
192 }
193
194 /**
195  * gst_caps_new_simple:
196  * @media_type: the media type of the structure
197  * @fieldname: first field to set
198  * @...: additional arguments
199  *
200  * Creates a new #GstCaps that contains one #GstStructure.  The
201  * structure is defined by the arguments, which have the same format
202  * as gst_structure_new().
203  * Caller is responsible for unreffing the returned caps.
204  *
205  * Returns: the new #GstCaps
206  */
207 GstCaps *
208 gst_caps_new_simple (const char *media_type, const char *fieldname, ...)
209 {
210   GstCaps *caps;
211   GstStructure *structure;
212   va_list var_args;
213
214   caps = gst_caps_new_empty ();
215
216   va_start (var_args, fieldname);
217   structure = gst_structure_new_valist (media_type, fieldname, var_args);
218   va_end (var_args);
219
220   gst_caps_append_structure_unchecked (caps, structure);
221
222   return caps;
223 }
224
225 /**
226  * gst_caps_new_full:
227  * @struct1: the first structure to add
228  * @...: additional structures to add
229  *
230  * Creates a new #GstCaps and adds all the structures listed as
231  * arguments.  The list must be NULL-terminated.  The structures
232  * are not copied; the returned #GstCaps owns the structures.
233  *
234  * Returns: the new #GstCaps
235  */
236 GstCaps *
237 gst_caps_new_full (GstStructure * struct1, ...)
238 {
239   GstCaps *caps;
240   va_list var_args;
241
242   va_start (var_args, struct1);
243   caps = gst_caps_new_full_valist (struct1, var_args);
244   va_end (var_args);
245
246   return caps;
247 }
248
249 /**
250  * gst_caps_new_full_valist:
251  * @structure: the first structure to add
252  * @var_args: additional structures to add
253  *
254  * Creates a new #GstCaps and adds all the structures listed as
255  * arguments.  The list must be NULL-terminated.  The structures
256  * are not copied; the returned #GstCaps owns the structures.
257  *
258  * Returns: the new #GstCaps
259  */
260 GstCaps *
261 gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
262 {
263   GstCaps *caps;
264
265   caps = gst_caps_new_empty ();
266
267   while (structure) {
268     gst_caps_append_structure_unchecked (caps, structure);
269     structure = va_arg (var_args, GstStructure *);
270   }
271
272   return caps;
273 }
274
275 /**
276  * gst_caps_copy:
277  * @caps: the #GstCaps to copy
278  *
279  * Creates a new #GstCaps as a copy of the old @caps. The new caps will have a
280  * refcount of 1, owned by the caller. The structures are copied as well.
281  *
282  * Note that this function is the semantic equivalent of a gst_caps_ref()
283  * followed by a gst_caps_make_writable(). If you only want to hold on to a
284  * reference to the data, you should use gst_caps_ref().
285  *
286  * When you are finished with the caps, call gst_caps_unref() on it.
287  *
288  * Returns: the new #GstCaps
289  */
290 GstCaps *
291 gst_caps_copy (const GstCaps * caps)
292 {
293   GstCaps *newcaps;
294   GstStructure *structure;
295   guint i, n;
296
297   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
298
299   newcaps = gst_caps_new_empty ();
300   newcaps->flags = caps->flags;
301   n = caps->structs->len;
302
303   for (i = 0; i < n; i++) {
304     structure = gst_caps_get_structure_unchecked (caps, i);
305     gst_caps_append_structure_unchecked (newcaps,
306         gst_structure_copy (structure));
307   }
308
309   return newcaps;
310 }
311
312 static void
313 _gst_caps_free (GstCaps * caps)
314 {
315   GstStructure *structure;
316   guint i, len;
317
318   /* The refcount must be 0, but since we're only called by gst_caps_unref,
319    * don't bother testing. */
320   len = caps->structs->len;
321   /* This can be used to get statistics about caps sizes */
322   /*GST_CAT_INFO (GST_CAT_CAPS, "caps size: %d", len); */
323   for (i = 0; i < len; i++) {
324     structure = (GstStructure *) gst_caps_get_structure_unchecked (caps, i);
325     gst_structure_set_parent_refcount (structure, NULL);
326     gst_structure_free (structure);
327   }
328   g_ptr_array_free (caps->structs, TRUE);
329 #ifdef USE_POISONING
330   memset (caps, 0xff, sizeof (GstCaps));
331 #endif
332
333 #ifdef DEBUG_REFCOUNT
334   GST_CAT_LOG (GST_CAT_CAPS, "freeing caps %p", caps);
335 #endif
336   g_slice_free (GstCaps, caps);
337 }
338
339 /**
340  * gst_caps_make_writable:
341  * @caps: the #GstCaps to make writable
342  *
343  * Returns a writable copy of @caps.
344  *
345  * If there is only one reference count on @caps, the caller must be the owner,
346  * and so this function will return the caps object unchanged. If on the other
347  * hand there is more than one reference on the object, a new caps object will
348  * be returned. The caller's reference on @caps will be removed, and instead the
349  * caller will own a reference to the returned object.
350  *
351  * In short, this function unrefs the caps in the argument and refs the caps
352  * that it returns. Don't access the argument after calling this function. See
353  * also: gst_caps_ref().
354  *
355  * Returns: the same #GstCaps object.
356  */
357 GstCaps *
358 gst_caps_make_writable (GstCaps * caps)
359 {
360   GstCaps *copy;
361
362   g_return_val_if_fail (caps != NULL, NULL);
363
364   /* we are the only instance reffing this caps */
365   if (IS_WRITABLE (caps))
366     return caps;
367
368   /* else copy */
369   GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy caps");
370   copy = gst_caps_copy (caps);
371   gst_caps_unref (caps);
372
373   return copy;
374 }
375
376 /**
377  * gst_caps_ref:
378  * @caps: the #GstCaps to reference
379  *
380  * Add a reference to a #GstCaps object.
381  *
382  * From this point on, until the caller calls gst_caps_unref() or
383  * gst_caps_make_writable(), it is guaranteed that the caps object will not
384  * change. This means its structures won't change, etc. To use a #GstCaps
385  * object, you must always have a refcount on it -- either the one made
386  * implicitly by e.g. gst_caps_new_simple(), or via taking one explicitly with
387  * this function.
388  *
389  * Returns: the same #GstCaps object.
390  */
391 GstCaps *
392 gst_caps_ref (GstCaps * caps)
393 {
394   g_return_val_if_fail (caps != NULL, NULL);
395
396 #ifdef DEBUG_REFCOUNT
397   GST_CAT_TRACE (GST_CAT_REFCOUNTING, "%p %d->%d", caps,
398       GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) + 1);
399 #endif
400   g_return_val_if_fail (GST_CAPS_REFCOUNT_VALUE (caps), NULL);
401
402   g_atomic_int_inc (&caps->refcount);
403
404   return caps;
405 }
406
407 /**
408  * gst_caps_unref:
409  * @caps: the #GstCaps to unref
410  *
411  * Unref a #GstCaps and and free all its structures and the
412  * structures' values when the refcount reaches 0.
413  */
414 void
415 gst_caps_unref (GstCaps * caps)
416 {
417   g_return_if_fail (caps != NULL);
418
419 #ifdef DEBUG_REFCOUNT
420   GST_CAT_TRACE (GST_CAT_REFCOUNTING, "%p %d->%d", caps,
421       GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) - 1);
422 #endif
423
424   g_return_if_fail (GST_CAPS_REFCOUNT_VALUE (caps));
425
426   /* if we ended up with the refcount at zero, free the caps */
427   if (G_UNLIKELY (g_atomic_int_dec_and_test (&caps->refcount)))
428     _gst_caps_free (caps);
429 }
430
431 GType
432 gst_static_caps_get_type (void)
433 {
434   static GType staticcaps_type = 0;
435
436   if (G_UNLIKELY (staticcaps_type == 0)) {
437     staticcaps_type = g_pointer_type_register_static ("GstStaticCaps");
438   }
439   return staticcaps_type;
440 }
441
442
443 /**
444  * gst_static_caps_get:
445  * @static_caps: the #GstStaticCaps to convert
446  *
447  * Converts a #GstStaticCaps to a #GstCaps.
448  *
449  * Returns: A pointer to the #GstCaps. Unref after usage. Since the
450  * core holds an additional ref to the returned caps,
451  * use gst_caps_make_writable() on the returned caps to modify it.
452  */
453 GstCaps *
454 gst_static_caps_get (GstStaticCaps * static_caps)
455 {
456   GstCaps *caps;
457
458   g_return_val_if_fail (static_caps != NULL, NULL);
459
460   caps = (GstCaps *) static_caps;
461
462   /* refcount is 0 when we need to convert */
463   if (G_UNLIKELY (g_atomic_int_get (&caps->refcount) == 0)) {
464     const char *string;
465     GstCaps temp;
466
467     G_LOCK (static_caps_lock);
468     /* check if other thread already updated */
469     if (G_UNLIKELY (g_atomic_int_get (&caps->refcount)))
470       goto done;
471
472     string = static_caps->string;
473
474     if (G_UNLIKELY (string == NULL))
475       goto no_string;
476
477     GST_CAT_LOG (GST_CAT_CAPS, "creating %p", static_caps);
478
479     /* we construct the caps on the stack, then copy over the struct into our
480      * real caps, refcount last. We do this because we must leave the refcount
481      * of the result caps to 0 so that other threads don't run away with the
482      * caps while we are constructing it. */
483     temp.type = GST_TYPE_CAPS;
484     temp.flags = 0;
485     temp.structs = g_ptr_array_new ();
486
487     /* initialize the caps to a refcount of 1 so the caps can be writable for
488      * the next statement */
489     temp.refcount = 1;
490
491     /* convert to string */
492     if (G_UNLIKELY (!gst_caps_from_string_inplace (&temp, string)))
493       g_critical ("Could not convert static caps \"%s\"", string);
494
495     /* now copy stuff over to the real caps. */
496     caps->type = temp.type;
497     caps->flags = temp.flags;
498     caps->structs = temp.structs;
499     /* and bump the refcount so other threads can now read */
500     g_atomic_int_set (&caps->refcount, 1);
501
502     GST_CAT_LOG (GST_CAT_CAPS, "created %p", static_caps);
503   done:
504     G_UNLOCK (static_caps_lock);
505   }
506   /* ref the caps, makes it not writable */
507   gst_caps_ref (caps);
508
509   return caps;
510
511   /* ERRORS */
512 no_string:
513   {
514     G_UNLOCK (static_caps_lock);
515     g_warning ("static caps %p string is NULL", static_caps);
516     return NULL;
517   }
518 }
519
520 /* manipulation */
521
522 static GstStructure *
523 gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
524 {
525   /* don't use index_fast, gst_caps_do_simplify relies on the order */
526   GstStructure *s = g_ptr_array_remove_index (caps->structs, idx);
527
528   gst_structure_set_parent_refcount (s, NULL);
529   return s;
530 }
531
532 /**
533  * gst_caps_steal_structure:
534  * @caps: the #GstCaps to retrieve from
535  * @index: Index of the structure to retrieve
536  *
537  * Retrieves the stucture with the given index from the list of structures
538  * contained in @caps. The caller becomes the owner of the returned structure.
539  *
540  * Returns: a pointer to the #GstStructure corresponding to @index.
541  *
542  * Since: 0.10.30
543  */
544 GstStructure *
545 gst_caps_steal_structure (GstCaps * caps, guint index)
546 {
547   g_return_val_if_fail (caps != NULL, NULL);
548   g_return_val_if_fail (IS_WRITABLE (caps), NULL);
549
550   if (G_UNLIKELY (index >= caps->structs->len))
551     return NULL;
552
553   return gst_caps_remove_and_get_structure (caps, index);
554 }
555
556 static gboolean
557 gst_structure_is_equal_foreach (GQuark field_id, const GValue * val2,
558     gpointer data)
559 {
560   GstStructure *struct1 = (GstStructure *) data;
561   const GValue *val1 = gst_structure_id_get_value (struct1, field_id);
562
563   if (G_UNLIKELY (val1 == NULL))
564     return FALSE;
565   if (gst_value_compare (val1, val2) == GST_VALUE_EQUAL) {
566     return TRUE;
567   }
568
569   return FALSE;
570 }
571
572 static gboolean
573 gst_caps_structure_is_subset_field (GQuark field_id, const GValue * value,
574     gpointer user_data)
575 {
576   GstStructure *subtract_from = user_data;
577   GValue subtraction = { 0, };
578   const GValue *other;
579
580   if (!(other = gst_structure_id_get_value (subtract_from, field_id)))
581     /* field is missing in one set */
582     return FALSE;
583
584   /* equal values are subset */
585   if (gst_value_compare (other, value) == GST_VALUE_EQUAL)
586     return TRUE;
587
588   /*
589    * 1 - [1,2] = empty
590    * -> !subset
591    *
592    * [1,2] - 1 = 2
593    *  -> 1 - [1,2] = empty
594    *  -> subset
595    *
596    * [1,3] - [1,2] = 3
597    * -> [1,2] - [1,3] = empty
598    * -> subset
599    *
600    * {1,2} - {1,3} = 2
601    * -> {1,3} - {1,2} = 3
602    * -> !subset
603    *
604    *  First caps subtraction needs to return a non-empty set, second
605    *  subtractions needs to give en empty set.
606    */
607   if (gst_value_subtract (&subtraction, other, value)) {
608     g_value_unset (&subtraction);
609     /* !empty result, swapping must be empty */
610     if (!gst_value_subtract (&subtraction, value, other))
611       return TRUE;
612
613     g_value_unset (&subtraction);
614   }
615   return FALSE;
616 }
617
618 static gboolean
619 gst_caps_structure_is_subset (const GstStructure * minuend,
620     const GstStructure * subtrahend)
621 {
622   if ((minuend->name != subtrahend->name) ||
623       (gst_structure_n_fields (minuend) !=
624           gst_structure_n_fields (subtrahend))) {
625     return FALSE;
626   }
627
628   return gst_structure_foreach ((GstStructure *) subtrahend,
629       gst_caps_structure_is_subset_field, (gpointer) minuend);
630 }
631
632 /**
633  * gst_caps_append:
634  * @caps1: the #GstCaps that will be appended to
635  * @caps2: the #GstCaps to append
636  *
637  * Appends the structures contained in @caps2 to @caps1. The structures in
638  * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
639  * freed. If either caps is ANY, the resulting caps will be ANY.
640  */
641 void
642 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
643 {
644   GstStructure *structure;
645   int i;
646
647   g_return_if_fail (GST_IS_CAPS (caps1));
648   g_return_if_fail (GST_IS_CAPS (caps2));
649   g_return_if_fail (IS_WRITABLE (caps1));
650   g_return_if_fail (IS_WRITABLE (caps2));
651
652 #ifdef USE_POISONING
653   CAPS_POISON (caps2);
654 #endif
655   if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))) {
656     /* FIXME: this leaks */
657     caps1->flags |= GST_CAPS_FLAGS_ANY;
658     for (i = caps2->structs->len - 1; i >= 0; i--) {
659       structure = gst_caps_remove_and_get_structure (caps2, i);
660       gst_structure_free (structure);
661     }
662   } else {
663     for (i = caps2->structs->len; i; i--) {
664       structure = gst_caps_remove_and_get_structure (caps2, 0);
665       gst_caps_append_structure_unchecked (caps1, structure);
666     }
667   }
668   gst_caps_unref (caps2);       /* guaranteed to free it */
669 }
670
671 /**
672  * gst_caps_merge:
673  * @caps1: the #GstCaps that will take the new entries
674  * @caps2: the #GstCaps to merge in
675  *
676  * Appends the structures contained in @caps2 to @caps1 if they are not yet
677  * expressed by @caps1. The structures in @caps2 are not copied -- they are
678  * transferred to @caps1, and then @caps2 is freed.
679  * If either caps is ANY, the resulting caps will be ANY.
680  *
681  * Since: 0.10.10
682  */
683 void
684 gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
685 {
686   GstStructure *structure;
687   int i;
688
689   g_return_if_fail (GST_IS_CAPS (caps1));
690   g_return_if_fail (GST_IS_CAPS (caps2));
691   g_return_if_fail (IS_WRITABLE (caps1));
692   g_return_if_fail (IS_WRITABLE (caps2));
693
694 #ifdef USE_POISONING
695   CAPS_POISON (caps2);
696 #endif
697   if (G_UNLIKELY (CAPS_IS_ANY (caps1))) {
698     for (i = caps2->structs->len - 1; i >= 0; i--) {
699       structure = gst_caps_remove_and_get_structure (caps2, i);
700       gst_structure_free (structure);
701     }
702   } else if (G_UNLIKELY (CAPS_IS_ANY (caps2))) {
703     caps1->flags |= GST_CAPS_FLAGS_ANY;
704     for (i = caps1->structs->len - 1; i >= 0; i--) {
705       structure = gst_caps_remove_and_get_structure (caps1, i);
706       gst_structure_free (structure);
707     }
708   } else {
709     for (i = caps2->structs->len; i; i--) {
710       structure = gst_caps_remove_and_get_structure (caps2, 0);
711       gst_caps_merge_structure (caps1, structure);
712     }
713     /* this is too naive
714        GstCaps *com = gst_caps_intersect (caps1, caps2);
715        GstCaps *add = gst_caps_subtract (caps2, com);
716
717        GST_DEBUG ("common : %d", gst_caps_get_size (com));
718        GST_DEBUG ("adding : %d", gst_caps_get_size (add));
719        gst_caps_append (caps1, add);
720        gst_caps_unref (com);
721      */
722   }
723   gst_caps_unref (caps2);       /* guaranteed to free it */
724 }
725
726 /**
727  * gst_caps_append_structure:
728  * @caps: the #GstCaps that will be appended to
729  * @structure: the #GstStructure to append
730  *
731  * Appends @structure to @caps.  The structure is not copied; @caps
732  * becomes the owner of @structure.
733  */
734 void
735 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
736 {
737   g_return_if_fail (GST_IS_CAPS (caps));
738   g_return_if_fail (IS_WRITABLE (caps));
739
740   if (G_LIKELY (structure)) {
741     g_return_if_fail (structure->parent_refcount == NULL);
742 #if 0
743 #ifdef USE_POISONING
744     STRUCTURE_POISON (structure);
745 #endif
746 #endif
747     gst_caps_append_structure_unchecked (caps, structure);
748   }
749 }
750
751 /**
752  * gst_caps_remove_structure:
753  * @caps: the #GstCaps to remove from
754  * @idx: Index of the structure to remove
755  *
756  * removes the stucture with the given index from the list of structures
757  * contained in @caps.
758  */
759 void
760 gst_caps_remove_structure (GstCaps * caps, guint idx)
761 {
762   GstStructure *structure;
763
764   g_return_if_fail (caps != NULL);
765   g_return_if_fail (idx <= gst_caps_get_size (caps));
766   g_return_if_fail (IS_WRITABLE (caps));
767
768   structure = gst_caps_remove_and_get_structure (caps, idx);
769   gst_structure_free (structure);
770 }
771
772 /**
773  * gst_caps_merge_structure:
774  * @caps: the #GstCaps that will the the new structure
775  * @structure: the #GstStructure to merge
776  *
777  * Appends @structure to @caps if its not already expressed by @caps.  The
778  * structure is not copied; @caps becomes the owner of @structure.
779  */
780 void
781 gst_caps_merge_structure (GstCaps * caps, GstStructure * structure)
782 {
783   g_return_if_fail (GST_IS_CAPS (caps));
784   g_return_if_fail (IS_WRITABLE (caps));
785
786   if (G_LIKELY (structure)) {
787     GstStructure *structure1;
788     int i;
789     gboolean unique = TRUE;
790
791     g_return_if_fail (structure->parent_refcount == NULL);
792 #if 0
793 #ifdef USE_POISONING
794     STRUCTURE_POISON (structure);
795 #endif
796 #endif
797     /* check each structure */
798     for (i = caps->structs->len - 1; i >= 0; i--) {
799       structure1 = gst_caps_get_structure_unchecked (caps, i);
800       /* if structure is a subset of structure1, then skip it */
801       if (gst_caps_structure_is_subset (structure1, structure)) {
802         unique = FALSE;
803         break;
804       }
805     }
806     if (unique) {
807       gst_caps_append_structure_unchecked (caps, structure);
808     } else {
809       gst_structure_free (structure);
810     }
811   }
812 }
813
814 /**
815  * gst_caps_get_size:
816  * @caps: a #GstCaps
817  *
818  * Gets the number of structures contained in @caps.
819  *
820  * Returns: the number of structures that @caps contains
821  */
822 guint
823 gst_caps_get_size (const GstCaps * caps)
824 {
825   g_return_val_if_fail (GST_IS_CAPS (caps), 0);
826
827   return caps->structs->len;
828 }
829
830 /**
831  * gst_caps_get_structure:
832  * @caps: a #GstCaps
833  * @index: the index of the structure
834  *
835  * Finds the structure in @caps that has the index @index, and
836  * returns it.
837  *
838  * WARNING: This function takes a const GstCaps *, but returns a
839  * non-const GstStructure *.  This is for programming convenience --
840  * the caller should be aware that structures inside a constant
841  * #GstCaps should not be modified. However, if you know the caps
842  * are writable, either because you have just copied them or made
843  * them writable with gst_caps_make_writable(), you may modify the
844  * structure returned in the usual way, e.g. with functions like
845  * gst_structure_set().
846  *
847  * You do not need to free or unref the structure returned, it
848  * belongs to the #GstCaps.
849  *
850  * Returns: a pointer to the #GstStructure corresponding to @index
851  */
852 GstStructure *
853 gst_caps_get_structure (const GstCaps * caps, guint index)
854 {
855   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
856   g_return_val_if_fail (index < caps->structs->len, NULL);
857
858   return gst_caps_get_structure_unchecked (caps, index);
859 }
860
861 /**
862  * gst_caps_copy_nth:
863  * @caps: the #GstCaps to copy
864  * @nth: the nth structure to copy
865  *
866  * Creates a new #GstCaps and appends a copy of the nth structure
867  * contained in @caps.
868  *
869  * Returns: the new #GstCaps
870  */
871 GstCaps *
872 gst_caps_copy_nth (const GstCaps * caps, guint nth)
873 {
874   GstCaps *newcaps;
875   GstStructure *structure;
876
877   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
878
879   newcaps = gst_caps_new_empty ();
880   newcaps->flags = caps->flags;
881
882   if (G_LIKELY (caps->structs->len > nth)) {
883     structure = gst_caps_get_structure_unchecked (caps, nth);
884     gst_caps_append_structure_unchecked (newcaps,
885         gst_structure_copy (structure));
886   }
887
888   return newcaps;
889 }
890
891 /**
892  * gst_caps_truncate:
893  * @caps: the #GstCaps to truncate
894  *
895  * Destructively discard all but the first structure from @caps. Useful when
896  * fixating. @caps must be writable.
897  */
898 void
899 gst_caps_truncate (GstCaps * caps)
900 {
901   gint i;
902
903   g_return_if_fail (GST_IS_CAPS (caps));
904   g_return_if_fail (IS_WRITABLE (caps));
905
906   i = caps->structs->len - 1;
907
908   while (i > 0)
909     gst_caps_remove_structure (caps, i--);
910 }
911
912 /**
913  * gst_caps_set_value:
914  * @caps: a writable caps
915  * @field: name of the field to set
916  * @value: value to set the field to
917  *
918  * Sets the given @field on all structures of @caps to the given @value.
919  * This is a convenience function for calling gst_structure_set_value() on
920  * all structures of @caps.
921  *
922  * Since: 0.10.26
923  **/
924 void
925 gst_caps_set_value (GstCaps * caps, const char *field, const GValue * value)
926 {
927   guint i, len;
928
929   g_return_if_fail (GST_IS_CAPS (caps));
930   g_return_if_fail (IS_WRITABLE (caps));
931   g_return_if_fail (field != NULL);
932   g_return_if_fail (G_IS_VALUE (value));
933
934   len = caps->structs->len;
935   for (i = 0; i < len; i++) {
936     GstStructure *structure = gst_caps_get_structure_unchecked (caps, i);
937     gst_structure_set_value (structure, field, value);
938   }
939 }
940
941 /**
942  * gst_caps_set_simple_valist:
943  * @caps: the #GstCaps to set
944  * @field: first field to set
945  * @varargs: additional parameters
946  *
947  * Sets fields in a #GstCaps.  The arguments must be passed in the same
948  * manner as gst_structure_set(), and be NULL-terminated.
949  * <note>Prior to GStreamer version 0.10.26, this function failed when
950  * @caps was not simple. If your code needs to work with those versions 
951  * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
952  * is %TRUE for @caps.</note>
953  */
954 void
955 gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs)
956 {
957   GValue value = { 0, };
958
959   g_return_if_fail (GST_IS_CAPS (caps));
960   g_return_if_fail (IS_WRITABLE (caps));
961
962   while (field) {
963     GType type;
964     char *err;
965
966     type = va_arg (varargs, GType);
967
968     if (G_UNLIKELY (type == G_TYPE_DATE)) {
969       g_warning ("Don't use G_TYPE_DATE, use GST_TYPE_DATE instead\n");
970       type = GST_TYPE_DATE;
971     }
972 #if GLIB_CHECK_VERSION(2,23,3)
973     G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
974 #else
975     g_value_init (&value, type);
976     G_VALUE_COLLECT (&value, varargs, 0, &err);
977 #endif
978     if (G_UNLIKELY (err)) {
979       g_critical ("%s", err);
980       return;
981     }
982
983     gst_caps_set_value (caps, field, &value);
984
985     g_value_unset (&value);
986
987     field = va_arg (varargs, const gchar *);
988   }
989 }
990
991 /**
992  * gst_caps_set_simple:
993  * @caps: the #GstCaps to set
994  * @field: first field to set
995  * @...: additional parameters
996  *
997  * Sets fields in a #GstCaps.  The arguments must be passed in the same
998  * manner as gst_structure_set(), and be NULL-terminated.
999  * <note>Prior to GStreamer version 0.10.26, this function failed when
1000  * @caps was not simple. If your code needs to work with those versions
1001  * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
1002  * is %TRUE for @caps.</note>
1003  */
1004 void
1005 gst_caps_set_simple (GstCaps * caps, const char *field, ...)
1006 {
1007   va_list var_args;
1008
1009   g_return_if_fail (GST_IS_CAPS (caps));
1010   g_return_if_fail (IS_WRITABLE (caps));
1011
1012   va_start (var_args, field);
1013   gst_caps_set_simple_valist (caps, field, var_args);
1014   va_end (var_args);
1015 }
1016
1017 /* tests */
1018
1019 /**
1020  * gst_caps_is_any:
1021  * @caps: the #GstCaps to test
1022  *
1023  * Determines if @caps represents any media format.
1024  *
1025  * Returns: TRUE if @caps represents any format.
1026  */
1027 gboolean
1028 gst_caps_is_any (const GstCaps * caps)
1029 {
1030   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1031
1032   return (CAPS_IS_ANY (caps));
1033 }
1034
1035 /**
1036  * gst_caps_is_empty:
1037  * @caps: the #GstCaps to test
1038  *
1039  * Determines if @caps represents no media formats.
1040  *
1041  * Returns: TRUE if @caps represents no formats.
1042  */
1043 gboolean
1044 gst_caps_is_empty (const GstCaps * caps)
1045 {
1046   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1047
1048   if (CAPS_IS_ANY (caps))
1049     return FALSE;
1050
1051   return CAPS_IS_EMPTY_SIMPLE (caps);
1052 }
1053
1054 static gboolean
1055 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
1056     gpointer unused)
1057 {
1058   return gst_value_is_fixed (value);
1059 }
1060
1061 /**
1062  * gst_caps_is_fixed:
1063  * @caps: the #GstCaps to test
1064  *
1065  * Fixed #GstCaps describe exactly one format, that is, they have exactly
1066  * one structure, and each field in the structure describes a fixed type.
1067  * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
1068  *
1069  * Returns: TRUE if @caps is fixed
1070  */
1071 gboolean
1072 gst_caps_is_fixed (const GstCaps * caps)
1073 {
1074   GstStructure *structure;
1075
1076   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1077
1078   if (caps->structs->len != 1)
1079     return FALSE;
1080
1081   structure = gst_caps_get_structure_unchecked (caps, 0);
1082
1083   return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
1084 }
1085
1086 /**
1087  * gst_caps_is_equal_fixed:
1088  * @caps1: the #GstCaps to test
1089  * @caps2: the #GstCaps to test
1090  *
1091  * Tests if two #GstCaps are equal.  This function only works on fixed
1092  * #GstCaps.
1093  *
1094  * Returns: TRUE if the arguments represent the same format
1095  */
1096 gboolean
1097 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
1098 {
1099   GstStructure *struct1, *struct2;
1100
1101   g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
1102   g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
1103
1104   struct1 = gst_caps_get_structure_unchecked (caps1, 0);
1105   struct2 = gst_caps_get_structure_unchecked (caps2, 0);
1106
1107   if (struct1->name != struct2->name) {
1108     return FALSE;
1109   }
1110   if (struct1->fields->len != struct2->fields->len) {
1111     return FALSE;
1112   }
1113
1114   return gst_structure_foreach (struct1, gst_structure_is_equal_foreach,
1115       struct2);
1116 }
1117
1118 /**
1119  * gst_caps_is_always_compatible:
1120  * @caps1: the #GstCaps to test
1121  * @caps2: the #GstCaps to test
1122  *
1123  * A given #GstCaps structure is always compatible with another if
1124  * every media format that is in the first is also contained in the
1125  * second.  That is, @caps1 is a subset of @caps2.
1126  *
1127  * Returns: TRUE if @caps1 is a subset of @caps2.
1128  */
1129 gboolean
1130 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
1131 {
1132   g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1133   g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1134
1135   return gst_caps_is_subset (caps1, caps2);
1136 }
1137
1138 /**
1139  * gst_caps_is_subset:
1140  * @subset: a #GstCaps
1141  * @superset: a potentially greater #GstCaps
1142  *
1143  * Checks if all caps represented by @subset are also represented by @superset.
1144  * <note>This function does not work reliably if optional properties for caps
1145  * are included on one caps and omitted on the other.</note>
1146  *
1147  * Returns: %TRUE if @subset is a subset of @superset
1148  */
1149 gboolean
1150 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
1151 {
1152   GstCaps *caps;
1153   gboolean ret;
1154
1155   g_return_val_if_fail (subset != NULL, FALSE);
1156   g_return_val_if_fail (superset != NULL, FALSE);
1157
1158   if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
1159     return TRUE;
1160   if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
1161     return FALSE;
1162
1163   caps = gst_caps_subtract (subset, superset);
1164   ret = CAPS_IS_EMPTY_SIMPLE (caps);
1165   gst_caps_unref (caps);
1166   return ret;
1167 }
1168
1169 /**
1170  * gst_caps_is_equal:
1171  * @caps1: a #GstCaps
1172  * @caps2: another #GstCaps
1173  *
1174  * Checks if the given caps represent the same set of caps.
1175  * <note>This function does not work reliably if optional properties for caps
1176  * are included on one caps and omitted on the other.</note>
1177  *
1178  * This function deals correctly with passing NULL for any of the caps.
1179  *
1180  * Returns: TRUE if both caps are equal.
1181  */
1182 gboolean
1183 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
1184 {
1185   /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
1186    * So there should be an assertion that caps1 and caps2 != NULL */
1187
1188   /* NULL <-> NULL is allowed here */
1189   if (G_UNLIKELY (caps1 == caps2))
1190     return TRUE;
1191
1192   /* one of them NULL => they are different (can't be both NULL because
1193    * we checked that above) */
1194   if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
1195     return FALSE;
1196
1197   if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
1198     return gst_caps_is_equal_fixed (caps1, caps2);
1199
1200   return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1201 }
1202
1203 /* intersect operation */
1204
1205 typedef struct
1206 {
1207   GstStructure *dest;
1208   const GstStructure *intersect;
1209 }
1210 IntersectData;
1211
1212 static gboolean
1213 gst_caps_structure_intersect_field1 (GQuark id, const GValue * val1,
1214     gpointer data)
1215 {
1216   IntersectData *idata = (IntersectData *) data;
1217   const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
1218
1219   if (G_UNLIKELY (val2 == NULL)) {
1220     gst_structure_id_set_value (idata->dest, id, val1);
1221   } else {
1222     GValue dest_value = { 0 };
1223     if (gst_value_intersect (&dest_value, val1, val2)) {
1224       gst_structure_id_set_value (idata->dest, id, &dest_value);
1225       g_value_unset (&dest_value);
1226     } else {
1227       return FALSE;
1228     }
1229   }
1230   return TRUE;
1231 }
1232
1233 static gboolean
1234 gst_caps_structure_intersect_field2 (GQuark id, const GValue * val1,
1235     gpointer data)
1236 {
1237   IntersectData *idata = (IntersectData *) data;
1238   const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
1239
1240   if (G_UNLIKELY (val2 == NULL)) {
1241     gst_structure_id_set_value (idata->dest, id, val1);
1242   }
1243   return TRUE;
1244 }
1245
1246 static GstStructure *
1247 gst_caps_structure_intersect (const GstStructure * struct1,
1248     const GstStructure * struct2)
1249 {
1250   IntersectData data;
1251
1252   g_assert (struct1 != NULL);
1253   g_assert (struct2 != NULL);
1254
1255   if (G_UNLIKELY (struct1->name != struct2->name))
1256     return NULL;
1257
1258   /* copy fields from struct1 which we have not in struct2 to target
1259    * intersect if we have the field in both */
1260   data.dest = gst_structure_id_empty_new (struct1->name);
1261   data.intersect = struct2;
1262   if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
1263               gst_caps_structure_intersect_field1, &data)))
1264     goto error;
1265
1266   /* copy fields from struct2 which we have not in struct1 to target */
1267   data.intersect = struct1;
1268   if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct2,
1269               gst_caps_structure_intersect_field2, &data)))
1270     goto error;
1271
1272   return data.dest;
1273
1274 error:
1275   gst_structure_free (data.dest);
1276   return NULL;
1277 }
1278
1279 static gboolean
1280 gst_caps_structure_can_intersect_field (GQuark id, const GValue * val1,
1281     gpointer data)
1282 {
1283   GstStructure *other = (GstStructure *) data;
1284   const GValue *val2 = gst_structure_id_get_value (other, id);
1285
1286   if (G_LIKELY (val2)) {
1287     if (!gst_value_can_intersect (val1, val2)) {
1288       return FALSE;
1289     } else {
1290       gint eq = gst_value_compare (val1, val2);
1291
1292       if (eq == GST_VALUE_UNORDERED) {
1293         /* we need to try interseting */
1294         GValue dest_value = { 0 };
1295         if (gst_value_intersect (&dest_value, val1, val2)) {
1296           g_value_unset (&dest_value);
1297         } else {
1298           return FALSE;
1299         }
1300       } else if (eq != GST_VALUE_EQUAL) {
1301         return FALSE;
1302       }
1303     }
1304   }
1305   return TRUE;
1306 }
1307
1308 static gboolean
1309 gst_caps_structure_can_intersect (const GstStructure * struct1,
1310     const GstStructure * struct2)
1311 {
1312   g_assert (struct1 != NULL);
1313   g_assert (struct2 != NULL);
1314
1315   if (G_UNLIKELY (struct1->name != struct2->name))
1316     return FALSE;
1317
1318   /* tries to intersect if we have the field in both */
1319   if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
1320               gst_caps_structure_can_intersect_field, (gpointer) struct2)))
1321     return FALSE;
1322
1323   return TRUE;
1324 }
1325
1326 /**
1327  * gst_caps_can_intersect:
1328  * @caps1: a #GstCaps to intersect
1329  * @caps2: a #GstCaps to intersect
1330  *
1331  * Tries intersecting @caps1 and @caps2 and reports whether the result would not
1332  * be empty
1333  *
1334  * Returns: %TRUE if intersection would be not empty
1335  *
1336  * Since: 0.10.25
1337  */
1338 gboolean
1339 gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
1340 {
1341   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1342   guint j, k, len1, len2;
1343   GstStructure *struct1;
1344   GstStructure *struct2;
1345
1346   g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1347   g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1348
1349   /* caps are exactly the same pointers */
1350   if (G_UNLIKELY (caps1 == caps2))
1351     return TRUE;
1352
1353   /* empty caps on either side, return empty */
1354   if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1355     return FALSE;
1356
1357   /* one of the caps is any */
1358   if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
1359     return TRUE;
1360
1361   /* run zigzag on top line then right line, this preserves the caps order
1362    * much better than a simple loop.
1363    *
1364    * This algorithm zigzags over the caps structures as demonstrated in
1365    * the folowing matrix:
1366    *
1367    *          caps1                              0  1  2  3
1368    *       +-------------     total distance:  +-------------
1369    *       | 1  2  4  7                      0 | 0  1  2  3
1370    * caps2 | 3  5  8 10                      1 | 1  2  3  4
1371    *       | 6  9 11 12                      2 | 2  3  4  5
1372    *
1373    * First we iterate over the caps1 structures (top line) intersecting
1374    * the structures diagonally down, then we iterate over the caps2
1375    * structures. The result is that the intersections are ordered based on the
1376    * sum of the indexes in the list.
1377    */
1378   len1 = caps1->structs->len;
1379   len2 = caps2->structs->len;
1380   for (i = 0; i < len1 + len2 - 1; i++) {
1381     /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */
1382     j = MIN (i, len1 - 1);
1383     /* subset index stays 0 until i reaches superset->structs->len, then it
1384      * counts up from 1 to subset->structs->len - 1 */
1385     k = MAX (0, i - j);
1386
1387     /* now run the diagonal line, end condition is the left or bottom
1388      * border */
1389     while (k < len2) {
1390       struct1 = gst_caps_get_structure_unchecked (caps1, j);
1391       struct2 = gst_caps_get_structure_unchecked (caps2, k);
1392
1393       if (gst_caps_structure_can_intersect (struct1, struct2)) {
1394         return TRUE;
1395       }
1396       /* move down left */
1397       k++;
1398       if (G_UNLIKELY (j == 0))
1399         break;                  /* so we don't roll back to G_MAXUINT */
1400       j--;
1401     }
1402   }
1403   return FALSE;
1404 }
1405
1406 /**
1407  * gst_caps_intersect:
1408  * @caps1: a #GstCaps to intersect
1409  * @caps2: a #GstCaps to intersect
1410  *
1411  * Creates a new #GstCaps that contains all the formats that are common
1412  * to both @caps1 and @caps2.
1413  *
1414  * Returns: the new #GstCaps
1415  */
1416 GstCaps *
1417 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1418 {
1419   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1420   guint j, k, len1, len2;
1421
1422   GstStructure *struct1;
1423   GstStructure *struct2;
1424   GstCaps *dest;
1425   GstStructure *istruct;
1426
1427   g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1428   g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1429
1430   /* caps are exactly the same pointers, just copy one caps */
1431   if (G_UNLIKELY (caps1 == caps2))
1432     return gst_caps_copy (caps1);
1433
1434   /* empty caps on either side, return empty */
1435   if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1436     return gst_caps_new_empty ();
1437
1438   /* one of the caps is any, just copy the other caps */
1439   if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1440     return gst_caps_copy (caps2);
1441   if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1442     return gst_caps_copy (caps1);
1443
1444   dest = gst_caps_new_empty ();
1445
1446   /* run zigzag on top line then right line, this preserves the caps order
1447    * much better than a simple loop.
1448    *
1449    * This algorithm zigzags over the caps structures as demonstrated in
1450    * the folowing matrix:
1451    *
1452    *          caps1
1453    *       +-------------
1454    *       | 1  2  4  7
1455    * caps2 | 3  5  8 10
1456    *       | 6  9 11 12
1457    *
1458    * First we iterate over the caps1 structures (top line) intersecting
1459    * the structures diagonally down, then we iterate over the caps2
1460    * structures.
1461    */
1462   len1 = caps1->structs->len;
1463   len2 = caps2->structs->len;
1464   for (i = 0; i < len1 + len2 - 1; i++) {
1465     /* caps1 index goes from 0 to caps1->structs->len-1 */
1466     j = MIN (i, len1 - 1);
1467     /* caps2 index stays 0 until i reaches caps1->structs->len, then it counts
1468      * up from 1 to caps2->structs->len - 1 */
1469     k = MAX (0, i - j);
1470
1471     /* now run the diagonal line, end condition is the left or bottom
1472      * border */
1473     while (k < len2) {
1474       struct1 = gst_caps_get_structure_unchecked (caps1, j);
1475       struct2 = gst_caps_get_structure_unchecked (caps2, k);
1476
1477       istruct = gst_caps_structure_intersect (struct1, struct2);
1478
1479       gst_caps_append_structure (dest, istruct);
1480       /* move down left */
1481       k++;
1482       if (G_UNLIKELY (j == 0))
1483         break;                  /* so we don't roll back to G_MAXUINT */
1484       j--;
1485     }
1486   }
1487   return dest;
1488 }
1489
1490 /* subtract operation */
1491
1492 typedef struct
1493 {
1494   const GstStructure *subtract_from;
1495   GSList *put_into;
1496 }
1497 SubtractionEntry;
1498
1499 static gboolean
1500 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1501     gpointer user_data)
1502 {
1503   SubtractionEntry *e = user_data;
1504   GValue subtraction = { 0, };
1505   const GValue *other;
1506   GstStructure *structure;
1507
1508   other = gst_structure_id_get_value (e->subtract_from, field_id);
1509   if (!other) {
1510     return FALSE;
1511   }
1512   if (!gst_value_subtract (&subtraction, other, value))
1513     return TRUE;
1514   if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1515     g_value_unset (&subtraction);
1516     return FALSE;
1517   } else {
1518     structure = gst_structure_copy (e->subtract_from);
1519     gst_structure_id_set_value (structure, field_id, &subtraction);
1520     g_value_unset (&subtraction);
1521     e->put_into = g_slist_prepend (e->put_into, structure);
1522     return TRUE;
1523   }
1524 }
1525
1526 static gboolean
1527 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1528     const GstStructure * subtrahend)
1529 {
1530   SubtractionEntry e;
1531   gboolean ret;
1532
1533   e.subtract_from = minuend;
1534   e.put_into = NULL;
1535
1536   ret = gst_structure_foreach ((GstStructure *) subtrahend,
1537       gst_caps_structure_subtract_field, &e);
1538   if (ret) {
1539     *into = e.put_into;
1540   } else {
1541     GSList *walk;
1542
1543     for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1544       gst_structure_free (walk->data);
1545     }
1546     g_slist_free (e.put_into);
1547   }
1548   return ret;
1549 }
1550
1551 /**
1552  * gst_caps_subtract:
1553  * @minuend: #GstCaps to substract from
1554  * @subtrahend: #GstCaps to substract
1555  *
1556  * Subtracts the @subtrahend from the @minuend.
1557  * <note>This function does not work reliably if optional properties for caps
1558  * are included on one caps and omitted on the other.</note>
1559  *
1560  * Returns: the resulting caps
1561  */
1562 GstCaps *
1563 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1564 {
1565   guint i, j, sublen;
1566   GstStructure *min;
1567   GstStructure *sub;
1568   GstCaps *dest = NULL, *src;
1569
1570   g_return_val_if_fail (minuend != NULL, NULL);
1571   g_return_val_if_fail (subtrahend != NULL, NULL);
1572
1573   if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
1574     return gst_caps_new_empty ();
1575   }
1576   if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
1577     return gst_caps_copy (minuend);
1578
1579   /* FIXME: Do we want this here or above?
1580      The reason we need this is that there is no definition about what
1581      ANY means for specific types, so it's not possible to reduce ANY partially
1582      You can only remove everything or nothing and that is done above.
1583      Note: there's a test that checks this behaviour. */
1584   g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
1585   sublen = subtrahend->structs->len;
1586   g_assert (sublen);
1587
1588   src = gst_caps_copy (minuend);
1589   for (i = 0; i < sublen; i++) {
1590     guint srclen;
1591
1592     sub = gst_caps_get_structure_unchecked (subtrahend, i);
1593     if (dest) {
1594       gst_caps_unref (src);
1595       src = dest;
1596     }
1597     dest = gst_caps_new_empty ();
1598     srclen = src->structs->len;
1599     for (j = 0; j < srclen; j++) {
1600       min = gst_caps_get_structure_unchecked (src, j);
1601       if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1602         GSList *list;
1603
1604         if (gst_caps_structure_subtract (&list, min, sub)) {
1605           GSList *walk;
1606
1607           for (walk = list; walk; walk = g_slist_next (walk)) {
1608             gst_caps_append_structure_unchecked (dest,
1609                 (GstStructure *) walk->data);
1610           }
1611           g_slist_free (list);
1612         } else {
1613           gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1614         }
1615       } else {
1616         gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1617       }
1618     }
1619     if (CAPS_IS_EMPTY_SIMPLE (dest)) {
1620       gst_caps_unref (src);
1621       return dest;
1622     }
1623   }
1624
1625   gst_caps_unref (src);
1626   gst_caps_do_simplify (dest);
1627   return dest;
1628 }
1629
1630 /* union operation */
1631
1632 #if 0
1633 static GstStructure *
1634 gst_caps_structure_union (const GstStructure * struct1,
1635     const GstStructure * struct2)
1636 {
1637   int i;
1638   GstStructure *dest;
1639   const GstStructureField *field1;
1640   const GstStructureField *field2;
1641   int ret;
1642
1643   /* FIXME this doesn't actually work */
1644
1645   if (struct1->name != struct2->name)
1646     return NULL;
1647
1648   dest = gst_structure_id_empty_new (struct1->name);
1649
1650   for (i = 0; i < struct1->fields->len; i++) {
1651     GValue dest_value = { 0 };
1652
1653     field1 = GST_STRUCTURE_FIELD (struct1, i);
1654     field2 = gst_structure_id_get_field (struct2, field1->name);
1655
1656     if (field2 == NULL) {
1657       continue;
1658     } else {
1659       if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1660         gst_structure_set_value (dest, g_quark_to_string (field1->name),
1661             &dest_value);
1662       } else {
1663         ret = gst_value_compare (&field1->value, &field2->value);
1664       }
1665     }
1666   }
1667
1668   return dest;
1669 }
1670 #endif
1671
1672 /**
1673  * gst_caps_union:
1674  * @caps1: a #GstCaps to union
1675  * @caps2: a #GstCaps to union
1676  *
1677  * Creates a new #GstCaps that contains all the formats that are in
1678  * either @caps1 and @caps2.
1679  *
1680  * Returns: the new #GstCaps
1681  */
1682 GstCaps *
1683 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1684 {
1685   GstCaps *dest1;
1686   GstCaps *dest2;
1687
1688   /* NULL pointers are no correct GstCaps */
1689   g_return_val_if_fail (caps1 != NULL, NULL);
1690   g_return_val_if_fail (caps2 != NULL, NULL);
1691
1692   if (CAPS_IS_EMPTY (caps1))
1693     return gst_caps_copy (caps2);
1694
1695   if (CAPS_IS_EMPTY (caps2))
1696     return gst_caps_copy (caps1);
1697
1698   if (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))
1699     return gst_caps_new_any ();
1700
1701   dest1 = gst_caps_copy (caps1);
1702   dest2 = gst_caps_copy (caps2);
1703   gst_caps_append (dest1, dest2);
1704
1705   gst_caps_do_simplify (dest1);
1706   return dest1;
1707 }
1708
1709 /* normalize/simplify operations */
1710
1711 typedef struct _NormalizeForeach
1712 {
1713   GstCaps *caps;
1714   GstStructure *structure;
1715 }
1716 NormalizeForeach;
1717
1718 static gboolean
1719 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1720 {
1721   NormalizeForeach *nf = (NormalizeForeach *) ptr;
1722   GValue val = { 0 };
1723   guint i;
1724
1725   if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1726     guint len = gst_value_list_get_size (value);
1727     for (i = 1; i < len; i++) {
1728       const GValue *v = gst_value_list_get_value (value, i);
1729       GstStructure *structure = gst_structure_copy (nf->structure);
1730
1731       gst_structure_id_set_value (structure, field_id, v);
1732       gst_caps_append_structure_unchecked (nf->caps, structure);
1733     }
1734
1735     gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1736     gst_structure_id_set_value (nf->structure, field_id, &val);
1737     g_value_unset (&val);
1738
1739     return FALSE;
1740   }
1741   return TRUE;
1742 }
1743
1744 /**
1745  * gst_caps_normalize:
1746  * @caps: a #GstCaps to normalize
1747  *
1748  * Creates a new #GstCaps that represents the same set of formats as
1749  * @caps, but contains no lists.  Each list is expanded into separate
1750  * @GstStructures.
1751  *
1752  * Returns: the new #GstCaps
1753  */
1754 GstCaps *
1755 gst_caps_normalize (const GstCaps * caps)
1756 {
1757   NormalizeForeach nf;
1758   GstCaps *newcaps;
1759   guint i;
1760
1761   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1762
1763   newcaps = gst_caps_copy (caps);
1764   nf.caps = newcaps;
1765
1766   for (i = 0; i < gst_caps_get_size (newcaps); i++) {
1767     nf.structure = gst_caps_get_structure_unchecked (newcaps, i);
1768
1769     while (!gst_structure_foreach (nf.structure,
1770             gst_caps_normalize_foreach, &nf));
1771   }
1772
1773   return newcaps;
1774 }
1775
1776 static gint
1777 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1778 {
1779   gint ret;
1780   const GstStructure *struct1 = *((const GstStructure **) one);
1781   const GstStructure *struct2 = *((const GstStructure **) two);
1782
1783   /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1784      So what's the best way? */
1785   ret = strcmp (gst_structure_get_name (struct1),
1786       gst_structure_get_name (struct2));
1787   if (ret)
1788     return ret;
1789
1790   return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1791 }
1792
1793 typedef struct
1794 {
1795   GQuark name;
1796   GValue value;
1797   GstStructure *compare;
1798 }
1799 UnionField;
1800
1801 static gboolean
1802 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1803     gpointer user_data)
1804 {
1805   UnionField *u = user_data;
1806   const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1807
1808   if (!val) {
1809     if (u->name)
1810       g_value_unset (&u->value);
1811     return FALSE;
1812   }
1813   if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1814     return TRUE;
1815   if (u->name) {
1816     g_value_unset (&u->value);
1817     return FALSE;
1818   }
1819   u->name = field_id;
1820   gst_value_union (&u->value, val, value);
1821   return TRUE;
1822 }
1823
1824 static gboolean
1825 gst_caps_structure_simplify (GstStructure ** result,
1826     const GstStructure * simplify, GstStructure * compare)
1827 {
1828   GSList *list;
1829   UnionField field = { 0, {0,}, NULL };
1830
1831   /* try to subtract to get a real subset */
1832   if (gst_caps_structure_subtract (&list, simplify, compare)) {
1833     if (list == NULL) {         /* no result */
1834       *result = NULL;
1835       return TRUE;
1836     } else if (list->next == NULL) {    /* one result */
1837       *result = list->data;
1838       g_slist_free (list);
1839       return TRUE;
1840     } else {                    /* multiple results */
1841       g_slist_foreach (list, (GFunc) gst_structure_free, NULL);
1842       g_slist_free (list);
1843       list = NULL;
1844     }
1845   }
1846
1847   /* try to union both structs */
1848   field.compare = compare;
1849   if (gst_structure_foreach ((GstStructure *) simplify,
1850           gst_caps_structure_figure_out_union, &field)) {
1851     gboolean ret = FALSE;
1852
1853     /* now we know all of simplify's fields are the same in compare
1854      * but at most one field: field.name */
1855     if (G_IS_VALUE (&field.value)) {
1856       if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1857         gst_structure_id_set_value (compare, field.name, &field.value);
1858         *result = NULL;
1859         ret = TRUE;
1860       }
1861       g_value_unset (&field.value);
1862     } else if (gst_structure_n_fields (simplify) <=
1863         gst_structure_n_fields (compare)) {
1864       /* compare is just more specific, will be optimized away later */
1865       /* FIXME: do this here? */
1866       GST_LOG ("found a case that will be optimized later.");
1867     } else {
1868       gchar *one = gst_structure_to_string (simplify);
1869       gchar *two = gst_structure_to_string (compare);
1870
1871       GST_ERROR
1872           ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1873           one, two);
1874       g_free (one);
1875       g_free (two);
1876     }
1877     return ret;
1878   }
1879
1880   return FALSE;
1881 }
1882
1883 static void
1884 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1885     GstStructure * new, gint i)
1886 {
1887   gst_structure_set_parent_refcount (old, NULL);
1888   gst_structure_free (old);
1889   gst_structure_set_parent_refcount (new, &caps->refcount);
1890   g_ptr_array_index (caps->structs, i) = new;
1891 }
1892
1893 /**
1894  * gst_caps_do_simplify:
1895  * @caps: a #GstCaps to simplify
1896  *
1897  * Modifies the given @caps inplace into a representation that represents the
1898  * same set of formats, but in a simpler form.  Component structures that are
1899  * identical are merged.  Component structures that have values that can be
1900  * merged are also merged.
1901  *
1902  * Returns: TRUE, if the caps could be simplified
1903  */
1904 gboolean
1905 gst_caps_do_simplify (GstCaps * caps)
1906 {
1907   GstStructure *simplify, *compare, *result = NULL;
1908   gint i, j, start;
1909   gboolean changed = FALSE;
1910
1911   g_return_val_if_fail (caps != NULL, FALSE);
1912   g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1913
1914   if (gst_caps_get_size (caps) < 2)
1915     return FALSE;
1916
1917   g_ptr_array_sort (caps->structs, gst_caps_compare_structures);
1918
1919   start = caps->structs->len - 1;
1920   for (i = caps->structs->len - 1; i >= 0; i--) {
1921     simplify = gst_caps_get_structure_unchecked (caps, i);
1922     if (gst_structure_get_name_id (simplify) !=
1923         gst_structure_get_name_id (gst_caps_get_structure_unchecked (caps,
1924                 start)))
1925       start = i;
1926     for (j = start; j >= 0; j--) {
1927       if (j == i)
1928         continue;
1929       compare = gst_caps_get_structure_unchecked (caps, j);
1930       if (gst_structure_get_name_id (simplify) !=
1931           gst_structure_get_name_id (compare)) {
1932         break;
1933       }
1934       if (gst_caps_structure_simplify (&result, simplify, compare)) {
1935         if (result) {
1936           gst_caps_switch_structures (caps, simplify, result, i);
1937           simplify = result;
1938         } else {
1939           gst_caps_remove_structure (caps, i);
1940           start--;
1941           break;
1942         }
1943         changed = TRUE;
1944       }
1945     }
1946   }
1947
1948   if (!changed)
1949     return FALSE;
1950
1951   /* gst_caps_do_simplify (caps); */
1952   return TRUE;
1953 }
1954
1955 /* utility */
1956
1957 /**
1958  * gst_caps_replace:
1959  * @caps: a pointer to #GstCaps
1960  * @newcaps: a #GstCaps to replace *caps
1961  *
1962  * Replaces *caps with @newcaps.  Unrefs the #GstCaps in the location
1963  * pointed to by @caps, if applicable, then modifies @caps to point to
1964  * @newcaps. An additional ref on @newcaps is taken.
1965  *
1966  * This function does not take any locks so you might want to lock
1967  * the object owning @caps pointer.
1968  */
1969 void
1970 gst_caps_replace (GstCaps ** caps, GstCaps * newcaps)
1971 {
1972   GstCaps *oldcaps;
1973
1974   g_return_if_fail (caps != NULL);
1975
1976   oldcaps = *caps;
1977
1978   GST_CAT_TRACE (GST_CAT_REFCOUNTING, "%p, %p -> %p", caps, oldcaps, newcaps);
1979
1980   if (newcaps != oldcaps) {
1981     if (newcaps)
1982       gst_caps_ref (newcaps);
1983
1984     *caps = newcaps;
1985
1986     if (oldcaps)
1987       gst_caps_unref (oldcaps);
1988   }
1989 }
1990
1991 /**
1992  * gst_caps_to_string:
1993  * @caps: a #GstCaps
1994  *
1995  * Converts @caps to a string representation.  This string representation
1996  * can be converted back to a #GstCaps by gst_caps_from_string().
1997  *
1998  * For debugging purposes its easier to do something like this:
1999  * |[
2000  * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
2001  * ]|
2002  * This prints the caps in human readble form.
2003  *
2004  * Returns: a newly allocated string representing @caps.
2005  */
2006 gchar *
2007 gst_caps_to_string (const GstCaps * caps)
2008 {
2009   guint i, slen, clen;
2010   GString *s;
2011
2012   /* NOTE:  This function is potentially called by the debug system,
2013    * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
2014    * should be careful to avoid recursion.  This includes any functions
2015    * called by gst_caps_to_string.  In particular, calls should
2016    * not use the GST_PTR_FORMAT extension.  */
2017
2018   if (caps == NULL) {
2019     return g_strdup ("NULL");
2020   }
2021   if (CAPS_IS_ANY (caps)) {
2022     return g_strdup ("ANY");
2023   }
2024   if (CAPS_IS_EMPTY_SIMPLE (caps)) {
2025     return g_strdup ("EMPTY");
2026   }
2027
2028   /* estimate a rough string length to avoid unnecessary reallocs in GString */
2029   slen = 0;
2030   clen = caps->structs->len;
2031   for (i = 0; i < clen; i++) {
2032     slen +=
2033         STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked (caps,
2034             i));
2035   }
2036
2037   s = g_string_sized_new (slen);
2038   for (i = 0; i < clen; i++) {
2039     GstStructure *structure;
2040
2041     if (i) {
2042       /* ';' is now added by gst_structure_to_string */
2043       g_string_append_c (s, ' ');
2044     }
2045
2046     structure = gst_caps_get_structure_unchecked (caps, i);
2047     priv_gst_structure_append_to_gstring (structure, s);
2048   }
2049   if (s->len && s->str[s->len - 1] == ';') {
2050     /* remove latest ';' */
2051     s->str[--s->len] = '\0';
2052   }
2053   return g_string_free (s, FALSE);
2054 }
2055
2056 static gboolean
2057 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
2058 {
2059   GstStructure *structure;
2060   gchar *s;
2061
2062   if (strcmp ("ANY", string) == 0) {
2063     caps->flags = GST_CAPS_FLAGS_ANY;
2064     return TRUE;
2065   }
2066   if (strcmp ("EMPTY", string) == 0) {
2067     return TRUE;
2068   }
2069
2070   structure = gst_structure_from_string (string, &s);
2071   if (structure == NULL) {
2072     return FALSE;
2073   }
2074   gst_caps_append_structure_unchecked (caps, structure);
2075
2076   do {
2077
2078     while (g_ascii_isspace (*s))
2079       s++;
2080     if (*s == '\0') {
2081       break;
2082     }
2083     structure = gst_structure_from_string (s, &s);
2084     if (structure == NULL) {
2085       return FALSE;
2086     }
2087     gst_caps_append_structure_unchecked (caps, structure);
2088
2089   } while (TRUE);
2090
2091   return TRUE;
2092 }
2093
2094 /**
2095  * gst_caps_from_string:
2096  * @string: a string to convert to #GstCaps
2097  *
2098  * Converts @caps from a string representation.
2099  *
2100  * Returns: a newly allocated #GstCaps
2101  */
2102 GstCaps *
2103 gst_caps_from_string (const gchar * string)
2104 {
2105   GstCaps *caps;
2106
2107   g_return_val_if_fail (string, FALSE);
2108
2109   caps = gst_caps_new_empty ();
2110   if (gst_caps_from_string_inplace (caps, string)) {
2111     return caps;
2112   } else {
2113     gst_caps_unref (caps);
2114     return NULL;
2115   }
2116 }
2117
2118 static void
2119 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
2120 {
2121   g_return_if_fail (G_IS_VALUE (src_value));
2122   g_return_if_fail (G_IS_VALUE (dest_value));
2123   g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
2124   g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
2125       || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
2126
2127   dest_value->data[0].v_pointer =
2128       gst_caps_to_string (src_value->data[0].v_pointer);
2129 }
2130
2131 static GstCaps *
2132 gst_caps_copy_conditional (GstCaps * src)
2133 {
2134   if (src) {
2135     return gst_caps_ref (src);
2136   } else {
2137     return NULL;
2138   }
2139 }