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