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