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