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