2 * Copyright (C) <2003> David A. Schleef <ds@schleef.org>
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.
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.
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.
22 * @short_description: Structure describing sets of media formats
23 * @see_also: #GstStructure
25 * Caps (capabilities) are lighweight refcounted objects describing media types.
26 * They are composed of an array of #GstStructure.
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.
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.
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.
40 * A #GstCaps can be constructed with the following code fragment:
43 * <title>Creating caps</title>
46 * caps = gst_caps_new_simple ("video/x-raw",
47 * "format", G_TYPE_STRING, "I420",
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,
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.
60 * Various methods exist to work with the media types such as subtracting
63 * Last reviewed on 2007-02-13 (0.10.10)
72 #include "gst_private.h"
74 #include <gobject/gvaluecollector.h>
76 #define DEBUG_REFCOUNT
78 typedef struct _GstCapsImpl
85 #define GST_CAPS_ARRAY(c) (((GstCapsImpl *)(c))->array)
87 #define GST_CAPS_LEN(c) (GST_CAPS_ARRAY(c)->len)
89 #define IS_WRITABLE(caps) \
90 (GST_CAPS_REFCOUNT_VALUE (caps) == 1)
92 /* same as gst_caps_is_any () */
93 #define CAPS_IS_ANY(caps) \
94 (GST_CAPS_FLAGS(caps) & GST_CAPS_FLAG_ANY)
96 /* same as gst_caps_is_empty () */
97 #define CAPS_IS_EMPTY(caps) \
98 (!CAPS_IS_ANY(caps) && CAPS_IS_EMPTY_SIMPLE(caps))
100 #define CAPS_IS_EMPTY_SIMPLE(caps) \
101 ((GST_CAPS_ARRAY (caps) == NULL) || (GST_CAPS_LEN (caps) == 0))
103 /* quick way to get a caps structure at an index without doing a type or array
105 #define gst_caps_get_structure_unchecked(caps, index) \
106 ((GstStructure *)g_ptr_array_index (GST_CAPS_ARRAY (caps), (index)))
107 /* quick way to append a structure without checking the args */
108 #define gst_caps_append_structure_unchecked(caps, structure) G_STMT_START{\
109 GstStructure *__s=structure; \
110 if (gst_structure_set_parent_refcount (__s, &GST_MINI_OBJECT_REFCOUNT(caps))) \
111 g_ptr_array_add (GST_CAPS_ARRAY (caps), __s); \
114 /* lock to protect multiple invocations of static caps to caps conversion */
115 G_LOCK_DEFINE_STATIC (static_caps_lock);
117 static void gst_caps_transform_to_string (const GValue * src_value,
118 GValue * dest_value);
119 static gboolean gst_caps_from_string_inplace (GstCaps * caps,
120 const gchar * string);
122 GType _gst_caps_type = 0;
123 GstCaps *_gst_caps_any;
124 GstCaps *_gst_caps_none;
126 GST_DEFINE_MINI_OBJECT_TYPE (GstCaps, gst_caps);
129 _priv_gst_caps_initialize (void)
131 _gst_caps_type = gst_caps_get_type ();
133 _gst_caps_any = gst_caps_new_any ();
134 _gst_caps_none = gst_caps_new_empty ();
136 g_value_register_transform_func (_gst_caps_type,
137 G_TYPE_STRING, gst_caps_transform_to_string);
141 _gst_caps_copy (const GstCaps * caps)
144 GstStructure *structure;
147 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
149 newcaps = gst_caps_new_empty ();
150 GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
151 n = GST_CAPS_LEN (caps);
153 GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, caps, "doing copy %p -> %p",
156 for (i = 0; i < n; i++) {
157 structure = gst_caps_get_structure_unchecked (caps, i);
158 gst_caps_append_structure (newcaps, gst_structure_copy (structure));
164 /* creation/deletion */
166 _gst_caps_free (GstCaps * caps)
168 GstStructure *structure;
171 /* The refcount must be 0, but since we're only called by gst_caps_unref,
172 * don't bother testing. */
173 len = GST_CAPS_LEN (caps);
174 /* This can be used to get statistics about caps sizes */
175 /*GST_CAT_INFO (GST_CAT_CAPS, "caps size: %d", len); */
176 for (i = 0; i < len; i++) {
177 structure = (GstStructure *) gst_caps_get_structure_unchecked (caps, i);
178 gst_structure_set_parent_refcount (structure, NULL);
179 gst_structure_free (structure);
181 g_ptr_array_free (GST_CAPS_ARRAY (caps), TRUE);
183 #ifdef DEBUG_REFCOUNT
184 GST_CAT_LOG (GST_CAT_CAPS, "freeing caps %p", caps);
186 g_slice_free1 (GST_MINI_OBJECT_SIZE (caps), caps);
190 gst_caps_init (GstCaps * caps, gsize size)
192 gst_mini_object_init (GST_MINI_OBJECT_CAST (caps), _gst_caps_type, size);
194 caps->mini_object.copy = (GstMiniObjectCopyFunction) _gst_caps_copy;
195 caps->mini_object.dispose = NULL;
196 caps->mini_object.free = (GstMiniObjectFreeFunction) _gst_caps_free;
198 /* the 32 has been determined by logging caps sizes in _gst_caps_free
199 * but g_ptr_array uses 16 anyway if it expands once, so this does not help
201 * GST_CAPS_ARRAY (caps) = g_ptr_array_sized_new (32);
203 GST_CAPS_ARRAY (caps) = g_ptr_array_new ();
207 * gst_caps_new_empty:
209 * Creates a new #GstCaps that is empty. That is, the returned
210 * #GstCaps contains no media formats.
211 * The #GstCaps is guaranteed to be writable.
212 * Caller is responsible for unreffing the returned caps.
214 * Returns: (transfer full): the new #GstCaps
217 gst_caps_new_empty (void)
221 caps = (GstCaps *) g_slice_new (GstCapsImpl);
223 gst_caps_init (caps, sizeof (GstCapsImpl));
225 #ifdef DEBUG_REFCOUNT
226 GST_CAT_TRACE (GST_CAT_CAPS, "created caps %p", caps);
235 * Creates a new #GstCaps that indicates that it is compatible with
238 * Returns: (transfer full): the new #GstCaps
241 gst_caps_new_any (void)
243 GstCaps *caps = gst_caps_new_empty ();
245 GST_CAPS_FLAG_SET (caps, GST_CAPS_FLAG_ANY);
251 * gst_caps_new_empty_simple:
252 * @media_type: the media type of the structure
254 * Creates a new #GstCaps that contains one #GstStructure with name
256 * Caller is responsible for unreffing the returned caps.
258 * Returns: (transfer full): the new #GstCaps
261 gst_caps_new_empty_simple (const char *media_type)
264 GstStructure *structure;
266 caps = gst_caps_new_empty ();
267 structure = gst_structure_new_empty (media_type);
269 gst_caps_append_structure_unchecked (caps, structure);
275 * gst_caps_new_simple:
276 * @media_type: the media type of the structure
277 * @fieldname: first field to set
278 * @...: additional arguments
280 * Creates a new #GstCaps that contains one #GstStructure. The
281 * structure is defined by the arguments, which have the same format
282 * as gst_structure_new().
283 * Caller is responsible for unreffing the returned caps.
285 * Returns: (transfer full): the new #GstCaps
288 gst_caps_new_simple (const char *media_type, const char *fieldname, ...)
291 GstStructure *structure;
294 caps = gst_caps_new_empty ();
296 va_start (var_args, fieldname);
297 structure = gst_structure_new_valist (media_type, fieldname, var_args);
301 gst_caps_append_structure_unchecked (caps, structure);
303 gst_caps_replace (&caps, NULL);
310 * @struct1: the first structure to add
311 * @...: additional structures to add
313 * Creates a new #GstCaps and adds all the structures listed as
314 * arguments. The list must be NULL-terminated. The structures
315 * are not copied; the returned #GstCaps owns the structures.
317 * Returns: (transfer full): the new #GstCaps
320 gst_caps_new_full (GstStructure * struct1, ...)
325 va_start (var_args, struct1);
326 caps = gst_caps_new_full_valist (struct1, var_args);
333 * gst_caps_new_full_valist:
334 * @structure: the first structure to add
335 * @var_args: additional structures to add
337 * Creates a new #GstCaps and adds all the structures listed as
338 * arguments. The list must be NULL-terminated. The structures
339 * are not copied; the returned #GstCaps owns the structures.
341 * Returns: (transfer full): the new #GstCaps
344 gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
348 caps = gst_caps_new_empty ();
351 gst_caps_append_structure_unchecked (caps, structure);
352 structure = va_arg (var_args, GstStructure *);
358 G_DEFINE_POINTER_TYPE (GstStaticCaps, gst_static_caps);
361 * gst_static_caps_get:
362 * @static_caps: the #GstStaticCaps to convert
364 * Converts a #GstStaticCaps to a #GstCaps.
366 * Returns: (transfer full): a pointer to the #GstCaps. Unref after usage.
367 * Since the core holds an additional ref to the returned caps,
368 * use gst_caps_make_writable() on the returned caps to modify it.
371 gst_static_caps_get (GstStaticCaps * static_caps)
375 g_return_val_if_fail (static_caps != NULL, NULL);
377 caps = &static_caps->caps;
379 /* refcount is 0 when we need to convert */
380 if (G_UNLIKELY (*caps == NULL)) {
383 G_LOCK (static_caps_lock);
384 /* check if other thread already updated */
385 if (G_UNLIKELY (*caps != NULL))
388 string = static_caps->string;
390 if (G_UNLIKELY (string == NULL))
393 *caps = gst_caps_from_string (string);
395 /* convert to string */
396 if (G_UNLIKELY (*caps == NULL))
397 g_critical ("Could not convert static caps \"%s\"", string);
399 GST_CAT_TRACE (GST_CAT_CAPS, "created %p from string %s", static_caps,
402 G_UNLOCK (static_caps_lock);
404 /* ref the caps, makes it not writable */
405 if (G_LIKELY (*caps != NULL))
406 gst_caps_ref (*caps);
413 G_UNLOCK (static_caps_lock);
414 g_warning ("static caps %p string is NULL", static_caps);
420 * gst_static_caps_cleanup:
421 * @static_caps: the #GstStaticCaps to clean
423 * Clean up the cached caps contained in @static_caps.
426 gst_static_caps_cleanup (GstStaticCaps * static_caps)
428 G_LOCK (static_caps_lock);
429 gst_caps_replace (&static_caps->caps, NULL);
430 G_UNLOCK (static_caps_lock);
435 static GstStructure *
436 gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
438 /* don't use index_fast, gst_caps_simplify relies on the order */
439 GstStructure *s = g_ptr_array_remove_index (GST_CAPS_ARRAY (caps), idx);
441 gst_structure_set_parent_refcount (s, NULL);
446 * gst_caps_steal_structure:
447 * @caps: the #GstCaps to retrieve from
448 * @index: Index of the structure to retrieve
450 * Retrieves the stucture with the given index from the list of structures
451 * contained in @caps. The caller becomes the owner of the returned structure.
453 * Returns: (transfer full): a pointer to the #GstStructure corresponding
459 gst_caps_steal_structure (GstCaps * caps, guint index)
461 g_return_val_if_fail (caps != NULL, NULL);
462 g_return_val_if_fail (IS_WRITABLE (caps), NULL);
464 if (G_UNLIKELY (index >= GST_CAPS_LEN (caps)))
467 return gst_caps_remove_and_get_structure (caps, index);
472 * @caps1: the #GstCaps that will be appended to
473 * @caps2: (transfer full): the #GstCaps to append
475 * Appends the structures contained in @caps2 to @caps1. The structures in
476 * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
477 * freed. If either caps is ANY, the resulting caps will be ANY.
480 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
482 GstStructure *structure;
485 g_return_if_fail (GST_IS_CAPS (caps1));
486 g_return_if_fail (GST_IS_CAPS (caps2));
487 g_return_if_fail (IS_WRITABLE (caps1));
489 if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))) {
490 GST_CAPS_FLAGS (caps1) |= GST_CAPS_FLAG_ANY;
491 gst_caps_unref (caps2);
493 caps2 = gst_caps_make_writable (caps2);
495 for (i = GST_CAPS_LEN (caps2); i; i--) {
496 structure = gst_caps_remove_and_get_structure (caps2, 0);
497 gst_caps_append_structure_unchecked (caps1, structure);
499 gst_caps_unref (caps2); /* guaranteed to free it */
505 * @caps1: (transfer full): the #GstCaps that will take the new entries
506 * @caps2: (transfer full): the #GstCaps to merge in
508 * Appends the structures contained in @caps2 to @caps1 if they are not yet
509 * expressed by @caps1. The structures in @caps2 are not copied -- they are
510 * transferred to a writable copy of @caps1, and then @caps2 is freed.
511 * If either caps is ANY, the resulting caps will be ANY.
513 * Returns: (transfer full): the merged caps.
518 gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
520 GstStructure *structure;
524 g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
525 g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
527 if (G_UNLIKELY (CAPS_IS_ANY (caps1))) {
528 gst_caps_unref (caps2);
530 } else if (G_UNLIKELY (CAPS_IS_ANY (caps2))) {
531 gst_caps_unref (caps1);
534 caps2 = gst_caps_make_writable (caps2);
536 for (i = GST_CAPS_LEN (caps2); i; i--) {
537 structure = gst_caps_remove_and_get_structure (caps2, 0);
538 caps1 = gst_caps_merge_structure (caps1, structure);
540 gst_caps_unref (caps2);
544 GstCaps *com = gst_caps_intersect (caps1, caps2);
545 GstCaps *add = gst_caps_subtract (caps2, com);
547 GST_DEBUG ("common : %d", gst_caps_get_size (com));
548 GST_DEBUG ("adding : %d", gst_caps_get_size (add));
549 gst_caps_append (caps1, add);
550 gst_caps_unref (com);
558 * gst_caps_append_structure:
559 * @caps: the #GstCaps that will be appended to
560 * @structure: (transfer full): the #GstStructure to append
562 * Appends @structure to @caps. The structure is not copied; @caps
563 * becomes the owner of @structure.
566 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
568 g_return_if_fail (GST_IS_CAPS (caps));
569 g_return_if_fail (IS_WRITABLE (caps));
571 if (G_LIKELY (structure)) {
572 gst_caps_append_structure_unchecked (caps, structure);
577 * gst_caps_remove_structure:
578 * @caps: the #GstCaps to remove from
579 * @idx: Index of the structure to remove
581 * removes the stucture with the given index from the list of structures
582 * contained in @caps.
585 gst_caps_remove_structure (GstCaps * caps, guint idx)
587 GstStructure *structure;
589 g_return_if_fail (caps != NULL);
590 g_return_if_fail (idx <= gst_caps_get_size (caps));
591 g_return_if_fail (IS_WRITABLE (caps));
593 structure = gst_caps_remove_and_get_structure (caps, idx);
594 gst_structure_free (structure);
598 * gst_caps_merge_structure:
599 * @caps: (transfer full): the #GstCaps to merge into
600 * @structure: (transfer full): the #GstStructure to merge
602 * Appends @structure to @caps if its not already expressed by @caps.
604 * Returns: (transfer full): the merged caps.
607 gst_caps_merge_structure (GstCaps * caps, GstStructure * structure)
609 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
611 if (G_LIKELY (structure)) {
612 GstStructure *structure1;
614 gboolean unique = TRUE;
616 /* check each structure */
617 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
618 structure1 = gst_caps_get_structure_unchecked (caps, i);
619 /* if structure is a subset of structure1, then skip it */
620 if (gst_structure_is_subset (structure, structure1)) {
626 caps = gst_caps_make_writable (caps);
627 gst_caps_append_structure_unchecked (caps, structure);
629 gst_structure_free (structure);
639 * Gets the number of structures contained in @caps.
641 * Returns: the number of structures that @caps contains
644 gst_caps_get_size (const GstCaps * caps)
646 g_return_val_if_fail (GST_IS_CAPS (caps), 0);
648 return GST_CAPS_LEN (caps);
652 * gst_caps_get_structure:
654 * @index: the index of the structure
656 * Finds the structure in @caps that has the index @index, and
659 * WARNING: This function takes a const GstCaps *, but returns a
660 * non-const GstStructure *. This is for programming convenience --
661 * the caller should be aware that structures inside a constant
662 * #GstCaps should not be modified. However, if you know the caps
663 * are writable, either because you have just copied them or made
664 * them writable with gst_caps_make_writable(), you may modify the
665 * structure returned in the usual way, e.g. with functions like
666 * gst_structure_set().
668 * You do not need to free or unref the structure returned, it
669 * belongs to the #GstCaps.
671 * Returns: (transfer none): a pointer to the #GstStructure corresponding
675 gst_caps_get_structure (const GstCaps * caps, guint index)
677 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
678 g_return_val_if_fail (index < GST_CAPS_LEN (caps), NULL);
680 return gst_caps_get_structure_unchecked (caps, index);
685 * @caps: the #GstCaps to copy
686 * @nth: the nth structure to copy
688 * Creates a new #GstCaps and appends a copy of the nth structure
689 * contained in @caps.
691 * Returns: (transfer full): the new #GstCaps
694 gst_caps_copy_nth (const GstCaps * caps, guint nth)
697 GstStructure *structure;
699 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
701 newcaps = gst_caps_new_empty ();
702 GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
704 if (G_LIKELY (GST_CAPS_LEN (caps) > nth)) {
705 structure = gst_caps_get_structure_unchecked (caps, nth);
706 gst_caps_append_structure_unchecked (newcaps,
707 gst_structure_copy (structure));
715 * @caps: (transfer full): the #GstCaps to truncate
717 * Discard all but the first structure from @caps. Useful when
720 * Returns: (transfer full): truncated caps
723 gst_caps_truncate (GstCaps * caps)
727 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
729 i = GST_CAPS_LEN (caps) - 1;
733 caps = gst_caps_make_writable (caps);
735 gst_caps_remove_structure (caps, i--);
741 * gst_caps_set_value:
742 * @caps: a writable caps
743 * @field: name of the field to set
744 * @value: value to set the field to
746 * Sets the given @field on all structures of @caps to the given @value.
747 * This is a convenience function for calling gst_structure_set_value() on
748 * all structures of @caps.
753 gst_caps_set_value (GstCaps * caps, const char *field, const GValue * value)
757 g_return_if_fail (GST_IS_CAPS (caps));
758 g_return_if_fail (IS_WRITABLE (caps));
759 g_return_if_fail (field != NULL);
760 g_return_if_fail (G_IS_VALUE (value));
762 len = GST_CAPS_LEN (caps);
763 for (i = 0; i < len; i++) {
764 GstStructure *structure = gst_caps_get_structure_unchecked (caps, i);
765 gst_structure_set_value (structure, field, value);
770 * gst_caps_set_simple_valist:
771 * @caps: the #GstCaps to set
772 * @field: first field to set
773 * @varargs: additional parameters
775 * Sets fields in a #GstCaps. The arguments must be passed in the same
776 * manner as gst_structure_set(), and be NULL-terminated.
777 * <note>Prior to GStreamer version 0.10.26, this function failed when
778 * @caps was not simple. If your code needs to work with those versions
779 * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
780 * is %TRUE for @caps.</note>
783 gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs)
785 GValue value = { 0, };
787 g_return_if_fail (GST_IS_CAPS (caps));
788 g_return_if_fail (IS_WRITABLE (caps));
794 type = va_arg (varargs, GType);
796 G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
797 if (G_UNLIKELY (err)) {
798 g_critical ("%s", err);
802 gst_caps_set_value (caps, field, &value);
804 g_value_unset (&value);
806 field = va_arg (varargs, const gchar *);
811 * gst_caps_set_simple:
812 * @caps: the #GstCaps to set
813 * @field: first field to set
814 * @...: additional parameters
816 * Sets fields in a #GstCaps. The arguments must be passed in the same
817 * manner as gst_structure_set(), and be NULL-terminated.
818 * <note>Prior to GStreamer version 0.10.26, this function failed when
819 * @caps was not simple. If your code needs to work with those versions
820 * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
821 * is %TRUE for @caps.</note>
824 gst_caps_set_simple (GstCaps * caps, const char *field, ...)
828 g_return_if_fail (GST_IS_CAPS (caps));
829 g_return_if_fail (IS_WRITABLE (caps));
831 va_start (var_args, field);
832 gst_caps_set_simple_valist (caps, field, var_args);
840 * @caps: the #GstCaps to test
842 * Determines if @caps represents any media format.
844 * Returns: TRUE if @caps represents any format.
847 gst_caps_is_any (const GstCaps * caps)
849 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
851 return (CAPS_IS_ANY (caps));
856 * @caps: the #GstCaps to test
858 * Determines if @caps represents no media formats.
860 * Returns: TRUE if @caps represents no formats.
863 gst_caps_is_empty (const GstCaps * caps)
865 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
867 if (CAPS_IS_ANY (caps))
870 return CAPS_IS_EMPTY_SIMPLE (caps);
874 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
877 return gst_value_is_fixed (value);
882 * @caps: the #GstCaps to test
884 * Fixed #GstCaps describe exactly one format, that is, they have exactly
885 * one structure, and each field in the structure describes a fixed type.
886 * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
888 * Returns: TRUE if @caps is fixed
891 gst_caps_is_fixed (const GstCaps * caps)
893 GstStructure *structure;
895 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
897 if (GST_CAPS_LEN (caps) != 1)
900 structure = gst_caps_get_structure_unchecked (caps, 0);
902 return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
906 * gst_caps_is_equal_fixed:
907 * @caps1: the #GstCaps to test
908 * @caps2: the #GstCaps to test
910 * Tests if two #GstCaps are equal. This function only works on fixed
913 * Returns: TRUE if the arguments represent the same format
916 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
918 GstStructure *struct1, *struct2;
920 g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
921 g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
923 struct1 = gst_caps_get_structure_unchecked (caps1, 0);
924 struct2 = gst_caps_get_structure_unchecked (caps2, 0);
926 return gst_structure_is_equal (struct1, struct2);
930 * gst_caps_is_always_compatible:
931 * @caps1: the #GstCaps to test
932 * @caps2: the #GstCaps to test
934 * A given #GstCaps structure is always compatible with another if
935 * every media format that is in the first is also contained in the
936 * second. That is, @caps1 is a subset of @caps2.
938 * Returns: TRUE if @caps1 is a subset of @caps2.
941 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
943 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
944 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
946 return gst_caps_is_subset (caps1, caps2);
950 * gst_caps_is_subset:
951 * @subset: a #GstCaps
952 * @superset: a potentially greater #GstCaps
954 * Checks if all caps represented by @subset are also represented by @superset.
955 * <note>This function does not work reliably if optional properties for caps
956 * are included on one caps and omitted on the other.</note>
958 * Returns: %TRUE if @subset is a subset of @superset
961 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
963 GstStructure *s1, *s2;
967 g_return_val_if_fail (subset != NULL, FALSE);
968 g_return_val_if_fail (superset != NULL, FALSE);
970 if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
972 if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
975 for (i = GST_CAPS_LEN (subset) - 1; i >= 0; i--) {
976 for (j = GST_CAPS_LEN (superset) - 1; j >= 0; j--) {
977 s1 = gst_caps_get_structure_unchecked (subset, i);
978 s2 = gst_caps_get_structure_unchecked (superset, j);
979 if (gst_structure_is_subset (s1, s2)) {
980 /* If we found a superset, continue with the next
981 * subset structure */
985 /* If we found no superset for this subset structure
986 * we return FALSE immediately */
997 * gst_caps_is_subset_structure:
999 * @structure: a potential #GstStructure subset of @caps
1001 * Checks if @structure is a subset of @caps. See gst_caps_is_subset()
1002 * for more information.
1004 * Returns: %TRUE if @structure is a subset of @caps
1009 gst_caps_is_subset_structure (const GstCaps * caps,
1010 const GstStructure * structure)
1015 g_return_val_if_fail (caps != NULL, FALSE);
1016 g_return_val_if_fail (structure != NULL, FALSE);
1018 if (CAPS_IS_ANY (caps))
1020 if (CAPS_IS_EMPTY (caps))
1023 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
1024 s = gst_caps_get_structure_unchecked (caps, i);
1025 if (gst_structure_is_subset (structure, s)) {
1026 /* If we found a superset return TRUE */
1035 * gst_caps_is_equal:
1036 * @caps1: a #GstCaps
1037 * @caps2: another #GstCaps
1039 * Checks if the given caps represent the same set of caps.
1040 * <note>This function does not work reliably if optional properties for caps
1041 * are included on one caps and omitted on the other.</note>
1043 * This function deals correctly with passing NULL for any of the caps.
1045 * Returns: TRUE if both caps are equal.
1048 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
1050 /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
1051 * So there should be an assertion that caps1 and caps2 != NULL */
1053 /* NULL <-> NULL is allowed here */
1054 if (G_UNLIKELY (caps1 == caps2))
1057 /* one of them NULL => they are different (can't be both NULL because
1058 * we checked that above) */
1059 if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
1062 if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
1063 return gst_caps_is_equal_fixed (caps1, caps2);
1065 return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1069 * gst_caps_is_strictly_equal:
1070 * @caps1: a #GstCaps
1071 * @caps2: another #GstCaps
1073 * Checks if the given caps are exactly the same set of caps.
1075 * This function deals correctly with passing NULL for any of the caps.
1077 * Returns: TRUE if both caps are strictly equal.
1082 gst_caps_is_strictly_equal (const GstCaps * caps1, const GstCaps * caps2)
1085 /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
1086 * So there should be an assertion that caps1 and caps2 != NULL */
1088 /* NULL <-> NULL is allowed here */
1089 if (G_UNLIKELY (caps1 == caps2))
1092 /* one of them NULL => they are different (can't be both NULL because
1093 * we checked that above) */
1094 if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
1097 if (GST_CAPS_LEN (caps1) != GST_CAPS_LEN (caps2))
1100 for (i = 0; i < GST_CAPS_LEN (caps1); i++) {
1101 if (!gst_structure_is_equal (gst_caps_get_structure_unchecked (caps1, i),
1102 gst_caps_get_structure_unchecked (caps2, i)))
1109 /* intersect operation */
1112 * gst_caps_can_intersect:
1113 * @caps1: a #GstCaps to intersect
1114 * @caps2: a #GstCaps to intersect
1116 * Tries intersecting @caps1 and @caps2 and reports whether the result would not
1119 * Returns: %TRUE if intersection would be not empty
1124 gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
1126 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1127 guint j, k, len1, len2;
1128 GstStructure *struct1;
1129 GstStructure *struct2;
1131 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1132 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1134 /* caps are exactly the same pointers */
1135 if (G_UNLIKELY (caps1 == caps2))
1138 /* empty caps on either side, return empty */
1139 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1142 /* one of the caps is any */
1143 if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
1146 /* run zigzag on top line then right line, this preserves the caps order
1147 * much better than a simple loop.
1149 * This algorithm zigzags over the caps structures as demonstrated in
1150 * the folowing matrix:
1153 * +------------- total distance: +-------------
1154 * | 1 2 4 7 0 | 0 1 2 3
1155 * caps2 | 3 5 8 10 1 | 1 2 3 4
1156 * | 6 9 11 12 2 | 2 3 4 5
1158 * First we iterate over the caps1 structures (top line) intersecting
1159 * the structures diagonally down, then we iterate over the caps2
1160 * structures. The result is that the intersections are ordered based on the
1161 * sum of the indexes in the list.
1163 len1 = GST_CAPS_LEN (caps1);
1164 len2 = GST_CAPS_LEN (caps2);
1165 for (i = 0; i < len1 + len2 - 1; i++) {
1166 /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */
1167 j = MIN (i, len1 - 1);
1168 /* subset index stays 0 until i reaches superset->structs->len, then it
1169 * counts up from 1 to subset->structs->len - 1 */
1170 k = (i > j) ? (i - j) : 0; /* MAX (0, i - j) */
1172 /* now run the diagonal line, end condition is the left or bottom
1175 struct1 = gst_caps_get_structure_unchecked (caps1, j);
1176 struct2 = gst_caps_get_structure_unchecked (caps2, k);
1178 if (gst_structure_can_intersect (struct1, struct2)) {
1181 /* move down left */
1183 if (G_UNLIKELY (j == 0))
1184 break; /* so we don't roll back to G_MAXUINT */
1192 gst_caps_intersect_zig_zag (GstCaps * caps1, GstCaps * caps2)
1194 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1195 guint j, k, len1, len2;
1197 GstStructure *struct1;
1198 GstStructure *struct2;
1200 GstStructure *istruct;
1202 /* caps are exactly the same pointers, just copy one caps */
1203 if (G_UNLIKELY (caps1 == caps2))
1204 return gst_caps_ref (caps1);
1206 /* empty caps on either side, return empty */
1207 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1208 return gst_caps_ref (GST_CAPS_NONE);
1210 /* one of the caps is any, just copy the other caps */
1211 if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1212 return gst_caps_ref (caps2);
1213 if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1214 return gst_caps_ref (caps1);
1216 dest = gst_caps_new_empty ();
1218 /* run zigzag on top line then right line, this preserves the caps order
1219 * much better than a simple loop.
1221 * This algorithm zigzags over the caps structures as demonstrated in
1222 * the folowing matrix:
1230 * First we iterate over the caps1 structures (top line) intersecting
1231 * the structures diagonally down, then we iterate over the caps2
1234 len1 = GST_CAPS_LEN (caps1);
1235 len2 = GST_CAPS_LEN (caps2);
1236 for (i = 0; i < len1 + len2 - 1; i++) {
1237 /* caps1 index goes from 0 to GST_CAPS_LEN (caps1)-1 */
1238 j = MIN (i, len1 - 1);
1239 /* caps2 index stays 0 until i reaches GST_CAPS_LEN (caps1), then it counts
1240 * up from 1 to GST_CAPS_LEN (caps2) - 1 */
1241 k = (i > j) ? (i - j) : 0; /* MAX (0, i - j) */
1243 /* now run the diagonal line, end condition is the left or bottom
1246 struct1 = gst_caps_get_structure_unchecked (caps1, j);
1247 struct2 = gst_caps_get_structure_unchecked (caps2, k);
1249 istruct = gst_structure_intersect (struct1, struct2);
1251 dest = gst_caps_merge_structure (dest, istruct);
1252 /* move down left */
1254 if (G_UNLIKELY (j == 0))
1255 break; /* so we don't roll back to G_MAXUINT */
1263 * gst_caps_intersect_first:
1264 * @caps1: a #GstCaps to intersect
1265 * @caps2: a #GstCaps to intersect
1267 * Creates a new #GstCaps that contains all the formats that are common
1268 * to both @caps1 and @caps2.
1270 * Unlike @gst_caps_intersect, the returned caps will be ordered in a similar
1271 * fashion as @caps1.
1273 * Returns: the new #GstCaps
1276 gst_caps_intersect_first (GstCaps * caps1, GstCaps * caps2)
1279 guint j, len1, len2;
1281 GstStructure *struct1;
1282 GstStructure *struct2;
1284 GstStructure *istruct;
1286 /* caps are exactly the same pointers, just copy one caps */
1287 if (G_UNLIKELY (caps1 == caps2))
1288 return gst_caps_ref (caps1);
1290 /* empty caps on either side, return empty */
1291 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1292 return gst_caps_ref (GST_CAPS_NONE);
1294 /* one of the caps is any, just copy the other caps */
1295 if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1296 return gst_caps_ref (caps2);
1297 if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1298 return gst_caps_ref (caps1);
1300 dest = gst_caps_new_empty ();
1302 len1 = GST_CAPS_LEN (caps1);
1303 len2 = GST_CAPS_LEN (caps2);
1304 for (i = 0; i < len1; i++) {
1305 struct1 = gst_caps_get_structure_unchecked (caps1, i);
1306 for (j = 0; j < len2; j++) {
1307 struct2 = gst_caps_get_structure_unchecked (caps2, j);
1308 istruct = gst_structure_intersect (struct1, struct2);
1310 dest = gst_caps_merge_structure (dest, istruct);
1318 * gst_caps_intersect_full:
1319 * @caps1: a #GstCaps to intersect
1320 * @caps2: a #GstCaps to intersect
1321 * @mode: The intersection algorithm/mode to use
1323 * Creates a new #GstCaps that contains all the formats that are common
1324 * to both @caps1 and @caps2, the order is defined by the #GstCapsIntersectMode
1327 * Returns: the new #GstCaps
1331 gst_caps_intersect_full (GstCaps * caps1, GstCaps * caps2,
1332 GstCapsIntersectMode mode)
1334 g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1335 g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1338 case GST_CAPS_INTERSECT_FIRST:
1339 return gst_caps_intersect_first (caps1, caps2);
1341 g_warning ("Unknown caps intersect mode: %d", mode);
1343 case GST_CAPS_INTERSECT_ZIG_ZAG:
1344 return gst_caps_intersect_zig_zag (caps1, caps2);
1349 * gst_caps_intersect:
1350 * @caps1: a #GstCaps to intersect
1351 * @caps2: a #GstCaps to intersect
1353 * Creates a new #GstCaps that contains all the formats that are common
1354 * to both @caps1 and @caps2. Defaults to %GST_CAPS_INTERSECT_ZIG_ZAG mode.
1356 * Returns: the new #GstCaps
1359 gst_caps_intersect (GstCaps * caps1, GstCaps * caps2)
1361 return gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_ZIG_ZAG);
1365 /* subtract operation */
1369 const GstStructure *subtract_from;
1375 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1378 SubtractionEntry *e = user_data;
1379 GValue subtraction = { 0, };
1380 const GValue *other;
1381 GstStructure *structure;
1383 other = gst_structure_id_get_value (e->subtract_from, field_id);
1387 if (!gst_value_subtract (&subtraction, other, value))
1389 if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1390 g_value_unset (&subtraction);
1393 structure = gst_structure_copy (e->subtract_from);
1394 gst_structure_id_set_value (structure, field_id, &subtraction);
1395 g_value_unset (&subtraction);
1396 e->put_into = g_slist_prepend (e->put_into, structure);
1402 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1403 const GstStructure * subtrahend)
1408 e.subtract_from = minuend;
1411 ret = gst_structure_foreach ((GstStructure *) subtrahend,
1412 gst_caps_structure_subtract_field, &e);
1418 for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1419 gst_structure_free (walk->data);
1421 g_slist_free (e.put_into);
1427 * gst_caps_subtract:
1428 * @minuend: #GstCaps to subtract from
1429 * @subtrahend: #GstCaps to subtract
1431 * Subtracts the @subtrahend from the @minuend.
1432 * <note>This function does not work reliably if optional properties for caps
1433 * are included on one caps and omitted on the other.</note>
1435 * Returns: the resulting caps
1438 gst_caps_subtract (GstCaps * minuend, GstCaps * subtrahend)
1443 GstCaps *dest = NULL, *src;
1445 g_return_val_if_fail (minuend != NULL, NULL);
1446 g_return_val_if_fail (subtrahend != NULL, NULL);
1448 if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
1449 return gst_caps_new_empty ();
1451 if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
1452 return gst_caps_ref (minuend);
1454 /* FIXME: Do we want this here or above?
1455 The reason we need this is that there is no definition about what
1456 ANY means for specific types, so it's not possible to reduce ANY partially
1457 You can only remove everything or nothing and that is done above.
1458 Note: there's a test that checks this behaviour. */
1459 g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
1460 sublen = GST_CAPS_LEN (subtrahend);
1461 g_assert (sublen > 0);
1463 src = _gst_caps_copy (minuend);
1464 for (i = 0; i < sublen; i++) {
1467 sub = gst_caps_get_structure_unchecked (subtrahend, i);
1469 gst_caps_unref (src);
1472 dest = gst_caps_new_empty ();
1473 srclen = GST_CAPS_LEN (src);
1474 for (j = 0; j < srclen; j++) {
1475 min = gst_caps_get_structure_unchecked (src, j);
1476 if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1479 if (gst_caps_structure_subtract (&list, min, sub)) {
1482 for (walk = list; walk; walk = g_slist_next (walk)) {
1483 gst_caps_append_structure_unchecked (dest,
1484 (GstStructure *) walk->data);
1486 g_slist_free (list);
1488 gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1491 gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1494 if (CAPS_IS_EMPTY_SIMPLE (dest)) {
1495 gst_caps_unref (src);
1500 gst_caps_unref (src);
1501 dest = gst_caps_simplify (dest);
1505 /* union operation */
1508 static GstStructure *
1509 gst_caps_structure_union (const GstStructure * struct1,
1510 const GstStructure * struct2)
1514 const GstStructureField *field1;
1515 const GstStructureField *field2;
1518 /* FIXME this doesn't actually work */
1520 if (struct1->name != struct2->name)
1523 dest = gst_structure_new_id_empty (struct1->name);
1525 for (i = 0; i < struct1->fields->len; i++) {
1526 GValue dest_value = { 0 };
1528 field1 = GST_STRUCTURE_FIELD (struct1, i);
1529 field2 = gst_structure_id_get_field (struct2, field1->name);
1531 if (field2 == NULL) {
1534 if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1535 gst_structure_set_value (dest, g_quark_to_string (field1->name),
1538 ret = gst_value_compare (&field1->value, &field2->value);
1549 * @caps1: a #GstCaps to union
1550 * @caps2: a #GstCaps to union
1552 * Creates a new #GstCaps that contains all the formats that are in
1553 * either @caps1 and @caps2.
1555 * Returns: the new #GstCaps
1558 gst_caps_union (GstCaps * caps1, GstCaps * caps2)
1562 /* NULL pointers are no correct GstCaps */
1563 g_return_val_if_fail (caps1 != NULL, NULL);
1564 g_return_val_if_fail (caps2 != NULL, NULL);
1566 if (CAPS_IS_EMPTY (caps1))
1567 return gst_caps_ref (caps2);
1569 if (CAPS_IS_EMPTY (caps2))
1570 return gst_caps_ref (caps1);
1572 if (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))
1573 return gst_caps_ref (caps1);
1575 dest1 = _gst_caps_copy (caps1);
1576 gst_caps_append (dest1, gst_caps_ref (caps2));
1578 dest1 = gst_caps_simplify (dest1);
1582 /* normalize/simplify operations */
1584 typedef struct _NormalizeForeach
1587 GstStructure *structure;
1592 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1594 NormalizeForeach *nf = (NormalizeForeach *) ptr;
1598 if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1599 guint len = gst_value_list_get_size (value);
1600 for (i = 1; i < len; i++) {
1601 const GValue *v = gst_value_list_get_value (value, i);
1602 GstStructure *structure = gst_structure_copy (nf->structure);
1604 gst_structure_id_set_value (structure, field_id, v);
1605 gst_caps_append_structure_unchecked (nf->caps, structure);
1608 gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1609 gst_structure_id_set_value (nf->structure, field_id, &val);
1610 g_value_unset (&val);
1618 * gst_caps_normalize:
1619 * @caps: a #GstCaps to normalize
1621 * Creates a new #GstCaps that represents the same set of formats as
1622 * @caps, but contains no lists. Each list is expanded into separate
1625 * Returns: the new #GstCaps
1628 gst_caps_normalize (GstCaps * caps)
1630 NormalizeForeach nf;
1634 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1636 newcaps = _gst_caps_copy (caps);
1639 for (i = 0; i < gst_caps_get_size (newcaps); i++) {
1640 nf.structure = gst_caps_get_structure_unchecked (newcaps, i);
1642 while (!gst_structure_foreach (nf.structure,
1643 gst_caps_normalize_foreach, &nf));
1650 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1653 const GstStructure *struct1 = *((const GstStructure **) one);
1654 const GstStructure *struct2 = *((const GstStructure **) two);
1656 /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1657 So what's the best way? */
1658 ret = strcmp (gst_structure_get_name (struct1),
1659 gst_structure_get_name (struct2));
1663 return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1670 GstStructure *compare;
1675 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1678 UnionField *u = user_data;
1679 const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1683 g_value_unset (&u->value);
1686 if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1689 g_value_unset (&u->value);
1693 gst_value_union (&u->value, val, value);
1698 gst_caps_structure_simplify (GstStructure ** result,
1699 const GstStructure * simplify, GstStructure * compare)
1702 UnionField field = { 0, {0,}, NULL };
1704 /* try to subtract to get a real subset */
1705 if (gst_caps_structure_subtract (&list, simplify, compare)) {
1706 if (list == NULL) { /* no result */
1709 } else if (list->next == NULL) { /* one result */
1710 *result = list->data;
1711 g_slist_free (list);
1713 } else { /* multiple results */
1714 g_slist_foreach (list, (GFunc) gst_structure_free, NULL);
1715 g_slist_free (list);
1720 /* try to union both structs */
1721 field.compare = compare;
1722 if (gst_structure_foreach ((GstStructure *) simplify,
1723 gst_caps_structure_figure_out_union, &field)) {
1724 gboolean ret = FALSE;
1726 /* now we know all of simplify's fields are the same in compare
1727 * but at most one field: field.name */
1728 if (G_IS_VALUE (&field.value)) {
1729 if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1730 gst_structure_id_set_value (compare, field.name, &field.value);
1734 g_value_unset (&field.value);
1735 } else if (gst_structure_n_fields (simplify) <=
1736 gst_structure_n_fields (compare)) {
1737 /* compare is just more specific, will be optimized away later */
1738 /* FIXME: do this here? */
1739 GST_LOG ("found a case that will be optimized later.");
1741 gchar *one = gst_structure_to_string (simplify);
1742 gchar *two = gst_structure_to_string (compare);
1745 ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1757 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1758 GstStructure * new, gint i)
1760 gst_structure_set_parent_refcount (old, NULL);
1761 gst_structure_free (old);
1762 gst_structure_set_parent_refcount (new, &GST_CAPS_REFCOUNT (caps));
1763 g_ptr_array_index (GST_CAPS_ARRAY (caps), i) = new;
1767 * gst_caps_simplify:
1768 * @caps: (transfer full): a #GstCaps to simplify
1770 * Modifies the given @caps inplace into a representation that represents the
1771 * same set of formats, but in a simpler form. Component structures that are
1772 * identical are merged. Component structures that have values that can be
1773 * merged are also merged.
1775 * Returns: The simplified caps.
1778 gst_caps_simplify (GstCaps * caps)
1780 GstStructure *simplify, *compare, *result = NULL;
1783 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1785 if (gst_caps_is_fixed (caps))
1788 caps = gst_caps_make_writable (caps);
1790 g_ptr_array_sort (GST_CAPS_ARRAY (caps), gst_caps_compare_structures);
1792 start = GST_CAPS_LEN (caps) - 1;
1793 for (i = start; i >= 0; i--) {
1794 simplify = gst_caps_get_structure_unchecked (caps, i);
1795 compare = gst_caps_get_structure_unchecked (caps, start);
1796 if (gst_structure_get_name_id (simplify) !=
1797 gst_structure_get_name_id (compare))
1799 for (j = start; j >= 0; j--) {
1802 compare = gst_caps_get_structure_unchecked (caps, j);
1803 if (gst_structure_get_name_id (simplify) !=
1804 gst_structure_get_name_id (compare)) {
1807 if (gst_caps_structure_simplify (&result, simplify, compare)) {
1809 gst_caps_switch_structures (caps, simplify, result, i);
1812 gst_caps_remove_structure (caps, i);
1824 * @caps: (transfer full): a #GstCaps to fixate
1826 * Modifies the given @caps into a representation with only fixed
1827 * values. First the caps will be truncated and then the first structure will be
1828 * fixated with gst_structure_fixate().
1830 * Returns: (transfer full): the fixated caps
1833 gst_caps_fixate (GstCaps * caps)
1837 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1839 /* default fixation */
1840 caps = gst_caps_truncate (caps);
1841 caps = gst_caps_make_writable (caps);
1842 s = gst_caps_get_structure (caps, 0);
1843 gst_structure_fixate (s);
1851 * gst_caps_to_string:
1854 * Converts @caps to a string representation. This string representation
1855 * can be converted back to a #GstCaps by gst_caps_from_string().
1857 * For debugging purposes its easier to do something like this:
1859 * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
1861 * This prints the caps in human readble form.
1863 * Returns: (transfer full): a newly allocated string representing @caps.
1866 gst_caps_to_string (const GstCaps * caps)
1868 guint i, slen, clen;
1871 /* NOTE: This function is potentially called by the debug system,
1872 * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
1873 * should be careful to avoid recursion. This includes any functions
1874 * called by gst_caps_to_string. In particular, calls should
1875 * not use the GST_PTR_FORMAT extension. */
1878 return g_strdup ("NULL");
1880 if (CAPS_IS_ANY (caps)) {
1881 return g_strdup ("ANY");
1883 if (CAPS_IS_EMPTY_SIMPLE (caps)) {
1884 return g_strdup ("EMPTY");
1887 /* estimate a rough string length to avoid unnecessary reallocs in GString */
1889 clen = GST_CAPS_LEN (caps);
1890 for (i = 0; i < clen; i++) {
1892 STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked (caps,
1896 s = g_string_sized_new (slen);
1897 for (i = 0; i < clen; i++) {
1898 GstStructure *structure;
1901 /* ';' is now added by gst_structure_to_string */
1902 g_string_append_c (s, ' ');
1905 structure = gst_caps_get_structure_unchecked (caps, i);
1906 priv_gst_structure_append_to_gstring (structure, s);
1908 if (s->len && s->str[s->len - 1] == ';') {
1909 /* remove latest ';' */
1910 s->str[--s->len] = '\0';
1912 return g_string_free (s, FALSE);
1916 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
1918 GstStructure *structure;
1921 if (strcmp ("ANY", string) == 0) {
1922 GST_CAPS_FLAGS (caps) = GST_CAPS_FLAG_ANY;
1925 if (strcmp ("EMPTY", string) == 0) {
1929 structure = gst_structure_from_string (string, &s);
1930 if (structure == NULL) {
1933 gst_caps_append_structure_unchecked (caps, structure);
1937 while (g_ascii_isspace (*s))
1942 structure = gst_structure_from_string (s, &s);
1943 if (structure == NULL) {
1946 gst_caps_append_structure_unchecked (caps, structure);
1954 * gst_caps_from_string:
1955 * @string: a string to convert to #GstCaps
1957 * Converts @caps from a string representation.
1959 * Returns: (transfer full): a newly allocated #GstCaps
1962 gst_caps_from_string (const gchar * string)
1966 g_return_val_if_fail (string, FALSE);
1968 caps = gst_caps_new_empty ();
1969 if (gst_caps_from_string_inplace (caps, string)) {
1972 gst_caps_unref (caps);
1978 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
1980 g_return_if_fail (G_IS_VALUE (src_value));
1981 g_return_if_fail (G_IS_VALUE (dest_value));
1982 g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
1983 g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
1984 || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
1986 g_value_take_string (dest_value,
1987 gst_caps_to_string (gst_value_get_caps (src_value)));