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