caps: use our macros more often in the code
[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_LOG (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) > 0, 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_LOG (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) > 0);
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) > 0))
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 static gboolean
533 gst_structure_is_equal_foreach (GQuark field_id, const GValue * val2,
534     gpointer data)
535 {
536   GstStructure *struct1 = (GstStructure *) data;
537   const GValue *val1 = gst_structure_id_get_value (struct1, field_id);
538
539   if (G_UNLIKELY (val1 == NULL))
540     return FALSE;
541   if (gst_value_compare (val1, val2) == GST_VALUE_EQUAL) {
542     return TRUE;
543   }
544
545   return FALSE;
546 }
547
548 static gboolean
549 gst_caps_structure_is_subset_field (GQuark field_id, const GValue * value,
550     gpointer user_data)
551 {
552   GstStructure *subtract_from = user_data;
553   GValue subtraction = { 0, };
554   const GValue *other;
555
556   if (!(other = gst_structure_id_get_value (subtract_from, field_id)))
557     /* field is missing in one set */
558     return FALSE;
559
560   /* equal values are subset */
561   if (gst_value_compare (other, value) == GST_VALUE_EQUAL)
562     return TRUE;
563
564   /*
565    * 1 - [1,2] = empty
566    * -> !subset
567    *
568    * [1,2] - 1 = 2
569    *  -> 1 - [1,2] = empty
570    *  -> subset
571    *
572    * [1,3] - [1,2] = 3
573    * -> [1,2] - [1,3] = empty
574    * -> subset
575    *
576    * {1,2} - {1,3} = 2
577    * -> {1,3} - {1,2} = 3
578    * -> !subset
579    *
580    *  First caps subtraction needs to return a non-empty set, second
581    *  subtractions needs to give en empty set.
582    */
583   if (gst_value_subtract (&subtraction, other, value)) {
584     g_value_unset (&subtraction);
585     /* !empty result, swapping must be empty */
586     if (!gst_value_subtract (&subtraction, value, other))
587       return TRUE;
588
589     g_value_unset (&subtraction);
590   }
591   return FALSE;
592 }
593
594 static gboolean
595 gst_caps_structure_is_subset (const GstStructure * minuend,
596     const GstStructure * subtrahend)
597 {
598   if ((minuend->name != subtrahend->name) ||
599       (gst_structure_n_fields (minuend) !=
600           gst_structure_n_fields (subtrahend))) {
601     return FALSE;
602   }
603
604   return gst_structure_foreach ((GstStructure *) subtrahend,
605       gst_caps_structure_is_subset_field, (gpointer) minuend);
606 }
607
608 /**
609  * gst_caps_append:
610  * @caps1: the #GstCaps that will be appended to
611  * @caps2: the #GstCaps to append
612  *
613  * Appends the structures contained in @caps2 to @caps1. The structures in
614  * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
615  * freed. If either caps is ANY, the resulting caps will be ANY.
616  */
617 void
618 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
619 {
620   GstStructure *structure;
621   int i;
622
623   g_return_if_fail (GST_IS_CAPS (caps1));
624   g_return_if_fail (GST_IS_CAPS (caps2));
625   g_return_if_fail (IS_WRITABLE (caps1));
626   g_return_if_fail (IS_WRITABLE (caps2));
627
628 #ifdef USE_POISONING
629   CAPS_POISON (caps2);
630 #endif
631   if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))) {
632     /* FIXME: this leaks */
633     caps1->flags |= GST_CAPS_FLAGS_ANY;
634     for (i = caps2->structs->len - 1; i >= 0; i--) {
635       structure = gst_caps_remove_and_get_structure (caps2, i);
636       gst_structure_free (structure);
637     }
638   } else {
639     for (i = caps2->structs->len; i; i--) {
640       structure = gst_caps_remove_and_get_structure (caps2, 0);
641       gst_caps_append_structure_unchecked (caps1, structure);
642     }
643   }
644   gst_caps_unref (caps2);       /* guaranteed to free it */
645 }
646
647 /**
648  * gst_caps_merge:
649  * @caps1: the #GstCaps that will take the new entries
650  * @caps2: the #GstCaps to merge in
651  *
652  * Appends the structures contained in @caps2 to @caps1 if they are not yet
653  * expressed by @caps1. The structures in @caps2 are not copied -- they are
654  * transferred to @caps1, and then @caps2 is freed.
655  * If either caps is ANY, the resulting caps will be ANY.
656  *
657  * Since: 0.10.10
658  */
659 void
660 gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
661 {
662   GstStructure *structure;
663   int i;
664
665   g_return_if_fail (GST_IS_CAPS (caps1));
666   g_return_if_fail (GST_IS_CAPS (caps2));
667   g_return_if_fail (IS_WRITABLE (caps1));
668   g_return_if_fail (IS_WRITABLE (caps2));
669
670 #ifdef USE_POISONING
671   CAPS_POISON (caps2);
672 #endif
673   if (G_UNLIKELY (CAPS_IS_ANY (caps1))) {
674     for (i = caps2->structs->len - 1; i >= 0; i--) {
675       structure = gst_caps_remove_and_get_structure (caps2, i);
676       gst_structure_free (structure);
677     }
678   } else if (G_UNLIKELY (CAPS_IS_ANY (caps2))) {
679     caps1->flags |= GST_CAPS_FLAGS_ANY;
680     for (i = caps1->structs->len - 1; i >= 0; i--) {
681       structure = gst_caps_remove_and_get_structure (caps1, i);
682       gst_structure_free (structure);
683     }
684   } else {
685     for (i = caps2->structs->len; i; i--) {
686       structure = gst_caps_remove_and_get_structure (caps2, 0);
687       gst_caps_merge_structure (caps1, structure);
688     }
689     /* this is too naive
690        GstCaps *com = gst_caps_intersect (caps1, caps2);
691        GstCaps *add = gst_caps_subtract (caps2, com);
692
693        GST_DEBUG ("common : %d", gst_caps_get_size (com));
694        GST_DEBUG ("adding : %d", gst_caps_get_size (add));
695        gst_caps_append (caps1, add);
696        gst_caps_unref (com);
697      */
698   }
699   gst_caps_unref (caps2);       /* guaranteed to free it */
700 }
701
702 /**
703  * gst_caps_append_structure:
704  * @caps: the #GstCaps that will be appended to
705  * @structure: the #GstStructure to append
706  *
707  * Appends @structure to @caps.  The structure is not copied; @caps
708  * becomes the owner of @structure.
709  */
710 void
711 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
712 {
713   g_return_if_fail (GST_IS_CAPS (caps));
714   g_return_if_fail (IS_WRITABLE (caps));
715
716   if (G_LIKELY (structure)) {
717     g_return_if_fail (structure->parent_refcount == NULL);
718 #if 0
719 #ifdef USE_POISONING
720     STRUCTURE_POISON (structure);
721 #endif
722 #endif
723     gst_caps_append_structure_unchecked (caps, structure);
724   }
725 }
726
727 /**
728  * gst_caps_remove_structure:
729  * @caps: the #GstCaps to remove from
730  * @idx: Index of the structure to remove
731  *
732  * removes the stucture with the given index from the list of structures
733  * contained in @caps.
734  */
735 void
736 gst_caps_remove_structure (GstCaps * caps, guint idx)
737 {
738   GstStructure *structure;
739
740   g_return_if_fail (caps != NULL);
741   g_return_if_fail (idx <= gst_caps_get_size (caps));
742   g_return_if_fail (IS_WRITABLE (caps));
743
744   structure = gst_caps_remove_and_get_structure (caps, idx);
745   gst_structure_free (structure);
746 }
747
748 /**
749  * gst_caps_merge_structure:
750  * @caps: the #GstCaps that will the the new structure
751  * @structure: the #GstStructure to merge
752  *
753  * Appends @structure to @caps if its not already expressed by @caps.  The
754  * structure is not copied; @caps becomes the owner of @structure.
755  */
756 void
757 gst_caps_merge_structure (GstCaps * caps, GstStructure * structure)
758 {
759   g_return_if_fail (GST_IS_CAPS (caps));
760   g_return_if_fail (IS_WRITABLE (caps));
761
762   if (G_LIKELY (structure)) {
763     GstStructure *structure1;
764     int i;
765     gboolean unique = TRUE;
766
767     g_return_if_fail (structure->parent_refcount == NULL);
768 #if 0
769 #ifdef USE_POISONING
770     STRUCTURE_POISON (structure);
771 #endif
772 #endif
773     /* check each structure */
774     for (i = caps->structs->len - 1; i >= 0; i--) {
775       structure1 = gst_caps_get_structure_unchecked (caps, i);
776       /* if structure is a subset of structure1, then skip it */
777       if (gst_caps_structure_is_subset (structure1, structure)) {
778         unique = FALSE;
779         break;
780       }
781     }
782     if (unique) {
783       gst_structure_set_parent_refcount (structure, &caps->refcount);
784       g_ptr_array_add (caps->structs, structure);
785     } else {
786       gst_structure_free (structure);
787     }
788   }
789 }
790
791 /**
792  * gst_caps_get_size:
793  * @caps: a #GstCaps
794  *
795  * Gets the number of structures contained in @caps.
796  *
797  * Returns: the number of structures that @caps contains
798  */
799 guint
800 gst_caps_get_size (const GstCaps * caps)
801 {
802   g_return_val_if_fail (GST_IS_CAPS (caps), 0);
803
804   return caps->structs->len;
805 }
806
807 /**
808  * gst_caps_get_structure:
809  * @caps: a #GstCaps
810  * @index: the index of the structure
811  *
812  * Finds the structure in @caps that has the index @index, and
813  * returns it.
814  *
815  * WARNING: This function takes a const GstCaps *, but returns a
816  * non-const GstStructure *.  This is for programming convenience --
817  * the caller should be aware that structures inside a constant
818  * #GstCaps should not be modified. However, if you know the caps
819  * are writable, either because you have just copied them or made
820  * them writable with gst_caps_make_writable(), you may modify the
821  * structure returned in the usual way, e.g. with functions like
822  * gst_structure_set().
823  *
824  * You do not need to free or unref the structure returned, it
825  * belongs to the #GstCaps.
826  *
827  * Returns: a pointer to the #GstStructure corresponding to @index
828  */
829 GstStructure *
830 gst_caps_get_structure (const GstCaps * caps, guint index)
831 {
832   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
833   g_return_val_if_fail (index < caps->structs->len, NULL);
834
835   return gst_caps_get_structure_unchecked (caps, index);
836 }
837
838 /**
839  * gst_caps_copy_nth:
840  * @caps: the #GstCaps to copy
841  * @nth: the nth structure to copy
842  *
843  * Creates a new #GstCaps and appends a copy of the nth structure
844  * contained in @caps.
845  *
846  * Returns: the new #GstCaps
847  */
848 GstCaps *
849 gst_caps_copy_nth (const GstCaps * caps, guint nth)
850 {
851   GstCaps *newcaps;
852   GstStructure *structure;
853
854   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
855
856   newcaps = gst_caps_new_empty ();
857   newcaps->flags = caps->flags;
858
859   if (G_LIKELY (caps->structs->len > nth)) {
860     structure = gst_caps_get_structure_unchecked (caps, nth);
861     gst_caps_append_structure_unchecked (newcaps,
862         gst_structure_copy (structure));
863   }
864
865   return newcaps;
866 }
867
868 /**
869  * gst_caps_truncate:
870  * @caps: the #GstCaps to truncate
871  *
872  * Destructively discard all but the first structure from @caps. Useful when
873  * fixating. @caps must be writable.
874  */
875 void
876 gst_caps_truncate (GstCaps * caps)
877 {
878   gint i;
879
880   g_return_if_fail (GST_IS_CAPS (caps));
881   g_return_if_fail (IS_WRITABLE (caps));
882
883   i = caps->structs->len - 1;
884
885   while (i > 0)
886     gst_caps_remove_structure (caps, i--);
887 }
888
889 /**
890  * gst_caps_set_value:
891  * @caps: a writable caps
892  * @field: name of the field to set
893  * @value: value to set the field to
894  *
895  * Sets the given @field on all structures of @caps to the given @value.
896  * This is a convenience function for calling gst_structure_set_value() on
897  * all structures of @caps.
898  *
899  * Since: 0.10.26
900  **/
901 void
902 gst_caps_set_value (GstCaps * caps, const char *field, const GValue * value)
903 {
904   guint i, len;
905
906   g_return_if_fail (GST_IS_CAPS (caps));
907   g_return_if_fail (IS_WRITABLE (caps));
908   g_return_if_fail (field != NULL);
909   g_return_if_fail (G_IS_VALUE (value));
910
911   len = caps->structs->len;
912   for (i = 0; i < len; i++) {
913     GstStructure *structure = gst_caps_get_structure_unchecked (caps, i);
914     gst_structure_set_value (structure, field, value);
915   }
916 }
917
918 /**
919  * gst_caps_set_simple_valist:
920  * @caps: the #GstCaps to set
921  * @field: first field to set
922  * @varargs: additional parameters
923  *
924  * Sets fields in a #GstCaps.  The arguments must be passed in the same
925  * manner as gst_structure_set(), and be NULL-terminated.
926  * <note>Prior to GStreamer version 0.10.26, this function failed when
927  * @caps was not simple. If your code needs to work with those versions 
928  * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
929  * is %TRUE for @caps.</note>
930  */
931 void
932 gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs)
933 {
934   GValue value = { 0, };
935
936   g_return_if_fail (GST_IS_CAPS (caps));
937   g_return_if_fail (IS_WRITABLE (caps));
938
939   while (field) {
940     GType type;
941     char *err;
942
943     type = va_arg (varargs, GType);
944
945     if (G_UNLIKELY (type == G_TYPE_DATE)) {
946       g_warning ("Don't use G_TYPE_DATE, use GST_TYPE_DATE instead\n");
947       type = GST_TYPE_DATE;
948     }
949 #if GLIB_CHECK_VERSION(2,23,3)
950     G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
951 #else
952     g_value_init (&value, type);
953     G_VALUE_COLLECT (&value, varargs, 0, &err);
954 #endif
955     if (G_UNLIKELY (err)) {
956       g_critical ("%s", err);
957       return;
958     }
959
960     gst_caps_set_value (caps, field, &value);
961
962     g_value_unset (&value);
963
964     field = va_arg (varargs, const gchar *);
965   }
966 }
967
968 /**
969  * gst_caps_set_simple:
970  * @caps: the #GstCaps to set
971  * @field: first field to set
972  * @...: additional parameters
973  *
974  * Sets fields in a #GstCaps.  The arguments must be passed in the same
975  * manner as gst_structure_set(), and be NULL-terminated.
976  * <note>Prior to GStreamer version 0.10.26, this function failed when
977  * @caps was not simple. If your code needs to work with those versions
978  * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
979  * is %TRUE for @caps.</note>
980  */
981 void
982 gst_caps_set_simple (GstCaps * caps, const char *field, ...)
983 {
984   va_list var_args;
985
986   g_return_if_fail (GST_IS_CAPS (caps));
987   g_return_if_fail (IS_WRITABLE (caps));
988
989   va_start (var_args, field);
990   gst_caps_set_simple_valist (caps, field, var_args);
991   va_end (var_args);
992 }
993
994 /* tests */
995
996 /**
997  * gst_caps_is_any:
998  * @caps: the #GstCaps to test
999  *
1000  * Determines if @caps represents any media format.
1001  *
1002  * Returns: TRUE if @caps represents any format.
1003  */
1004 gboolean
1005 gst_caps_is_any (const GstCaps * caps)
1006 {
1007   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1008
1009   return (CAPS_IS_ANY (caps));
1010 }
1011
1012 /**
1013  * gst_caps_is_empty:
1014  * @caps: the #GstCaps to test
1015  *
1016  * Determines if @caps represents no media formats.
1017  *
1018  * Returns: TRUE if @caps represents no formats.
1019  */
1020 gboolean
1021 gst_caps_is_empty (const GstCaps * caps)
1022 {
1023   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1024
1025   if (CAPS_IS_ANY (caps))
1026     return FALSE;
1027
1028   return CAPS_IS_EMPTY_SIMPLE (caps);
1029 }
1030
1031 static gboolean
1032 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
1033     gpointer unused)
1034 {
1035   return gst_value_is_fixed (value);
1036 }
1037
1038 /**
1039  * gst_caps_is_fixed:
1040  * @caps: the #GstCaps to test
1041  *
1042  * Fixed #GstCaps describe exactly one format, that is, they have exactly
1043  * one structure, and each field in the structure describes a fixed type.
1044  * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
1045  *
1046  * Returns: TRUE if @caps is fixed
1047  */
1048 gboolean
1049 gst_caps_is_fixed (const GstCaps * caps)
1050 {
1051   GstStructure *structure;
1052
1053   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1054
1055   if (caps->structs->len != 1)
1056     return FALSE;
1057
1058   structure = gst_caps_get_structure_unchecked (caps, 0);
1059
1060   return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
1061 }
1062
1063 /**
1064  * gst_caps_is_equal_fixed:
1065  * @caps1: the #GstCaps to test
1066  * @caps2: the #GstCaps to test
1067  *
1068  * Tests if two #GstCaps are equal.  This function only works on fixed
1069  * #GstCaps.
1070  *
1071  * Returns: TRUE if the arguments represent the same format
1072  */
1073 gboolean
1074 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
1075 {
1076   GstStructure *struct1, *struct2;
1077
1078   g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
1079   g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
1080
1081   struct1 = gst_caps_get_structure_unchecked (caps1, 0);
1082   struct2 = gst_caps_get_structure_unchecked (caps2, 0);
1083
1084   if (struct1->name != struct2->name) {
1085     return FALSE;
1086   }
1087   if (struct1->fields->len != struct2->fields->len) {
1088     return FALSE;
1089   }
1090
1091   return gst_structure_foreach (struct1, gst_structure_is_equal_foreach,
1092       struct2);
1093 }
1094
1095 /**
1096  * gst_caps_is_always_compatible:
1097  * @caps1: the #GstCaps to test
1098  * @caps2: the #GstCaps to test
1099  *
1100  * A given #GstCaps structure is always compatible with another if
1101  * every media format that is in the first is also contained in the
1102  * second.  That is, @caps1 is a subset of @caps2.
1103  *
1104  * Returns: TRUE if @caps1 is a subset of @caps2.
1105  */
1106 gboolean
1107 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
1108 {
1109   g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1110   g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1111
1112   return gst_caps_is_subset (caps1, caps2);
1113 }
1114
1115 /**
1116  * gst_caps_is_subset:
1117  * @subset: a #GstCaps
1118  * @superset: a potentially greater #GstCaps
1119  *
1120  * Checks if all caps represented by @subset are also represented by @superset.
1121  * <note>This function does not work reliably if optional properties for caps
1122  * are included on one caps and omitted on the other.</note>
1123  *
1124  * Returns: %TRUE if @subset is a subset of @superset
1125  */
1126 gboolean
1127 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
1128 {
1129   GstCaps *caps;
1130   gboolean ret;
1131
1132   g_return_val_if_fail (subset != NULL, FALSE);
1133   g_return_val_if_fail (superset != NULL, FALSE);
1134
1135   if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
1136     return TRUE;
1137   if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
1138     return FALSE;
1139
1140   caps = gst_caps_subtract (subset, superset);
1141   ret = CAPS_IS_EMPTY_SIMPLE (caps);
1142   gst_caps_unref (caps);
1143   return ret;
1144 }
1145
1146 /**
1147  * gst_caps_is_equal:
1148  * @caps1: a #GstCaps
1149  * @caps2: another #GstCaps
1150  *
1151  * Checks if the given caps represent the same set of caps.
1152  * <note>This function does not work reliably if optional properties for caps
1153  * are included on one caps and omitted on the other.</note>
1154  *
1155  * This function deals correctly with passing NULL for any of the caps.
1156  *
1157  * Returns: TRUE if both caps are equal.
1158  */
1159 gboolean
1160 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
1161 {
1162   /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
1163    * So there should be an assertion that caps1 and caps2 != NULL */
1164
1165   /* NULL <-> NULL is allowed here */
1166   if (G_UNLIKELY (caps1 == caps2))
1167     return TRUE;
1168
1169   /* one of them NULL => they are different (can't be both NULL because
1170    * we checked that above) */
1171   if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
1172     return FALSE;
1173
1174   if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
1175     return gst_caps_is_equal_fixed (caps1, caps2);
1176
1177   return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1178 }
1179
1180 /* intersect operation */
1181
1182 typedef struct
1183 {
1184   GstStructure *dest;
1185   const GstStructure *intersect;
1186 }
1187 IntersectData;
1188
1189 static gboolean
1190 gst_caps_structure_intersect_field1 (GQuark id, const GValue * val1,
1191     gpointer data)
1192 {
1193   IntersectData *idata = (IntersectData *) data;
1194   const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
1195
1196   if (G_UNLIKELY (val2 == NULL)) {
1197     gst_structure_id_set_value (idata->dest, id, val1);
1198   } else {
1199     GValue dest_value = { 0 };
1200     if (gst_value_intersect (&dest_value, val1, val2)) {
1201       gst_structure_id_set_value (idata->dest, id, &dest_value);
1202       g_value_unset (&dest_value);
1203     } else {
1204       return FALSE;
1205     }
1206   }
1207   return TRUE;
1208 }
1209
1210 static gboolean
1211 gst_caps_structure_intersect_field2 (GQuark id, const GValue * val1,
1212     gpointer data)
1213 {
1214   IntersectData *idata = (IntersectData *) data;
1215   const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
1216
1217   if (G_UNLIKELY (val2 == NULL)) {
1218     gst_structure_id_set_value (idata->dest, id, val1);
1219   }
1220   return TRUE;
1221 }
1222
1223 static GstStructure *
1224 gst_caps_structure_intersect (const GstStructure * struct1,
1225     const GstStructure * struct2)
1226 {
1227   IntersectData data;
1228
1229   g_assert (struct1 != NULL);
1230   g_assert (struct2 != NULL);
1231
1232   if (G_UNLIKELY (struct1->name != struct2->name))
1233     return NULL;
1234
1235   /* copy fields from struct1 which we have not in struct2 to target
1236    * intersect if we have the field in both */
1237   data.dest = gst_structure_id_empty_new (struct1->name);
1238   data.intersect = struct2;
1239   if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
1240               gst_caps_structure_intersect_field1, &data)))
1241     goto error;
1242
1243   /* copy fields from struct2 which we have not in struct1 to target */
1244   data.intersect = struct1;
1245   if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct2,
1246               gst_caps_structure_intersect_field2, &data)))
1247     goto error;
1248
1249   return data.dest;
1250
1251 error:
1252   gst_structure_free (data.dest);
1253   return NULL;
1254 }
1255
1256 static gboolean
1257 gst_caps_structure_can_intersect_field (GQuark id, const GValue * val1,
1258     gpointer data)
1259 {
1260   GstStructure *other = (GstStructure *) data;
1261   const GValue *val2 = gst_structure_id_get_value (other, id);
1262
1263   if (G_LIKELY (val2)) {
1264     if (!gst_value_can_intersect (val1, val2)) {
1265       return FALSE;
1266     } else {
1267       gint eq = gst_value_compare (val1, val2);
1268
1269       if (eq == GST_VALUE_UNORDERED) {
1270         /* we need to try interseting */
1271         GValue dest_value = { 0 };
1272         if (gst_value_intersect (&dest_value, val1, val2)) {
1273           g_value_unset (&dest_value);
1274         } else {
1275           return FALSE;
1276         }
1277       } else if (eq != GST_VALUE_EQUAL) {
1278         return FALSE;
1279       }
1280     }
1281   }
1282   return TRUE;
1283 }
1284
1285 static gboolean
1286 gst_caps_structure_can_intersect (const GstStructure * struct1,
1287     const GstStructure * struct2)
1288 {
1289   g_assert (struct1 != NULL);
1290   g_assert (struct2 != NULL);
1291
1292   if (G_UNLIKELY (struct1->name != struct2->name))
1293     return FALSE;
1294
1295   /* tries to intersect if we have the field in both */
1296   if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
1297               gst_caps_structure_can_intersect_field, (gpointer) struct2)))
1298     return FALSE;
1299
1300   return TRUE;
1301 }
1302
1303 /**
1304  * gst_caps_can_intersect:
1305  * @caps1: a #GstCaps to intersect
1306  * @caps2: a #GstCaps to intersect
1307  *
1308  * Tries intersecting @caps1 and @caps2 and reports wheter the result would not
1309  * be empty
1310  *
1311  * Returns: %TRUE if intersection would be not empty
1312  *
1313  * Since: 0.10.25
1314  */
1315 gboolean
1316 gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
1317 {
1318   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1319   guint j, k, len1, len2;
1320   GstStructure *struct1;
1321   GstStructure *struct2;
1322
1323   g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1324   g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1325
1326   /* caps are exactly the same pointers */
1327   if (G_UNLIKELY (caps1 == caps2))
1328     return TRUE;
1329
1330   /* empty caps on either side, return empty */
1331   if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1332     return FALSE;
1333
1334   /* one of the caps is any */
1335   if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
1336     return TRUE;
1337
1338   /* run zigzag on top line then right line, this preserves the caps order
1339    * much better than a simple loop.
1340    *
1341    * This algorithm zigzags over the caps structures as demonstrated in
1342    * the folowing matrix:
1343    *
1344    *          caps1
1345    *       +-------------
1346    *       | 1  2  4  7
1347    * caps2 | 3  5  8 10
1348    *       | 6  9 11 12
1349    *
1350    * First we iterate over the caps1 structures (top line) intersecting
1351    * the structures diagonally down, then we iterate over the caps2
1352    * structures.
1353    */
1354   len1 = caps1->structs->len;
1355   len2 = caps2->structs->len;
1356   for (i = 0; i < len1 + len2 - 1; i++) {
1357     /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */
1358     j = MIN (i, len1 - 1);
1359     /* subset index stays 0 until i reaches superset->structs->len, then it
1360      * counts up from 1 to subset->structs->len - 1 */
1361     k = MAX (0, i - j);
1362
1363     /* now run the diagonal line, end condition is the left or bottom
1364      * border */
1365     while (k < len2) {
1366       struct1 = gst_caps_get_structure_unchecked (caps1, j);
1367       struct2 = gst_caps_get_structure_unchecked (caps2, k);
1368
1369       if (gst_caps_structure_can_intersect (struct1, struct2)) {
1370         return TRUE;
1371       }
1372       /* move down left */
1373       k++;
1374       if (G_UNLIKELY (j == 0))
1375         break;                  /* so we don't roll back to G_MAXUINT */
1376       j--;
1377     }
1378   }
1379   return FALSE;
1380 }
1381
1382 /**
1383  * gst_caps_intersect:
1384  * @caps1: a #GstCaps to intersect
1385  * @caps2: a #GstCaps to intersect
1386  *
1387  * Creates a new #GstCaps that contains all the formats that are common
1388  * to both @caps1 and @caps2.
1389  *
1390  * Returns: the new #GstCaps
1391  */
1392 GstCaps *
1393 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1394 {
1395   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1396   guint j, k, len1, len2;
1397
1398   GstStructure *struct1;
1399   GstStructure *struct2;
1400   GstCaps *dest;
1401   GstStructure *istruct;
1402
1403   g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1404   g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1405
1406   /* caps are exactly the same pointers, just copy one caps */
1407   if (G_UNLIKELY (caps1 == caps2))
1408     return gst_caps_copy (caps1);
1409
1410   /* empty caps on either side, return empty */
1411   if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1412     return gst_caps_new_empty ();
1413
1414   /* one of the caps is any, just copy the other caps */
1415   if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1416     return gst_caps_copy (caps2);
1417   if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1418     return gst_caps_copy (caps1);
1419
1420   dest = gst_caps_new_empty ();
1421
1422   /* run zigzag on top line then right line, this preserves the caps order
1423    * much better than a simple loop.
1424    *
1425    * This algorithm zigzags over the caps structures as demonstrated in
1426    * the folowing matrix:
1427    *
1428    *          caps1
1429    *       +-------------
1430    *       | 1  2  4  7
1431    * caps2 | 3  5  8 10
1432    *       | 6  9 11 12
1433    *
1434    * First we iterate over the caps1 structures (top line) intersecting
1435    * the structures diagonally down, then we iterate over the caps2
1436    * structures.
1437    */
1438   len1 = caps1->structs->len;
1439   len2 = caps2->structs->len;
1440   for (i = 0; i < len1 + len2 - 1; i++) {
1441     /* caps1 index goes from 0 to caps1->structs->len-1 */
1442     j = MIN (i, len1 - 1);
1443     /* caps2 index stays 0 until i reaches caps1->structs->len, then it counts
1444      * up from 1 to caps2->structs->len - 1 */
1445     k = MAX (0, i - j);
1446
1447     /* now run the diagonal line, end condition is the left or bottom
1448      * border */
1449     while (k < len2) {
1450       struct1 = gst_caps_get_structure_unchecked (caps1, j);
1451       struct2 = gst_caps_get_structure_unchecked (caps2, k);
1452
1453       istruct = gst_caps_structure_intersect (struct1, struct2);
1454
1455       gst_caps_append_structure (dest, istruct);
1456       /* move down left */
1457       k++;
1458       if (G_UNLIKELY (j == 0))
1459         break;                  /* so we don't roll back to G_MAXUINT */
1460       j--;
1461     }
1462   }
1463   return dest;
1464 }
1465
1466 /* subtract operation */
1467
1468 typedef struct
1469 {
1470   const GstStructure *subtract_from;
1471   GSList *put_into;
1472 }
1473 SubtractionEntry;
1474
1475 static gboolean
1476 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1477     gpointer user_data)
1478 {
1479   SubtractionEntry *e = user_data;
1480   GValue subtraction = { 0, };
1481   const GValue *other;
1482   GstStructure *structure;
1483
1484   other = gst_structure_id_get_value (e->subtract_from, field_id);
1485   if (!other) {
1486     return FALSE;
1487   }
1488   if (!gst_value_subtract (&subtraction, other, value))
1489     return TRUE;
1490   if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1491     g_value_unset (&subtraction);
1492     return FALSE;
1493   } else {
1494     structure = gst_structure_copy (e->subtract_from);
1495     gst_structure_id_set_value (structure, field_id, &subtraction);
1496     g_value_unset (&subtraction);
1497     e->put_into = g_slist_prepend (e->put_into, structure);
1498     return TRUE;
1499   }
1500 }
1501
1502 static gboolean
1503 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1504     const GstStructure * subtrahend)
1505 {
1506   SubtractionEntry e;
1507   gboolean ret;
1508
1509   e.subtract_from = minuend;
1510   e.put_into = NULL;
1511
1512   ret = gst_structure_foreach ((GstStructure *) subtrahend,
1513       gst_caps_structure_subtract_field, &e);
1514   if (ret) {
1515     *into = e.put_into;
1516   } else {
1517     GSList *walk;
1518
1519     for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1520       gst_structure_free (walk->data);
1521     }
1522     g_slist_free (e.put_into);
1523   }
1524   return ret;
1525 }
1526
1527 /**
1528  * gst_caps_subtract:
1529  * @minuend: #GstCaps to substract from
1530  * @subtrahend: #GstCaps to substract
1531  *
1532  * Subtracts the @subtrahend from the @minuend.
1533  * <note>This function does not work reliably if optional properties for caps
1534  * are included on one caps and omitted on the other.</note>
1535  *
1536  * Returns: the resulting caps
1537  */
1538 GstCaps *
1539 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1540 {
1541   guint i, j, sublen;
1542   GstStructure *min;
1543   GstStructure *sub;
1544   GstCaps *dest = NULL, *src;
1545
1546   g_return_val_if_fail (minuend != NULL, NULL);
1547   g_return_val_if_fail (subtrahend != NULL, NULL);
1548
1549   if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
1550     return gst_caps_new_empty ();
1551   }
1552   if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
1553     return gst_caps_copy (minuend);
1554
1555   /* FIXME: Do we want this here or above?
1556      The reason we need this is that there is no definition about what
1557      ANY means for specific types, so it's not possible to reduce ANY partially
1558      You can only remove everything or nothing and that is done above.
1559      Note: there's a test that checks this behaviour. */
1560   g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
1561   sublen = subtrahend->structs->len;
1562   g_assert (sublen > 0);
1563
1564   src = gst_caps_copy (minuend);
1565   for (i = 0; i < sublen; i++) {
1566     guint srclen;
1567
1568     sub = gst_caps_get_structure_unchecked (subtrahend, i);
1569     if (dest) {
1570       gst_caps_unref (src);
1571       src = dest;
1572     }
1573     dest = gst_caps_new_empty ();
1574     srclen = src->structs->len;
1575     for (j = 0; j < srclen; j++) {
1576       min = gst_caps_get_structure_unchecked (src, j);
1577       if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1578         GSList *list;
1579
1580         if (gst_caps_structure_subtract (&list, min, sub)) {
1581           GSList *walk;
1582
1583           for (walk = list; walk; walk = g_slist_next (walk)) {
1584             gst_caps_append_structure_unchecked (dest,
1585                 (GstStructure *) walk->data);
1586           }
1587           g_slist_free (list);
1588         } else {
1589           gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1590         }
1591       } else {
1592         gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1593       }
1594     }
1595     if (CAPS_IS_EMPTY_SIMPLE (dest)) {
1596       gst_caps_unref (src);
1597       return dest;
1598     }
1599   }
1600
1601   gst_caps_unref (src);
1602   gst_caps_do_simplify (dest);
1603   return dest;
1604 }
1605
1606 /* union operation */
1607
1608 #if 0
1609 static GstStructure *
1610 gst_caps_structure_union (const GstStructure * struct1,
1611     const GstStructure * struct2)
1612 {
1613   int i;
1614   GstStructure *dest;
1615   const GstStructureField *field1;
1616   const GstStructureField *field2;
1617   int ret;
1618
1619   /* FIXME this doesn't actually work */
1620
1621   if (struct1->name != struct2->name)
1622     return NULL;
1623
1624   dest = gst_structure_id_empty_new (struct1->name);
1625
1626   for (i = 0; i < struct1->fields->len; i++) {
1627     GValue dest_value = { 0 };
1628
1629     field1 = GST_STRUCTURE_FIELD (struct1, i);
1630     field2 = gst_structure_id_get_field (struct2, field1->name);
1631
1632     if (field2 == NULL) {
1633       continue;
1634     } else {
1635       if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1636         gst_structure_set_value (dest, g_quark_to_string (field1->name),
1637             &dest_value);
1638       } else {
1639         ret = gst_value_compare (&field1->value, &field2->value);
1640       }
1641     }
1642   }
1643
1644   return dest;
1645 }
1646 #endif
1647
1648 /**
1649  * gst_caps_union:
1650  * @caps1: a #GstCaps to union
1651  * @caps2: a #GstCaps to union
1652  *
1653  * Creates a new #GstCaps that contains all the formats that are in
1654  * either @caps1 and @caps2.
1655  *
1656  * Returns: the new #GstCaps
1657  */
1658 GstCaps *
1659 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1660 {
1661   GstCaps *dest1;
1662   GstCaps *dest2;
1663
1664   /* NULL pointers are no correct GstCaps */
1665   g_return_val_if_fail (caps1 != NULL, NULL);
1666   g_return_val_if_fail (caps2 != NULL, NULL);
1667
1668   if (CAPS_IS_EMPTY (caps1))
1669     return gst_caps_copy (caps2);
1670
1671   if (CAPS_IS_EMPTY (caps2))
1672     return gst_caps_copy (caps1);
1673
1674   if (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))
1675     return gst_caps_new_any ();
1676
1677   dest1 = gst_caps_copy (caps1);
1678   dest2 = gst_caps_copy (caps2);
1679   gst_caps_append (dest1, dest2);
1680
1681   gst_caps_do_simplify (dest1);
1682   return dest1;
1683 }
1684
1685 /* normalize/simplify operations */
1686
1687 typedef struct _NormalizeForeach
1688 {
1689   GstCaps *caps;
1690   GstStructure *structure;
1691 }
1692 NormalizeForeach;
1693
1694 static gboolean
1695 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1696 {
1697   NormalizeForeach *nf = (NormalizeForeach *) ptr;
1698   GValue val = { 0 };
1699   guint i;
1700
1701   if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1702     guint len = gst_value_list_get_size (value);
1703     for (i = 1; i < len; i++) {
1704       const GValue *v = gst_value_list_get_value (value, i);
1705       GstStructure *structure = gst_structure_copy (nf->structure);
1706
1707       gst_structure_id_set_value (structure, field_id, v);
1708       gst_caps_append_structure_unchecked (nf->caps, structure);
1709     }
1710
1711     gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1712     gst_structure_id_set_value (nf->structure, field_id, &val);
1713     g_value_unset (&val);
1714
1715     return FALSE;
1716   }
1717   return TRUE;
1718 }
1719
1720 /**
1721  * gst_caps_normalize:
1722  * @caps: a #GstCaps to normalize
1723  *
1724  * Creates a new #GstCaps that represents the same set of formats as
1725  * @caps, but contains no lists.  Each list is expanded into separate
1726  * @GstStructures.
1727  *
1728  * Returns: the new #GstCaps
1729  */
1730 GstCaps *
1731 gst_caps_normalize (const GstCaps * caps)
1732 {
1733   NormalizeForeach nf;
1734   GstCaps *newcaps;
1735   guint i, nlen;
1736
1737   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1738
1739   newcaps = gst_caps_copy (caps);
1740   nf.caps = newcaps;
1741   nlen = newcaps->structs->len;
1742
1743   for (i = 0; i < nlen; i++) {
1744     nf.structure = gst_caps_get_structure_unchecked (newcaps, i);
1745
1746     while (!gst_structure_foreach (nf.structure,
1747             gst_caps_normalize_foreach, &nf));
1748   }
1749
1750   return newcaps;
1751 }
1752
1753 static gint
1754 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1755 {
1756   gint ret;
1757   const GstStructure *struct1 = *((const GstStructure **) one);
1758   const GstStructure *struct2 = *((const GstStructure **) two);
1759
1760   /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1761      So what's the best way? */
1762   ret = strcmp (gst_structure_get_name (struct1),
1763       gst_structure_get_name (struct2));
1764   if (ret)
1765     return ret;
1766
1767   return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1768 }
1769
1770 typedef struct
1771 {
1772   GQuark name;
1773   GValue value;
1774   GstStructure *compare;
1775 }
1776 UnionField;
1777
1778 static gboolean
1779 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1780     gpointer user_data)
1781 {
1782   UnionField *u = user_data;
1783   const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1784
1785   if (!val) {
1786     if (u->name)
1787       g_value_unset (&u->value);
1788     return FALSE;
1789   }
1790   if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1791     return TRUE;
1792   if (u->name) {
1793     g_value_unset (&u->value);
1794     return FALSE;
1795   }
1796   u->name = field_id;
1797   gst_value_union (&u->value, val, value);
1798   return TRUE;
1799 }
1800
1801 static gboolean
1802 gst_caps_structure_simplify (GstStructure ** result,
1803     const GstStructure * simplify, GstStructure * compare)
1804 {
1805   GSList *list;
1806   UnionField field = { 0, {0,}, NULL };
1807
1808   /* try to subtract to get a real subset */
1809   if (gst_caps_structure_subtract (&list, simplify, compare)) {
1810     switch (g_slist_length (list)) {
1811       case 0:
1812         *result = NULL;
1813         return TRUE;
1814       case 1:
1815         *result = list->data;
1816         g_slist_free (list);
1817         return TRUE;
1818       default:
1819       {
1820         GSList *walk;
1821
1822         for (walk = list; walk; walk = g_slist_next (walk)) {
1823           gst_structure_free (walk->data);
1824         }
1825         g_slist_free (list);
1826         break;
1827       }
1828     }
1829   }
1830
1831   /* try to union both structs */
1832   field.compare = compare;
1833   if (gst_structure_foreach ((GstStructure *) simplify,
1834           gst_caps_structure_figure_out_union, &field)) {
1835     gboolean ret = FALSE;
1836
1837     /* now we know all of simplify's fields are the same in compare
1838      * but at most one field: field.name */
1839     if (G_IS_VALUE (&field.value)) {
1840       if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1841         gst_structure_id_set_value (compare, field.name, &field.value);
1842         *result = NULL;
1843         ret = TRUE;
1844       }
1845       g_value_unset (&field.value);
1846     } else if (gst_structure_n_fields (simplify) <=
1847         gst_structure_n_fields (compare)) {
1848       /* compare is just more specific, will be optimized away later */
1849       /* FIXME: do this here? */
1850       GST_LOG ("found a case that will be optimized later.");
1851     } else {
1852       gchar *one = gst_structure_to_string (simplify);
1853       gchar *two = gst_structure_to_string (compare);
1854
1855       GST_ERROR
1856           ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1857           one, two);
1858       g_free (one);
1859       g_free (two);
1860     }
1861     return ret;
1862   }
1863
1864   return FALSE;
1865 }
1866
1867 static void
1868 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1869     GstStructure * new, gint i)
1870 {
1871   gst_structure_set_parent_refcount (old, NULL);
1872   gst_structure_free (old);
1873   gst_structure_set_parent_refcount (new, &caps->refcount);
1874   g_ptr_array_index (caps->structs, i) = new;
1875 }
1876
1877 /**
1878  * gst_caps_do_simplify:
1879  * @caps: a #GstCaps to simplify
1880  *
1881  * Modifies the given @caps inplace into a representation that represents the
1882  * same set of formats, but in a simpler form.  Component structures that are
1883  * identical are merged.  Component structures that have values that can be
1884  * merged are also merged.
1885  *
1886  * Returns: TRUE, if the caps could be simplified
1887  */
1888 gboolean
1889 gst_caps_do_simplify (GstCaps * caps)
1890 {
1891   GstStructure *simplify, *compare, *result = NULL;
1892   gint i, j, start;
1893   gboolean changed = FALSE;
1894
1895   g_return_val_if_fail (caps != NULL, FALSE);
1896   g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1897
1898   if (gst_caps_get_size (caps) < 2)
1899     return FALSE;
1900
1901   g_ptr_array_sort (caps->structs, gst_caps_compare_structures);
1902
1903   start = caps->structs->len - 1;
1904   for (i = caps->structs->len - 1; i >= 0; i--) {
1905     simplify = gst_caps_get_structure_unchecked (caps, i);
1906     if (gst_structure_get_name_id (simplify) !=
1907         gst_structure_get_name_id (gst_caps_get_structure_unchecked (caps,
1908                 start)))
1909       start = i;
1910     for (j = start; j >= 0; j--) {
1911       if (j == i)
1912         continue;
1913       compare = gst_caps_get_structure_unchecked (caps, j);
1914       if (gst_structure_get_name_id (simplify) !=
1915           gst_structure_get_name_id (compare)) {
1916         break;
1917       }
1918       if (gst_caps_structure_simplify (&result, simplify, compare)) {
1919         if (result) {
1920           gst_caps_switch_structures (caps, simplify, result, i);
1921           simplify = result;
1922         } else {
1923           gst_caps_remove_structure (caps, i);
1924           start--;
1925           break;
1926         }
1927         changed = TRUE;
1928       }
1929     }
1930   }
1931
1932   if (!changed)
1933     return FALSE;
1934
1935   /* gst_caps_do_simplify (caps); */
1936   return TRUE;
1937 }
1938
1939 /* persistence */
1940
1941 #ifndef GST_DISABLE_LOADSAVE
1942 /**
1943  * gst_caps_save_thyself:
1944  * @caps: a #GstCaps structure
1945  * @parent: a XML parent node
1946  *
1947  * Serializes a #GstCaps to XML and adds it as a child node of @parent.
1948  *
1949  * Returns: a XML node pointer
1950  */
1951 xmlNodePtr
1952 gst_caps_save_thyself (const GstCaps * caps, xmlNodePtr parent)
1953 {
1954   char *s = gst_caps_to_string (caps);
1955
1956   xmlNewChild (parent, NULL, (xmlChar *) "caps", (xmlChar *) s);
1957   g_free (s);
1958   return parent;
1959 }
1960
1961 /**
1962  * gst_caps_load_thyself:
1963  * @parent: a XML node
1964  *
1965  * Creates a #GstCaps from its XML serialization.
1966  *
1967  * Returns: a new #GstCaps structure
1968  */
1969 GstCaps *
1970 gst_caps_load_thyself (xmlNodePtr parent)
1971 {
1972   if (strcmp ("caps", (char *) parent->name) == 0) {
1973     return gst_caps_from_string ((gchar *) xmlNodeGetContent (parent));
1974   }
1975
1976   return NULL;
1977 }
1978 #endif
1979
1980 /* utility */
1981
1982 /**
1983  * gst_caps_replace:
1984  * @caps: a pointer to #GstCaps
1985  * @newcaps: a #GstCaps to replace *caps
1986  *
1987  * Replaces *caps with @newcaps.  Unrefs the #GstCaps in the location
1988  * pointed to by @caps, if applicable, then modifies @caps to point to
1989  * @newcaps. An additional ref on @newcaps is taken.
1990  *
1991  * This function does not take any locks so you might want to lock
1992  * the object owning @caps pointer.
1993  */
1994 void
1995 gst_caps_replace (GstCaps ** caps, GstCaps * newcaps)
1996 {
1997   GstCaps *oldcaps;
1998
1999   g_return_if_fail (caps != NULL);
2000
2001   oldcaps = *caps;
2002
2003   GST_CAT_LOG (GST_CAT_REFCOUNTING, "%p, %p -> %p", caps, oldcaps, newcaps);
2004
2005   if (newcaps != oldcaps) {
2006     if (newcaps)
2007       gst_caps_ref (newcaps);
2008
2009     *caps = newcaps;
2010
2011     if (oldcaps)
2012       gst_caps_unref (oldcaps);
2013   }
2014 }
2015
2016 /**
2017  * gst_caps_to_string:
2018  * @caps: a #GstCaps
2019  *
2020  * Converts @caps to a string representation.  This string representation
2021  * can be converted back to a #GstCaps by gst_caps_from_string().
2022  *
2023  * For debugging purposes its easier to do something like this:
2024  * |[
2025  * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
2026  * ]|
2027  * This prints the caps in human readble form.
2028  *
2029  * Returns: a newly allocated string representing @caps.
2030  */
2031 gchar *
2032 gst_caps_to_string (const GstCaps * caps)
2033 {
2034   guint i, slen, clen;
2035   GString *s;
2036
2037   /* NOTE:  This function is potentially called by the debug system,
2038    * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
2039    * should be careful to avoid recursion.  This includes any functions
2040    * called by gst_caps_to_string.  In particular, calls should
2041    * not use the GST_PTR_FORMAT extension.  */
2042
2043   if (caps == NULL) {
2044     return g_strdup ("NULL");
2045   }
2046   if (CAPS_IS_ANY (caps)) {
2047     return g_strdup ("ANY");
2048   }
2049   if (CAPS_IS_EMPTY_SIMPLE (caps)) {
2050     return g_strdup ("EMPTY");
2051   }
2052
2053   /* estimate a rough string length to avoid unnecessary reallocs in GString */
2054   slen = 0;
2055   clen = caps->structs->len;
2056   for (i = 0; i < clen; i++) {
2057     slen +=
2058         STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked (caps,
2059             i));
2060   }
2061
2062   s = g_string_sized_new (slen);
2063   for (i = 0; i < clen; i++) {
2064     GstStructure *structure;
2065
2066     if (i > 0) {
2067       /* ';' is now added by gst_structure_to_string */
2068       g_string_append_c (s, ' ');
2069     }
2070
2071     structure = gst_caps_get_structure_unchecked (caps, i);
2072     priv_gst_structure_append_to_gstring (structure, s);
2073   }
2074   if (s->len && s->str[s->len - 1] == ';') {
2075     /* remove latest ';' */
2076     s->str[--s->len] = '\0';
2077   }
2078   return g_string_free (s, FALSE);
2079 }
2080
2081 static gboolean
2082 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
2083 {
2084   GstStructure *structure;
2085   gchar *s;
2086
2087   if (strcmp ("ANY", string) == 0) {
2088     caps->flags = GST_CAPS_FLAGS_ANY;
2089     return TRUE;
2090   }
2091   if (strcmp ("EMPTY", string) == 0) {
2092     return TRUE;
2093   }
2094
2095   structure = gst_structure_from_string (string, &s);
2096   if (structure == NULL) {
2097     return FALSE;
2098   }
2099   gst_caps_append_structure_unchecked (caps, structure);
2100
2101   do {
2102
2103     while (g_ascii_isspace (*s))
2104       s++;
2105     if (*s == '\0') {
2106       break;
2107     }
2108     structure = gst_structure_from_string (s, &s);
2109     if (structure == NULL) {
2110       return FALSE;
2111     }
2112     gst_caps_append_structure_unchecked (caps, structure);
2113
2114   } while (TRUE);
2115
2116   return TRUE;
2117 }
2118
2119 /**
2120  * gst_caps_from_string:
2121  * @string: a string to convert to #GstCaps
2122  *
2123  * Converts @caps from a string representation.
2124  *
2125  * Returns: a newly allocated #GstCaps
2126  */
2127 GstCaps *
2128 gst_caps_from_string (const gchar * string)
2129 {
2130   GstCaps *caps;
2131
2132   g_return_val_if_fail (string, FALSE);
2133
2134   caps = gst_caps_new_empty ();
2135   if (gst_caps_from_string_inplace (caps, string)) {
2136     return caps;
2137   } else {
2138     gst_caps_unref (caps);
2139     return NULL;
2140   }
2141 }
2142
2143 static void
2144 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
2145 {
2146   g_return_if_fail (G_IS_VALUE (src_value));
2147   g_return_if_fail (G_IS_VALUE (dest_value));
2148   g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
2149   g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
2150       || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
2151
2152   dest_value->data[0].v_pointer =
2153       gst_caps_to_string (src_value->data[0].v_pointer);
2154 }
2155
2156 static GstCaps *
2157 gst_caps_copy_conditional (GstCaps * src)
2158 {
2159   if (src) {
2160     return gst_caps_ref (src);
2161   } else {
2162     return NULL;
2163   }
2164 }