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)
94 #if GLIB_CHECK_VERSION (2, 10, 0)
95 #define ALLOC_CAPS() g_slice_new (GstCaps)
96 #define FREE_CAPS(caps) g_slice_free (GstCaps, caps)
98 #define ALLOC_CAPS() g_new (GstCaps, 1)
99 #define FREE_CAPS(caps) g_free (caps)
102 static void gst_caps_transform_to_string (const GValue * src_value,
103 GValue * dest_value);
104 static gboolean gst_caps_from_string_inplace (GstCaps * caps,
105 const gchar * string);
106 static GstCaps *gst_caps_copy_conditional (GstCaps * src);
109 gst_caps_get_type (void)
111 static GType gst_caps_type = 0;
113 if (G_UNLIKELY (gst_caps_type == 0)) {
114 gst_caps_type = g_boxed_type_register_static ("GstCaps",
115 (GBoxedCopyFunc) gst_caps_copy_conditional,
116 (GBoxedFreeFunc) gst_caps_unref);
118 g_value_register_transform_func (gst_caps_type,
119 G_TYPE_STRING, gst_caps_transform_to_string);
122 return gst_caps_type;
125 /* creation/deletion */
128 * gst_caps_new_empty:
130 * Creates a new #GstCaps that is empty. That is, the returned
131 * #GstCaps contains no media formats.
132 * Caller is responsible for unreffing the returned caps.
134 * Returns: the new #GstCaps
137 gst_caps_new_empty (void)
139 GstCaps *caps = ALLOC_CAPS ();
141 caps->type = GST_TYPE_CAPS;
144 caps->structs = g_ptr_array_new ();
146 #ifdef DEBUG_REFCOUNT
147 GST_CAT_LOG (GST_CAT_CAPS, "created caps %p", caps);
156 * Creates a new #GstCaps that indicates that it is compatible with
159 * Returns: the new #GstCaps
162 gst_caps_new_any (void)
164 GstCaps *caps = gst_caps_new_empty ();
166 caps->flags = GST_CAPS_FLAGS_ANY;
172 * gst_caps_new_simple:
173 * @media_type: the media type of the structure
174 * @fieldname: first field to set
175 * @...: additional arguments
177 * Creates a new #GstCaps that contains one #GstStructure. The
178 * structure is defined by the arguments, which have the same format
179 * as gst_structure_new().
180 * Caller is responsible for unreffing the returned caps.
182 * Returns: the new #GstCaps
185 gst_caps_new_simple (const char *media_type, const char *fieldname, ...)
188 GstStructure *structure;
191 caps = gst_caps_new_empty ();
193 va_start (var_args, fieldname);
194 structure = gst_structure_new_valist (media_type, fieldname, var_args);
197 gst_caps_append_structure (caps, structure);
204 * @struct1: the first structure to add
205 * @...: additional structures to add
207 * Creates a new #GstCaps and adds all the structures listed as
208 * arguments. The list must be NULL-terminated. The structures
209 * are not copied; the returned #GstCaps owns the structures.
211 * Returns: the new #GstCaps
214 gst_caps_new_full (GstStructure * struct1, ...)
219 va_start (var_args, struct1);
220 caps = gst_caps_new_full_valist (struct1, var_args);
227 * gst_caps_new_full_valist:
228 * @structure: the first structure to add
229 * @var_args: additional structures to add
231 * Creates a new #GstCaps and adds all the structures listed as
232 * arguments. The list must be NULL-terminated. The structures
233 * are not copied; the returned #GstCaps owns the structures.
235 * Returns: the new #GstCaps
238 gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
242 caps = gst_caps_new_empty ();
245 gst_caps_append_structure (caps, structure);
246 structure = va_arg (var_args, GstStructure *);
254 * @caps: the #GstCaps to copy
256 * Creates a new #GstCaps as a copy of the old @caps. The new caps will have a
257 * refcount of 1, owned by the caller. The structures are copied as well.
259 * Note that this function is the semantic equivalent of a gst_caps_ref()
260 * followed by a gst_caps_make_writable(). If you only want to hold on to a
261 * reference to the data, you should use gst_caps_ref().
263 * When you are finished with the caps, call gst_caps_unref() on it.
265 * Returns: the new #GstCaps
268 gst_caps_copy (const GstCaps * caps)
271 GstStructure *structure;
274 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
276 newcaps = gst_caps_new_empty ();
277 newcaps->flags = caps->flags;
279 for (i = 0; i < caps->structs->len; i++) {
280 structure = gst_caps_get_structure (caps, i);
281 gst_caps_append_structure (newcaps, gst_structure_copy (structure));
288 _gst_caps_free (GstCaps * caps)
290 GstStructure *structure;
293 /* The refcount must be 0, but since we're only called by gst_caps_unref,
294 * don't bother testing. */
296 for (i = 0; i < caps->structs->len; i++) {
297 structure = (GstStructure *) gst_caps_get_structure (caps, i);
298 gst_structure_set_parent_refcount (structure, NULL);
299 gst_structure_free (structure);
301 g_ptr_array_free (caps->structs, TRUE);
303 memset (caps, 0xff, sizeof (GstCaps));
309 * gst_caps_make_writable:
310 * @caps: the #GstCaps to make writable
312 * Returns a writable copy of @caps.
314 * If there is only one reference count on @caps, the caller must be the owner,
315 * and so this function will return the caps object unchanged. If on the other
316 * hand there is more than one reference on the object, a new caps object will
317 * be returned. The caller's reference on @caps will be removed, and instead the
318 * caller will own a reference to the returned object.
320 * In short, this function unrefs the caps in the argument and refs the caps
321 * that it returns. Don't access the argument after calling this function. See
322 * also: gst_caps_ref().
324 * Returns: the same #GstCaps object.
327 gst_caps_make_writable (GstCaps * caps)
331 g_return_val_if_fail (caps != NULL, NULL);
333 /* we are the only instance reffing this caps */
334 if (g_atomic_int_get (&caps->refcount) == 1)
338 copy = gst_caps_copy (caps);
339 gst_caps_unref (caps);
346 * @caps: the #GstCaps to reference
348 * Add a reference to a #GstCaps object.
350 * From this point on, until the caller calls gst_caps_unref() or
351 * gst_caps_make_writable(), it is guaranteed that the caps object will not
352 * change. This means its structures won't change, etc. To use a #GstCaps
353 * object, you must always have a refcount on it -- either the one made
354 * implicitly by gst_caps_new(), or via taking one explicitly with this
357 * Returns: the same #GstCaps object.
360 gst_caps_ref (GstCaps * caps)
362 g_return_val_if_fail (caps != NULL, NULL);
364 #ifdef DEBUG_REFCOUNT
365 GST_CAT_LOG (GST_CAT_REFCOUNTING, "%p %d->%d", caps,
366 GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) + 1);
368 g_return_val_if_fail (GST_CAPS_REFCOUNT_VALUE (caps) > 0, NULL);
370 g_atomic_int_inc (&caps->refcount);
377 * @caps: the #GstCaps to unref
379 * Unref a #GstCaps and and free all its structures and the
380 * structures' values when the refcount reaches 0.
383 gst_caps_unref (GstCaps * caps)
385 g_return_if_fail (caps != NULL);
387 #ifdef DEBUG_REFCOUNT
388 GST_CAT_LOG (GST_CAT_REFCOUNTING, "%p %d->%d", caps,
389 GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) - 1);
392 g_return_if_fail (GST_CAPS_REFCOUNT_VALUE (caps) > 0);
394 /* if we ended up with the refcount at zero, free the caps */
395 if (G_UNLIKELY (g_atomic_int_dec_and_test (&caps->refcount)))
396 _gst_caps_free (caps);
400 gst_static_caps_get_type (void)
402 static GType staticcaps_type = 0;
404 if (G_UNLIKELY (staticcaps_type == 0)) {
405 staticcaps_type = g_pointer_type_register_static ("GstStaticCaps");
407 return staticcaps_type;
412 * gst_static_caps_get:
413 * @static_caps: the #GstStaticCaps to convert
415 * Converts a #GstStaticCaps to a #GstCaps.
417 * Returns: A pointer to the #GstCaps. Unref after usage. Since the
418 * core holds an additional ref to the returned caps,
419 * use gst_caps_make_writable() on the returned caps to modify it.
422 gst_static_caps_get (GstStaticCaps * static_caps)
426 g_return_val_if_fail (static_caps != NULL, NULL);
428 caps = (GstCaps *) static_caps;
430 if (caps->type == 0) {
431 if (G_UNLIKELY (static_caps->string == NULL))
434 caps->type = GST_TYPE_CAPS;
435 /* initialize the caps to a refcount of 1 so the caps can be writable... */
436 gst_atomic_int_set (&caps->refcount, 1);
437 caps->structs = g_ptr_array_new ();
439 /* convert to string */
440 if (G_UNLIKELY (!gst_caps_from_string_inplace (caps, static_caps->string)))
441 g_critical ("Could not convert static caps \"%s\"", static_caps->string);
443 /* ref the caps, makes it not writable */
451 g_warning ("static caps string is NULL");
457 static GstStructure *
458 gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
460 /* don't use index_fast, gst_caps_do_simplify relies on the order */
461 GstStructure *s = g_ptr_array_remove_index (caps->structs, idx);
463 gst_structure_set_parent_refcount (s, NULL);
469 * @caps1: the #GstCaps that will be appended to
470 * @caps2: the #GstCaps to append
472 * Appends the structures contained in @caps2 to @caps1. The structures in
473 * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
474 * freed. If either caps is ANY, the resulting caps will be ANY.
477 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
479 GstStructure *structure;
482 g_return_if_fail (GST_IS_CAPS (caps1));
483 g_return_if_fail (GST_IS_CAPS (caps2));
484 g_return_if_fail (IS_WRITABLE (caps1));
485 g_return_if_fail (IS_WRITABLE (caps2));
490 if (gst_caps_is_any (caps1) || gst_caps_is_any (caps2)) {
491 /* FIXME: this leaks */
492 caps1->flags |= GST_CAPS_FLAGS_ANY;
493 for (i = caps2->structs->len - 1; i >= 0; i--) {
494 structure = gst_caps_remove_and_get_structure (caps2, i);
495 gst_structure_free (structure);
498 int len = caps2->structs->len;
500 for (i = 0; i < len; i++) {
501 structure = gst_caps_remove_and_get_structure (caps2, 0);
502 gst_caps_append_structure (caps1, structure);
505 gst_caps_unref (caps2); /* guaranteed to free it */
509 * gst_caps_append_structure:
510 * @caps: the #GstCaps that will be appended to
511 * @structure: the #GstStructure to append
513 * Appends @structure to @caps. The structure is not copied; @caps
514 * becomes the owner of @structure.
517 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
519 g_return_if_fail (GST_IS_CAPS (caps));
520 g_return_if_fail (IS_WRITABLE (caps));
522 if (G_LIKELY (structure)) {
523 g_return_if_fail (structure->parent_refcount == NULL);
526 STRUCTURE_POISON (structure);
529 gst_structure_set_parent_refcount (structure, &caps->refcount);
530 g_ptr_array_add (caps->structs, structure);
535 * gst_caps_remove_structure:
536 * @caps: the #GstCaps to remove from
537 * @idx: Index of the structure to remove
539 * removes the stucture with the given index from the list of structures
540 * contained in @caps.
543 gst_caps_remove_structure (GstCaps * caps, guint idx)
545 GstStructure *structure;
547 g_return_if_fail (caps != NULL);
548 g_return_if_fail (idx <= gst_caps_get_size (caps));
549 g_return_if_fail (IS_WRITABLE (caps));
551 structure = gst_caps_remove_and_get_structure (caps, idx);
552 gst_structure_free (structure);
556 * gst_caps_split_one:
559 * This function is not implemented.
564 gst_caps_split_one (GstCaps * caps)
567 g_critical ("unimplemented");
576 * Gets the number of structures contained in @caps.
578 * Returns: the number of structures that @caps contains
581 gst_caps_get_size (const GstCaps * caps)
583 g_return_val_if_fail (GST_IS_CAPS (caps), 0);
585 return caps->structs->len;
589 * gst_caps_get_structure:
591 * @index: the index of the structure
593 * Finds the structure in @caps that has the index @index, and
596 * WARNING: This function takes a const GstCaps *, but returns a
597 * non-const GstStructure *. This is for programming convenience --
598 * the caller should be aware that structures inside a constant
599 * #GstCaps should not be modified.
601 * Returns: a pointer to the #GstStructure corresponding to @index
604 gst_caps_get_structure (const GstCaps * caps, guint index)
606 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
607 g_return_val_if_fail (index >= 0, NULL);
608 g_return_val_if_fail (index < caps->structs->len, NULL);
610 return g_ptr_array_index (caps->structs, index);
615 * @caps: the #GstCaps to copy
616 * @nth: the nth structure to copy
618 * Creates a new #GstCaps and appends a copy of the nth structure
619 * contained in @caps.
621 * Returns: the new #GstCaps
624 gst_caps_copy_nth (const GstCaps * caps, guint nth)
627 GstStructure *structure;
629 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
631 newcaps = gst_caps_new_empty ();
632 newcaps->flags = caps->flags;
634 if (caps->structs->len > nth) {
635 structure = gst_caps_get_structure (caps, nth);
636 gst_caps_append_structure (newcaps, gst_structure_copy (structure));
644 * @caps: the #GstCaps to truncate
646 * Destructively discard all but the first structure from @caps. Useful when
647 * fixating. @caps must be writable.
650 gst_caps_truncate (GstCaps * caps)
654 g_return_if_fail (GST_IS_CAPS (caps));
655 g_return_if_fail (IS_WRITABLE (caps));
657 i = caps->structs->len - 1;
660 gst_caps_remove_structure (caps, i--);
664 * gst_caps_set_simple:
665 * @caps: the #GstCaps to set
666 * @field: first field to set
667 * @...: additional parameters
669 * Sets fields in a simple #GstCaps. A simple #GstCaps is one that
670 * only has one structure. The arguments must be passed in the same
671 * manner as gst_structure_set(), and be NULL-terminated.
674 gst_caps_set_simple (GstCaps * caps, char *field, ...)
676 GstStructure *structure;
679 g_return_if_fail (GST_IS_CAPS (caps));
680 g_return_if_fail (caps->structs->len == 1);
681 g_return_if_fail (IS_WRITABLE (caps));
683 structure = gst_caps_get_structure (caps, 0);
685 va_start (var_args, field);
686 gst_structure_set_valist (structure, field, var_args);
691 * gst_caps_set_simple_valist:
692 * @caps: the #GstCaps to copy
693 * @field: first field to set
694 * @varargs: additional parameters
696 * Sets fields in a simple #GstCaps. A simple #GstCaps is one that
697 * only has one structure. The arguments must be passed in the same
698 * manner as gst_structure_set(), and be NULL-terminated.
701 gst_caps_set_simple_valist (GstCaps * caps, char *field, va_list varargs)
703 GstStructure *structure;
705 g_return_if_fail (GST_IS_CAPS (caps));
706 g_return_if_fail (caps->structs->len != 1);
707 g_return_if_fail (IS_WRITABLE (caps));
709 structure = gst_caps_get_structure (caps, 0);
711 gst_structure_set_valist (structure, field, varargs);
718 * @caps: the #GstCaps to test
720 * Determines if @caps represents any media format.
722 * Returns: TRUE if @caps represents any format.
725 gst_caps_is_any (const GstCaps * caps)
727 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
729 return (caps->flags & GST_CAPS_FLAGS_ANY);
734 * @caps: the #GstCaps to test
736 * Determines if @caps represents no media formats.
738 * Returns: TRUE if @caps represents no formats.
741 gst_caps_is_empty (const GstCaps * caps)
743 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
745 if (caps->flags & GST_CAPS_FLAGS_ANY)
748 return (caps->structs == NULL) || (caps->structs->len == 0);
752 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
755 return gst_value_is_fixed (value);
760 * @caps: the #GstCaps to test
762 * Fixed #GstCaps describe exactly one format, that is, they have exactly
763 * one structure, and each field in the structure describes a fixed type.
764 * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
766 * Returns: TRUE if @caps is fixed
769 gst_caps_is_fixed (const GstCaps * caps)
771 GstStructure *structure;
773 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
775 if (caps->structs->len != 1)
778 structure = gst_caps_get_structure (caps, 0);
780 return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
784 gst_structure_is_equal_foreach (GQuark field_id, const GValue * val2,
787 GstStructure *struct1 = (GstStructure *) data;
788 const GValue *val1 = gst_structure_id_get_value (struct1, field_id);
792 if (gst_value_compare (val1, val2) == GST_VALUE_EQUAL) {
800 * gst_caps_is_equal_fixed:
801 * @caps1: the #GstCaps to test
802 * @caps2: the #GstCaps to test
804 * Tests if two #GstCaps are equal. This function only works on fixed
807 * Returns: TRUE if the arguments represent the same format
810 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
812 GstStructure *struct1, *struct2;
814 g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
815 g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
817 struct1 = gst_caps_get_structure (caps1, 0);
818 struct2 = gst_caps_get_structure (caps2, 0);
820 if (struct1->name != struct2->name) {
823 if (struct1->fields->len != struct2->fields->len) {
827 return gst_structure_foreach (struct1, gst_structure_is_equal_foreach,
832 * gst_caps_is_always_compatible:
833 * @caps1: the #GstCaps to test
834 * @caps2: the #GstCaps to test
836 * A given #GstCaps structure is always compatible with another if
837 * every media format that is in the first is also contained in the
838 * second. That is, @caps1 is a subset of @caps2.
840 * Returns: TRUE if @caps1 is a subset of @caps2.
843 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
845 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
846 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
848 return gst_caps_is_subset (caps1, caps2);
852 * gst_caps_is_subset:
853 * @subset: a #GstCaps
854 * @superset: a potentially greater #GstCaps
856 * Checks if all caps represented by @subset are also represented by @superset
857 * <note>This function does not work reliably if optional properties for caps
858 * are included on one caps and omitted on the other.</note>
860 * Returns: TRUE if @subset is a subset of @superset
863 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
868 g_return_val_if_fail (subset != NULL, FALSE);
869 g_return_val_if_fail (superset != NULL, FALSE);
871 if (gst_caps_is_empty (subset) || gst_caps_is_any (superset))
873 if (gst_caps_is_any (subset) || gst_caps_is_empty (superset))
876 caps = gst_caps_subtract (subset, superset);
877 ret = gst_caps_is_empty (caps);
878 gst_caps_unref (caps);
885 * @caps2: another #GstCaps
887 * Checks if the given caps represent the same set of caps.
888 * <note>This function does not work reliably if optional properties for caps
889 * are included on one caps and omitted on the other.</note>
891 * This function deals correctly with passing NULL for any of the caps.
893 * Returns: TRUE if both caps are equal.
896 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
898 /* NULL <-> NULL is allowed here */
902 /* one of them NULL => they are different (can't be both NULL because
903 * we checked that above) */
904 if (caps1 == NULL || caps2 == NULL)
907 if (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2))
908 return gst_caps_is_equal_fixed (caps1, caps2);
910 return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
916 const GstStructure *intersect;
922 gst_caps_structure_intersect_field (GQuark id, const GValue * val1,
925 IntersectData *idata = (IntersectData *) data;
926 GValue dest_value = { 0 };
927 const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
930 gst_structure_id_set_value (idata->dest, id, val1);
931 } else if (idata->first_run) {
932 if (gst_value_intersect (&dest_value, val1, val2)) {
933 gst_structure_id_set_value (idata->dest, id, &dest_value);
934 g_value_unset (&dest_value);
943 static GstStructure *
944 gst_caps_structure_intersect (const GstStructure * struct1,
945 const GstStructure * struct2)
949 g_return_val_if_fail (struct1 != NULL, NULL);
950 g_return_val_if_fail (struct2 != NULL, NULL);
952 if (struct1->name != struct2->name)
955 data.dest = gst_structure_id_empty_new (struct1->name);
956 data.intersect = struct2;
957 data.first_run = TRUE;
958 if (!gst_structure_foreach ((GstStructure *) struct1,
959 gst_caps_structure_intersect_field, &data))
962 data.intersect = struct1;
963 data.first_run = FALSE;
964 if (!gst_structure_foreach ((GstStructure *) struct2,
965 gst_caps_structure_intersect_field, &data))
971 gst_structure_free (data.dest);
976 static GstStructure *
977 gst_caps_structure_union (const GstStructure * struct1,
978 const GstStructure * struct2)
982 const GstStructureField *field1;
983 const GstStructureField *field2;
986 /* FIXME this doesn't actually work */
988 if (struct1->name != struct2->name)
991 dest = gst_structure_id_empty_new (struct1->name);
993 for (i = 0; i < struct1->fields->len; i++) {
994 GValue dest_value = { 0 };
996 field1 = GST_STRUCTURE_FIELD (struct1, i);
997 field2 = gst_structure_id_get_field (struct2, field1->name);
999 if (field2 == NULL) {
1002 if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1003 gst_structure_set_value (dest, g_quark_to_string (field1->name),
1006 ret = gst_value_compare (&field1->value, &field2->value);
1018 * gst_caps_intersect:
1019 * @caps1: a #GstCaps to intersect
1020 * @caps2: a #GstCaps to intersect
1022 * Creates a new #GstCaps that contains all the formats that are common
1023 * to both @caps1 and @caps2.
1025 * Returns: the new #GstCaps
1028 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1030 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1033 GstStructure *struct1;
1034 GstStructure *struct2;
1036 GstStructure *istruct;
1038 g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1039 g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1041 if (gst_caps_is_empty (caps1) || gst_caps_is_empty (caps2)) {
1042 return gst_caps_new_empty ();
1044 if (gst_caps_is_any (caps1))
1045 return gst_caps_copy (caps2);
1046 if (gst_caps_is_any (caps2))
1047 return gst_caps_copy (caps1);
1049 dest = gst_caps_new_empty ();
1051 /* run zigzag on top line then right line, this preserves the caps order
1052 * much better than a simple loop.
1054 * This algorithm zigzags over the caps structures as demonstrated in
1055 * the folowing matrix:
1063 * First we iterate over the caps1 structures (top line) intersecting
1064 * the structures diagonally down, then we iterate over the caps2
1067 for (i = 0; i < caps1->structs->len + caps2->structs->len - 1; i++) {
1068 /* caps1 index goes from 0 to caps1->structs->len-1 */
1069 j = MIN (i, caps1->structs->len - 1);
1070 /* caps2 index stays 0 until i reaches caps1->structs->len, then it counts
1071 * up from 1 to caps2->structs->len - 1 */
1074 /* now run the diagonal line, end condition is the left or bottom
1076 while (k < caps2->structs->len) {
1077 struct1 = gst_caps_get_structure (caps1, j);
1078 struct2 = gst_caps_get_structure (caps2, k);
1080 istruct = gst_caps_structure_intersect (struct1, struct2);
1082 gst_caps_append_structure (dest, istruct);
1083 /* move down left */
1086 break; /* so we don't roll back to G_MAXUINT */
1095 const GstStructure *subtract_from;
1102 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1105 SubtractionEntry *e = user_data;
1106 GValue subtraction = { 0, };
1107 const GValue *other;
1108 GstStructure *structure;
1110 other = gst_structure_id_get_value (e->subtract_from, field_id);
1114 if (!gst_value_subtract (&subtraction, other, value))
1116 if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1117 g_value_unset (&subtraction);
1120 structure = gst_structure_copy (e->subtract_from);
1121 gst_structure_id_set_value (structure, field_id, &subtraction);
1122 g_value_unset (&subtraction);
1123 e->put_into = g_slist_prepend (e->put_into, structure);
1129 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1130 const GstStructure * subtrahend)
1135 e.subtract_from = minuend;
1138 ret = gst_structure_foreach ((GstStructure *) subtrahend,
1139 gst_caps_structure_subtract_field, &e);
1145 for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1146 gst_structure_free (walk->data);
1148 g_slist_free (e.put_into);
1154 * gst_caps_subtract:
1155 * @minuend: #GstCaps to substract from
1156 * @subtrahend: #GstCaps to substract
1158 * Subtracts the @subtrahend from the @minuend.
1159 * <note>This function does not work reliably if optional properties for caps
1160 * are included on one caps and omitted on the other.</note>
1162 * Returns: the resulting caps
1165 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1170 GstCaps *dest = NULL, *src;
1172 g_return_val_if_fail (minuend != NULL, NULL);
1173 g_return_val_if_fail (subtrahend != NULL, NULL);
1175 if (gst_caps_is_empty (minuend) || gst_caps_is_any (subtrahend)) {
1176 return gst_caps_new_empty ();
1178 if (gst_caps_is_empty (subtrahend))
1179 return gst_caps_copy (minuend);
1181 /* FIXME: Do we want this here or above?
1182 The reason we need this is that there is no definition about what
1183 ANY means for specific types, so it's not possible to reduce ANY partially
1184 You can only remove everything or nothing and that is done above.
1185 Note: there's a test that checks this behaviour. */
1186 g_return_val_if_fail (!gst_caps_is_any (minuend), NULL);
1187 g_assert (subtrahend->structs->len > 0);
1189 src = gst_caps_copy (minuend);
1190 for (i = 0; i < subtrahend->structs->len; i++) {
1191 sub = gst_caps_get_structure (subtrahend, i);
1193 gst_caps_unref (src);
1196 dest = gst_caps_new_empty ();
1197 for (j = 0; j < src->structs->len; j++) {
1198 min = gst_caps_get_structure (src, j);
1199 if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1202 if (gst_caps_structure_subtract (&list, min, sub)) {
1205 for (walk = list; walk; walk = g_slist_next (walk)) {
1206 gst_caps_append_structure (dest, (GstStructure *) walk->data);
1208 g_slist_free (list);
1210 gst_caps_append_structure (dest, gst_structure_copy (min));
1213 gst_caps_append_structure (dest, gst_structure_copy (min));
1216 if (gst_caps_is_empty (dest)) {
1217 gst_caps_unref (src);
1222 gst_caps_unref (src);
1223 gst_caps_do_simplify (dest);
1229 * @caps1: a #GstCaps to union
1230 * @caps2: a #GstCaps to union
1232 * Creates a new #GstCaps that contains all the formats that are in
1233 * either @caps1 and @caps2.
1235 * Returns: the new #GstCaps
1238 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1243 if (gst_caps_is_any (caps1) || gst_caps_is_any (caps2))
1244 return gst_caps_new_any ();
1246 dest1 = gst_caps_copy (caps1);
1247 dest2 = gst_caps_copy (caps2);
1248 gst_caps_append (dest1, dest2);
1250 gst_caps_do_simplify (dest1);
1254 typedef struct _NormalizeForeach
1257 GstStructure *structure;
1262 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1264 NormalizeForeach *nf = (NormalizeForeach *) ptr;
1268 if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1269 for (i = 1; i < gst_value_list_get_size (value); i++) {
1270 const GValue *v = gst_value_list_get_value (value, i);
1271 GstStructure *structure = gst_structure_copy (nf->structure);
1273 gst_structure_id_set_value (structure, field_id, v);
1274 gst_caps_append_structure (nf->caps, structure);
1277 gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1278 gst_structure_id_set_value (nf->structure, field_id, &val);
1279 g_value_unset (&val);
1287 * gst_caps_normalize:
1288 * @caps: a #GstCaps to normalize
1290 * Creates a new #GstCaps that represents the same set of formats as
1291 * @caps, but contains no lists. Each list is expanded into separate
1294 * Returns: the new #GstCaps
1297 gst_caps_normalize (const GstCaps * caps)
1299 NormalizeForeach nf;
1303 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1305 newcaps = gst_caps_copy (caps);
1308 for (i = 0; i < newcaps->structs->len; i++) {
1309 nf.structure = gst_caps_get_structure (newcaps, i);
1311 while (!gst_structure_foreach (nf.structure,
1312 gst_caps_normalize_foreach, &nf));
1319 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1322 const GstStructure *struct1 = *((const GstStructure **) one);
1323 const GstStructure *struct2 = *((const GstStructure **) two);
1325 /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1326 So what's the best way? */
1327 ret = strcmp (gst_structure_get_name (struct1),
1328 gst_structure_get_name (struct2));
1332 return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1339 GstStructure *compare;
1344 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1347 UnionField *u = user_data;
1348 const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1352 g_value_unset (&u->value);
1355 if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1358 g_value_unset (&u->value);
1362 gst_value_union (&u->value, val, value);
1367 gst_caps_structure_simplify (GstStructure ** result,
1368 const GstStructure * simplify, GstStructure * compare)
1371 UnionField field = { 0, {0,}, NULL };
1373 /* try to subtract to get a real subset */
1374 if (gst_caps_structure_subtract (&list, simplify, compare)) {
1375 switch (g_slist_length (list)) {
1380 *result = list->data;
1381 g_slist_free (list);
1387 for (walk = list; walk; walk = g_slist_next (walk)) {
1388 gst_structure_free (walk->data);
1390 g_slist_free (list);
1396 /* try to union both structs */
1397 field.compare = compare;
1398 if (gst_structure_foreach ((GstStructure *) simplify,
1399 gst_caps_structure_figure_out_union, &field)) {
1400 gboolean ret = FALSE;
1402 /* now we know all of simplify's fields are the same in compare
1403 * but at most one field: field.name */
1404 if (G_IS_VALUE (&field.value)) {
1405 if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1406 gst_structure_id_set_value (compare, field.name, &field.value);
1410 g_value_unset (&field.value);
1411 } else if (gst_structure_n_fields (simplify) <=
1412 gst_structure_n_fields (compare)) {
1413 /* compare is just more specific, will be optimized away later */
1414 /* FIXME: do this here? */
1415 GST_LOG ("found a case that will be optimized later.");
1417 gchar *one = gst_structure_to_string (simplify);
1418 gchar *two = gst_structure_to_string (compare);
1421 ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1433 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1434 GstStructure * new, gint i)
1436 gst_structure_set_parent_refcount (old, NULL);
1437 gst_structure_free (old);
1438 gst_structure_set_parent_refcount (new, &caps->refcount);
1439 g_ptr_array_index (caps->structs, i) = new;
1443 * gst_caps_do_simplify:
1444 * @caps: a #GstCaps to simplify
1446 * Modifies the given @caps inplace into a representation that represents the
1447 * same set of formats, but in a simpler form. Component structures that are
1448 * identical are merged. Component structures that have values that can be
1449 * merged are also merged.
1451 * Returns: TRUE, if the caps could be simplified
1454 gst_caps_do_simplify (GstCaps * caps)
1456 GstStructure *simplify, *compare, *result = NULL;
1458 gboolean changed = FALSE;
1460 g_return_val_if_fail (caps != NULL, FALSE);
1461 g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1463 if (gst_caps_get_size (caps) < 2)
1466 g_ptr_array_sort (caps->structs, gst_caps_compare_structures);
1468 start = caps->structs->len - 1;
1469 for (i = caps->structs->len - 1; i >= 0; i--) {
1470 simplify = gst_caps_get_structure (caps, i);
1471 if (gst_structure_get_name_id (simplify) !=
1472 gst_structure_get_name_id (gst_caps_get_structure (caps, start)))
1474 for (j = start; j >= 0; j--) {
1477 compare = gst_caps_get_structure (caps, j);
1478 if (gst_structure_get_name_id (simplify) !=
1479 gst_structure_get_name_id (compare)) {
1482 if (gst_caps_structure_simplify (&result, simplify, compare)) {
1484 gst_caps_switch_structures (caps, simplify, result, i);
1487 gst_caps_remove_structure (caps, i);
1499 /* gst_caps_do_simplify (caps); */
1503 #ifndef GST_DISABLE_LOADSAVE
1505 * gst_caps_save_thyself:
1506 * @caps: a #GstCaps structure
1507 * @parent: a XML parent node
1509 * Serializes a #GstCaps to XML and adds it as a child node of @parent.
1511 * Returns: a XML node pointer
1514 gst_caps_save_thyself (const GstCaps * caps, xmlNodePtr parent)
1516 char *s = gst_caps_to_string (caps);
1518 xmlNewChild (parent, NULL, (xmlChar *) "caps", (xmlChar *) s);
1524 * gst_caps_load_thyself:
1525 * @parent: a XML node
1527 * Creates a #GstCaps from its XML serialization.
1529 * Returns: a new #GstCaps structure
1532 gst_caps_load_thyself (xmlNodePtr parent)
1534 if (strcmp ("caps", (char *) parent->name) == 0) {
1535 return gst_caps_from_string ((gchar *) xmlNodeGetContent (parent));
1546 * @caps: a pointer to #GstCaps
1547 * @newcaps: a #GstCaps to replace *caps
1549 * Replaces *caps with @newcaps. Unrefs the #GstCaps in the location
1550 * pointed to by @caps, if applicable, then modifies @caps to point to
1551 * @newcaps. An additional ref on @newcaps is taken.
1553 * This function does not take any locks so you might want to lock
1554 * the object owning @caps pointer.
1557 gst_caps_replace (GstCaps ** caps, GstCaps * newcaps)
1561 g_return_if_fail (caps != NULL);
1565 if (newcaps != oldcaps) {
1567 gst_caps_ref (newcaps);
1572 gst_caps_unref (oldcaps);
1577 * gst_caps_to_string:
1580 * Converts @caps to a string representation. This string representation
1581 * can be converted back to a #GstCaps by gst_caps_from_string().
1583 * For debugging purposes its easier to do something like this:
1585 * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
1587 * This prints the caps in human readble form.
1589 * Returns: a newly allocated string representing @caps.
1592 gst_caps_to_string (const GstCaps * caps)
1597 /* NOTE: This function is potentially called by the debug system,
1598 * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
1599 * should be careful to avoid recursion. This includes any functions
1600 * called by gst_caps_to_string. In particular, calls should
1601 * not use the GST_PTR_FORMAT extension. */
1604 return g_strdup ("NULL");
1606 if (gst_caps_is_any (caps)) {
1607 return g_strdup ("ANY");
1609 if (gst_caps_is_empty (caps)) {
1610 return g_strdup ("EMPTY");
1613 s = g_string_new ("");
1614 for (i = 0; i < caps->structs->len; i++) {
1615 GstStructure *structure;
1619 g_string_append (s, "; ");
1621 structure = gst_caps_get_structure (caps, i);
1622 sstr = gst_structure_to_string (structure);
1623 g_string_append (s, sstr);
1627 return g_string_free (s, FALSE);
1631 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
1633 GstStructure *structure;
1636 g_return_val_if_fail (string, FALSE);
1637 if (strcmp ("ANY", string) == 0) {
1638 caps->flags = GST_CAPS_FLAGS_ANY;
1641 if (strcmp ("EMPTY", string) == 0) {
1645 structure = gst_structure_from_string (string, &s);
1646 if (structure == NULL) {
1649 gst_caps_append_structure (caps, structure);
1653 while (g_ascii_isspace (*s))
1655 structure = gst_structure_from_string (s, &s);
1656 if (structure == NULL) {
1659 gst_caps_append_structure (caps, structure);
1660 while (g_ascii_isspace (*s))
1672 * gst_caps_from_string:
1673 * @string: a string to convert to #GstCaps
1675 * Converts @caps from a string representation.
1677 * Returns: a newly allocated #GstCaps
1680 gst_caps_from_string (const gchar * string)
1684 caps = gst_caps_new_empty ();
1685 if (gst_caps_from_string_inplace (caps, string)) {
1688 gst_caps_unref (caps);
1694 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
1696 g_return_if_fail (G_IS_VALUE (src_value));
1697 g_return_if_fail (G_IS_VALUE (dest_value));
1698 g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
1699 g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
1700 || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
1702 dest_value->data[0].v_pointer =
1703 gst_caps_to_string (src_value->data[0].v_pointer);
1707 gst_caps_copy_conditional (GstCaps * src)
1710 return gst_caps_ref (src);