caps: split callback for structure intersect into two functions
[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   GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy caps");
352   copy = gst_caps_copy (caps);
353   gst_caps_unref (caps);
354
355   return copy;
356 }
357
358 /**
359  * gst_caps_ref:
360  * @caps: the #GstCaps to reference
361  *
362  * Add a reference to a #GstCaps object.
363  *
364  * From this point on, until the caller calls gst_caps_unref() or
365  * gst_caps_make_writable(), it is guaranteed that the caps object will not
366  * change. This means its structures won't change, etc. To use a #GstCaps
367  * object, you must always have a refcount on it -- either the one made
368  * implicitly by gst_caps_new(), or via taking one explicitly with this
369  * function.
370  *
371  * Returns: the same #GstCaps object.
372  */
373 GstCaps *
374 gst_caps_ref (GstCaps * caps)
375 {
376   g_return_val_if_fail (caps != NULL, NULL);
377
378 #ifdef DEBUG_REFCOUNT
379   GST_CAT_LOG (GST_CAT_REFCOUNTING, "%p %d->%d", caps,
380       GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) + 1);
381 #endif
382   g_return_val_if_fail (GST_CAPS_REFCOUNT_VALUE (caps) > 0, NULL);
383
384   g_atomic_int_inc (&caps->refcount);
385
386   return caps;
387 }
388
389 /**
390  * gst_caps_unref:
391  * @caps: the #GstCaps to unref
392  *
393  * Unref a #GstCaps and and free all its structures and the
394  * structures' values when the refcount reaches 0.
395  */
396 void
397 gst_caps_unref (GstCaps * caps)
398 {
399   g_return_if_fail (caps != NULL);
400
401 #ifdef DEBUG_REFCOUNT
402   GST_CAT_LOG (GST_CAT_REFCOUNTING, "%p %d->%d", caps,
403       GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) - 1);
404 #endif
405
406   g_return_if_fail (GST_CAPS_REFCOUNT_VALUE (caps) > 0);
407
408   /* if we ended up with the refcount at zero, free the caps */
409   if (G_UNLIKELY (g_atomic_int_dec_and_test (&caps->refcount)))
410     _gst_caps_free (caps);
411 }
412
413 GType
414 gst_static_caps_get_type (void)
415 {
416   static GType staticcaps_type = 0;
417
418   if (G_UNLIKELY (staticcaps_type == 0)) {
419     staticcaps_type = g_pointer_type_register_static ("GstStaticCaps");
420   }
421   return staticcaps_type;
422 }
423
424
425 /**
426  * gst_static_caps_get:
427  * @static_caps: the #GstStaticCaps to convert
428  *
429  * Converts a #GstStaticCaps to a #GstCaps.
430  *
431  * Returns: A pointer to the #GstCaps. Unref after usage. Since the
432  * core holds an additional ref to the returned caps,
433  * use gst_caps_make_writable() on the returned caps to modify it.
434  */
435 GstCaps *
436 gst_static_caps_get (GstStaticCaps * static_caps)
437 {
438   GstCaps *caps;
439
440   g_return_val_if_fail (static_caps != NULL, NULL);
441
442   caps = (GstCaps *) static_caps;
443
444   /* refcount is 0 when we need to convert */
445   if (G_UNLIKELY (g_atomic_int_get (&caps->refcount) == 0)) {
446     const char *string;
447     GstCaps temp;
448
449     G_LOCK (static_caps_lock);
450     /* check if other thread already updated */
451     if (G_UNLIKELY (g_atomic_int_get (&caps->refcount) > 0))
452       goto done;
453
454     string = static_caps->string;
455
456     if (G_UNLIKELY (string == NULL))
457       goto no_string;
458
459     GST_CAT_LOG (GST_CAT_CAPS, "creating %p", static_caps);
460
461     /* we construct the caps on the stack, then copy over the struct into our
462      * real caps, refcount last. We do this because we must leave the refcount
463      * of the result caps to 0 so that other threads don't run away with the
464      * caps while we are constructing it. */
465     temp.type = GST_TYPE_CAPS;
466     temp.flags = 0;
467     temp.structs = g_ptr_array_new ();
468
469     /* initialize the caps to a refcount of 1 so the caps can be writable for
470      * the next statement */
471     temp.refcount = 1;
472
473     /* convert to string */
474     if (G_UNLIKELY (!gst_caps_from_string_inplace (&temp, string)))
475       g_critical ("Could not convert static caps \"%s\"", string);
476
477     /* now copy stuff over to the real caps. */
478     caps->type = temp.type;
479     caps->flags = temp.flags;
480     caps->structs = temp.structs;
481     /* and bump the refcount so other threads can now read */
482     g_atomic_int_set (&caps->refcount, 1);
483
484     GST_CAT_LOG (GST_CAT_CAPS, "created %p", static_caps);
485   done:
486     G_UNLOCK (static_caps_lock);
487   }
488   /* ref the caps, makes it not writable */
489   gst_caps_ref (caps);
490
491   return caps;
492
493   /* ERRORS */
494 no_string:
495   {
496     G_UNLOCK (static_caps_lock);
497     g_warning ("static caps %p string is NULL", static_caps);
498     return NULL;
499   }
500 }
501
502 /* manipulation */
503 static GstStructure *
504 gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
505 {
506   /* don't use index_fast, gst_caps_do_simplify relies on the order */
507   GstStructure *s = g_ptr_array_remove_index (caps->structs, idx);
508
509   gst_structure_set_parent_refcount (s, NULL);
510   return s;
511 }
512
513 static gboolean
514 gst_structure_is_equal_foreach (GQuark field_id, const GValue * val2,
515     gpointer data)
516 {
517   GstStructure *struct1 = (GstStructure *) data;
518   const GValue *val1 = gst_structure_id_get_value (struct1, field_id);
519
520   if (G_UNLIKELY (val1 == NULL))
521     return FALSE;
522   if (gst_value_compare (val1, val2) == GST_VALUE_EQUAL) {
523     return TRUE;
524   }
525
526   return FALSE;
527 }
528
529 static gboolean
530 gst_caps_structure_is_subset_field (GQuark field_id, const GValue * value,
531     gpointer user_data)
532 {
533   GstStructure *subtract_from = user_data;
534   GValue subtraction = { 0, };
535   const GValue *other;
536
537   if (!(other = gst_structure_id_get_value (subtract_from, field_id)))
538     /* field is missing in one set */
539     return FALSE;
540
541   /* equal values are subset */
542   if (gst_value_compare (other, value) == GST_VALUE_EQUAL)
543     return TRUE;
544
545   /*
546    * 1 - [1,2] = empty
547    * -> !subset
548    *
549    * [1,2] - 1 = 2
550    *  -> 1 - [1,2] = empty
551    *  -> subset
552    *
553    * [1,3] - [1,2] = 3
554    * -> [1,2] - [1,3] = empty
555    * -> subset
556    *
557    * {1,2} - {1,3} = 2
558    * -> {1,3} - {1,2} = 3
559    * -> !subset
560    *
561    *  First caps subtraction needs to return a non-empty set, second
562    *  subtractions needs to give en empty set.
563    */
564   if (gst_value_subtract (&subtraction, other, value)) {
565     g_value_unset (&subtraction);
566     /* !empty result, swapping must be empty */
567     if (!gst_value_subtract (&subtraction, value, other))
568       return TRUE;
569
570     g_value_unset (&subtraction);
571   }
572   return FALSE;
573 }
574
575 static gboolean
576 gst_caps_structure_is_subset (const GstStructure * minuend,
577     const GstStructure * subtrahend)
578 {
579   if ((minuend->name != subtrahend->name) ||
580       (gst_structure_n_fields (minuend) !=
581           gst_structure_n_fields (subtrahend))) {
582     return FALSE;
583   }
584
585   return gst_structure_foreach ((GstStructure *) subtrahend,
586       gst_caps_structure_is_subset_field, (gpointer) minuend);
587 }
588
589 /**
590  * gst_caps_append:
591  * @caps1: the #GstCaps that will be appended to
592  * @caps2: the #GstCaps to append
593  *
594  * Appends the structures contained in @caps2 to @caps1. The structures in
595  * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
596  * freed. If either caps is ANY, the resulting caps will be ANY.
597  */
598 void
599 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
600 {
601   GstStructure *structure;
602   int i;
603
604   g_return_if_fail (GST_IS_CAPS (caps1));
605   g_return_if_fail (GST_IS_CAPS (caps2));
606   g_return_if_fail (IS_WRITABLE (caps1));
607   g_return_if_fail (IS_WRITABLE (caps2));
608
609 #ifdef USE_POISONING
610   CAPS_POISON (caps2);
611 #endif
612   if (G_UNLIKELY (gst_caps_is_any (caps1) || gst_caps_is_any (caps2))) {
613     /* FIXME: this leaks */
614     caps1->flags |= GST_CAPS_FLAGS_ANY;
615     for (i = caps2->structs->len - 1; i >= 0; i--) {
616       structure = gst_caps_remove_and_get_structure (caps2, i);
617       gst_structure_free (structure);
618     }
619   } else {
620     for (i = caps2->structs->len; i; i--) {
621       structure = gst_caps_remove_and_get_structure (caps2, 0);
622       gst_caps_append_structure (caps1, structure);
623     }
624   }
625   gst_caps_unref (caps2);       /* guaranteed to free it */
626 }
627
628 /**
629  * gst_caps_merge:
630  * @caps1: the #GstCaps that will take the new entries
631  * @caps2: the #GstCaps to merge in
632  *
633  * Appends the structures contained in @caps2 to @caps1 if they are not yet
634  * expressed by @caps1. The structures in @caps2 are not copied -- they are
635  * transferred to @caps1, and then @caps2 is freed.
636  * If either caps is ANY, the resulting caps will be ANY.
637  *
638  * Since: 0.10.10
639  */
640 void
641 gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
642 {
643   GstStructure *structure;
644   int i;
645
646   g_return_if_fail (GST_IS_CAPS (caps1));
647   g_return_if_fail (GST_IS_CAPS (caps2));
648   g_return_if_fail (IS_WRITABLE (caps1));
649   g_return_if_fail (IS_WRITABLE (caps2));
650
651 #ifdef USE_POISONING
652   CAPS_POISON (caps2);
653 #endif
654   if (G_UNLIKELY (gst_caps_is_any (caps1))) {
655     for (i = caps2->structs->len - 1; i >= 0; i--) {
656       structure = gst_caps_remove_and_get_structure (caps2, i);
657       gst_structure_free (structure);
658     }
659   } else if (G_UNLIKELY (gst_caps_is_any (caps2))) {
660     caps1->flags |= GST_CAPS_FLAGS_ANY;
661     for (i = caps1->structs->len - 1; i >= 0; i--) {
662       structure = gst_caps_remove_and_get_structure (caps1, i);
663       gst_structure_free (structure);
664     }
665   } else {
666     for (i = caps2->structs->len; i; i--) {
667       structure = gst_caps_remove_and_get_structure (caps2, 0);
668       gst_caps_merge_structure (caps1, structure);
669     }
670     /* this is too naive
671        GstCaps *com = gst_caps_intersect (caps1, caps2);
672        GstCaps *add = gst_caps_subtract (caps2, com);
673
674        GST_DEBUG ("common : %d", gst_caps_get_size (com));
675        GST_DEBUG ("adding : %d", gst_caps_get_size (add));
676        gst_caps_append (caps1, add);
677        gst_caps_unref (com);
678      */
679   }
680   gst_caps_unref (caps2);       /* guaranteed to free it */
681 }
682
683 /**
684  * gst_caps_append_structure:
685  * @caps: the #GstCaps that will be appended to
686  * @structure: the #GstStructure to append
687  *
688  * Appends @structure to @caps.  The structure is not copied; @caps
689  * becomes the owner of @structure.
690  */
691 void
692 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
693 {
694   g_return_if_fail (GST_IS_CAPS (caps));
695   g_return_if_fail (IS_WRITABLE (caps));
696
697   if (G_LIKELY (structure)) {
698     g_return_if_fail (structure->parent_refcount == NULL);
699 #if 0
700 #ifdef USE_POISONING
701     STRUCTURE_POISON (structure);
702 #endif
703 #endif
704     gst_structure_set_parent_refcount (structure, &caps->refcount);
705     g_ptr_array_add (caps->structs, structure);
706   }
707 }
708
709 /**
710  * gst_caps_remove_structure:
711  * @caps: the #GstCaps to remove from
712  * @idx: Index of the structure to remove
713  *
714  * removes the stucture with the given index from the list of structures
715  * contained in @caps.
716  */
717 void
718 gst_caps_remove_structure (GstCaps * caps, guint idx)
719 {
720   GstStructure *structure;
721
722   g_return_if_fail (caps != NULL);
723   g_return_if_fail (idx <= gst_caps_get_size (caps));
724   g_return_if_fail (IS_WRITABLE (caps));
725
726   structure = gst_caps_remove_and_get_structure (caps, idx);
727   gst_structure_free (structure);
728 }
729
730 /**
731  * gst_caps_merge_structure:
732  * @caps: the #GstCaps that will the the new structure
733  * @structure: the #GstStructure to merge
734  *
735  * Appends @structure to @caps if its not already expressed by @caps.  The
736  * structure is not copied; @caps becomes the owner of @structure.
737  */
738 void
739 gst_caps_merge_structure (GstCaps * caps, GstStructure * structure)
740 {
741   g_return_if_fail (GST_IS_CAPS (caps));
742   g_return_if_fail (IS_WRITABLE (caps));
743
744   if (G_LIKELY (structure)) {
745     GstStructure *structure1;
746     int i;
747     gboolean unique = TRUE;
748
749     g_return_if_fail (structure->parent_refcount == NULL);
750 #if 0
751 #ifdef USE_POISONING
752     STRUCTURE_POISON (structure);
753 #endif
754 #endif
755     /* check each structure */
756     for (i = caps->structs->len - 1; i >= 0; i--) {
757       structure1 = gst_caps_get_structure_unchecked (caps, i);
758       /* if structure is a subset of structure1, then skip it */
759       if (gst_caps_structure_is_subset (structure1, structure)) {
760         unique = FALSE;
761         break;
762       }
763     }
764     if (unique) {
765       gst_structure_set_parent_refcount (structure, &caps->refcount);
766       g_ptr_array_add (caps->structs, structure);
767     } else {
768       gst_structure_free (structure);
769     }
770   }
771 }
772
773
774 /**
775  * gst_caps_get_size:
776  * @caps: a #GstCaps
777  *
778  * Gets the number of structures contained in @caps.
779  *
780  * Returns: the number of structures that @caps contains
781  */
782 guint
783 gst_caps_get_size (const GstCaps * caps)
784 {
785   g_return_val_if_fail (GST_IS_CAPS (caps), 0);
786
787   return caps->structs->len;
788 }
789
790 /**
791  * gst_caps_get_structure:
792  * @caps: a #GstCaps
793  * @index: the index of the structure
794  *
795  * Finds the structure in @caps that has the index @index, and
796  * returns it.
797  *
798  * WARNING: This function takes a const GstCaps *, but returns a
799  * non-const GstStructure *.  This is for programming convenience --
800  * the caller should be aware that structures inside a constant
801  * #GstCaps should not be modified. However, if you know the caps
802  * are writable, either because you have just copied them or made
803  * them writable with gst_caps_make_writable(), you may modify the
804  * structure returned in the usual way, e.g. with functions like
805  * gst_structure_set_simple().
806  *
807  * You do not need to free or unref the structure returned, it
808  * belongs to the #GstCaps.
809  *
810  * Returns: a pointer to the #GstStructure corresponding to @index
811  */
812 GstStructure *
813 gst_caps_get_structure (const GstCaps * caps, guint index)
814 {
815   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
816   g_return_val_if_fail (index < caps->structs->len, NULL);
817
818   return gst_caps_get_structure_unchecked (caps, index);
819 }
820
821 /**
822  * gst_caps_copy_nth:
823  * @caps: the #GstCaps to copy
824  * @nth: the nth structure to copy
825  *
826  * Creates a new #GstCaps and appends a copy of the nth structure
827  * contained in @caps.
828  *
829  * Returns: the new #GstCaps
830  */
831 GstCaps *
832 gst_caps_copy_nth (const GstCaps * caps, guint nth)
833 {
834   GstCaps *newcaps;
835   GstStructure *structure;
836
837   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
838
839   newcaps = gst_caps_new_empty ();
840   newcaps->flags = caps->flags;
841
842   if (G_LIKELY (caps->structs->len > nth)) {
843     structure = gst_caps_get_structure_unchecked (caps, nth);
844     gst_caps_append_structure (newcaps, gst_structure_copy (structure));
845   }
846
847   return newcaps;
848 }
849
850 /**
851  * gst_caps_truncate:
852  * @caps: the #GstCaps to truncate
853  *
854  * Destructively discard all but the first structure from @caps. Useful when
855  * fixating. @caps must be writable.
856  */
857 void
858 gst_caps_truncate (GstCaps * caps)
859 {
860   gint i;
861
862   g_return_if_fail (GST_IS_CAPS (caps));
863   g_return_if_fail (IS_WRITABLE (caps));
864
865   i = caps->structs->len - 1;
866
867   while (i > 0)
868     gst_caps_remove_structure (caps, i--);
869 }
870
871 /**
872  * gst_caps_set_simple:
873  * @caps: the #GstCaps to set
874  * @field: first field to set
875  * @...: additional parameters
876  *
877  * Sets fields in a simple #GstCaps.  A simple #GstCaps is one that
878  * only has one structure.  The arguments must be passed in the same
879  * manner as gst_structure_set(), and be NULL-terminated.
880  */
881 void
882 gst_caps_set_simple (GstCaps * caps, const char *field, ...)
883 {
884   GstStructure *structure;
885   va_list var_args;
886
887   g_return_if_fail (GST_IS_CAPS (caps));
888   g_return_if_fail (caps->structs->len == 1);
889   g_return_if_fail (IS_WRITABLE (caps));
890
891   structure = gst_caps_get_structure_unchecked (caps, 0);
892
893   va_start (var_args, field);
894   gst_structure_set_valist (structure, field, var_args);
895   va_end (var_args);
896 }
897
898 /**
899  * gst_caps_set_simple_valist:
900  * @caps: the #GstCaps to copy
901  * @field: first field to set
902  * @varargs: additional parameters
903  *
904  * Sets fields in a simple #GstCaps.  A simple #GstCaps is one that
905  * only has one structure.  The arguments must be passed in the same
906  * manner as gst_structure_set(), and be NULL-terminated.
907  */
908 void
909 gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs)
910 {
911   GstStructure *structure;
912
913   g_return_if_fail (GST_IS_CAPS (caps));
914   g_return_if_fail (caps->structs->len == 1);
915   g_return_if_fail (IS_WRITABLE (caps));
916
917   structure = gst_caps_get_structure_unchecked (caps, 0);
918
919   gst_structure_set_valist (structure, field, varargs);
920 }
921
922 /* tests */
923
924 /**
925  * gst_caps_is_any:
926  * @caps: the #GstCaps to test
927  *
928  * Determines if @caps represents any media format.
929  *
930  * Returns: TRUE if @caps represents any format.
931  */
932 gboolean
933 gst_caps_is_any (const GstCaps * caps)
934 {
935   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
936
937   return (caps->flags & GST_CAPS_FLAGS_ANY);
938 }
939
940 /**
941  * gst_caps_is_empty:
942  * @caps: the #GstCaps to test
943  *
944  * Determines if @caps represents no media formats.
945  *
946  * Returns: TRUE if @caps represents no formats.
947  */
948 gboolean
949 gst_caps_is_empty (const GstCaps * caps)
950 {
951   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
952
953   if (caps->flags & GST_CAPS_FLAGS_ANY)
954     return FALSE;
955
956   return (caps->structs == NULL) || (caps->structs->len == 0);
957 }
958
959 static gboolean
960 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
961     gpointer unused)
962 {
963   return gst_value_is_fixed (value);
964 }
965
966 /**
967  * gst_caps_is_fixed:
968  * @caps: the #GstCaps to test
969  *
970  * Fixed #GstCaps describe exactly one format, that is, they have exactly
971  * one structure, and each field in the structure describes a fixed type.
972  * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
973  *
974  * Returns: TRUE if @caps is fixed
975  */
976 gboolean
977 gst_caps_is_fixed (const GstCaps * caps)
978 {
979   GstStructure *structure;
980
981   g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
982
983   if (caps->structs->len != 1)
984     return FALSE;
985
986   structure = gst_caps_get_structure_unchecked (caps, 0);
987
988   return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
989 }
990
991 /**
992  * gst_caps_is_equal_fixed:
993  * @caps1: the #GstCaps to test
994  * @caps2: the #GstCaps to test
995  *
996  * Tests if two #GstCaps are equal.  This function only works on fixed
997  * #GstCaps.
998  *
999  * Returns: TRUE if the arguments represent the same format
1000  */
1001 gboolean
1002 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
1003 {
1004   GstStructure *struct1, *struct2;
1005
1006   g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
1007   g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
1008
1009   struct1 = gst_caps_get_structure_unchecked (caps1, 0);
1010   struct2 = gst_caps_get_structure_unchecked (caps2, 0);
1011
1012   if (struct1->name != struct2->name) {
1013     return FALSE;
1014   }
1015   if (struct1->fields->len != struct2->fields->len) {
1016     return FALSE;
1017   }
1018
1019   return gst_structure_foreach (struct1, gst_structure_is_equal_foreach,
1020       struct2);
1021 }
1022
1023 /**
1024  * gst_caps_is_always_compatible:
1025  * @caps1: the #GstCaps to test
1026  * @caps2: the #GstCaps to test
1027  *
1028  * A given #GstCaps structure is always compatible with another if
1029  * every media format that is in the first is also contained in the
1030  * second.  That is, @caps1 is a subset of @caps2.
1031  *
1032  * Returns: TRUE if @caps1 is a subset of @caps2.
1033  */
1034 gboolean
1035 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
1036 {
1037   g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1038   g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1039
1040   return gst_caps_is_subset (caps1, caps2);
1041 }
1042
1043 /**
1044  * gst_caps_is_subset:
1045  * @subset: a #GstCaps
1046  * @superset: a potentially greater #GstCaps
1047  *
1048  * Checks if all caps represented by @subset are also represented by @superset.
1049  * <note>This function does not work reliably if optional properties for caps
1050  * are included on one caps and omitted on the other.</note>
1051  *
1052  * Returns: %TRUE if @subset is a subset of @superset
1053  */
1054 gboolean
1055 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
1056 {
1057   GstCaps *caps;
1058   gboolean ret;
1059
1060   g_return_val_if_fail (subset != NULL, FALSE);
1061   g_return_val_if_fail (superset != NULL, FALSE);
1062
1063   if (gst_caps_is_empty (subset) || gst_caps_is_any (superset))
1064     return TRUE;
1065   if (gst_caps_is_any (subset) || gst_caps_is_empty (superset))
1066     return FALSE;
1067
1068   caps = gst_caps_subtract (subset, superset);
1069   ret = gst_caps_is_empty (caps);
1070   gst_caps_unref (caps);
1071   return ret;
1072 }
1073
1074 /**
1075  * gst_caps_is_equal:
1076  * @caps1: a #GstCaps
1077  * @caps2: another #GstCaps
1078  *
1079  * Checks if the given caps represent the same set of caps.
1080  * <note>This function does not work reliably if optional properties for caps
1081  * are included on one caps and omitted on the other.</note>
1082  *
1083  * This function deals correctly with passing NULL for any of the caps.
1084  *
1085  * Returns: TRUE if both caps are equal.
1086  */
1087 gboolean
1088 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
1089 {
1090   /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
1091    * So there should be an assertion that caps1 and caps2 != NULL */
1092
1093   /* NULL <-> NULL is allowed here */
1094   if (G_UNLIKELY (caps1 == caps2))
1095     return TRUE;
1096
1097   /* one of them NULL => they are different (can't be both NULL because
1098    * we checked that above) */
1099   if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
1100     return FALSE;
1101
1102   if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
1103     return gst_caps_is_equal_fixed (caps1, caps2);
1104
1105   return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1106 }
1107
1108 typedef struct
1109 {
1110   GstStructure *dest;
1111   const GstStructure *intersect;
1112 }
1113 IntersectData;
1114
1115 static gboolean
1116 gst_caps_structure_intersect_field1 (GQuark id, const GValue * val1,
1117     gpointer data)
1118 {
1119   IntersectData *idata = (IntersectData *) data;
1120   const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
1121
1122   if (G_UNLIKELY (val2 == NULL)) {
1123     gst_structure_id_set_value (idata->dest, id, val1);
1124   } else {
1125     GValue dest_value = { 0 };
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   return TRUE;
1134 }
1135
1136 static gboolean
1137 gst_caps_structure_intersect_field2 (GQuark id, const GValue * val1,
1138     gpointer data)
1139 {
1140   IntersectData *idata = (IntersectData *) data;
1141   const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
1142
1143   if (G_UNLIKELY (val2 == NULL)) {
1144     gst_structure_id_set_value (idata->dest, id, val1);
1145   }
1146   return TRUE;
1147 }
1148
1149 static GstStructure *
1150 gst_caps_structure_intersect (const GstStructure * struct1,
1151     const GstStructure * struct2)
1152 {
1153   IntersectData data;
1154
1155   g_return_val_if_fail (struct1 != NULL, NULL);
1156   g_return_val_if_fail (struct2 != NULL, NULL);
1157
1158   if (G_UNLIKELY (struct1->name != struct2->name))
1159     return NULL;
1160
1161   /* copy fields from struct1 which we have not in struct2 to target
1162    * intersect if we have the field in both */
1163   data.dest = gst_structure_id_empty_new (struct1->name);
1164   data.intersect = struct2;
1165   if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
1166               gst_caps_structure_intersect_field1, &data)))
1167     goto error;
1168
1169   /* copy fields from struct2 which we have not in struct1 to target */
1170   data.intersect = struct1;
1171   if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct2,
1172               gst_caps_structure_intersect_field2, &data)))
1173     goto error;
1174
1175   return data.dest;
1176
1177 error:
1178   gst_structure_free (data.dest);
1179   return NULL;
1180 }
1181
1182 #if 0
1183 static GstStructure *
1184 gst_caps_structure_union (const GstStructure * struct1,
1185     const GstStructure * struct2)
1186 {
1187   int i;
1188   GstStructure *dest;
1189   const GstStructureField *field1;
1190   const GstStructureField *field2;
1191   int ret;
1192
1193   /* FIXME this doesn't actually work */
1194
1195   if (struct1->name != struct2->name)
1196     return NULL;
1197
1198   dest = gst_structure_id_empty_new (struct1->name);
1199
1200   for (i = 0; i < struct1->fields->len; i++) {
1201     GValue dest_value = { 0 };
1202
1203     field1 = GST_STRUCTURE_FIELD (struct1, i);
1204     field2 = gst_structure_id_get_field (struct2, field1->name);
1205
1206     if (field2 == NULL) {
1207       continue;
1208     } else {
1209       if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1210         gst_structure_set_value (dest, g_quark_to_string (field1->name),
1211             &dest_value);
1212       } else {
1213         ret = gst_value_compare (&field1->value, &field2->value);
1214       }
1215     }
1216   }
1217
1218   return dest;
1219 }
1220 #endif
1221
1222 /* operations */
1223
1224 /**
1225  * gst_caps_intersect:
1226  * @caps1: a #GstCaps to intersect
1227  * @caps2: a #GstCaps to intersect
1228  *
1229  * Creates a new #GstCaps that contains all the formats that are common
1230  * to both @caps1 and @caps2.
1231  *
1232  * Returns: the new #GstCaps
1233  */
1234 GstCaps *
1235 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1236 {
1237   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1238   guint j, k, len1, len2;
1239
1240   GstStructure *struct1;
1241   GstStructure *struct2;
1242   GstCaps *dest;
1243   GstStructure *istruct;
1244
1245   g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1246   g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1247
1248   /* caps are exactly the same pointers, just copy one caps */
1249   if (G_UNLIKELY (caps1 == caps2))
1250     return gst_caps_copy (caps1);
1251
1252   /* empty caps on either side, return empty */
1253   if (G_UNLIKELY (gst_caps_is_empty (caps1) || gst_caps_is_empty (caps2)))
1254     return gst_caps_new_empty ();
1255
1256   /* one of the caps is any, just copy the other caps */
1257   if (G_UNLIKELY (gst_caps_is_any (caps1)))
1258     return gst_caps_copy (caps2);
1259   if (G_UNLIKELY (gst_caps_is_any (caps2)))
1260     return gst_caps_copy (caps1);
1261
1262   dest = gst_caps_new_empty ();
1263
1264   /* run zigzag on top line then right line, this preserves the caps order
1265    * much better than a simple loop.
1266    *
1267    * This algorithm zigzags over the caps structures as demonstrated in
1268    * the folowing matrix:
1269    *
1270    *          caps1
1271    *       +-------------
1272    *       | 1  2  4  7
1273    * caps2 | 3  5  8 10
1274    *       | 6  9 11 12
1275    *
1276    * First we iterate over the caps1 structures (top line) intersecting
1277    * the structures diagonally down, then we iterate over the caps2
1278    * structures.
1279    */
1280   len1 = caps1->structs->len;
1281   len2 = caps2->structs->len;
1282   for (i = 0; i < len1 + len2 - 1; i++) {
1283     /* caps1 index goes from 0 to caps1->structs->len-1 */
1284     j = MIN (i, len1 - 1);
1285     /* caps2 index stays 0 until i reaches caps1->structs->len, then it counts
1286      * up from 1 to caps2->structs->len - 1 */
1287     k = MAX (0, i - j);
1288
1289     /* now run the diagonal line, end condition is the left or bottom
1290      * border */
1291     while (k < len2) {
1292       struct1 = gst_caps_get_structure_unchecked (caps1, j);
1293       struct2 = gst_caps_get_structure_unchecked (caps2, k);
1294
1295       istruct = gst_caps_structure_intersect (struct1, struct2);
1296
1297       gst_caps_append_structure (dest, istruct);
1298       /* move down left */
1299       k++;
1300       if (G_UNLIKELY (j == 0))
1301         break;                  /* so we don't roll back to G_MAXUINT */
1302       j--;
1303     }
1304   }
1305   return dest;
1306 }
1307
1308 typedef struct
1309 {
1310   const GstStructure *subtract_from;
1311   GSList *put_into;
1312 }
1313 SubtractionEntry;
1314
1315
1316 static gboolean
1317 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1318     gpointer user_data)
1319 {
1320   SubtractionEntry *e = user_data;
1321   GValue subtraction = { 0, };
1322   const GValue *other;
1323   GstStructure *structure;
1324
1325   other = gst_structure_id_get_value (e->subtract_from, field_id);
1326   if (!other) {
1327     return FALSE;
1328   }
1329   if (!gst_value_subtract (&subtraction, other, value))
1330     return TRUE;
1331   if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1332     g_value_unset (&subtraction);
1333     return FALSE;
1334   } else {
1335     structure = gst_structure_copy (e->subtract_from);
1336     gst_structure_id_set_value (structure, field_id, &subtraction);
1337     g_value_unset (&subtraction);
1338     e->put_into = g_slist_prepend (e->put_into, structure);
1339     return TRUE;
1340   }
1341 }
1342
1343 static gboolean
1344 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1345     const GstStructure * subtrahend)
1346 {
1347   SubtractionEntry e;
1348   gboolean ret;
1349
1350   e.subtract_from = minuend;
1351   e.put_into = NULL;
1352
1353   ret = gst_structure_foreach ((GstStructure *) subtrahend,
1354       gst_caps_structure_subtract_field, &e);
1355   if (ret) {
1356     *into = e.put_into;
1357   } else {
1358     GSList *walk;
1359
1360     for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1361       gst_structure_free (walk->data);
1362     }
1363     g_slist_free (e.put_into);
1364   }
1365   return ret;
1366 }
1367
1368 /**
1369  * gst_caps_subtract:
1370  * @minuend: #GstCaps to substract from
1371  * @subtrahend: #GstCaps to substract
1372  *
1373  * Subtracts the @subtrahend from the @minuend.
1374  * <note>This function does not work reliably if optional properties for caps
1375  * are included on one caps and omitted on the other.</note>
1376  *
1377  * Returns: the resulting caps
1378  */
1379 GstCaps *
1380 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1381 {
1382   guint i, j, sublen;
1383   GstStructure *min;
1384   GstStructure *sub;
1385   GstCaps *dest = NULL, *src;
1386
1387   g_return_val_if_fail (minuend != NULL, NULL);
1388   g_return_val_if_fail (subtrahend != NULL, NULL);
1389
1390   if (gst_caps_is_empty (minuend) || gst_caps_is_any (subtrahend)) {
1391     return gst_caps_new_empty ();
1392   }
1393   if (gst_caps_is_empty (subtrahend))
1394     return gst_caps_copy (minuend);
1395
1396   /* FIXME: Do we want this here or above?
1397      The reason we need this is that there is no definition about what
1398      ANY means for specific types, so it's not possible to reduce ANY partially
1399      You can only remove everything or nothing and that is done above.
1400      Note: there's a test that checks this behaviour. */
1401   g_return_val_if_fail (!gst_caps_is_any (minuend), NULL);
1402   sublen = subtrahend->structs->len;
1403   g_assert (sublen > 0);
1404
1405   src = gst_caps_copy (minuend);
1406   for (i = 0; i < sublen; i++) {
1407     guint srclen;
1408
1409     sub = gst_caps_get_structure_unchecked (subtrahend, i);
1410     if (dest) {
1411       gst_caps_unref (src);
1412       src = dest;
1413     }
1414     dest = gst_caps_new_empty ();
1415     srclen = src->structs->len;
1416     for (j = 0; j < srclen; j++) {
1417       min = gst_caps_get_structure_unchecked (src, j);
1418       if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1419         GSList *list;
1420
1421         if (gst_caps_structure_subtract (&list, min, sub)) {
1422           GSList *walk;
1423
1424           for (walk = list; walk; walk = g_slist_next (walk)) {
1425             gst_caps_append_structure (dest, (GstStructure *) walk->data);
1426           }
1427           g_slist_free (list);
1428         } else {
1429           gst_caps_append_structure (dest, gst_structure_copy (min));
1430         }
1431       } else {
1432         gst_caps_append_structure (dest, gst_structure_copy (min));
1433       }
1434     }
1435     if (gst_caps_is_empty (dest)) {
1436       gst_caps_unref (src);
1437       return dest;
1438     }
1439   }
1440
1441   gst_caps_unref (src);
1442   gst_caps_do_simplify (dest);
1443   return dest;
1444 }
1445
1446 /**
1447  * gst_caps_union:
1448  * @caps1: a #GstCaps to union
1449  * @caps2: a #GstCaps to union
1450  *
1451  * Creates a new #GstCaps that contains all the formats that are in
1452  * either @caps1 and @caps2.
1453  *
1454  * Returns: the new #GstCaps
1455  */
1456 GstCaps *
1457 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1458 {
1459   GstCaps *dest1;
1460   GstCaps *dest2;
1461
1462   /* NULL pointers are no correct GstCaps */
1463   g_return_val_if_fail (caps1 != NULL, NULL);
1464   g_return_val_if_fail (caps2 != NULL, NULL);
1465
1466   if (gst_caps_is_empty (caps1))
1467     return gst_caps_copy (caps2);
1468
1469   if (gst_caps_is_empty (caps2))
1470     return gst_caps_copy (caps1);
1471
1472   if (gst_caps_is_any (caps1) || gst_caps_is_any (caps2))
1473     return gst_caps_new_any ();
1474
1475   dest1 = gst_caps_copy (caps1);
1476   dest2 = gst_caps_copy (caps2);
1477   gst_caps_append (dest1, dest2);
1478
1479   gst_caps_do_simplify (dest1);
1480   return dest1;
1481 }
1482
1483 typedef struct _NormalizeForeach
1484 {
1485   GstCaps *caps;
1486   GstStructure *structure;
1487 }
1488 NormalizeForeach;
1489
1490 static gboolean
1491 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1492 {
1493   NormalizeForeach *nf = (NormalizeForeach *) ptr;
1494   GValue val = { 0 };
1495   guint i;
1496
1497   if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1498     guint len = gst_value_list_get_size (value);
1499     for (i = 1; i < len; i++) {
1500       const GValue *v = gst_value_list_get_value (value, i);
1501       GstStructure *structure = gst_structure_copy (nf->structure);
1502
1503       gst_structure_id_set_value (structure, field_id, v);
1504       gst_caps_append_structure (nf->caps, structure);
1505     }
1506
1507     gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1508     gst_structure_id_set_value (nf->structure, field_id, &val);
1509     g_value_unset (&val);
1510
1511     return FALSE;
1512   }
1513   return TRUE;
1514 }
1515
1516 /**
1517  * gst_caps_normalize:
1518  * @caps: a #GstCaps to normalize
1519  *
1520  * Creates a new #GstCaps that represents the same set of formats as
1521  * @caps, but contains no lists.  Each list is expanded into separate
1522  * @GstStructures.
1523  *
1524  * Returns: the new #GstCaps
1525  */
1526 GstCaps *
1527 gst_caps_normalize (const GstCaps * caps)
1528 {
1529   NormalizeForeach nf;
1530   GstCaps *newcaps;
1531   guint i, nlen;
1532
1533   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1534
1535   newcaps = gst_caps_copy (caps);
1536   nf.caps = newcaps;
1537   nlen = newcaps->structs->len;
1538
1539   for (i = 0; i < nlen; i++) {
1540     nf.structure = gst_caps_get_structure_unchecked (newcaps, i);
1541
1542     while (!gst_structure_foreach (nf.structure,
1543             gst_caps_normalize_foreach, &nf));
1544   }
1545
1546   return newcaps;
1547 }
1548
1549 static gint
1550 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1551 {
1552   gint ret;
1553   const GstStructure *struct1 = *((const GstStructure **) one);
1554   const GstStructure *struct2 = *((const GstStructure **) two);
1555
1556   /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1557      So what's the best way? */
1558   ret = strcmp (gst_structure_get_name (struct1),
1559       gst_structure_get_name (struct2));
1560   if (ret)
1561     return ret;
1562
1563   return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1564 }
1565
1566 typedef struct
1567 {
1568   GQuark name;
1569   GValue value;
1570   GstStructure *compare;
1571 }
1572 UnionField;
1573
1574 static gboolean
1575 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1576     gpointer user_data)
1577 {
1578   UnionField *u = user_data;
1579   const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1580
1581   if (!val) {
1582     if (u->name)
1583       g_value_unset (&u->value);
1584     return FALSE;
1585   }
1586   if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1587     return TRUE;
1588   if (u->name) {
1589     g_value_unset (&u->value);
1590     return FALSE;
1591   }
1592   u->name = field_id;
1593   gst_value_union (&u->value, val, value);
1594   return TRUE;
1595 }
1596
1597 static gboolean
1598 gst_caps_structure_simplify (GstStructure ** result,
1599     const GstStructure * simplify, GstStructure * compare)
1600 {
1601   GSList *list;
1602   UnionField field = { 0, {0,}, NULL };
1603
1604   /* try to subtract to get a real subset */
1605   if (gst_caps_structure_subtract (&list, simplify, compare)) {
1606     switch (g_slist_length (list)) {
1607       case 0:
1608         *result = NULL;
1609         return TRUE;
1610       case 1:
1611         *result = list->data;
1612         g_slist_free (list);
1613         return TRUE;
1614       default:
1615       {
1616         GSList *walk;
1617
1618         for (walk = list; walk; walk = g_slist_next (walk)) {
1619           gst_structure_free (walk->data);
1620         }
1621         g_slist_free (list);
1622         break;
1623       }
1624     }
1625   }
1626
1627   /* try to union both structs */
1628   field.compare = compare;
1629   if (gst_structure_foreach ((GstStructure *) simplify,
1630           gst_caps_structure_figure_out_union, &field)) {
1631     gboolean ret = FALSE;
1632
1633     /* now we know all of simplify's fields are the same in compare
1634      * but at most one field: field.name */
1635     if (G_IS_VALUE (&field.value)) {
1636       if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1637         gst_structure_id_set_value (compare, field.name, &field.value);
1638         *result = NULL;
1639         ret = TRUE;
1640       }
1641       g_value_unset (&field.value);
1642     } else if (gst_structure_n_fields (simplify) <=
1643         gst_structure_n_fields (compare)) {
1644       /* compare is just more specific, will be optimized away later */
1645       /* FIXME: do this here? */
1646       GST_LOG ("found a case that will be optimized later.");
1647     } else {
1648       gchar *one = gst_structure_to_string (simplify);
1649       gchar *two = gst_structure_to_string (compare);
1650
1651       GST_ERROR
1652           ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1653           one, two);
1654       g_free (one);
1655       g_free (two);
1656     }
1657     return ret;
1658   }
1659
1660   return FALSE;
1661 }
1662
1663 static void
1664 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1665     GstStructure * new, gint i)
1666 {
1667   gst_structure_set_parent_refcount (old, NULL);
1668   gst_structure_free (old);
1669   gst_structure_set_parent_refcount (new, &caps->refcount);
1670   g_ptr_array_index (caps->structs, i) = new;
1671 }
1672
1673 /**
1674  * gst_caps_do_simplify:
1675  * @caps: a #GstCaps to simplify
1676  *
1677  * Modifies the given @caps inplace into a representation that represents the
1678  * same set of formats, but in a simpler form.  Component structures that are
1679  * identical are merged.  Component structures that have values that can be
1680  * merged are also merged.
1681  *
1682  * Returns: TRUE, if the caps could be simplified
1683  */
1684 gboolean
1685 gst_caps_do_simplify (GstCaps * caps)
1686 {
1687   GstStructure *simplify, *compare, *result = NULL;
1688   gint i, j, start;
1689   gboolean changed = FALSE;
1690
1691   g_return_val_if_fail (caps != NULL, FALSE);
1692   g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1693
1694   if (gst_caps_get_size (caps) < 2)
1695     return FALSE;
1696
1697   g_ptr_array_sort (caps->structs, gst_caps_compare_structures);
1698
1699   start = caps->structs->len - 1;
1700   for (i = caps->structs->len - 1; i >= 0; i--) {
1701     simplify = gst_caps_get_structure_unchecked (caps, i);
1702     if (gst_structure_get_name_id (simplify) !=
1703         gst_structure_get_name_id (gst_caps_get_structure_unchecked (caps,
1704                 start)))
1705       start = i;
1706     for (j = start; j >= 0; j--) {
1707       if (j == i)
1708         continue;
1709       compare = gst_caps_get_structure_unchecked (caps, j);
1710       if (gst_structure_get_name_id (simplify) !=
1711           gst_structure_get_name_id (compare)) {
1712         break;
1713       }
1714       if (gst_caps_structure_simplify (&result, simplify, compare)) {
1715         if (result) {
1716           gst_caps_switch_structures (caps, simplify, result, i);
1717           simplify = result;
1718         } else {
1719           gst_caps_remove_structure (caps, i);
1720           start--;
1721           break;
1722         }
1723         changed = TRUE;
1724       }
1725     }
1726   }
1727
1728   if (!changed)
1729     return FALSE;
1730
1731   /* gst_caps_do_simplify (caps); */
1732   return TRUE;
1733 }
1734
1735 #ifndef GST_DISABLE_LOADSAVE
1736 /**
1737  * gst_caps_save_thyself:
1738  * @caps: a #GstCaps structure
1739  * @parent: a XML parent node
1740  *
1741  * Serializes a #GstCaps to XML and adds it as a child node of @parent.
1742  *
1743  * Returns: a XML node pointer
1744  */
1745 xmlNodePtr
1746 gst_caps_save_thyself (const GstCaps * caps, xmlNodePtr parent)
1747 {
1748   char *s = gst_caps_to_string (caps);
1749
1750   xmlNewChild (parent, NULL, (xmlChar *) "caps", (xmlChar *) s);
1751   g_free (s);
1752   return parent;
1753 }
1754
1755 /**
1756  * gst_caps_load_thyself:
1757  * @parent: a XML node
1758  *
1759  * Creates a #GstCaps from its XML serialization.
1760  *
1761  * Returns: a new #GstCaps structure
1762  */
1763 GstCaps *
1764 gst_caps_load_thyself (xmlNodePtr parent)
1765 {
1766   if (strcmp ("caps", (char *) parent->name) == 0) {
1767     return gst_caps_from_string ((gchar *) xmlNodeGetContent (parent));
1768   }
1769
1770   return NULL;
1771 }
1772 #endif
1773
1774 /* utility */
1775
1776 /**
1777  * gst_caps_replace:
1778  * @caps: a pointer to #GstCaps
1779  * @newcaps: a #GstCaps to replace *caps
1780  *
1781  * Replaces *caps with @newcaps.  Unrefs the #GstCaps in the location
1782  * pointed to by @caps, if applicable, then modifies @caps to point to
1783  * @newcaps. An additional ref on @newcaps is taken.
1784  *
1785  * This function does not take any locks so you might want to lock
1786  * the object owning @caps pointer.
1787  */
1788 void
1789 gst_caps_replace (GstCaps ** caps, GstCaps * newcaps)
1790 {
1791   GstCaps *oldcaps;
1792
1793   g_return_if_fail (caps != NULL);
1794
1795   oldcaps = *caps;
1796
1797   GST_CAT_LOG (GST_CAT_REFCOUNTING, "%p, %p -> %p", caps, oldcaps, newcaps);
1798
1799   if (newcaps != oldcaps) {
1800     if (newcaps)
1801       gst_caps_ref (newcaps);
1802
1803     *caps = newcaps;
1804
1805     if (oldcaps)
1806       gst_caps_unref (oldcaps);
1807   }
1808 }
1809
1810 /**
1811  * gst_caps_to_string:
1812  * @caps: a #GstCaps
1813  *
1814  * Converts @caps to a string representation.  This string representation
1815  * can be converted back to a #GstCaps by gst_caps_from_string().
1816  *
1817  * For debugging purposes its easier to do something like this:
1818  * |[
1819  * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
1820  * ]|
1821  * This prints the caps in human readble form.
1822  *
1823  * Returns: a newly allocated string representing @caps.
1824  */
1825 gchar *
1826 gst_caps_to_string (const GstCaps * caps)
1827 {
1828   guint i, slen, clen;
1829   GString *s;
1830
1831   /* NOTE:  This function is potentially called by the debug system,
1832    * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
1833    * should be careful to avoid recursion.  This includes any functions
1834    * called by gst_caps_to_string.  In particular, calls should
1835    * not use the GST_PTR_FORMAT extension.  */
1836
1837   if (caps == NULL) {
1838     return g_strdup ("NULL");
1839   }
1840   if (gst_caps_is_any (caps)) {
1841     return g_strdup ("ANY");
1842   }
1843   if (gst_caps_is_empty (caps)) {
1844     return g_strdup ("EMPTY");
1845   }
1846
1847   /* estimate a rough string length to avoid unnecessary reallocs in GString */
1848   slen = 0;
1849   clen = caps->structs->len;
1850   for (i = 0; i < clen; i++) {
1851     slen +=
1852         STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked (caps,
1853             i));
1854   }
1855
1856   s = g_string_sized_new (slen);
1857   for (i = 0; i < clen; i++) {
1858     GstStructure *structure;
1859
1860     if (i > 0) {
1861       /* ';' is now added by gst_structure_to_string */
1862       g_string_append_c (s, ' ');
1863     }
1864
1865     structure = gst_caps_get_structure_unchecked (caps, i);
1866     priv_gst_structure_append_to_gstring (structure, s);
1867   }
1868   if (s->len && s->str[s->len - 1] == ';') {
1869     /* remove latest ';' */
1870     s->str[--s->len] = '\0';
1871   }
1872   return g_string_free (s, FALSE);
1873 }
1874
1875 static gboolean
1876 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
1877 {
1878   GstStructure *structure;
1879   gchar *s;
1880
1881   g_return_val_if_fail (string, FALSE);
1882   if (strcmp ("ANY", string) == 0) {
1883     caps->flags = GST_CAPS_FLAGS_ANY;
1884     return TRUE;
1885   }
1886   if (strcmp ("EMPTY", string) == 0) {
1887     return TRUE;
1888   }
1889
1890   structure = gst_structure_from_string (string, &s);
1891   if (structure == NULL) {
1892     return FALSE;
1893   }
1894   gst_caps_append_structure (caps, structure);
1895
1896   do {
1897
1898     while (g_ascii_isspace (*s))
1899       s++;
1900     if (*s == '\0') {
1901       break;
1902     }
1903     structure = gst_structure_from_string (s, &s);
1904     if (structure == NULL) {
1905       return FALSE;
1906     }
1907     gst_caps_append_structure (caps, structure);
1908
1909   } while (TRUE);
1910
1911   return TRUE;
1912 }
1913
1914 /**
1915  * gst_caps_from_string:
1916  * @string: a string to convert to #GstCaps
1917  *
1918  * Converts @caps from a string representation.
1919  *
1920  * Returns: a newly allocated #GstCaps
1921  */
1922 GstCaps *
1923 gst_caps_from_string (const gchar * string)
1924 {
1925   GstCaps *caps;
1926
1927   caps = gst_caps_new_empty ();
1928   if (gst_caps_from_string_inplace (caps, string)) {
1929     return caps;
1930   } else {
1931     gst_caps_unref (caps);
1932     return NULL;
1933   }
1934 }
1935
1936 static void
1937 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
1938 {
1939   g_return_if_fail (G_IS_VALUE (src_value));
1940   g_return_if_fail (G_IS_VALUE (dest_value));
1941   g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
1942   g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
1943       || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
1944
1945   dest_value->data[0].v_pointer =
1946       gst_caps_to_string (src_value->data[0].v_pointer);
1947 }
1948
1949 static GstCaps *
1950 gst_caps_copy_conditional (GstCaps * src)
1951 {
1952   if (src) {
1953     return gst_caps_ref (src);
1954   } else {
1955     return NULL;
1956   }
1957 }