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