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