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