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