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