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