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