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