gst/: Don't use g_atomic_set_int where it's not needed.
[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   /* NULL <-> NULL is allowed here */
1067   if (caps1 == caps2)
1068     return TRUE;
1069
1070   /* one of them NULL => they are different (can't be both NULL because
1071    * we checked that above) */
1072   if (caps1 == NULL || caps2 == NULL)
1073     return FALSE;
1074
1075   if (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2))
1076     return gst_caps_is_equal_fixed (caps1, caps2);
1077
1078   return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1079 }
1080
1081 typedef struct
1082 {
1083   GstStructure *dest;
1084   const GstStructure *intersect;
1085   gboolean first_run;
1086 }
1087 IntersectData;
1088
1089 static gboolean
1090 gst_caps_structure_intersect_field (GQuark id, const GValue * val1,
1091     gpointer data)
1092 {
1093   IntersectData *idata = (IntersectData *) data;
1094   GValue dest_value = { 0 };
1095   const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
1096
1097   if (val2 == NULL) {
1098     gst_structure_id_set_value (idata->dest, id, val1);
1099   } else if (idata->first_run) {
1100     if (gst_value_intersect (&dest_value, val1, val2)) {
1101       gst_structure_id_set_value (idata->dest, id, &dest_value);
1102       g_value_unset (&dest_value);
1103     } else {
1104       return FALSE;
1105     }
1106   }
1107
1108   return TRUE;
1109 }
1110
1111 static GstStructure *
1112 gst_caps_structure_intersect (const GstStructure * struct1,
1113     const GstStructure * struct2)
1114 {
1115   IntersectData data;
1116
1117   g_return_val_if_fail (struct1 != NULL, NULL);
1118   g_return_val_if_fail (struct2 != NULL, NULL);
1119
1120   if (struct1->name != struct2->name)
1121     return NULL;
1122
1123   data.dest = gst_structure_id_empty_new (struct1->name);
1124   data.intersect = struct2;
1125   data.first_run = TRUE;
1126   if (!gst_structure_foreach ((GstStructure *) struct1,
1127           gst_caps_structure_intersect_field, &data))
1128     goto error;
1129
1130   data.intersect = struct1;
1131   data.first_run = FALSE;
1132   if (!gst_structure_foreach ((GstStructure *) struct2,
1133           gst_caps_structure_intersect_field, &data))
1134     goto error;
1135
1136   return data.dest;
1137
1138 error:
1139   gst_structure_free (data.dest);
1140   return NULL;
1141 }
1142
1143 #if 0
1144 static GstStructure *
1145 gst_caps_structure_union (const GstStructure * struct1,
1146     const GstStructure * struct2)
1147 {
1148   int i;
1149   GstStructure *dest;
1150   const GstStructureField *field1;
1151   const GstStructureField *field2;
1152   int ret;
1153
1154   /* FIXME this doesn't actually work */
1155
1156   if (struct1->name != struct2->name)
1157     return NULL;
1158
1159   dest = gst_structure_id_empty_new (struct1->name);
1160
1161   for (i = 0; i < struct1->fields->len; i++) {
1162     GValue dest_value = { 0 };
1163
1164     field1 = GST_STRUCTURE_FIELD (struct1, i);
1165     field2 = gst_structure_id_get_field (struct2, field1->name);
1166
1167     if (field2 == NULL) {
1168       continue;
1169     } else {
1170       if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1171         gst_structure_set_value (dest, g_quark_to_string (field1->name),
1172             &dest_value);
1173       } else {
1174         ret = gst_value_compare (&field1->value, &field2->value);
1175       }
1176     }
1177   }
1178
1179   return dest;
1180 }
1181 #endif
1182
1183 /* operations */
1184
1185 /**
1186  * gst_caps_intersect:
1187  * @caps1: a #GstCaps to intersect
1188  * @caps2: a #GstCaps to intersect
1189  *
1190  * Creates a new #GstCaps that contains all the formats that are common
1191  * to both @caps1 and @caps2.
1192  *
1193  * Returns: the new #GstCaps
1194  */
1195 GstCaps *
1196 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1197 {
1198   guint64 i;                    /* index can be up to 2 * G_MAX_UINT */
1199   guint j, k;
1200
1201   GstStructure *struct1;
1202   GstStructure *struct2;
1203   GstCaps *dest;
1204   GstStructure *istruct;
1205
1206   g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1207   g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1208
1209   /* caps are exactly the same pointers, just copy one caps */
1210   if (caps1 == caps2)
1211     return gst_caps_copy (caps1);
1212
1213   /* empty caps on either side, return empty */
1214   if (gst_caps_is_empty (caps1) || gst_caps_is_empty (caps2))
1215     return gst_caps_new_empty ();
1216
1217   /* one of the caps is any, just copy the other caps */
1218   if (gst_caps_is_any (caps1))
1219     return gst_caps_copy (caps2);
1220   if (gst_caps_is_any (caps2))
1221     return gst_caps_copy (caps1);
1222
1223   dest = gst_caps_new_empty ();
1224
1225   /* run zigzag on top line then right line, this preserves the caps order
1226    * much better than a simple loop.
1227    *
1228    * This algorithm zigzags over the caps structures as demonstrated in
1229    * the folowing matrix:
1230    *
1231    *          caps1
1232    *       +-------------
1233    *       | 1  2  4  7
1234    * caps2 | 3  5  8 10
1235    *       | 6  9 11 12
1236    *
1237    * First we iterate over the caps1 structures (top line) intersecting
1238    * the structures diagonally down, then we iterate over the caps2
1239    * structures.
1240    */
1241   for (i = 0; i < caps1->structs->len + caps2->structs->len - 1; i++) {
1242     /* caps1 index goes from 0 to caps1->structs->len-1 */
1243     j = MIN (i, caps1->structs->len - 1);
1244     /* caps2 index stays 0 until i reaches caps1->structs->len, then it counts
1245      * up from 1 to caps2->structs->len - 1 */
1246     k = MAX (0, i - j);
1247
1248     /* now run the diagonal line, end condition is the left or bottom
1249      * border */
1250     while (k < caps2->structs->len) {
1251       struct1 = gst_caps_get_structure (caps1, j);
1252       struct2 = gst_caps_get_structure (caps2, k);
1253
1254       istruct = gst_caps_structure_intersect (struct1, struct2);
1255
1256       gst_caps_append_structure (dest, istruct);
1257       /* move down left */
1258       k++;
1259       if (j == 0)
1260         break;                  /* so we don't roll back to G_MAXUINT */
1261       j--;
1262     }
1263   }
1264   return dest;
1265 }
1266
1267 typedef struct
1268 {
1269   const GstStructure *subtract_from;
1270   GSList *put_into;
1271 }
1272 SubtractionEntry;
1273
1274
1275 static gboolean
1276 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1277     gpointer user_data)
1278 {
1279   SubtractionEntry *e = user_data;
1280   GValue subtraction = { 0, };
1281   const GValue *other;
1282   GstStructure *structure;
1283
1284   other = gst_structure_id_get_value (e->subtract_from, field_id);
1285   if (!other) {
1286     return FALSE;
1287   }
1288   if (!gst_value_subtract (&subtraction, other, value))
1289     return TRUE;
1290   if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1291     g_value_unset (&subtraction);
1292     return FALSE;
1293   } else {
1294     structure = gst_structure_copy (e->subtract_from);
1295     gst_structure_id_set_value (structure, field_id, &subtraction);
1296     g_value_unset (&subtraction);
1297     e->put_into = g_slist_prepend (e->put_into, structure);
1298     return TRUE;
1299   }
1300 }
1301
1302 static gboolean
1303 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1304     const GstStructure * subtrahend)
1305 {
1306   SubtractionEntry e;
1307   gboolean ret;
1308
1309   e.subtract_from = minuend;
1310   e.put_into = NULL;
1311
1312   ret = gst_structure_foreach ((GstStructure *) subtrahend,
1313       gst_caps_structure_subtract_field, &e);
1314   if (ret) {
1315     *into = e.put_into;
1316   } else {
1317     GSList *walk;
1318
1319     for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1320       gst_structure_free (walk->data);
1321     }
1322     g_slist_free (e.put_into);
1323   }
1324   return ret;
1325 }
1326
1327 /**
1328  * gst_caps_subtract:
1329  * @minuend: #GstCaps to substract from
1330  * @subtrahend: #GstCaps to substract
1331  *
1332  * Subtracts the @subtrahend from the @minuend.
1333  * <note>This function does not work reliably if optional properties for caps
1334  * are included on one caps and omitted on the other.</note>
1335  *
1336  * Returns: the resulting caps
1337  */
1338 GstCaps *
1339 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1340 {
1341   guint i, j;
1342   GstStructure *min;
1343   GstStructure *sub;
1344   GstCaps *dest = NULL, *src;
1345
1346   g_return_val_if_fail (minuend != NULL, NULL);
1347   g_return_val_if_fail (subtrahend != NULL, NULL);
1348
1349   if (gst_caps_is_empty (minuend) || gst_caps_is_any (subtrahend)) {
1350     return gst_caps_new_empty ();
1351   }
1352   if (gst_caps_is_empty (subtrahend))
1353     return gst_caps_copy (minuend);
1354
1355   /* FIXME: Do we want this here or above?
1356      The reason we need this is that there is no definition about what
1357      ANY means for specific types, so it's not possible to reduce ANY partially
1358      You can only remove everything or nothing and that is done above.
1359      Note: there's a test that checks this behaviour. */
1360   g_return_val_if_fail (!gst_caps_is_any (minuend), NULL);
1361   g_assert (subtrahend->structs->len > 0);
1362
1363   src = gst_caps_copy (minuend);
1364   for (i = 0; i < subtrahend->structs->len; i++) {
1365     sub = gst_caps_get_structure (subtrahend, i);
1366     if (dest) {
1367       gst_caps_unref (src);
1368       src = dest;
1369     }
1370     dest = gst_caps_new_empty ();
1371     for (j = 0; j < src->structs->len; j++) {
1372       min = gst_caps_get_structure (src, j);
1373       if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1374         GSList *list;
1375
1376         if (gst_caps_structure_subtract (&list, min, sub)) {
1377           GSList *walk;
1378
1379           for (walk = list; walk; walk = g_slist_next (walk)) {
1380             gst_caps_append_structure (dest, (GstStructure *) walk->data);
1381           }
1382           g_slist_free (list);
1383         } else {
1384           gst_caps_append_structure (dest, gst_structure_copy (min));
1385         }
1386       } else {
1387         gst_caps_append_structure (dest, gst_structure_copy (min));
1388       }
1389     }
1390     if (gst_caps_is_empty (dest)) {
1391       gst_caps_unref (src);
1392       return dest;
1393     }
1394   }
1395
1396   gst_caps_unref (src);
1397   gst_caps_do_simplify (dest);
1398   return dest;
1399 }
1400
1401 /**
1402  * gst_caps_union:
1403  * @caps1: a #GstCaps to union
1404  * @caps2: a #GstCaps to union
1405  *
1406  * Creates a new #GstCaps that contains all the formats that are in
1407  * either @caps1 and @caps2.
1408  *
1409  * Returns: the new #GstCaps
1410  */
1411 GstCaps *
1412 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1413 {
1414   GstCaps *dest1;
1415   GstCaps *dest2;
1416
1417   if (gst_caps_is_any (caps1) || gst_caps_is_any (caps2))
1418     return gst_caps_new_any ();
1419
1420   dest1 = gst_caps_copy (caps1);
1421   dest2 = gst_caps_copy (caps2);
1422   gst_caps_append (dest1, dest2);
1423
1424   gst_caps_do_simplify (dest1);
1425   return dest1;
1426 }
1427
1428 typedef struct _NormalizeForeach
1429 {
1430   GstCaps *caps;
1431   GstStructure *structure;
1432 }
1433 NormalizeForeach;
1434
1435 static gboolean
1436 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1437 {
1438   NormalizeForeach *nf = (NormalizeForeach *) ptr;
1439   GValue val = { 0 };
1440   guint i;
1441
1442   if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1443     for (i = 1; i < gst_value_list_get_size (value); i++) {
1444       const GValue *v = gst_value_list_get_value (value, i);
1445       GstStructure *structure = gst_structure_copy (nf->structure);
1446
1447       gst_structure_id_set_value (structure, field_id, v);
1448       gst_caps_append_structure (nf->caps, structure);
1449     }
1450
1451     gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1452     gst_structure_id_set_value (nf->structure, field_id, &val);
1453     g_value_unset (&val);
1454
1455     return FALSE;
1456   }
1457   return TRUE;
1458 }
1459
1460 /**
1461  * gst_caps_normalize:
1462  * @caps: a #GstCaps to normalize
1463  *
1464  * Creates a new #GstCaps that represents the same set of formats as
1465  * @caps, but contains no lists.  Each list is expanded into separate
1466  * @GstStructures.
1467  *
1468  * Returns: the new #GstCaps
1469  */
1470 GstCaps *
1471 gst_caps_normalize (const GstCaps * caps)
1472 {
1473   NormalizeForeach nf;
1474   GstCaps *newcaps;
1475   guint i;
1476
1477   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1478
1479   newcaps = gst_caps_copy (caps);
1480   nf.caps = newcaps;
1481
1482   for (i = 0; i < newcaps->structs->len; i++) {
1483     nf.structure = gst_caps_get_structure (newcaps, i);
1484
1485     while (!gst_structure_foreach (nf.structure,
1486             gst_caps_normalize_foreach, &nf));
1487   }
1488
1489   return newcaps;
1490 }
1491
1492 static gint
1493 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1494 {
1495   gint ret;
1496   const GstStructure *struct1 = *((const GstStructure **) one);
1497   const GstStructure *struct2 = *((const GstStructure **) two);
1498
1499   /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1500      So what's the best way? */
1501   ret = strcmp (gst_structure_get_name (struct1),
1502       gst_structure_get_name (struct2));
1503   if (ret)
1504     return ret;
1505
1506   return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1507 }
1508
1509 typedef struct
1510 {
1511   GQuark name;
1512   GValue value;
1513   GstStructure *compare;
1514 }
1515 UnionField;
1516
1517 static gboolean
1518 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1519     gpointer user_data)
1520 {
1521   UnionField *u = user_data;
1522   const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1523
1524   if (!val) {
1525     if (u->name)
1526       g_value_unset (&u->value);
1527     return FALSE;
1528   }
1529   if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1530     return TRUE;
1531   if (u->name) {
1532     g_value_unset (&u->value);
1533     return FALSE;
1534   }
1535   u->name = field_id;
1536   gst_value_union (&u->value, val, value);
1537   return TRUE;
1538 }
1539
1540 static gboolean
1541 gst_caps_structure_simplify (GstStructure ** result,
1542     const GstStructure * simplify, GstStructure * compare)
1543 {
1544   GSList *list;
1545   UnionField field = { 0, {0,}, NULL };
1546
1547   /* try to subtract to get a real subset */
1548   if (gst_caps_structure_subtract (&list, simplify, compare)) {
1549     switch (g_slist_length (list)) {
1550       case 0:
1551         *result = NULL;
1552         return TRUE;
1553       case 1:
1554         *result = list->data;
1555         g_slist_free (list);
1556         return TRUE;
1557       default:
1558       {
1559         GSList *walk;
1560
1561         for (walk = list; walk; walk = g_slist_next (walk)) {
1562           gst_structure_free (walk->data);
1563         }
1564         g_slist_free (list);
1565         break;
1566       }
1567     }
1568   }
1569
1570   /* try to union both structs */
1571   field.compare = compare;
1572   if (gst_structure_foreach ((GstStructure *) simplify,
1573           gst_caps_structure_figure_out_union, &field)) {
1574     gboolean ret = FALSE;
1575
1576     /* now we know all of simplify's fields are the same in compare
1577      * but at most one field: field.name */
1578     if (G_IS_VALUE (&field.value)) {
1579       if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1580         gst_structure_id_set_value (compare, field.name, &field.value);
1581         *result = NULL;
1582         ret = TRUE;
1583       }
1584       g_value_unset (&field.value);
1585     } else if (gst_structure_n_fields (simplify) <=
1586         gst_structure_n_fields (compare)) {
1587       /* compare is just more specific, will be optimized away later */
1588       /* FIXME: do this here? */
1589       GST_LOG ("found a case that will be optimized later.");
1590     } else {
1591       gchar *one = gst_structure_to_string (simplify);
1592       gchar *two = gst_structure_to_string (compare);
1593
1594       GST_ERROR
1595           ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1596           one, two);
1597       g_free (one);
1598       g_free (two);
1599     }
1600     return ret;
1601   }
1602
1603   return FALSE;
1604 }
1605
1606 static void
1607 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1608     GstStructure * new, gint i)
1609 {
1610   gst_structure_set_parent_refcount (old, NULL);
1611   gst_structure_free (old);
1612   gst_structure_set_parent_refcount (new, &caps->refcount);
1613   g_ptr_array_index (caps->structs, i) = new;
1614 }
1615
1616 /**
1617  * gst_caps_do_simplify:
1618  * @caps: a #GstCaps to simplify
1619  *
1620  * Modifies the given @caps inplace into a representation that represents the
1621  * same set of formats, but in a simpler form.  Component structures that are
1622  * identical are merged.  Component structures that have values that can be
1623  * merged are also merged.
1624  *
1625  * Returns: TRUE, if the caps could be simplified
1626  */
1627 gboolean
1628 gst_caps_do_simplify (GstCaps * caps)
1629 {
1630   GstStructure *simplify, *compare, *result = NULL;
1631   gint i, j, start;
1632   gboolean changed = FALSE;
1633
1634   g_return_val_if_fail (caps != NULL, FALSE);
1635   g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1636
1637   if (gst_caps_get_size (caps) < 2)
1638     return FALSE;
1639
1640   g_ptr_array_sort (caps->structs, gst_caps_compare_structures);
1641
1642   start = caps->structs->len - 1;
1643   for (i = caps->structs->len - 1; i >= 0; i--) {
1644     simplify = gst_caps_get_structure (caps, i);
1645     if (gst_structure_get_name_id (simplify) !=
1646         gst_structure_get_name_id (gst_caps_get_structure (caps, start)))
1647       start = i;
1648     for (j = start; j >= 0; j--) {
1649       if (j == i)
1650         continue;
1651       compare = gst_caps_get_structure (caps, j);
1652       if (gst_structure_get_name_id (simplify) !=
1653           gst_structure_get_name_id (compare)) {
1654         break;
1655       }
1656       if (gst_caps_structure_simplify (&result, simplify, compare)) {
1657         if (result) {
1658           gst_caps_switch_structures (caps, simplify, result, i);
1659           simplify = result;
1660         } else {
1661           gst_caps_remove_structure (caps, i);
1662           start--;
1663           break;
1664         }
1665         changed = TRUE;
1666       }
1667     }
1668   }
1669
1670   if (!changed)
1671     return FALSE;
1672
1673   /* gst_caps_do_simplify (caps); */
1674   return TRUE;
1675 }
1676
1677 #ifndef GST_DISABLE_LOADSAVE
1678 /**
1679  * gst_caps_save_thyself:
1680  * @caps: a #GstCaps structure
1681  * @parent: a XML parent node
1682  *
1683  * Serializes a #GstCaps to XML and adds it as a child node of @parent.
1684  *
1685  * Returns: a XML node pointer
1686  */
1687 xmlNodePtr
1688 gst_caps_save_thyself (const GstCaps * caps, xmlNodePtr parent)
1689 {
1690   char *s = gst_caps_to_string (caps);
1691
1692   xmlNewChild (parent, NULL, (xmlChar *) "caps", (xmlChar *) s);
1693   g_free (s);
1694   return parent;
1695 }
1696
1697 /**
1698  * gst_caps_load_thyself:
1699  * @parent: a XML node
1700  *
1701  * Creates a #GstCaps from its XML serialization.
1702  *
1703  * Returns: a new #GstCaps structure
1704  */
1705 GstCaps *
1706 gst_caps_load_thyself (xmlNodePtr parent)
1707 {
1708   if (strcmp ("caps", (char *) parent->name) == 0) {
1709     return gst_caps_from_string ((gchar *) xmlNodeGetContent (parent));
1710   }
1711
1712   return NULL;
1713 }
1714 #endif
1715
1716 /* utility */
1717
1718 /**
1719  * gst_caps_replace:
1720  * @caps: a pointer to #GstCaps
1721  * @newcaps: a #GstCaps to replace *caps
1722  *
1723  * Replaces *caps with @newcaps.  Unrefs the #GstCaps in the location
1724  * pointed to by @caps, if applicable, then modifies @caps to point to
1725  * @newcaps. An additional ref on @newcaps is taken.
1726  *
1727  * This function does not take any locks so you might want to lock
1728  * the object owning @caps pointer.
1729  */
1730 void
1731 gst_caps_replace (GstCaps ** caps, GstCaps * newcaps)
1732 {
1733   GstCaps *oldcaps;
1734
1735   g_return_if_fail (caps != NULL);
1736
1737   oldcaps = *caps;
1738
1739   if (newcaps != oldcaps) {
1740     if (newcaps)
1741       gst_caps_ref (newcaps);
1742
1743     *caps = newcaps;
1744
1745     if (oldcaps)
1746       gst_caps_unref (oldcaps);
1747   }
1748 }
1749
1750 /**
1751  * gst_caps_to_string:
1752  * @caps: a #GstCaps
1753  *
1754  * Converts @caps to a string representation.  This string representation
1755  * can be converted back to a #GstCaps by gst_caps_from_string().
1756  *
1757  * For debugging purposes its easier to do something like this:
1758  * <programlisting>
1759  *  GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
1760  * </programlisting>
1761  * This prints the caps in human readble form.
1762  *
1763  * Returns: a newly allocated string representing @caps.
1764  */
1765 gchar *
1766 gst_caps_to_string (const GstCaps * caps)
1767 {
1768   guint i, slen;
1769   GString *s;
1770
1771   /* NOTE:  This function is potentially called by the debug system,
1772    * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
1773    * should be careful to avoid recursion.  This includes any functions
1774    * called by gst_caps_to_string.  In particular, calls should
1775    * not use the GST_PTR_FORMAT extension.  */
1776
1777   if (caps == NULL) {
1778     return g_strdup ("NULL");
1779   }
1780   if (gst_caps_is_any (caps)) {
1781     return g_strdup ("ANY");
1782   }
1783   if (gst_caps_is_empty (caps)) {
1784     return g_strdup ("EMPTY");
1785   }
1786
1787   /* estimate a rough string length to avoid unnecessary reallocs in GString */
1788   slen = 0;
1789   for (i = 0; i < caps->structs->len; i++) {
1790     slen += STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure (caps, i));
1791   }
1792
1793   s = g_string_sized_new (slen);
1794   for (i = 0; i < caps->structs->len; i++) {
1795     GstStructure *structure;
1796
1797     if (i > 0) {
1798       /* ';' is now added by gst_structure_to_string */
1799       g_string_append_c (s, ' ');
1800     }
1801
1802     structure = gst_caps_get_structure (caps, i);
1803     priv_gst_structure_append_to_gstring (structure, s);
1804   }
1805   if (s->len && s->str[s->len - 1] == ';') {
1806     /* remove latest ';' */
1807     s->str[--s->len] = '\0';
1808   }
1809   return g_string_free (s, FALSE);
1810 }
1811
1812 static gboolean
1813 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
1814 {
1815   GstStructure *structure;
1816   gchar *s;
1817
1818   g_return_val_if_fail (string, FALSE);
1819   if (strcmp ("ANY", string) == 0) {
1820     caps->flags = GST_CAPS_FLAGS_ANY;
1821     return TRUE;
1822   }
1823   if (strcmp ("EMPTY", string) == 0) {
1824     return TRUE;
1825   }
1826
1827   structure = gst_structure_from_string (string, &s);
1828   if (structure == NULL) {
1829     return FALSE;
1830   }
1831   gst_caps_append_structure (caps, structure);
1832
1833   do {
1834
1835     while (g_ascii_isspace (*s))
1836       s++;
1837     if (*s == '\0') {
1838       break;
1839     }
1840     structure = gst_structure_from_string (s, &s);
1841     if (structure == NULL) {
1842       return FALSE;
1843     }
1844     gst_caps_append_structure (caps, structure);
1845
1846   } while (TRUE);
1847
1848   return TRUE;
1849 }
1850
1851 /**
1852  * gst_caps_from_string:
1853  * @string: a string to convert to #GstCaps
1854  *
1855  * Converts @caps from a string representation.
1856  *
1857  * Returns: a newly allocated #GstCaps
1858  */
1859 GstCaps *
1860 gst_caps_from_string (const gchar * string)
1861 {
1862   GstCaps *caps;
1863
1864   caps = gst_caps_new_empty ();
1865   if (gst_caps_from_string_inplace (caps, string)) {
1866     return caps;
1867   } else {
1868     gst_caps_unref (caps);
1869     return NULL;
1870   }
1871 }
1872
1873 static void
1874 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
1875 {
1876   g_return_if_fail (G_IS_VALUE (src_value));
1877   g_return_if_fail (G_IS_VALUE (dest_value));
1878   g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
1879   g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
1880       || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
1881
1882   dest_value->data[0].v_pointer =
1883       gst_caps_to_string (src_value->data[0].v_pointer);
1884 }
1885
1886 static GstCaps *
1887 gst_caps_copy_conditional (GstCaps * src)
1888 {
1889   if (src) {
1890     return gst_caps_ref (src);
1891   } else {
1892     return NULL;
1893   }
1894 }