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