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 registry along with
30 * a description of the element.
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-yuv",
47 * "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
48 * "framerate", G_TYPE_DOUBLE, 25.0,
49 * "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
50 * "width", G_TYPE_INT, 320,
51 * "height", G_TYPE_INT, 240,
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 2005-11-23 (0.9.5)
72 #include "gst_private.h"
75 #define DEBUG_REFCOUNT
77 #define CAPS_POISON(caps) G_STMT_START{ \
79 GstCaps *_newcaps = gst_caps_copy (caps); \
80 gst_caps_unref(caps); \
84 #define STRUCTURE_POISON(structure) G_STMT_START{ \
86 GstStructure *_newstruct = gst_structure_copy (structure); \
87 gst_structure_free(structure); \
88 structure = _newstruct; \
91 #define IS_WRITABLE(caps) \
92 (g_atomic_int_get (&(caps)->refcount) == 1)
95 static void gst_caps_transform_to_string (const GValue * src_value,
97 static gboolean gst_caps_from_string_inplace (GstCaps * caps,
98 const gchar * string);
99 static GstCaps *gst_caps_copy_conditional (GstCaps * src);
102 gst_caps_get_type (void)
104 static GType gst_caps_type = 0;
106 if (!gst_caps_type) {
107 gst_caps_type = g_boxed_type_register_static ("GstCaps",
108 (GBoxedCopyFunc) gst_caps_copy_conditional,
109 (GBoxedFreeFunc) gst_caps_unref);
111 g_value_register_transform_func (gst_caps_type,
112 G_TYPE_STRING, gst_caps_transform_to_string);
115 return gst_caps_type;
118 /* creation/deletion */
121 * gst_caps_new_empty:
123 * Creates a new #GstCaps that is empty. That is, the returned
124 * #GstCaps contains no media formats.
125 * Caller is responsible for unreffing the returned caps.
127 * Returns: the new #GstCaps
130 gst_caps_new_empty (void)
132 GstCaps *caps = g_new0 (GstCaps, 1);
134 g_atomic_int_inc (&caps->refcount);
135 caps->type = GST_TYPE_CAPS;
136 caps->structs = g_ptr_array_new ();
138 #ifdef DEBUG_REFCOUNT
139 GST_CAT_LOG (GST_CAT_CAPS, "created caps %p", caps);
148 * Creates a new #GstCaps that indicates that it is compatible with
151 * Returns: the new #GstCaps
154 gst_caps_new_any (void)
156 GstCaps *caps = gst_caps_new_empty ();
158 caps->flags = GST_CAPS_FLAGS_ANY;
164 * gst_caps_new_simple:
165 * @media_type: the media type of the structure
166 * @fieldname: first field to set
167 * @...: additional arguments
169 * Creates a new #GstCaps that contains one #GstStructure. The
170 * structure is defined by the arguments, which have the same format
171 * as gst_structure_new().
172 * Caller is responsible for unreffing the returned caps.
174 * Returns: the new #GstCaps
177 gst_caps_new_simple (const char *media_type, const char *fieldname, ...)
180 GstStructure *structure;
183 caps = gst_caps_new_empty ();
185 va_start (var_args, fieldname);
186 structure = gst_structure_new_valist (media_type, fieldname, var_args);
189 gst_caps_append_structure (caps, structure);
196 * @struct1: the first structure to add
197 * @...: additional structures to add
199 * Creates a new #GstCaps and adds all the structures listed as
200 * arguments. The list must be NULL-terminated. The structures
201 * are not copied; the returned #GstCaps owns the structures.
203 * Returns: the new #GstCaps
206 gst_caps_new_full (GstStructure * struct1, ...)
211 va_start (var_args, struct1);
212 caps = gst_caps_new_full_valist (struct1, var_args);
219 * gst_caps_new_full_valist:
220 * @structure: the first structure to add
221 * @var_args: additional structures to add
223 * Creates a new #GstCaps and adds all the structures listed as
224 * arguments. The list must be NULL-terminated. The structures
225 * are not copied; the returned #GstCaps owns the structures.
227 * Returns: the new #GstCaps
230 gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
234 caps = gst_caps_new_empty ();
237 gst_caps_append_structure (caps, structure);
238 structure = va_arg (var_args, GstStructure *);
246 * @caps: the #GstCaps to copy
248 * Creates a new #GstCaps as a copy of the old @caps. The new caps will have a
249 * refcount of 1, owned by the caller. The structures are copied as well.
251 * Note that this function is the semantic equivalent of a gst_caps_ref()
252 * followed by a gst_caps_make_writable(). If you only want to hold on to a
253 * reference to the data, you should use gst_caps_ref().
255 * When you are finished with the caps, call gst_caps_unref() on it.
257 * Returns: the new #GstCaps
260 gst_caps_copy (const GstCaps * caps)
263 GstStructure *structure;
266 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
268 newcaps = gst_caps_new_empty ();
269 newcaps->flags = caps->flags;
271 for (i = 0; i < caps->structs->len; i++) {
272 structure = gst_caps_get_structure (caps, i);
273 gst_caps_append_structure (newcaps, gst_structure_copy (structure));
280 _gst_caps_free (GstCaps * caps)
282 GstStructure *structure;
285 /* The refcount must be 0, but since we're only called by gst_caps_unref,
286 * don't bother testing. */
288 for (i = 0; i < caps->structs->len; i++) {
289 structure = (GstStructure *) gst_caps_get_structure (caps, i);
290 gst_structure_set_parent_refcount (structure, NULL);
291 gst_structure_free (structure);
293 g_ptr_array_free (caps->structs, TRUE);
295 memset (caps, 0xff, sizeof (GstCaps));
301 * gst_caps_make_writable:
302 * @caps: the #GstCaps to make writable
304 * Returns a writable copy of @caps.
306 * If there is only one reference count on @caps, the caller must be the owner,
307 * and so this function will return the caps object unchanged. If on the other
308 * hand there is more than one reference on the object, a new caps object will
309 * be returned. The caller's reference on @caps will be removed, and instead the
310 * caller will own a reference to the returned object.
312 * In short, this function unrefs the caps in the argument and refs the caps
313 * that it returns. Don't access the argument after calling this function. See
314 * also: gst_caps_ref().
316 * Returns: the same #GstCaps object.
319 gst_caps_make_writable (GstCaps * caps)
323 g_return_val_if_fail (caps != NULL, NULL);
325 /* we are the only instance reffing this caps */
326 if (g_atomic_int_get (&caps->refcount) == 1)
330 copy = gst_caps_copy (caps);
331 gst_caps_unref (caps);
338 * @caps: the #GstCaps to reference
340 * Add a reference to a #GstCaps object.
342 * From this point on, until the caller calls gst_caps_unref() or
343 * gst_caps_make_writable(), it is guaranteed that the caps object will not
344 * change. This means its structures won't change, etc. To use a #GstCaps
345 * object, you must always have a refcount on it -- either the one made
346 * implicitly by gst_caps_new(), or via taking one explicitly with this
349 * Returns: the same #GstCaps object.
352 gst_caps_ref (GstCaps * caps)
354 g_return_val_if_fail (caps != NULL, NULL);
356 #ifdef DEBUG_REFCOUNT
357 GST_CAT_LOG (GST_CAT_CAPS, "%p %d->%d", caps,
358 GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) + 1);
360 g_return_val_if_fail (GST_CAPS_REFCOUNT_VALUE (caps) > 0, NULL);
362 g_atomic_int_inc (&caps->refcount);
369 * @caps: the #GstCaps to unref
371 * Unref a #GstCaps and and free all its structures and the
372 * structures' values when the refcount reaches 0.
375 gst_caps_unref (GstCaps * caps)
377 g_return_if_fail (caps != NULL);
379 #ifdef DEBUG_REFCOUNT
380 GST_CAT_LOG (GST_CAT_CAPS, "%p %d->%d", caps,
381 GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) - 1);
384 g_return_if_fail (GST_CAPS_REFCOUNT_VALUE (caps) > 0);
386 /* if we ended up with the refcount at zero, free the caps */
387 if (g_atomic_int_dec_and_test (&caps->refcount)) {
388 _gst_caps_free (caps);
393 gst_static_caps_get_type (void)
395 static GType staticcaps_type = 0;
397 if (!staticcaps_type) {
398 staticcaps_type = g_pointer_type_register_static ("GstStaticCaps");
400 return staticcaps_type;
405 * gst_static_caps_get:
406 * @static_caps: the #GstStaticCaps to convert
408 * Converts a #GstStaticCaps to a #GstCaps.
410 * Returns: A pointer to the #GstCaps. Unref after usage. Since the
411 * core holds an additional ref to the returned caps,
412 * use gst_caps_make_writable() on the returned caps to modify it.
415 gst_static_caps_get (GstStaticCaps * static_caps)
417 GstCaps *caps = (GstCaps *) static_caps;
420 if (caps->type == 0) {
421 if (static_caps->string == NULL) {
422 g_warning ("static caps is NULL");
426 caps->type = GST_TYPE_CAPS;
427 /* initialize the caps to a refcount of 1 so the caps can be writable... */
428 gst_atomic_int_set (&caps->refcount, 1);
429 caps->structs = g_ptr_array_new ();
430 ret = gst_caps_from_string_inplace (caps, static_caps->string);
433 g_critical ("Could not convert static caps \"%s\"", static_caps->string);
436 /* ref the caps, makes it not writable */
444 static GstStructure *
445 gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
447 /* don't use index_fast, gst_caps_simplify relies on the order */
448 GstStructure *s = g_ptr_array_remove_index (caps->structs, idx);
450 gst_structure_set_parent_refcount (s, NULL);
456 * @caps1: the #GstCaps that will be appended to
457 * @caps2: the #GstCaps to append
459 * Appends the structures contained in @caps2 to @caps1. The structures in
460 * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
461 * freed. If either caps is ANY, the resulting caps will be ANY.
464 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
466 GstStructure *structure;
469 g_return_if_fail (GST_IS_CAPS (caps1));
470 g_return_if_fail (GST_IS_CAPS (caps2));
471 g_return_if_fail (IS_WRITABLE (caps1));
472 g_return_if_fail (IS_WRITABLE (caps2));
477 if (gst_caps_is_any (caps1) || gst_caps_is_any (caps2)) {
478 /* FIXME: this leaks */
479 caps1->flags |= GST_CAPS_FLAGS_ANY;
480 for (i = caps2->structs->len - 1; i >= 0; i--) {
481 structure = gst_caps_remove_and_get_structure (caps2, i);
482 gst_structure_free (structure);
485 int len = caps2->structs->len;
487 for (i = 0; i < len; i++) {
488 structure = gst_caps_remove_and_get_structure (caps2, 0);
489 gst_caps_append_structure (caps1, structure);
492 gst_caps_unref (caps2); /* guaranteed to free it */
496 * gst_caps_append_structure:
497 * @caps: the #GstCaps that will be appended to
498 * @structure: the #GstStructure to append
500 * Appends @structure to @caps. The structure is not copied; @caps
501 * becomes the owner of @structure.
504 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
506 g_return_if_fail (GST_IS_CAPS (caps));
507 g_return_if_fail (IS_WRITABLE (caps));
510 g_return_if_fail (structure->parent_refcount == NULL);
513 STRUCTURE_POISON (structure);
516 gst_structure_set_parent_refcount (structure, &caps->refcount);
517 g_ptr_array_add (caps->structs, structure);
522 * gst_caps_remove_structure:
523 * @caps: the #GstCaps to remove from
524 * @idx: Index of the structure to remove
526 * removes the stucture with the given index from the list of structures
527 * contained in @caps.
530 gst_caps_remove_structure (GstCaps * caps, guint idx)
532 GstStructure *structure;
534 g_return_if_fail (caps != NULL);
535 g_return_if_fail (idx <= gst_caps_get_size (caps));
536 g_return_if_fail (IS_WRITABLE (caps));
538 structure = gst_caps_remove_and_get_structure (caps, idx);
539 gst_structure_free (structure);
543 * gst_caps_split_one:
546 * This function is not implemented.
551 gst_caps_split_one (GstCaps * caps)
554 g_critical ("unimplemented");
563 * Gets the number of structures contained in @caps.
565 * Returns: the number of structures that @caps contains
568 gst_caps_get_size (const GstCaps * caps)
570 g_return_val_if_fail (GST_IS_CAPS (caps), 0);
572 return caps->structs->len;
576 * gst_caps_get_structure:
578 * @index: the index of the structure
580 * Finds the structure in @caps that has the index @index, and
583 * WARNING: This function takes a const GstCaps *, but returns a
584 * non-const GstStructure *. This is for programming convenience --
585 * the caller should be aware that structures inside a constant
586 * #GstCaps should not be modified.
588 * Returns: a pointer to the #GstStructure corresponding to @index
591 gst_caps_get_structure (const GstCaps * caps, guint index)
593 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
594 g_return_val_if_fail (index >= 0, NULL);
595 g_return_val_if_fail (index < caps->structs->len, NULL);
597 return g_ptr_array_index (caps->structs, index);
602 * @caps: the #GstCaps to copy
603 * @nth: the nth structure to copy
605 * Creates a new #GstCaps and appends a copy of the nth structure
606 * contained in @caps.
608 * Returns: the new #GstCaps
611 gst_caps_copy_nth (const GstCaps * caps, guint nth)
614 GstStructure *structure;
616 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
618 newcaps = gst_caps_new_empty ();
619 newcaps->flags = caps->flags;
621 if (caps->structs->len > nth) {
622 structure = gst_caps_get_structure (caps, nth);
623 gst_caps_append_structure (newcaps, gst_structure_copy (structure));
631 * @caps: the #GstCaps to truncate
633 * Destructively discard all but the first structure from @caps. Useful when
634 * fixating. @caps must be writable.
637 gst_caps_truncate (GstCaps * caps)
641 g_return_if_fail (GST_IS_CAPS (caps));
642 g_return_if_fail (IS_WRITABLE (caps));
644 i = caps->structs->len - 1;
647 gst_caps_remove_structure (caps, i--);
651 * gst_caps_set_simple:
652 * @caps: the #GstCaps to set
653 * @field: first field to set
654 * @...: additional parameters
656 * Sets fields in a simple #GstCaps. A simple #GstCaps is one that
657 * only has one structure. The arguments must be passed in the same
658 * manner as gst_structure_set(), and be NULL-terminated.
661 gst_caps_set_simple (GstCaps * caps, char *field, ...)
663 GstStructure *structure;
666 g_return_if_fail (GST_IS_CAPS (caps));
667 g_return_if_fail (caps->structs->len == 1);
668 g_return_if_fail (IS_WRITABLE (caps));
670 structure = gst_caps_get_structure (caps, 0);
672 va_start (var_args, field);
673 gst_structure_set_valist (structure, field, var_args);
678 * gst_caps_set_simple_valist:
679 * @caps: the #GstCaps to copy
680 * @field: first field to set
681 * @varargs: additional parameters
683 * Sets fields in a simple #GstCaps. A simple #GstCaps is one that
684 * only has one structure. The arguments must be passed in the same
685 * manner as gst_structure_set(), and be NULL-terminated.
688 gst_caps_set_simple_valist (GstCaps * caps, char *field, va_list varargs)
690 GstStructure *structure;
692 g_return_if_fail (GST_IS_CAPS (caps));
693 g_return_if_fail (caps->structs->len != 1);
694 g_return_if_fail (IS_WRITABLE (caps));
696 structure = gst_caps_get_structure (caps, 0);
698 gst_structure_set_valist (structure, field, varargs);
705 * @caps: the #GstCaps to test
707 * Determines if @caps represents any media format.
709 * Returns: TRUE if @caps represents any format.
712 gst_caps_is_any (const GstCaps * caps)
714 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
716 return (caps->flags & GST_CAPS_FLAGS_ANY);
721 * @caps: the #GstCaps to test
723 * Determines if @caps represents no media formats.
725 * Returns: TRUE if @caps represents no formats.
728 gst_caps_is_empty (const GstCaps * caps)
730 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
732 if (caps->flags & GST_CAPS_FLAGS_ANY)
735 return (caps->structs == NULL) || (caps->structs->len == 0);
739 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
742 return gst_value_is_fixed (value);
747 * @caps: the #GstCaps to test
749 * Fixed #GstCaps describe exactly one format, that is, they have exactly
750 * one structure, and each field in the structure describes a fixed type.
751 * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
753 * Returns: TRUE if @caps is fixed
756 gst_caps_is_fixed (const GstCaps * caps)
758 GstStructure *structure;
760 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
762 if (caps->structs->len != 1)
765 structure = gst_caps_get_structure (caps, 0);
767 return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
771 gst_structure_is_equal_foreach (GQuark field_id, const GValue * val2,
774 GstStructure *struct1 = (GstStructure *) data;
775 const GValue *val1 = gst_structure_id_get_value (struct1, field_id);
779 if (gst_value_compare (val1, val2) == GST_VALUE_EQUAL) {
787 * gst_caps_is_equal_fixed:
788 * @caps1: the #GstCaps to test
789 * @caps2: the #GstCaps to test
791 * Tests if two #GstCaps are equal. This function only works on fixed
794 * Returns: TRUE if the arguments represent the same format
797 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
799 GstStructure *struct1, *struct2;
801 g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
802 g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
804 struct1 = gst_caps_get_structure (caps1, 0);
805 struct2 = gst_caps_get_structure (caps2, 0);
807 if (struct1->name != struct2->name) {
810 if (struct1->fields->len != struct2->fields->len) {
814 return gst_structure_foreach (struct1, gst_structure_is_equal_foreach,
819 * gst_caps_is_always_compatible:
820 * @caps1: the #GstCaps to test
821 * @caps2: the #GstCaps to test
823 * A given #GstCaps structure is always compatible with another if
824 * every media format that is in the first is also contained in the
825 * second. That is, @caps1 is a subset of @caps2.
827 * Returns: TRUE if @caps1 is a subset of @caps2.
830 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
832 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
833 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
835 return gst_caps_is_subset (caps1, caps2);
839 * gst_caps_is_subset:
840 * @subset: a #GstCaps
841 * @superset: a potentially greater #GstCaps
843 * Checks if all caps represented by @subset are also represented by @superset
844 * <note>This function does not work reliably if optional properties for caps
845 * are included on one caps and omitted on the other.</note>
847 * Returns: TRUE if @subset is a subset of @superset
850 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
855 g_return_val_if_fail (subset != NULL, FALSE);
856 g_return_val_if_fail (superset != NULL, FALSE);
858 if (gst_caps_is_empty (subset) || gst_caps_is_any (superset))
860 if (gst_caps_is_any (subset) || gst_caps_is_empty (superset))
863 caps = gst_caps_subtract (subset, superset);
864 ret = gst_caps_is_empty (caps);
865 gst_caps_unref (caps);
872 * @caps2: another #GstCaps
874 * Checks if the given caps represent the same set of caps.
875 * <note>This function does not work reliably if optional properties for caps
876 * are included on one caps and omitted on the other.</note>
878 * Returns: TRUE if both caps are equal
881 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
883 /* NULL <-> NULL is allowed here */
887 /* one of them NULL => they are different (can't be both NULL because
888 * we checked that above) */
889 if (caps1 == NULL || caps2 == NULL)
892 if (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2))
893 return gst_caps_is_equal_fixed (caps1, caps2);
895 return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
901 const GstStructure *intersect;
907 gst_caps_structure_intersect_field (GQuark id, const GValue * val1,
910 IntersectData *idata = (IntersectData *) data;
911 GValue dest_value = { 0 };
912 const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
915 gst_structure_id_set_value (idata->dest, id, val1);
916 } else if (idata->first_run) {
917 if (gst_value_intersect (&dest_value, val1, val2)) {
918 gst_structure_id_set_value (idata->dest, id, &dest_value);
919 g_value_unset (&dest_value);
928 static GstStructure *
929 gst_caps_structure_intersect (const GstStructure * struct1,
930 const GstStructure * struct2)
934 g_return_val_if_fail (struct1 != NULL, NULL);
935 g_return_val_if_fail (struct2 != NULL, NULL);
937 if (struct1->name != struct2->name)
940 data.dest = gst_structure_id_empty_new (struct1->name);
941 data.intersect = struct2;
942 data.first_run = TRUE;
943 if (!gst_structure_foreach ((GstStructure *) struct1,
944 gst_caps_structure_intersect_field, &data))
947 data.intersect = struct1;
948 data.first_run = FALSE;
949 if (!gst_structure_foreach ((GstStructure *) struct2,
950 gst_caps_structure_intersect_field, &data))
956 gst_structure_free (data.dest);
961 static GstStructure *
962 gst_caps_structure_union (const GstStructure * struct1,
963 const GstStructure * struct2)
967 const GstStructureField *field1;
968 const GstStructureField *field2;
971 /* FIXME this doesn't actually work */
973 if (struct1->name != struct2->name)
976 dest = gst_structure_id_empty_new (struct1->name);
978 for (i = 0; i < struct1->fields->len; i++) {
979 GValue dest_value = { 0 };
981 field1 = GST_STRUCTURE_FIELD (struct1, i);
982 field2 = gst_structure_id_get_field (struct2, field1->name);
984 if (field2 == NULL) {
987 if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
988 gst_structure_set_value (dest, g_quark_to_string (field1->name),
991 ret = gst_value_compare (&field1->value, &field2->value);
1003 * gst_caps_intersect:
1004 * @caps1: a #GstCaps to intersect
1005 * @caps2: a #GstCaps to intersect
1007 * Creates a new #GstCaps that contains all the formats that are common
1008 * to both @caps1 and @caps2.
1010 * Returns: the new #GstCaps
1013 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1015 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1018 GstStructure *struct1;
1019 GstStructure *struct2;
1021 GstStructure *istruct;
1023 g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1024 g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1026 if (gst_caps_is_empty (caps1) || gst_caps_is_empty (caps2)) {
1027 return gst_caps_new_empty ();
1029 if (gst_caps_is_any (caps1))
1030 return gst_caps_copy (caps2);
1031 if (gst_caps_is_any (caps2))
1032 return gst_caps_copy (caps1);
1034 dest = gst_caps_new_empty ();
1036 /* run zigzag on top line then right line, this preserves the caps order
1037 * much better than a simple loop.
1039 * This algorithm zigzags over the caps structures as demonstrated in
1040 * the folowing matrix:
1048 * First we iterate over the caps1 structures (top line) intersecting
1049 * the structures diagonally down, then we iterate over the caps2
1052 for (i = 0; i < caps1->structs->len + caps2->structs->len - 1; i++) {
1053 /* caps1 index goes from 0 to caps1->structs->len-1 */
1054 j = MIN (i, caps1->structs->len - 1);
1055 /* caps2 index stays 0 until i reaches caps1->structs->len, then it counts
1056 * up from 1 to caps2->structs->len - 1 */
1059 /* now run the diagonal line, end condition is the left or bottom
1061 while (k < caps2->structs->len) {
1062 struct1 = gst_caps_get_structure (caps1, j);
1063 struct2 = gst_caps_get_structure (caps2, k);
1065 istruct = gst_caps_structure_intersect (struct1, struct2);
1067 gst_caps_append_structure (dest, istruct);
1068 /* move down left */
1071 break; /* so we don't roll back to G_MAXUINT */
1080 const GstStructure *subtract_from;
1087 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1090 SubtractionEntry *e = user_data;
1091 GValue subtraction = { 0, };
1092 const GValue *other;
1093 GstStructure *structure;
1095 other = gst_structure_id_get_value (e->subtract_from, field_id);
1099 if (!gst_value_subtract (&subtraction, other, value))
1101 if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1102 g_value_unset (&subtraction);
1105 structure = gst_structure_copy (e->subtract_from);
1106 gst_structure_id_set_value (structure, field_id, &subtraction);
1107 g_value_unset (&subtraction);
1108 e->put_into = g_slist_prepend (e->put_into, structure);
1114 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1115 const GstStructure * subtrahend)
1120 e.subtract_from = minuend;
1123 ret = gst_structure_foreach ((GstStructure *) subtrahend,
1124 gst_caps_structure_subtract_field, &e);
1130 for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1131 gst_structure_free (walk->data);
1133 g_slist_free (e.put_into);
1139 * gst_caps_subtract:
1140 * @minuend: #GstCaps to substract from
1141 * @subtrahend: #GstCaps to substract
1143 * Subtracts the @subtrahend from the @minuend.
1144 * <note>This function does not work reliably if optional properties for caps
1145 * are included on one caps and omitted on the other.</note>
1147 * Returns: the resulting caps
1150 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1155 GstCaps *dest = NULL, *src;
1157 g_return_val_if_fail (minuend != NULL, NULL);
1158 g_return_val_if_fail (subtrahend != NULL, NULL);
1160 if (gst_caps_is_empty (minuend) || gst_caps_is_any (subtrahend)) {
1161 return gst_caps_new_empty ();
1163 if (gst_caps_is_empty (subtrahend))
1164 return gst_caps_copy (minuend);
1166 /* FIXME: Do we want this here or above?
1167 The reason we need this is that there is no definition about what
1168 ANY means for specific types, so it's not possible to reduce ANY partially
1169 You can only remove everything or nothing and that is done above.
1170 Note: there's a test that checks this behaviour. */
1171 g_return_val_if_fail (!gst_caps_is_any (minuend), NULL);
1172 g_assert (subtrahend->structs->len > 0);
1174 src = gst_caps_copy (minuend);
1175 for (i = 0; i < subtrahend->structs->len; i++) {
1176 sub = gst_caps_get_structure (subtrahend, i);
1178 gst_caps_unref (src);
1181 dest = gst_caps_new_empty ();
1182 for (j = 0; j < src->structs->len; j++) {
1183 min = gst_caps_get_structure (src, j);
1184 if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1187 if (gst_caps_structure_subtract (&list, min, sub)) {
1190 for (walk = list; walk; walk = g_slist_next (walk)) {
1191 gst_caps_append_structure (dest, (GstStructure *) walk->data);
1193 g_slist_free (list);
1195 gst_caps_append_structure (dest, gst_structure_copy (min));
1198 gst_caps_append_structure (dest, gst_structure_copy (min));
1201 if (gst_caps_is_empty (dest)) {
1202 gst_caps_unref (src);
1207 gst_caps_unref (src);
1208 gst_caps_do_simplify (dest);
1214 * @caps1: a #GstCaps to union
1215 * @caps2: a #GstCaps to union
1217 * Creates a new #GstCaps that contains all the formats that are in
1218 * either @caps1 and @caps2.
1220 * Returns: the new #GstCaps
1223 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1228 if (gst_caps_is_any (caps1) || gst_caps_is_any (caps2))
1229 return gst_caps_new_any ();
1231 dest1 = gst_caps_copy (caps1);
1232 dest2 = gst_caps_copy (caps2);
1233 gst_caps_append (dest1, dest2);
1235 gst_caps_do_simplify (dest1);
1239 typedef struct _NormalizeForeach
1242 GstStructure *structure;
1247 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1249 NormalizeForeach *nf = (NormalizeForeach *) ptr;
1253 if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1254 for (i = 1; i < gst_value_list_get_size (value); i++) {
1255 const GValue *v = gst_value_list_get_value (value, i);
1256 GstStructure *structure = gst_structure_copy (nf->structure);
1258 gst_structure_id_set_value (structure, field_id, v);
1259 gst_caps_append_structure (nf->caps, structure);
1262 gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1263 gst_structure_id_set_value (nf->structure, field_id, &val);
1264 g_value_unset (&val);
1272 * gst_caps_normalize:
1273 * @caps: a #GstCaps to normalize
1275 * Creates a new #GstCaps that represents the same set of formats as
1276 * @caps, but contains no lists. Each list is expanded into separate
1279 * Returns: the new #GstCaps
1282 gst_caps_normalize (const GstCaps * caps)
1284 NormalizeForeach nf;
1288 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1290 newcaps = gst_caps_copy (caps);
1293 for (i = 0; i < newcaps->structs->len; i++) {
1294 nf.structure = gst_caps_get_structure (newcaps, i);
1296 while (!gst_structure_foreach (nf.structure,
1297 gst_caps_normalize_foreach, &nf));
1304 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1307 const GstStructure *struct1 = *((const GstStructure **) one);
1308 const GstStructure *struct2 = *((const GstStructure **) two);
1310 /* FIXME: this orders aphabetically, but ordering the quarks might be faster
1311 So what's the best way? */
1312 ret = strcmp (gst_structure_get_name (struct1),
1313 gst_structure_get_name (struct2));
1317 return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1321 * gst_caps_simplify:
1322 * @caps: a #GstCaps to simplify
1324 * Creates a new #GstCaps that represents the same set of formats as
1325 * @caps, but simpler. Component structures that are identical are
1326 * merged. Component structures that have ranges or lists that can
1327 * be merged are also merged.
1329 * Returns: the new #GstCaps
1332 gst_caps_simplify (const GstCaps * caps)
1336 g_return_val_if_fail (caps != NULL, NULL);
1338 ret = gst_caps_copy (caps);
1339 gst_caps_do_simplify (ret);
1348 GstStructure *compare;
1353 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1356 UnionField *u = user_data;
1357 const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1361 g_value_unset (&u->value);
1364 if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1367 g_value_unset (&u->value);
1371 gst_value_union (&u->value, val, value);
1376 gst_caps_structure_simplify (GstStructure ** result,
1377 const GstStructure * simplify, GstStructure * compare)
1380 UnionField field = { 0, {0,}, NULL };
1382 /* try to subtract to get a real subset */
1383 if (gst_caps_structure_subtract (&list, simplify, compare)) {
1384 switch (g_slist_length (list)) {
1389 *result = list->data;
1390 g_slist_free (list);
1396 for (walk = list; walk; walk = g_slist_next (walk)) {
1397 gst_structure_free (walk->data);
1399 g_slist_free (list);
1405 /* try to union both structs */
1406 field.compare = compare;
1407 if (gst_structure_foreach ((GstStructure *) simplify,
1408 gst_caps_structure_figure_out_union, &field)) {
1409 gboolean ret = FALSE;
1411 /* now we know all of simplify's fields are the same in compare
1412 * but at most one field: field.name */
1413 if (G_IS_VALUE (&field.value)) {
1414 if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1415 gst_structure_id_set_value (compare, field.name, &field.value);
1419 g_value_unset (&field.value);
1420 } else if (gst_structure_n_fields (simplify) <=
1421 gst_structure_n_fields (compare)) {
1422 /* compare is just more specific, will be optimized away later */
1423 /* FIXME: do this here? */
1424 GST_LOG ("found a case that will be optimized later.");
1426 gchar *one = gst_structure_to_string (simplify);
1427 gchar *two = gst_structure_to_string (compare);
1430 ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1442 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1443 GstStructure * new, gint i)
1445 gst_structure_set_parent_refcount (old, NULL);
1446 gst_structure_free (old);
1447 gst_structure_set_parent_refcount (new, &caps->refcount);
1448 g_ptr_array_index (caps->structs, i) = new;
1452 * gst_caps_do_simplify:
1453 * @caps: a #GstCaps to simplify
1455 * Modifies the given @caps inplace into a representation that represents the
1456 * same set of formats, but in a simpler form. Component structures that are
1457 * identical are merged. Component structures that have values that can be
1458 * merged are also merged.
1460 * Returns: TRUE, if the caps could be simplified
1463 gst_caps_do_simplify (GstCaps * caps)
1465 GstStructure *simplify, *compare, *result = NULL;
1467 gboolean changed = FALSE;
1469 g_return_val_if_fail (caps != NULL, FALSE);
1470 g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1472 if (gst_caps_get_size (caps) < 2)
1475 g_ptr_array_sort (caps->structs, gst_caps_compare_structures);
1477 start = caps->structs->len - 1;
1478 for (i = caps->structs->len - 1; i >= 0; i--) {
1479 simplify = gst_caps_get_structure (caps, i);
1480 if (gst_structure_get_name_id (simplify) !=
1481 gst_structure_get_name_id (gst_caps_get_structure (caps, start)))
1483 for (j = start; j >= 0; j--) {
1486 compare = gst_caps_get_structure (caps, j);
1487 if (gst_structure_get_name_id (simplify) !=
1488 gst_structure_get_name_id (compare)) {
1491 if (gst_caps_structure_simplify (&result, simplify, compare)) {
1493 gst_caps_switch_structures (caps, simplify, result, i);
1496 gst_caps_remove_structure (caps, i);
1508 /* gst_caps_do_simplify (caps); */
1512 #ifndef GST_DISABLE_LOADSAVE
1514 * gst_caps_save_thyself:
1515 * @caps: a #GstCaps structure
1516 * @parent: a XML parent node
1518 * Serializes a #GstCaps to XML and adds it as a child node of @parent.
1520 * Returns: a XML node pointer
1523 gst_caps_save_thyself (const GstCaps * caps, xmlNodePtr parent)
1525 char *s = gst_caps_to_string (caps);
1527 xmlNewChild (parent, NULL, (xmlChar *) "caps", (xmlChar *) s);
1533 * gst_caps_load_thyself:
1534 * @parent: a XML node
1536 * Creates a #GstCaps from its XML serialization.
1538 * Returns: a new #GstCaps structure
1541 gst_caps_load_thyself (xmlNodePtr parent)
1543 if (strcmp ("caps", (char *) parent->name) == 0) {
1544 return gst_caps_from_string ((gchar *) xmlNodeGetContent (parent));
1555 * @caps: a pointer to #GstCaps
1556 * @newcaps: a #GstCaps to replace *caps
1558 * Replaces *caps with @newcaps. Unrefs the #GstCaps in the location
1559 * pointed to by @caps, if applicable, then modifies @caps to point to
1560 * @newcaps. An additional ref on @newcaps is taken.
1563 gst_caps_replace (GstCaps ** caps, GstCaps * newcaps)
1567 #if 0 /* disable this, since too many plugins rely on undefined behavior */
1568 #ifdef USE_POISONING
1569 //if (newcaps) CAPS_POISON (newcaps);
1575 gst_caps_ref (newcaps);
1580 gst_caps_unref (oldcaps);
1584 * gst_caps_to_string:
1587 * Converts @caps to a string representation. This string representation
1588 * can be converted back to a #GstCaps by #gst_caps_from_string.
1590 * Returns: a newly allocated string representing @caps.
1593 gst_caps_to_string (const GstCaps * caps)
1598 /* NOTE: This function is potentially called by the debug system,
1599 * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
1600 * should be careful to avoid recursion. This includes any functions
1601 * called by gst_caps_to_string. In particular, calls should
1602 * not use the GST_PTR_FORMAT extension. */
1605 return g_strdup ("NULL");
1607 if (gst_caps_is_any (caps)) {
1608 return g_strdup ("ANY");
1610 if (gst_caps_is_empty (caps)) {
1611 return g_strdup ("EMPTY");
1614 s = g_string_new ("");
1615 for (i = 0; i < caps->structs->len; i++) {
1616 GstStructure *structure;
1620 g_string_append (s, "; ");
1622 structure = gst_caps_get_structure (caps, i);
1623 sstr = gst_structure_to_string (structure);
1624 g_string_append (s, sstr);
1628 return g_string_free (s, FALSE);
1632 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
1634 GstStructure *structure;
1637 g_return_val_if_fail (string, FALSE);
1638 if (strcmp ("ANY", string) == 0) {
1639 caps->flags = GST_CAPS_FLAGS_ANY;
1642 if (strcmp ("EMPTY", string) == 0) {
1646 structure = gst_structure_from_string (string, &s);
1647 if (structure == NULL) {
1650 gst_caps_append_structure (caps, structure);
1654 while (g_ascii_isspace (*s))
1656 structure = gst_structure_from_string (s, &s);
1657 if (structure == NULL) {
1660 gst_caps_append_structure (caps, structure);
1661 while (g_ascii_isspace (*s))
1673 * gst_caps_from_string:
1674 * @string: a string to convert to #GstCaps
1676 * Converts @caps from a string representation.
1678 * Returns: a newly allocated #GstCaps
1681 gst_caps_from_string (const gchar * string)
1685 caps = gst_caps_new_empty ();
1686 if (gst_caps_from_string_inplace (caps, string)) {
1689 gst_caps_unref (caps);
1695 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
1697 g_return_if_fail (G_IS_VALUE (src_value));
1698 g_return_if_fail (G_IS_VALUE (dest_value));
1699 g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
1700 g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
1701 || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
1703 dest_value->data[0].v_pointer =
1704 gst_caps_to_string (src_value->data[0].v_pointer);
1708 gst_caps_copy_conditional (GstCaps * src)
1711 return gst_caps_ref (src);