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 #if GLIB_CHECK_VERSION(2,23,3)
851     G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
852 #else
853     g_value_init (&value, type);
854     G_VALUE_COLLECT (&value, varargs, 0, &err);
855 #endif
856     if (G_UNLIKELY (err)) {
857       g_critical ("%s", err);
858       return;
859     }
860
861     gst_caps_set_value (caps, field, &value);
862
863     g_value_unset (&value);
864
865     field = va_arg (varargs, const gchar *);
866   }
867 }
868
869 /**
870  * gst_caps_set_simple:
871  * @caps: the #GstCaps to set
872  * @field: first field to set
873  * @...: additional parameters
874  *
875  * Sets fields in a #GstCaps.  The arguments must be passed in the same
876  * manner as gst_structure_set(), and be NULL-terminated.
877  * <note>Prior to GStreamer version 0.10.26, this function failed when
878  * @caps was not simple. If your code needs to work with those versions
879  * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
880  * is %TRUE for @caps.</note>
881  */
882 void
883 gst_caps_set_simple (GstCaps * caps, const char *field, ...)
884 {
885   va_list var_args;
886
887   g_return_if_fail (GST_IS_CAPS (caps));
888   g_return_if_fail (IS_WRITABLE (caps));
889
890   va_start (var_args, field);
891   gst_caps_set_simple_valist (caps, field, var_args);
892   va_end (var_args);
893 }
894
895 /* tests */
896
897 /**
898  * gst_caps_is_any:
899  * @caps: the #GstCaps to test
900  *
901  * Determines if @caps represents any media format.
902  *
903  * Returns: TRUE if @caps represents any format.
904  */
905 gboolean
906 gst_caps_is_any (const GstCaps * caps)
907 {
908   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
909
910   return (CAPS_IS_ANY (caps));
911 }
912
913 /**
914  * gst_caps_is_empty:
915  * @caps: the #GstCaps to test
916  *
917  * Determines if @caps represents no media formats.
918  *
919  * Returns: TRUE if @caps represents no formats.
920  */
921 gboolean
922 gst_caps_is_empty (const GstCaps * caps)
923 {
924   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
925
926   if (CAPS_IS_ANY (caps))
927     return FALSE;
928
929   return CAPS_IS_EMPTY_SIMPLE (caps);
930 }
931
932 static gboolean
933 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
934     gpointer unused)
935 {
936   return gst_value_is_fixed (value);
937 }
938
939 /**
940  * gst_caps_is_fixed:
941  * @caps: the #GstCaps to test
942  *
943  * Fixed #GstCaps describe exactly one format, that is, they have exactly
944  * one structure, and each field in the structure describes a fixed type.
945  * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
946  *
947  * Returns: TRUE if @caps is fixed
948  */
949 gboolean
950 gst_caps_is_fixed (const GstCaps * caps)
951 {
952   GstStructure *structure;
953
954   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
955
956   if (caps->structs->len != 1)
957     return FALSE;
958
959   structure = gst_caps_get_structure_unchecked (caps, 0);
960
961   return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
962 }
963
964 /**
965  * gst_caps_is_equal_fixed:
966  * @caps1: the #GstCaps to test
967  * @caps2: the #GstCaps to test
968  *
969  * Tests if two #GstCaps are equal.  This function only works on fixed
970  * #GstCaps.
971  *
972  * Returns: TRUE if the arguments represent the same format
973  */
974 gboolean
975 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
976 {
977   GstStructure *struct1, *struct2;
978
979   g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
980   g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
981
982   struct1 = gst_caps_get_structure_unchecked (caps1, 0);
983   struct2 = gst_caps_get_structure_unchecked (caps2, 0);
984
985   return gst_structure_is_equal (struct1, struct2);
986 }
987
988 /**
989  * gst_caps_is_always_compatible:
990  * @caps1: the #GstCaps to test
991  * @caps2: the #GstCaps to test
992  *
993  * A given #GstCaps structure is always compatible with another if
994  * every media format that is in the first is also contained in the
995  * second.  That is, @caps1 is a subset of @caps2.
996  *
997  * Returns: TRUE if @caps1 is a subset of @caps2.
998  */
999 gboolean
1000 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
1001 {
1002   g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1003   g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1004
1005   return gst_caps_is_subset (caps1, caps2);
1006 }
1007
1008 /**
1009  * gst_caps_is_subset:
1010  * @subset: a #GstCaps
1011  * @superset: a potentially greater #GstCaps
1012  *
1013  * Checks if all caps represented by @subset are also represented by @superset.
1014  * <note>This function does not work reliably if optional properties for caps
1015  * are included on one caps and omitted on the other.</note>
1016  *
1017  * Returns: %TRUE if @subset is a subset of @superset
1018  */
1019 gboolean
1020 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
1021 {
1022   GstCaps *caps;
1023   gboolean ret;
1024
1025   g_return_val_if_fail (subset != NULL, FALSE);
1026   g_return_val_if_fail (superset != NULL, FALSE);
1027
1028   if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
1029     return TRUE;
1030   if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
1031     return FALSE;
1032
1033   caps = gst_caps_subtract (subset, superset);
1034   ret = CAPS_IS_EMPTY_SIMPLE (caps);
1035   gst_caps_unref (caps);
1036   return ret;
1037 }
1038
1039 /**
1040  * gst_caps_is_equal:
1041  * @caps1: a #GstCaps
1042  * @caps2: another #GstCaps
1043  *
1044  * Checks if the given caps represent the same set of caps.
1045  * <note>This function does not work reliably if optional properties for caps
1046  * are included on one caps and omitted on the other.</note>
1047  *
1048  * This function deals correctly with passing NULL for any of the caps.
1049  *
1050  * Returns: TRUE if both caps are equal.
1051  */
1052 gboolean
1053 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
1054 {
1055   /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
1056    * So there should be an assertion that caps1 and caps2 != NULL */
1057
1058   /* NULL <-> NULL is allowed here */
1059   if (G_UNLIKELY (caps1 == caps2))
1060     return TRUE;
1061
1062   /* one of them NULL => they are different (can't be both NULL because
1063    * we checked that above) */
1064   if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
1065     return FALSE;
1066
1067   if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
1068     return gst_caps_is_equal_fixed (caps1, caps2);
1069
1070   return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1071 }
1072
1073 /* intersect operation */
1074
1075 /**
1076  * gst_caps_can_intersect:
1077  * @caps1: a #GstCaps to intersect
1078  * @caps2: a #GstCaps to intersect
1079  *
1080  * Tries intersecting @caps1 and @caps2 and reports whether the result would not
1081  * be empty
1082  *
1083  * Returns: %TRUE if intersection would be not empty
1084  *
1085  * Since: 0.10.25
1086  */
1087 gboolean
1088 gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
1089 {
1090   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1091   guint j, k, len1, len2;
1092   GstStructure *struct1;
1093   GstStructure *struct2;
1094
1095   g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1096   g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1097
1098   /* caps are exactly the same pointers */
1099   if (G_UNLIKELY (caps1 == caps2))
1100     return TRUE;
1101
1102   /* empty caps on either side, return empty */
1103   if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1104     return FALSE;
1105
1106   /* one of the caps is any */
1107   if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
1108     return TRUE;
1109
1110   /* run zigzag on top line then right line, this preserves the caps order
1111    * much better than a simple loop.
1112    *
1113    * This algorithm zigzags over the caps structures as demonstrated in
1114    * the folowing matrix:
1115    *
1116    *          caps1                              0  1  2  3
1117    *       +-------------     total distance:  +-------------
1118    *       | 1  2  4  7                      0 | 0  1  2  3
1119    * caps2 | 3  5  8 10                      1 | 1  2  3  4
1120    *       | 6  9 11 12                      2 | 2  3  4  5
1121    *
1122    * First we iterate over the caps1 structures (top line) intersecting
1123    * the structures diagonally down, then we iterate over the caps2
1124    * structures. The result is that the intersections are ordered based on the
1125    * sum of the indexes in the list.
1126    */
1127   len1 = caps1->structs->len;
1128   len2 = caps2->structs->len;
1129   for (i = 0; i < len1 + len2 - 1; i++) {
1130     /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */
1131     j = MIN (i, len1 - 1);
1132     /* subset index stays 0 until i reaches superset->structs->len, then it
1133      * counts up from 1 to subset->structs->len - 1 */
1134     k = MAX (0, i - j);
1135
1136     /* now run the diagonal line, end condition is the left or bottom
1137      * border */
1138     while (k < len2) {
1139       struct1 = gst_caps_get_structure_unchecked (caps1, j);
1140       struct2 = gst_caps_get_structure_unchecked (caps2, k);
1141
1142       if (gst_structure_can_intersect (struct1, struct2)) {
1143         return TRUE;
1144       }
1145       /* move down left */
1146       k++;
1147       if (G_UNLIKELY (j == 0))
1148         break;                  /* so we don't roll back to G_MAXUINT */
1149       j--;
1150     }
1151   }
1152   return FALSE;
1153 }
1154
1155 static GstCaps *
1156 gst_caps_intersect_zig_zag (const GstCaps * caps1, const GstCaps * caps2)
1157 {
1158   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1159   guint j, k, len1, len2;
1160
1161   GstStructure *struct1;
1162   GstStructure *struct2;
1163   GstCaps *dest;
1164   GstStructure *istruct;
1165
1166   /* caps are exactly the same pointers, just copy one caps */
1167   if (G_UNLIKELY (caps1 == caps2))
1168     return _gst_caps_copy (caps1);
1169
1170   /* empty caps on either side, return empty */
1171   if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1172     return gst_caps_new_empty ();
1173
1174   /* one of the caps is any, just copy the other caps */
1175   if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1176     return _gst_caps_copy (caps2);
1177   if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1178     return _gst_caps_copy (caps1);
1179
1180   dest = gst_caps_new_empty ();
1181
1182   /* run zigzag on top line then right line, this preserves the caps order
1183    * much better than a simple loop.
1184    *
1185    * This algorithm zigzags over the caps structures as demonstrated in
1186    * the folowing matrix:
1187    *
1188    *          caps1
1189    *       +-------------
1190    *       | 1  2  4  7
1191    * caps2 | 3  5  8 10
1192    *       | 6  9 11 12
1193    *
1194    * First we iterate over the caps1 structures (top line) intersecting
1195    * the structures diagonally down, then we iterate over the caps2
1196    * structures.
1197    */
1198   len1 = caps1->structs->len;
1199   len2 = caps2->structs->len;
1200   for (i = 0; i < len1 + len2 - 1; i++) {
1201     /* caps1 index goes from 0 to caps1->structs->len-1 */
1202     j = MIN (i, len1 - 1);
1203     /* caps2 index stays 0 until i reaches caps1->structs->len, then it counts
1204      * up from 1 to caps2->structs->len - 1 */
1205     k = MAX (0, i - j);
1206
1207     /* now run the diagonal line, end condition is the left or bottom
1208      * border */
1209     while (k < len2) {
1210       struct1 = gst_caps_get_structure_unchecked (caps1, j);
1211       struct2 = gst_caps_get_structure_unchecked (caps2, k);
1212
1213       istruct = gst_structure_intersect (struct1, struct2);
1214
1215       gst_caps_merge_structure (dest, istruct);
1216       /* move down left */
1217       k++;
1218       if (G_UNLIKELY (j == 0))
1219         break;                  /* so we don't roll back to G_MAXUINT */
1220       j--;
1221     }
1222   }
1223   return dest;
1224 }
1225
1226 /**
1227  * gst_caps_intersect_first:
1228  * @caps1: a #GstCaps to intersect
1229  * @caps2: a #GstCaps to intersect
1230  *
1231  * Creates a new #GstCaps that contains all the formats that are common
1232  * to both @caps1 and @caps2.
1233  *
1234  * Unlike @gst_caps_intersect, the returned caps will be ordered in a similar
1235  * fashion as @caps1.
1236  *
1237  * Returns: the new #GstCaps
1238  */
1239 static GstCaps *
1240 gst_caps_intersect_first (const GstCaps * caps1, const GstCaps * caps2)
1241 {
1242   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1243   guint j, len1, len2;
1244
1245   GstStructure *struct1;
1246   GstStructure *struct2;
1247   GstCaps *dest;
1248   GstStructure *istruct;
1249
1250   /* caps are exactly the same pointers, just copy one caps */
1251   if (G_UNLIKELY (caps1 == caps2))
1252     return gst_caps_copy (caps1);
1253
1254   /* empty caps on either side, return empty */
1255   if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1256     return gst_caps_new_empty ();
1257
1258   /* one of the caps is any, just copy the other caps */
1259   if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1260     return gst_caps_copy (caps2);
1261   if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1262     return gst_caps_copy (caps1);
1263
1264   dest = gst_caps_new_empty ();
1265
1266   len1 = caps1->structs->len;
1267   len2 = caps2->structs->len;
1268   for (i = 0; i < len1; i++) {
1269     struct1 = gst_caps_get_structure_unchecked (caps1, i);
1270     for (j = 0; j < len2; j++) {
1271       struct2 = gst_caps_get_structure_unchecked (caps2, j);
1272       istruct = gst_structure_intersect (struct1, struct2);
1273       if (istruct)
1274         gst_caps_merge_structure (dest, istruct);
1275     }
1276   }
1277
1278   return dest;
1279 }
1280
1281 /**
1282  * gst_caps_intersect_full:
1283  * @caps1: a #GstCaps to intersect
1284  * @caps2: a #GstCaps to intersect
1285  * @mode: The intersection algorithm/mode to use
1286  *
1287  * Creates a new #GstCaps that contains all the formats that are common
1288  * to both @caps1 and @caps2, the order is defined by the #GstCapsIntersectMode
1289  * used.
1290  *
1291  * Returns: the new #GstCaps
1292  * Since: 0.10.33
1293  */
1294 GstCaps *
1295 gst_caps_intersect_full (const GstCaps * caps1, const GstCaps * caps2,
1296     GstCapsIntersectMode mode)
1297 {
1298   g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1299   g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1300
1301   switch (mode) {
1302     case GST_CAPS_INTERSECT_FIRST:
1303       return gst_caps_intersect_first (caps1, caps2);
1304     default:
1305       g_warning ("Unknown caps intersect mode: %d", mode);
1306       /* fallthrough */
1307     case GST_CAPS_INTERSECT_ZIG_ZAG:
1308       return gst_caps_intersect_zig_zag (caps1, caps2);
1309   }
1310 }
1311
1312 /**
1313  * gst_caps_intersect:
1314  * @caps1: a #GstCaps to intersect
1315  * @caps2: a #GstCaps to intersect
1316  *
1317  * Creates a new #GstCaps that contains all the formats that are common
1318  * to both @caps1 and @caps2. Defaults to %GST_CAPS_INTERSECT_ZIG_ZAG mode.
1319  *
1320  * Returns: the new #GstCaps
1321  */
1322 GstCaps *
1323 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1324 {
1325   return gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_ZIG_ZAG);
1326 }
1327
1328
1329 /* subtract operation */
1330
1331 typedef struct
1332 {
1333   const GstStructure *subtract_from;
1334   GSList *put_into;
1335 }
1336 SubtractionEntry;
1337
1338 static gboolean
1339 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1340     gpointer user_data)
1341 {
1342   SubtractionEntry *e = user_data;
1343   GValue subtraction = { 0, };
1344   const GValue *other;
1345   GstStructure *structure;
1346
1347   other = gst_structure_id_get_value (e->subtract_from, field_id);
1348   if (!other) {
1349     return FALSE;
1350   }
1351   if (!gst_value_subtract (&subtraction, other, value))
1352     return TRUE;
1353   if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1354     g_value_unset (&subtraction);
1355     return FALSE;
1356   } else {
1357     structure = gst_structure_copy (e->subtract_from);
1358     gst_structure_id_set_value (structure, field_id, &subtraction);
1359     g_value_unset (&subtraction);
1360     e->put_into = g_slist_prepend (e->put_into, structure);
1361     return TRUE;
1362   }
1363 }
1364
1365 static gboolean
1366 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1367     const GstStructure * subtrahend)
1368 {
1369   SubtractionEntry e;
1370   gboolean ret;
1371
1372   e.subtract_from = minuend;
1373   e.put_into = NULL;
1374
1375   ret = gst_structure_foreach ((GstStructure *) subtrahend,
1376       gst_caps_structure_subtract_field, &e);
1377   if (ret) {
1378     *into = e.put_into;
1379   } else {
1380     GSList *walk;
1381
1382     for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1383       gst_structure_free (walk->data);
1384     }
1385     g_slist_free (e.put_into);
1386   }
1387   return ret;
1388 }
1389
1390 /**
1391  * gst_caps_subtract:
1392  * @minuend: #GstCaps to substract from
1393  * @subtrahend: #GstCaps to substract
1394  *
1395  * Subtracts the @subtrahend from the @minuend.
1396  * <note>This function does not work reliably if optional properties for caps
1397  * are included on one caps and omitted on the other.</note>
1398  *
1399  * Returns: the resulting caps
1400  */
1401 GstCaps *
1402 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1403 {
1404   guint i, j, sublen;
1405   GstStructure *min;
1406   GstStructure *sub;
1407   GstCaps *dest = NULL, *src;
1408
1409   g_return_val_if_fail (minuend != NULL, NULL);
1410   g_return_val_if_fail (subtrahend != NULL, NULL);
1411
1412   if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
1413     return gst_caps_new_empty ();
1414   }
1415   if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
1416     return _gst_caps_copy (minuend);
1417
1418   /* FIXME: Do we want this here or above?
1419      The reason we need this is that there is no definition about what
1420      ANY means for specific types, so it's not possible to reduce ANY partially
1421      You can only remove everything or nothing and that is done above.
1422      Note: there's a test that checks this behaviour. */
1423   g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
1424   sublen = subtrahend->structs->len;
1425   g_assert (sublen > 0);
1426
1427   src = _gst_caps_copy (minuend);
1428   for (i = 0; i < sublen; i++) {
1429     guint srclen;
1430
1431     sub = gst_caps_get_structure_unchecked (subtrahend, i);
1432     if (dest) {
1433       gst_caps_unref (src);
1434       src = dest;
1435     }
1436     dest = gst_caps_new_empty ();
1437     srclen = src->structs->len;
1438     for (j = 0; j < srclen; j++) {
1439       min = gst_caps_get_structure_unchecked (src, j);
1440       if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1441         GSList *list;
1442
1443         if (gst_caps_structure_subtract (&list, min, sub)) {
1444           GSList *walk;
1445
1446           for (walk = list; walk; walk = g_slist_next (walk)) {
1447             gst_caps_append_structure_unchecked (dest,
1448                 (GstStructure *) walk->data);
1449           }
1450           g_slist_free (list);
1451         } else {
1452           gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1453         }
1454       } else {
1455         gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1456       }
1457     }
1458     if (CAPS_IS_EMPTY_SIMPLE (dest)) {
1459       gst_caps_unref (src);
1460       return dest;
1461     }
1462   }
1463
1464   gst_caps_unref (src);
1465   gst_caps_do_simplify (dest);
1466   return dest;
1467 }
1468
1469 /* union operation */
1470
1471 #if 0
1472 static GstStructure *
1473 gst_caps_structure_union (const GstStructure * struct1,
1474     const GstStructure * struct2)
1475 {
1476   int i;
1477   GstStructure *dest;
1478   const GstStructureField *field1;
1479   const GstStructureField *field2;
1480   int ret;
1481
1482   /* FIXME this doesn't actually work */
1483
1484   if (struct1->name != struct2->name)
1485     return NULL;
1486
1487   dest = gst_structure_id_empty_new (struct1->name);
1488
1489   for (i = 0; i < struct1->fields->len; i++) {
1490     GValue dest_value = { 0 };
1491
1492     field1 = GST_STRUCTURE_FIELD (struct1, i);
1493     field2 = gst_structure_id_get_field (struct2, field1->name);
1494
1495     if (field2 == NULL) {
1496       continue;
1497     } else {
1498       if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1499         gst_structure_set_value (dest, g_quark_to_string (field1->name),
1500             &dest_value);
1501       } else {
1502         ret = gst_value_compare (&field1->value, &field2->value);
1503       }
1504     }
1505   }
1506
1507   return dest;
1508 }
1509 #endif
1510
1511 /**
1512  * gst_caps_union:
1513  * @caps1: a #GstCaps to union
1514  * @caps2: a #GstCaps to union
1515  *
1516  * Creates a new #GstCaps that contains all the formats that are in
1517  * either @caps1 and @caps2.
1518  *
1519  * Returns: the new #GstCaps
1520  */
1521 GstCaps *
1522 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1523 {
1524   GstCaps *dest1;
1525   GstCaps *dest2;
1526
1527   /* NULL pointers are no correct GstCaps */
1528   g_return_val_if_fail (caps1 != NULL, NULL);
1529   g_return_val_if_fail (caps2 != NULL, NULL);
1530
1531   if (CAPS_IS_EMPTY (caps1))
1532     return _gst_caps_copy (caps2);
1533
1534   if (CAPS_IS_EMPTY (caps2))
1535     return _gst_caps_copy (caps1);
1536
1537   if (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))
1538     return gst_caps_new_any ();
1539
1540   dest1 = _gst_caps_copy (caps1);
1541   dest2 = _gst_caps_copy (caps2);
1542   gst_caps_append (dest1, dest2);
1543
1544   gst_caps_do_simplify (dest1);
1545   return dest1;
1546 }
1547
1548 /* normalize/simplify operations */
1549
1550 typedef struct _NormalizeForeach
1551 {
1552   GstCaps *caps;
1553   GstStructure *structure;
1554 }
1555 NormalizeForeach;
1556
1557 static gboolean
1558 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1559 {
1560   NormalizeForeach *nf = (NormalizeForeach *) ptr;
1561   GValue val = { 0 };
1562   guint i;
1563
1564   if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1565     guint len = gst_value_list_get_size (value);
1566     for (i = 1; i < len; i++) {
1567       const GValue *v = gst_value_list_get_value (value, i);
1568       GstStructure *structure = gst_structure_copy (nf->structure);
1569
1570       gst_structure_id_set_value (structure, field_id, v);
1571       gst_caps_append_structure_unchecked (nf->caps, structure);
1572     }
1573
1574     gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1575     gst_structure_id_set_value (nf->structure, field_id, &val);
1576     g_value_unset (&val);
1577
1578     return FALSE;
1579   }
1580   return TRUE;
1581 }
1582
1583 /**
1584  * gst_caps_normalize:
1585  * @caps: a #GstCaps to normalize
1586  *
1587  * Creates a new #GstCaps that represents the same set of formats as
1588  * @caps, but contains no lists.  Each list is expanded into separate
1589  * @GstStructures.
1590  *
1591  * Returns: the new #GstCaps
1592  */
1593 GstCaps *
1594 gst_caps_normalize (const GstCaps * caps)
1595 {
1596   NormalizeForeach nf;
1597   GstCaps *newcaps;
1598   guint i;
1599
1600   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1601
1602   newcaps = _gst_caps_copy (caps);
1603   nf.caps = newcaps;
1604
1605   for (i = 0; i < gst_caps_get_size (newcaps); i++) {
1606     nf.structure = gst_caps_get_structure_unchecked (newcaps, i);
1607
1608     while (!gst_structure_foreach (nf.structure,
1609             gst_caps_normalize_foreach, &nf));
1610   }
1611
1612   return newcaps;
1613 }
1614
1615 static gint
1616 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1617 {
1618   gint ret;
1619   const GstStructure *struct1 = *((const GstStructure **) one);
1620   const GstStructure *struct2 = *((const GstStructure **) two);
1621
1622   /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1623      So what's the best way? */
1624   ret = strcmp (gst_structure_get_name (struct1),
1625       gst_structure_get_name (struct2));
1626   if (ret)
1627     return ret;
1628
1629   return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1630 }
1631
1632 typedef struct
1633 {
1634   GQuark name;
1635   GValue value;
1636   GstStructure *compare;
1637 }
1638 UnionField;
1639
1640 static gboolean
1641 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1642     gpointer user_data)
1643 {
1644   UnionField *u = user_data;
1645   const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1646
1647   if (!val) {
1648     if (u->name)
1649       g_value_unset (&u->value);
1650     return FALSE;
1651   }
1652   if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1653     return TRUE;
1654   if (u->name) {
1655     g_value_unset (&u->value);
1656     return FALSE;
1657   }
1658   u->name = field_id;
1659   gst_value_union (&u->value, val, value);
1660   return TRUE;
1661 }
1662
1663 static gboolean
1664 gst_caps_structure_simplify (GstStructure ** result,
1665     const GstStructure * simplify, GstStructure * compare)
1666 {
1667   GSList *list;
1668   UnionField field = { 0, {0,}, NULL };
1669
1670   /* try to subtract to get a real subset */
1671   if (gst_caps_structure_subtract (&list, simplify, compare)) {
1672     if (list == NULL) {         /* no result */
1673       *result = NULL;
1674       return TRUE;
1675     } else if (list->next == NULL) {    /* one result */
1676       *result = list->data;
1677       g_slist_free (list);
1678       return TRUE;
1679     } else {                    /* multiple results */
1680       g_slist_foreach (list, (GFunc) gst_structure_free, NULL);
1681       g_slist_free (list);
1682       list = NULL;
1683     }
1684   }
1685
1686   /* try to union both structs */
1687   field.compare = compare;
1688   if (gst_structure_foreach ((GstStructure *) simplify,
1689           gst_caps_structure_figure_out_union, &field)) {
1690     gboolean ret = FALSE;
1691
1692     /* now we know all of simplify's fields are the same in compare
1693      * but at most one field: field.name */
1694     if (G_IS_VALUE (&field.value)) {
1695       if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1696         gst_structure_id_set_value (compare, field.name, &field.value);
1697         *result = NULL;
1698         ret = TRUE;
1699       }
1700       g_value_unset (&field.value);
1701     } else if (gst_structure_n_fields (simplify) <=
1702         gst_structure_n_fields (compare)) {
1703       /* compare is just more specific, will be optimized away later */
1704       /* FIXME: do this here? */
1705       GST_LOG ("found a case that will be optimized later.");
1706     } else {
1707       gchar *one = gst_structure_to_string (simplify);
1708       gchar *two = gst_structure_to_string (compare);
1709
1710       GST_ERROR
1711           ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1712           one, two);
1713       g_free (one);
1714       g_free (two);
1715     }
1716     return ret;
1717   }
1718
1719   return FALSE;
1720 }
1721
1722 static void
1723 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1724     GstStructure * new, gint i)
1725 {
1726   gst_structure_set_parent_refcount (old, NULL);
1727   gst_structure_free (old);
1728   gst_structure_set_parent_refcount (new, &GST_CAPS_REFCOUNT (caps));
1729   g_ptr_array_index (caps->structs, i) = new;
1730 }
1731
1732 /**
1733  * gst_caps_do_simplify:
1734  * @caps: a #GstCaps to simplify
1735  *
1736  * Modifies the given @caps inplace into a representation that represents the
1737  * same set of formats, but in a simpler form.  Component structures that are
1738  * identical are merged.  Component structures that have values that can be
1739  * merged are also merged.
1740  *
1741  * Returns: TRUE, if the caps could be simplified
1742  */
1743 gboolean
1744 gst_caps_do_simplify (GstCaps * caps)
1745 {
1746   GstStructure *simplify, *compare, *result = NULL;
1747   gint i, j, start;
1748   gboolean changed = FALSE;
1749
1750   g_return_val_if_fail (caps != NULL, FALSE);
1751   g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1752
1753   if (gst_caps_get_size (caps) < 2)
1754     return FALSE;
1755
1756   g_ptr_array_sort (caps->structs, gst_caps_compare_structures);
1757
1758   start = caps->structs->len - 1;
1759   for (i = caps->structs->len - 1; i >= 0; i--) {
1760     simplify = gst_caps_get_structure_unchecked (caps, i);
1761     if (gst_structure_get_name_id (simplify) !=
1762         gst_structure_get_name_id (gst_caps_get_structure_unchecked (caps,
1763                 start)))
1764       start = i;
1765     for (j = start; j >= 0; j--) {
1766       if (j == i)
1767         continue;
1768       compare = gst_caps_get_structure_unchecked (caps, j);
1769       if (gst_structure_get_name_id (simplify) !=
1770           gst_structure_get_name_id (compare)) {
1771         break;
1772       }
1773       if (gst_caps_structure_simplify (&result, simplify, compare)) {
1774         if (result) {
1775           gst_caps_switch_structures (caps, simplify, result, i);
1776           simplify = result;
1777         } else {
1778           gst_caps_remove_structure (caps, i);
1779           start--;
1780           break;
1781         }
1782         changed = TRUE;
1783       }
1784     }
1785   }
1786
1787   if (!changed)
1788     return FALSE;
1789
1790   /* gst_caps_do_simplify (caps); */
1791   return TRUE;
1792 }
1793
1794 /* utility */
1795
1796 /**
1797  * gst_caps_replace:
1798  * @caps: (inout) (transfer full): a pointer to #GstCaps
1799  * @newcaps: a #GstCaps to replace *caps
1800  *
1801  * Replaces *caps with @newcaps.  Unrefs the #GstCaps in the location
1802  * pointed to by @caps, if applicable, then modifies @caps to point to
1803  * @newcaps. An additional ref on @newcaps is taken.
1804  *
1805  * This function does not take any locks so you might want to lock
1806  * the object owning @caps pointer.
1807  */
1808 void
1809 gst_caps_replace (GstCaps ** caps, GstCaps * newcaps)
1810 {
1811   GstCaps *oldcaps;
1812
1813   g_return_if_fail (caps != NULL);
1814
1815   oldcaps = *caps;
1816
1817   GST_CAT_TRACE (GST_CAT_REFCOUNTING, "%p, %p -> %p", caps, oldcaps, newcaps);
1818
1819   if (newcaps != oldcaps) {
1820     if (newcaps)
1821       gst_caps_ref (newcaps);
1822
1823     *caps = newcaps;
1824
1825     if (oldcaps)
1826       gst_caps_unref (oldcaps);
1827   }
1828 }
1829
1830 /**
1831  * gst_caps_to_string:
1832  * @caps: a #GstCaps
1833  *
1834  * Converts @caps to a string representation.  This string representation
1835  * can be converted back to a #GstCaps by gst_caps_from_string().
1836  *
1837  * For debugging purposes its easier to do something like this:
1838  * |[
1839  * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
1840  * ]|
1841  * This prints the caps in human readble form.
1842  *
1843  * Returns: (transfer full): a newly allocated string representing @caps.
1844  */
1845 gchar *
1846 gst_caps_to_string (const GstCaps * caps)
1847 {
1848   guint i, slen, clen;
1849   GString *s;
1850
1851   /* NOTE:  This function is potentially called by the debug system,
1852    * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
1853    * should be careful to avoid recursion.  This includes any functions
1854    * called by gst_caps_to_string.  In particular, calls should
1855    * not use the GST_PTR_FORMAT extension.  */
1856
1857   if (caps == NULL) {
1858     return g_strdup ("NULL");
1859   }
1860   if (CAPS_IS_ANY (caps)) {
1861     return g_strdup ("ANY");
1862   }
1863   if (CAPS_IS_EMPTY_SIMPLE (caps)) {
1864     return g_strdup ("EMPTY");
1865   }
1866
1867   /* estimate a rough string length to avoid unnecessary reallocs in GString */
1868   slen = 0;
1869   clen = caps->structs->len;
1870   for (i = 0; i < clen; i++) {
1871     slen +=
1872         STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked (caps,
1873             i));
1874   }
1875
1876   s = g_string_sized_new (slen);
1877   for (i = 0; i < clen; i++) {
1878     GstStructure *structure;
1879
1880     if (i > 0) {
1881       /* ';' is now added by gst_structure_to_string */
1882       g_string_append_c (s, ' ');
1883     }
1884
1885     structure = gst_caps_get_structure_unchecked (caps, i);
1886     priv_gst_structure_append_to_gstring (structure, s);
1887   }
1888   if (s->len && s->str[s->len - 1] == ';') {
1889     /* remove latest ';' */
1890     s->str[--s->len] = '\0';
1891   }
1892   return g_string_free (s, FALSE);
1893 }
1894
1895 static gboolean
1896 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
1897 {
1898   GstStructure *structure;
1899   gchar *s;
1900
1901   if (strcmp ("ANY", string) == 0) {
1902     GST_CAPS_FLAGS (caps) = GST_CAPS_FLAGS_ANY;
1903     return TRUE;
1904   }
1905   if (strcmp ("EMPTY", string) == 0) {
1906     return TRUE;
1907   }
1908
1909   structure = gst_structure_from_string (string, &s);
1910   if (structure == NULL) {
1911     return FALSE;
1912   }
1913   gst_caps_append_structure_unchecked (caps, structure);
1914
1915   do {
1916
1917     while (g_ascii_isspace (*s))
1918       s++;
1919     if (*s == '\0') {
1920       break;
1921     }
1922     structure = gst_structure_from_string (s, &s);
1923     if (structure == NULL) {
1924       return FALSE;
1925     }
1926     gst_caps_append_structure_unchecked (caps, structure);
1927
1928   } while (TRUE);
1929
1930   return TRUE;
1931 }
1932
1933 /**
1934  * gst_caps_from_string:
1935  * @string: a string to convert to #GstCaps
1936  *
1937  * Converts @caps from a string representation.
1938  *
1939  * Returns: (transfer full): a newly allocated #GstCaps
1940  */
1941 GstCaps *
1942 gst_caps_from_string (const gchar * string)
1943 {
1944   GstCaps *caps;
1945
1946   g_return_val_if_fail (string, FALSE);
1947
1948   caps = gst_caps_new_empty ();
1949   if (gst_caps_from_string_inplace (caps, string)) {
1950     return caps;
1951   } else {
1952     gst_caps_unref (caps);
1953     return NULL;
1954   }
1955 }
1956
1957 static void
1958 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
1959 {
1960   g_return_if_fail (G_IS_VALUE (src_value));
1961   g_return_if_fail (G_IS_VALUE (dest_value));
1962   g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
1963   g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
1964       || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
1965
1966   dest_value->data[0].v_pointer =
1967       gst_caps_to_string (src_value->data[0].v_pointer);
1968 }