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