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