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