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