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