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., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
22 * @short_description: Structure describing sets of media formats
23 * @see_also: #GstStructure, #GstMiniObject
25 * Caps (capabilities) are lightweight 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_query_caps() pad
33 * function. This function describes the possible types that the pad can
34 * handle or produce at runtime.
36 * A #GstCaps can be constructed with the following code fragment:
39 * <title>Creating caps</title>
42 * caps = gst_caps_new_simple ("video/x-raw",
43 * "format", G_TYPE_STRING, "I420",
44 * "framerate", GST_TYPE_FRACTION, 25, 1,
45 * "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
46 * "width", G_TYPE_INT, 320,
47 * "height", G_TYPE_INT, 240,
52 * A #GstCaps is fixed when it has no properties with ranges or lists. Use
53 * gst_caps_is_fixed() to test for fixed caps. Fixed caps can be used in a
54 * caps event to notify downstream elements of the current media type.
56 * Various methods exist to work with the media types such as subtracting
59 * Last reviewed on 2011-03-28 (0.11.3)
68 #include "gst_private.h"
70 #include <gobject/gvaluecollector.h>
72 #define DEBUG_REFCOUNT
74 typedef struct _GstCapsArrayElement
76 GstStructure *structure;
77 GstCapsFeatures *features;
78 } GstCapsArrayElement;
80 typedef struct _GstCapsImpl
87 #define GST_CAPS_ARRAY(c) (((GstCapsImpl *)(c))->array)
89 #define GST_CAPS_LEN(c) (GST_CAPS_ARRAY(c)->len)
91 #define IS_WRITABLE(caps) \
92 (GST_CAPS_REFCOUNT_VALUE (caps) == 1)
94 /* same as gst_caps_is_any () */
95 #define CAPS_IS_ANY(caps) \
96 (GST_CAPS_FLAGS(caps) & GST_CAPS_FLAG_ANY)
98 /* same as gst_caps_is_empty () */
99 #define CAPS_IS_EMPTY(caps) \
100 (!CAPS_IS_ANY(caps) && CAPS_IS_EMPTY_SIMPLE(caps))
102 #define CAPS_IS_EMPTY_SIMPLE(caps) \
103 ((GST_CAPS_ARRAY (caps) == NULL) || (GST_CAPS_LEN (caps) == 0))
105 #define gst_caps_features_copy_conditional(f) ((f && !gst_caps_features_is_equal (f, GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY)) ? gst_caps_features_copy (f) : NULL)
107 /* quick way to get a caps structure at an index without doing a type or array
109 #define gst_caps_get_structure_unchecked(caps, index) \
110 (g_array_index (GST_CAPS_ARRAY (caps), GstCapsArrayElement, (index)).structure)
111 #define gst_caps_get_features_unchecked(caps, index) \
112 (g_array_index (GST_CAPS_ARRAY (caps), GstCapsArrayElement, (index)).features)
113 /* quick way to append a structure without checking the args */
114 #define gst_caps_append_structure_unchecked(caps, s, f) G_STMT_START{\
115 GstCapsArrayElement __e={s, f}; \
116 if (__e.features && gst_caps_features_is_equal (GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY, __e.features)) { \
117 gst_caps_features_free (__e.features); \
118 __e.features = NULL; \
120 if (gst_structure_set_parent_refcount (__e.structure, &GST_MINI_OBJECT_REFCOUNT(caps)) && \
121 (!__e.features || gst_caps_features_set_parent_refcount (__e.features, &GST_MINI_OBJECT_REFCOUNT(caps)))) \
122 g_array_append_val (GST_CAPS_ARRAY (caps), __e); \
125 /* lock to protect multiple invocations of static caps to caps conversion */
126 G_LOCK_DEFINE_STATIC (static_caps_lock);
128 static void gst_caps_transform_to_string (const GValue * src_value,
129 GValue * dest_value);
130 static gboolean gst_caps_from_string_inplace (GstCaps * caps,
131 const gchar * string);
133 GType _gst_caps_type = 0;
134 GstCaps *_gst_caps_any;
135 GstCaps *_gst_caps_none;
137 GST_DEFINE_MINI_OBJECT_TYPE (GstCaps, gst_caps);
140 _priv_gst_caps_initialize (void)
142 _gst_caps_type = gst_caps_get_type ();
144 _gst_caps_any = gst_caps_new_any ();
145 _gst_caps_none = gst_caps_new_empty ();
147 g_value_register_transform_func (_gst_caps_type,
148 G_TYPE_STRING, gst_caps_transform_to_string);
152 _gst_caps_copy (const GstCaps * caps)
155 GstStructure *structure;
156 GstCapsFeatures *features;
159 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
161 newcaps = gst_caps_new_empty ();
162 GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
163 n = GST_CAPS_LEN (caps);
165 GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, caps, "doing copy %p -> %p",
168 for (i = 0; i < n; i++) {
169 structure = gst_caps_get_structure_unchecked (caps, i);
170 features = gst_caps_get_features_unchecked (caps, i);
171 gst_caps_append_structure_full (newcaps, gst_structure_copy (structure),
172 gst_caps_features_copy_conditional (features));
178 /* creation/deletion */
180 _gst_caps_free (GstCaps * caps)
182 GstStructure *structure;
183 GstCapsFeatures *features;
186 /* The refcount must be 0, but since we're only called by gst_caps_unref,
187 * don't bother testing. */
188 len = GST_CAPS_LEN (caps);
189 /* This can be used to get statistics about caps sizes */
190 /*GST_CAT_INFO (GST_CAT_CAPS, "caps size: %d", len); */
191 for (i = 0; i < len; i++) {
192 structure = gst_caps_get_structure_unchecked (caps, i);
193 gst_structure_set_parent_refcount (structure, NULL);
194 gst_structure_free (structure);
195 features = gst_caps_get_features_unchecked (caps, i);
197 gst_caps_features_set_parent_refcount (features, NULL);
198 gst_caps_features_free (features);
201 g_array_free (GST_CAPS_ARRAY (caps), TRUE);
203 #ifdef DEBUG_REFCOUNT
204 GST_CAT_TRACE (GST_CAT_CAPS, "freeing caps %p", caps);
206 g_slice_free1 (sizeof (GstCapsImpl), caps);
210 gst_caps_init (GstCaps * caps)
212 gst_mini_object_init (GST_MINI_OBJECT_CAST (caps), 0, _gst_caps_type,
213 (GstMiniObjectCopyFunction) _gst_caps_copy, NULL,
214 (GstMiniObjectFreeFunction) _gst_caps_free);
216 /* the 32 has been determined by logging caps sizes in _gst_caps_free
217 * but g_ptr_array uses 16 anyway if it expands once, so this does not help
219 * GST_CAPS_ARRAY (caps) = g_ptr_array_sized_new (32);
221 GST_CAPS_ARRAY (caps) =
222 g_array_new (FALSE, TRUE, sizeof (GstCapsArrayElement));
226 * gst_caps_new_empty:
228 * Creates a new #GstCaps that is empty. That is, the returned
229 * #GstCaps contains no media formats.
230 * The #GstCaps is guaranteed to be writable.
231 * Caller is responsible for unreffing the returned caps.
233 * Returns: (transfer full): the new #GstCaps
236 gst_caps_new_empty (void)
240 caps = (GstCaps *) g_slice_new (GstCapsImpl);
242 gst_caps_init (caps);
244 #ifdef DEBUG_REFCOUNT
245 GST_CAT_TRACE (GST_CAT_CAPS, "created caps %p", caps);
254 * Creates a new #GstCaps that indicates that it is compatible with
257 * Returns: (transfer full): the new #GstCaps
260 gst_caps_new_any (void)
262 GstCaps *caps = gst_caps_new_empty ();
264 GST_CAPS_FLAG_SET (caps, GST_CAPS_FLAG_ANY);
270 * gst_caps_new_empty_simple:
271 * @media_type: the media type of the structure
273 * Creates a new #GstCaps that contains one #GstStructure with name
275 * Caller is responsible for unreffing the returned caps.
277 * Returns: (transfer full): the new #GstCaps
280 gst_caps_new_empty_simple (const char *media_type)
283 GstStructure *structure;
285 caps = gst_caps_new_empty ();
286 structure = gst_structure_new_empty (media_type);
288 gst_caps_append_structure_unchecked (caps, structure, NULL);
294 * gst_caps_new_simple:
295 * @media_type: the media type of the structure
296 * @fieldname: first field to set
297 * @...: additional arguments
299 * Creates a new #GstCaps that contains one #GstStructure. The
300 * structure is defined by the arguments, which have the same format
301 * as gst_structure_new().
302 * Caller is responsible for unreffing the returned caps.
304 * Returns: (transfer full): the new #GstCaps
307 gst_caps_new_simple (const char *media_type, const char *fieldname, ...)
310 GstStructure *structure;
313 caps = gst_caps_new_empty ();
315 va_start (var_args, fieldname);
316 structure = gst_structure_new_valist (media_type, fieldname, var_args);
320 gst_caps_append_structure_unchecked (caps, structure, NULL);
322 gst_caps_replace (&caps, NULL);
329 * @struct1: the first structure to add
330 * @...: additional structures to add
332 * Creates a new #GstCaps and adds all the structures listed as
333 * arguments. The list must be NULL-terminated. The structures
334 * are not copied; the returned #GstCaps owns the structures.
336 * Returns: (transfer full): the new #GstCaps
339 gst_caps_new_full (GstStructure * struct1, ...)
344 va_start (var_args, struct1);
345 caps = gst_caps_new_full_valist (struct1, var_args);
352 * gst_caps_new_full_valist:
353 * @structure: the first structure to add
354 * @var_args: additional structures to add
356 * Creates a new #GstCaps and adds all the structures listed as
357 * arguments. The list must be NULL-terminated. The structures
358 * are not copied; the returned #GstCaps owns the structures.
360 * Returns: (transfer full): the new #GstCaps
363 gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
367 caps = gst_caps_new_empty ();
370 gst_caps_append_structure_unchecked (caps, structure, NULL);
371 structure = va_arg (var_args, GstStructure *);
377 G_DEFINE_POINTER_TYPE (GstStaticCaps, gst_static_caps);
380 * gst_static_caps_get:
381 * @static_caps: the #GstStaticCaps to convert
383 * Converts a #GstStaticCaps to a #GstCaps.
385 * Returns: (transfer full): a pointer to the #GstCaps. Unref after usage.
386 * Since the core holds an additional ref to the returned caps,
387 * use gst_caps_make_writable() on the returned caps to modify it.
390 gst_static_caps_get (GstStaticCaps * static_caps)
394 g_return_val_if_fail (static_caps != NULL, NULL);
396 caps = &static_caps->caps;
398 /* refcount is 0 when we need to convert */
399 if (G_UNLIKELY (*caps == NULL)) {
402 G_LOCK (static_caps_lock);
403 /* check if other thread already updated */
404 if (G_UNLIKELY (*caps != NULL))
407 string = static_caps->string;
409 if (G_UNLIKELY (string == NULL))
412 *caps = gst_caps_from_string (string);
414 /* convert to string */
415 if (G_UNLIKELY (*caps == NULL))
416 g_critical ("Could not convert static caps \"%s\"", string);
418 GST_CAT_TRACE (GST_CAT_CAPS, "created %p from string %s", static_caps,
421 G_UNLOCK (static_caps_lock);
423 /* ref the caps, makes it not writable */
424 if (G_LIKELY (*caps != NULL))
425 gst_caps_ref (*caps);
432 G_UNLOCK (static_caps_lock);
433 g_warning ("static caps %p string is NULL", static_caps);
439 * gst_static_caps_cleanup:
440 * @static_caps: the #GstStaticCaps to clean
442 * Clean up the cached caps contained in @static_caps.
445 gst_static_caps_cleanup (GstStaticCaps * static_caps)
447 G_LOCK (static_caps_lock);
448 gst_caps_replace (&static_caps->caps, NULL);
449 G_UNLOCK (static_caps_lock);
455 gst_caps_remove_and_get_structure_and_features (GstCaps * caps, guint idx,
456 GstStructure ** s, GstCapsFeatures ** f)
461 s_ = gst_caps_get_structure_unchecked (caps, idx);
462 f_ = gst_caps_get_features_unchecked (caps, idx);
464 /* don't use index_fast, gst_caps_simplify relies on the order */
465 g_array_remove_index (GST_CAPS_ARRAY (caps), idx);
467 gst_structure_set_parent_refcount (s_, NULL);
469 gst_caps_features_set_parent_refcount (f_, NULL);
476 static GstStructure *
477 gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
482 gst_caps_remove_and_get_structure_and_features (caps, idx, &s, &f);
485 gst_caps_features_free (f);
493 * gst_caps_steal_structure:
494 * @caps: the #GstCaps to retrieve from
495 * @index: Index of the structure to retrieve
497 * Retrieves the structure with the given index from the list of structures
498 * contained in @caps. The caller becomes the owner of the returned structure.
500 * Returns: (transfer full): a pointer to the #GstStructure corresponding
504 gst_caps_steal_structure (GstCaps * caps, guint index)
506 g_return_val_if_fail (caps != NULL, NULL);
507 g_return_val_if_fail (IS_WRITABLE (caps), NULL);
509 if (G_UNLIKELY (index >= GST_CAPS_LEN (caps)))
512 return gst_caps_remove_and_get_structure (caps, index);
517 * @caps1: the #GstCaps that will be appended to
518 * @caps2: (transfer full): the #GstCaps to append
520 * Appends the structures contained in @caps2 to @caps1. The structures in
521 * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
522 * freed. If either caps is ANY, the resulting caps will be ANY.
525 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
527 GstStructure *structure;
528 GstCapsFeatures *features;
531 g_return_if_fail (GST_IS_CAPS (caps1));
532 g_return_if_fail (GST_IS_CAPS (caps2));
533 g_return_if_fail (IS_WRITABLE (caps1));
535 if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))) {
536 GST_CAPS_FLAGS (caps1) |= GST_CAPS_FLAG_ANY;
537 gst_caps_unref (caps2);
539 caps2 = gst_caps_make_writable (caps2);
541 for (i = GST_CAPS_LEN (caps2); i; i--) {
542 gst_caps_remove_and_get_structure_and_features (caps2, 0, &structure,
544 gst_caps_append_structure_unchecked (caps1, structure, features);
546 gst_caps_unref (caps2); /* guaranteed to free it */
552 * @caps1: (transfer full): the #GstCaps that will take the new entries
553 * @caps2: (transfer full): the #GstCaps to merge in
555 * Appends the structures contained in @caps2 to @caps1 if they are not yet
556 * expressed by @caps1. The structures in @caps2 are not copied -- they are
557 * transferred to a writable copy of @caps1, and then @caps2 is freed.
558 * If either caps is ANY, the resulting caps will be ANY.
560 * Returns: (transfer full): the merged caps.
563 gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
565 GstStructure *structure;
566 GstCapsFeatures *features;
570 g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
571 g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
573 if (G_UNLIKELY (CAPS_IS_ANY (caps1))) {
574 gst_caps_unref (caps2);
576 } else if (G_UNLIKELY (CAPS_IS_ANY (caps2))) {
577 gst_caps_unref (caps1);
580 caps2 = gst_caps_make_writable (caps2);
582 for (i = GST_CAPS_LEN (caps2); i; i--) {
583 gst_caps_remove_and_get_structure_and_features (caps2, 0, &structure,
585 caps1 = gst_caps_merge_structure_full (caps1, structure, features);
587 gst_caps_unref (caps2);
591 GstCaps *com = gst_caps_intersect (caps1, caps2);
592 GstCaps *add = gst_caps_subtract (caps2, com);
594 GST_DEBUG ("common : %d", gst_caps_get_size (com));
595 GST_DEBUG ("adding : %d", gst_caps_get_size (add));
596 gst_caps_append (caps1, add);
597 gst_caps_unref (com);
605 * gst_caps_append_structure:
606 * @caps: the #GstCaps that will be appended to
607 * @structure: (transfer full): the #GstStructure to append
609 * Appends @structure to @caps. The structure is not copied; @caps
610 * becomes the owner of @structure.
613 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
615 g_return_if_fail (GST_IS_CAPS (caps));
616 g_return_if_fail (IS_WRITABLE (caps));
618 if (G_LIKELY (structure)) {
619 gst_caps_append_structure_unchecked (caps, structure, NULL);
624 * gst_caps_append_structure_full:
625 * @caps: the #GstCaps that will be appended to
626 * @structure: (transfer full): the #GstStructure to append
627 * @features: (transfer full) (allow-none): the #GstCapsFeatures to append
629 * Appends @structure with @features to @caps. The structure is not copied; @caps
630 * becomes the owner of @structure.
633 gst_caps_append_structure_full (GstCaps * caps, GstStructure * structure,
634 GstCapsFeatures * features)
636 g_return_if_fail (GST_IS_CAPS (caps));
637 g_return_if_fail (IS_WRITABLE (caps));
639 if (G_LIKELY (structure)) {
640 gst_caps_append_structure_unchecked (caps, structure, features);
645 * gst_caps_remove_structure:
646 * @caps: the #GstCaps to remove from
647 * @idx: Index of the structure to remove
649 * removes the stucture with the given index from the list of structures
650 * contained in @caps.
653 gst_caps_remove_structure (GstCaps * caps, guint idx)
655 GstStructure *structure;
657 g_return_if_fail (caps != NULL);
658 g_return_if_fail (idx <= gst_caps_get_size (caps));
659 g_return_if_fail (IS_WRITABLE (caps));
661 structure = gst_caps_remove_and_get_structure (caps, idx);
662 gst_structure_free (structure);
666 * gst_caps_merge_structure:
667 * @caps: (transfer full): the #GstCaps to merge into
668 * @structure: (transfer full): the #GstStructure to merge
670 * Appends @structure to @caps if its not already expressed by @caps.
672 * Returns: (transfer full): the merged caps.
675 gst_caps_merge_structure (GstCaps * caps, GstStructure * structure)
677 GstStructure *structure1;
678 GstCapsFeatures *features1;
680 gboolean unique = TRUE;
682 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
684 if (G_UNLIKELY (structure == NULL))
687 /* check each structure */
688 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
689 structure1 = gst_caps_get_structure_unchecked (caps, i);
690 features1 = gst_caps_get_features_unchecked (caps, i);
692 features1 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
694 /* if structure is a subset of structure1 and the
695 * there are no existing features, then skip it */
696 if (gst_structure_is_subset (structure, structure1) &&
697 gst_caps_features_is_equal (features1,
698 GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY)) {
704 caps = gst_caps_make_writable (caps);
705 gst_caps_append_structure_unchecked (caps, structure, NULL);
707 gst_structure_free (structure);
713 * gst_caps_merge_structure_full:
714 * @caps: (transfer full): the #GstCaps to merge into
715 * @structure: (transfer full): the #GstStructure to merge
716 * @features: (transfer full) (allow-none): the #GstCapsFeatures to merge
718 * Appends @structure with @features to @caps if its not already expressed by @caps.
720 * Returns: (transfer full): the merged caps.
723 gst_caps_merge_structure_full (GstCaps * caps, GstStructure * structure,
724 GstCapsFeatures * features)
726 GstStructure *structure1;
727 GstCapsFeatures *features1, *features_tmp;
729 gboolean unique = TRUE;
731 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
733 if (G_UNLIKELY (structure == NULL))
736 /* To make comparisons easier below */
737 features_tmp = features ? features : GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
739 /* check each structure */
740 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
741 structure1 = gst_caps_get_structure_unchecked (caps, i);
742 features1 = gst_caps_get_features_unchecked (caps, i);
744 features1 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
745 /* if structure is a subset of structure1 and the
746 * the features are a subset, then skip it */
747 if (gst_structure_is_subset (structure, structure1) &&
748 gst_caps_features_is_equal (features_tmp, features1)) {
754 caps = gst_caps_make_writable (caps);
755 gst_caps_append_structure_unchecked (caps, structure, features);
757 gst_structure_free (structure);
759 gst_caps_features_free (features);
768 * Gets the number of structures contained in @caps.
770 * Returns: the number of structures that @caps contains
773 gst_caps_get_size (const GstCaps * caps)
775 g_return_val_if_fail (GST_IS_CAPS (caps), 0);
777 return GST_CAPS_LEN (caps);
781 * gst_caps_get_structure:
783 * @index: the index of the structure
785 * Finds the structure in @caps that has the index @index, and
788 * WARNING: This function takes a const GstCaps *, but returns a
789 * non-const GstStructure *. This is for programming convenience --
790 * the caller should be aware that structures inside a constant
791 * #GstCaps should not be modified. However, if you know the caps
792 * are writable, either because you have just copied them or made
793 * them writable with gst_caps_make_writable(), you may modify the
794 * structure returned in the usual way, e.g. with functions like
795 * gst_structure_set().
797 * You do not need to free or unref the structure returned, it
798 * belongs to the #GstCaps.
800 * Returns: (transfer none): a pointer to the #GstStructure corresponding
804 gst_caps_get_structure (const GstCaps * caps, guint index)
806 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
807 g_return_val_if_fail (index < GST_CAPS_LEN (caps), NULL);
809 return gst_caps_get_structure_unchecked (caps, index);
813 * gst_caps_get_features:
815 * @index: the index of the structure
817 * Finds the features in @caps that has the index @index, and
820 * WARNING: This function takes a const GstCaps *, but returns a
821 * non-const GstCapsFeatures *. This is for programming convenience --
822 * the caller should be aware that structures inside a constant
823 * #GstCaps should not be modified. However, if you know the caps
824 * are writable, either because you have just copied them or made
825 * them writable with gst_caps_make_writable(), you may modify the
826 * features returned in the usual way, e.g. with functions like
827 * gst_caps_features_add().
829 * You do not need to free or unref the structure returned, it
830 * belongs to the #GstCaps.
832 * Returns: (transfer none): a pointer to the #GstCapsFeatures corresponding
836 gst_caps_get_features (const GstCaps * caps, guint index)
838 GstCapsFeatures *features;
840 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
841 g_return_val_if_fail (index < GST_CAPS_LEN (caps), NULL);
843 features = gst_caps_get_features_unchecked (caps, index);
845 features = gst_caps_features_copy (GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY);
851 * gst_caps_set_features:
853 * @index: the index of the structure
854 * @features: (allow-none) (transfer full): the #GstFeatures to set
856 * Sets the #GstCapsFeatures @features for the structure at @index.
859 gst_caps_set_features (GstCaps * caps, guint index, GstCapsFeatures * features)
861 GstCapsFeatures **storage, *old;
863 g_return_if_fail (caps != NULL);
864 g_return_if_fail (index <= gst_caps_get_size (caps));
865 g_return_if_fail (IS_WRITABLE (caps));
867 storage = &gst_caps_get_features_unchecked (caps, index);
871 gst_caps_features_free (old);
876 * @caps: the #GstCaps to copy
877 * @nth: the nth structure to copy
879 * Creates a new #GstCaps and appends a copy of the nth structure
880 * contained in @caps.
882 * Returns: (transfer full): the new #GstCaps
885 gst_caps_copy_nth (const GstCaps * caps, guint nth)
888 GstStructure *structure;
889 GstCapsFeatures *features;
891 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
893 newcaps = gst_caps_new_empty ();
894 GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
896 if (G_LIKELY (GST_CAPS_LEN (caps) > nth)) {
897 structure = gst_caps_get_structure_unchecked (caps, nth);
898 features = gst_caps_get_features_unchecked (caps, nth);
899 gst_caps_append_structure_unchecked (newcaps,
900 gst_structure_copy (structure),
901 gst_caps_features_copy_conditional (features));
909 * @caps: (transfer full): the #GstCaps to truncate
911 * Discard all but the first structure from @caps. Useful when
914 * Returns: (transfer full): truncated caps
917 gst_caps_truncate (GstCaps * caps)
921 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
923 i = GST_CAPS_LEN (caps) - 1;
927 caps = gst_caps_make_writable (caps);
929 gst_caps_remove_structure (caps, i--);
935 * gst_caps_set_value:
936 * @caps: a writable caps
937 * @field: name of the field to set
938 * @value: value to set the field to
940 * Sets the given @field on all structures of @caps to the given @value.
941 * This is a convenience function for calling gst_structure_set_value() on
942 * all structures of @caps.
945 gst_caps_set_value (GstCaps * caps, const char *field, const GValue * value)
949 g_return_if_fail (GST_IS_CAPS (caps));
950 g_return_if_fail (IS_WRITABLE (caps));
951 g_return_if_fail (field != NULL);
952 g_return_if_fail (G_IS_VALUE (value));
954 len = GST_CAPS_LEN (caps);
955 for (i = 0; i < len; i++) {
956 GstStructure *structure = gst_caps_get_structure_unchecked (caps, i);
957 gst_structure_set_value (structure, field, value);
962 * gst_caps_set_simple_valist:
963 * @caps: the #GstCaps to set
964 * @field: first field to set
965 * @varargs: additional parameters
967 * Sets fields in a #GstCaps. The arguments must be passed in the same
968 * manner as gst_structure_set(), and be NULL-terminated.
971 gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs)
973 GValue value = { 0, };
975 g_return_if_fail (GST_IS_CAPS (caps));
976 g_return_if_fail (IS_WRITABLE (caps));
982 type = va_arg (varargs, GType);
984 G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
985 if (G_UNLIKELY (err)) {
986 g_critical ("%s", err);
990 gst_caps_set_value (caps, field, &value);
992 g_value_unset (&value);
994 field = va_arg (varargs, const gchar *);
999 * gst_caps_set_simple:
1000 * @caps: the #GstCaps to set
1001 * @field: first field to set
1002 * @...: additional parameters
1004 * Sets fields in a #GstCaps. The arguments must be passed in the same
1005 * manner as gst_structure_set(), and be NULL-terminated.
1008 gst_caps_set_simple (GstCaps * caps, const char *field, ...)
1012 g_return_if_fail (GST_IS_CAPS (caps));
1013 g_return_if_fail (IS_WRITABLE (caps));
1015 va_start (var_args, field);
1016 gst_caps_set_simple_valist (caps, field, var_args);
1024 * @caps: the #GstCaps to test
1026 * Determines if @caps represents any media format.
1028 * Returns: TRUE if @caps represents any format.
1031 gst_caps_is_any (const GstCaps * caps)
1033 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1035 return (CAPS_IS_ANY (caps));
1039 * gst_caps_is_empty:
1040 * @caps: the #GstCaps to test
1042 * Determines if @caps represents no media formats.
1044 * Returns: TRUE if @caps represents no formats.
1047 gst_caps_is_empty (const GstCaps * caps)
1049 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1051 if (CAPS_IS_ANY (caps))
1054 return CAPS_IS_EMPTY_SIMPLE (caps);
1058 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
1061 return gst_value_is_fixed (value);
1065 * gst_caps_is_fixed:
1066 * @caps: the #GstCaps to test
1068 * Fixed #GstCaps describe exactly one format, that is, they have exactly
1069 * one structure, and each field in the structure describes a fixed type.
1070 * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
1072 * Returns: TRUE if @caps is fixed
1075 gst_caps_is_fixed (const GstCaps * caps)
1077 GstStructure *structure;
1079 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
1081 if (GST_CAPS_LEN (caps) != 1)
1084 structure = gst_caps_get_structure_unchecked (caps, 0);
1086 return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
1090 * gst_caps_is_equal_fixed:
1091 * @caps1: the #GstCaps to test
1092 * @caps2: the #GstCaps to test
1094 * Tests if two #GstCaps are equal. This function only works on fixed
1097 * Returns: TRUE if the arguments represent the same format
1100 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
1102 GstStructure *struct1, *struct2;
1103 GstCapsFeatures *features1, *features2;
1105 g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
1106 g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
1108 struct1 = gst_caps_get_structure_unchecked (caps1, 0);
1109 features1 = gst_caps_get_features_unchecked (caps1, 0);
1111 features1 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1112 struct2 = gst_caps_get_structure_unchecked (caps2, 0);
1113 features2 = gst_caps_get_features_unchecked (caps2, 0);
1115 features2 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1117 return gst_structure_is_equal (struct1, struct2) &&
1118 gst_caps_features_is_equal (features1, features2);
1122 * gst_caps_is_always_compatible:
1123 * @caps1: the #GstCaps to test
1124 * @caps2: the #GstCaps to test
1126 * A given #GstCaps structure is always compatible with another if
1127 * every media format that is in the first is also contained in the
1128 * second. That is, @caps1 is a subset of @caps2.
1130 * Returns: TRUE if @caps1 is a subset of @caps2.
1133 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
1135 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1136 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1138 return gst_caps_is_subset (caps1, caps2);
1142 * gst_caps_is_subset:
1143 * @subset: a #GstCaps
1144 * @superset: a potentially greater #GstCaps
1146 * Checks if all caps represented by @subset are also represented by @superset.
1147 * <note>This function does not work reliably if optional properties for caps
1148 * are included on one caps and omitted on the other.</note>
1150 * Returns: %TRUE if @subset is a subset of @superset
1153 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
1155 GstStructure *s1, *s2;
1156 GstCapsFeatures *f1, *f2;
1157 gboolean ret = TRUE;
1160 g_return_val_if_fail (subset != NULL, FALSE);
1161 g_return_val_if_fail (superset != NULL, FALSE);
1163 if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
1165 if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
1168 for (i = GST_CAPS_LEN (subset) - 1; i >= 0; i--) {
1169 for (j = GST_CAPS_LEN (superset) - 1; j >= 0; j--) {
1170 s1 = gst_caps_get_structure_unchecked (subset, i);
1171 f1 = gst_caps_get_features_unchecked (subset, i);
1173 f1 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1174 s2 = gst_caps_get_structure_unchecked (superset, j);
1175 f2 = gst_caps_get_features_unchecked (superset, j);
1177 f2 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1178 if (gst_structure_is_subset (s1, s2) &&
1179 gst_caps_features_is_equal (f1, f2)) {
1180 /* If we found a superset, continue with the next
1181 * subset structure */
1185 /* If we found no superset for this subset structure
1186 * we return FALSE immediately */
1197 * gst_caps_is_subset_structure:
1199 * @structure: a potential #GstStructure subset of @caps
1201 * Checks if @structure is a subset of @caps. See gst_caps_is_subset()
1202 * for more information.
1204 * Returns: %TRUE if @structure is a subset of @caps
1207 gst_caps_is_subset_structure (const GstCaps * caps,
1208 const GstStructure * structure)
1213 g_return_val_if_fail (caps != NULL, FALSE);
1214 g_return_val_if_fail (structure != NULL, FALSE);
1216 if (CAPS_IS_ANY (caps))
1218 if (CAPS_IS_EMPTY (caps))
1221 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
1222 s = gst_caps_get_structure_unchecked (caps, i);
1223 if (gst_structure_is_subset (structure, s)) {
1224 /* If we found a superset return TRUE */
1233 * gst_caps_is_subset_structure_full:
1235 * @structure: a potential #GstStructure subset of @caps
1236 * @features: (allow-none): a #GstCapsFeatures for @structure
1238 * Checks if @structure is a subset of @caps. See gst_caps_is_subset()
1239 * for more information.
1241 * Returns: %TRUE if @structure is a subset of @caps
1244 gst_caps_is_subset_structure_full (const GstCaps * caps,
1245 const GstStructure * structure, const GstCapsFeatures * features)
1251 g_return_val_if_fail (caps != NULL, FALSE);
1252 g_return_val_if_fail (structure != NULL, FALSE);
1254 if (CAPS_IS_ANY (caps))
1256 if (CAPS_IS_EMPTY (caps))
1260 features = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1262 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
1263 s = gst_caps_get_structure_unchecked (caps, i);
1264 f = gst_caps_get_features_unchecked (caps, i);
1266 f = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1267 if (gst_structure_is_subset (structure, s) &&
1268 gst_caps_features_is_equal (features, f)) {
1269 /* If we found a superset return TRUE */
1278 * gst_caps_is_equal:
1279 * @caps1: a #GstCaps
1280 * @caps2: another #GstCaps
1282 * Checks if the given caps represent the same set of caps.
1283 * <note>This function does not work reliably if optional properties for caps
1284 * are included on one caps and omitted on the other.</note>
1286 * Returns: TRUE if both caps are equal.
1289 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
1291 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1292 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1294 if (G_UNLIKELY (caps1 == caps2))
1297 if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
1298 return gst_caps_is_equal_fixed (caps1, caps2);
1300 return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1304 * gst_caps_is_strictly_equal:
1305 * @caps1: a #GstCaps
1306 * @caps2: another #GstCaps
1308 * Checks if the given caps are exactly the same set of caps.
1310 * Returns: TRUE if both caps are strictly equal.
1313 gst_caps_is_strictly_equal (const GstCaps * caps1, const GstCaps * caps2)
1316 GstStructure *s1, *s2;
1317 GstCapsFeatures *f1, *f2;
1319 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1320 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1322 if (G_UNLIKELY (caps1 == caps2))
1325 if (GST_CAPS_LEN (caps1) != GST_CAPS_LEN (caps2))
1328 for (i = 0; i < GST_CAPS_LEN (caps1); i++) {
1329 s1 = gst_caps_get_structure_unchecked (caps1, i);
1330 f1 = gst_caps_get_features_unchecked (caps1, i);
1332 f1 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1333 s2 = gst_caps_get_structure_unchecked (caps2, i);
1334 f2 = gst_caps_get_features_unchecked (caps2, i);
1336 f2 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1338 if (!gst_structure_is_equal (s1, s2)
1339 || !gst_caps_features_is_equal (f1, f2))
1346 /* intersect operation */
1349 * gst_caps_can_intersect:
1350 * @caps1: a #GstCaps to intersect
1351 * @caps2: a #GstCaps to intersect
1353 * Tries intersecting @caps1 and @caps2 and reports whether the result would not
1356 * Returns: %TRUE if intersection would be not empty
1359 gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
1361 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1362 guint j, k, len1, len2;
1363 GstStructure *struct1;
1364 GstStructure *struct2;
1365 GstCapsFeatures *features1;
1366 GstCapsFeatures *features2;
1368 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1369 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1371 /* caps are exactly the same pointers */
1372 if (G_UNLIKELY (caps1 == caps2))
1375 /* empty caps on either side, return empty */
1376 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1379 /* one of the caps is any */
1380 if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
1383 /* run zigzag on top line then right line, this preserves the caps order
1384 * much better than a simple loop.
1386 * This algorithm zigzags over the caps structures as demonstrated in
1387 * the following matrix:
1390 * +------------- total distance: +-------------
1391 * | 1 2 4 7 0 | 0 1 2 3
1392 * caps2 | 3 5 8 10 1 | 1 2 3 4
1393 * | 6 9 11 12 2 | 2 3 4 5
1395 * First we iterate over the caps1 structures (top line) intersecting
1396 * the structures diagonally down, then we iterate over the caps2
1397 * structures. The result is that the intersections are ordered based on the
1398 * sum of the indexes in the list.
1400 len1 = GST_CAPS_LEN (caps1);
1401 len2 = GST_CAPS_LEN (caps2);
1402 for (i = 0; i < len1 + len2 - 1; i++) {
1403 /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */
1404 j = MIN (i, len1 - 1);
1405 /* subset index stays 0 until i reaches superset->structs->len, then it
1406 * counts up from 1 to subset->structs->len - 1 */
1407 k = (i > j) ? (i - j) : 0; /* MAX (0, i - j) */
1408 /* now run the diagonal line, end condition is the left or bottom
1411 struct1 = gst_caps_get_structure_unchecked (caps1, j);
1412 features1 = gst_caps_get_features_unchecked (caps1, j);
1414 features1 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1415 struct2 = gst_caps_get_structure_unchecked (caps2, k);
1416 features2 = gst_caps_get_features_unchecked (caps2, k);
1418 features2 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1419 if (gst_structure_can_intersect (struct1, struct2) &&
1420 gst_caps_features_is_equal (features1, features2)) {
1423 /* move down left */
1425 if (G_UNLIKELY (j == 0))
1426 break; /* so we don't roll back to G_MAXUINT */
1435 gst_caps_intersect_zig_zag (GstCaps * caps1, GstCaps * caps2)
1437 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1438 guint j, k, len1, len2;
1439 GstStructure *struct1;
1440 GstStructure *struct2;
1441 GstCapsFeatures *features1;
1442 GstCapsFeatures *features2;
1444 GstStructure *istruct;
1446 /* caps are exactly the same pointers, just copy one caps */
1447 if (G_UNLIKELY (caps1 == caps2))
1448 return gst_caps_ref (caps1);
1450 /* empty caps on either side, return empty */
1451 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1452 return gst_caps_ref (GST_CAPS_NONE);
1454 /* one of the caps is any, just copy the other caps */
1455 if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1456 return gst_caps_ref (caps2);
1458 if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1459 return gst_caps_ref (caps1);
1461 dest = gst_caps_new_empty ();
1462 /* run zigzag on top line then right line, this preserves the caps order
1463 * much better than a simple loop.
1465 * This algorithm zigzags over the caps structures as demonstrated in
1466 * the following matrix:
1474 * First we iterate over the caps1 structures (top line) intersecting
1475 * the structures diagonally down, then we iterate over the caps2
1478 len1 = GST_CAPS_LEN (caps1);
1479 len2 = GST_CAPS_LEN (caps2);
1480 for (i = 0; i < len1 + len2 - 1; i++) {
1481 /* caps1 index goes from 0 to GST_CAPS_LEN (caps1)-1 */
1482 j = MIN (i, len1 - 1);
1483 /* caps2 index stays 0 until i reaches GST_CAPS_LEN (caps1), then it counts
1484 * up from 1 to GST_CAPS_LEN (caps2) - 1 */
1485 k = (i > j) ? (i - j) : 0; /* MAX (0, i - j) */
1486 /* now run the diagonal line, end condition is the left or bottom
1489 struct1 = gst_caps_get_structure_unchecked (caps1, j);
1490 features1 = gst_caps_get_features_unchecked (caps1, j);
1492 features1 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1493 struct2 = gst_caps_get_structure_unchecked (caps2, k);
1494 features2 = gst_caps_get_features_unchecked (caps2, k);
1496 features2 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1497 istruct = gst_structure_intersect (struct1, struct2);
1498 if (istruct && gst_caps_features_is_equal (features1, features2))
1500 gst_caps_merge_structure_full (dest, istruct,
1501 gst_caps_features_copy_conditional (features1));
1502 /* move down left */
1504 if (G_UNLIKELY (j == 0))
1505 break; /* so we don't roll back to G_MAXUINT */
1513 * gst_caps_intersect_first:
1514 * @caps1: a #GstCaps to intersect
1515 * @caps2: a #GstCaps to intersect
1517 * Creates a new #GstCaps that contains all the formats that are common
1518 * to both @caps1 and @caps2.
1520 * Unlike @gst_caps_intersect, the returned caps will be ordered in a similar
1521 * fashion as @caps1.
1523 * Returns: the new #GstCaps
1526 gst_caps_intersect_first (GstCaps * caps1, GstCaps * caps2)
1529 guint j, len1, len2;
1530 GstStructure *struct1;
1531 GstStructure *struct2;
1532 GstCapsFeatures *features1;
1533 GstCapsFeatures *features2;
1535 GstStructure *istruct;
1537 /* caps are exactly the same pointers, just copy one caps */
1538 if (G_UNLIKELY (caps1 == caps2))
1539 return gst_caps_ref (caps1);
1541 /* empty caps on either side, return empty */
1542 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1543 return gst_caps_ref (GST_CAPS_NONE);
1545 /* one of the caps is any, just copy the other caps */
1546 if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1547 return gst_caps_ref (caps2);
1549 if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1550 return gst_caps_ref (caps1);
1552 dest = gst_caps_new_empty ();
1553 len1 = GST_CAPS_LEN (caps1);
1554 len2 = GST_CAPS_LEN (caps2);
1555 for (i = 0; i < len1; i++) {
1556 struct1 = gst_caps_get_structure_unchecked (caps1, i);
1557 features1 = gst_caps_get_features_unchecked (caps1, i);
1559 features1 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1560 for (j = 0; j < len2; j++) {
1561 struct2 = gst_caps_get_structure_unchecked (caps2, j);
1562 features2 = gst_caps_get_features_unchecked (caps2, j);
1564 features2 = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1565 istruct = gst_structure_intersect (struct1, struct2);
1566 if (istruct && gst_caps_features_is_equal (features1, features2))
1567 dest = gst_caps_merge_structure (dest, istruct);
1575 * gst_caps_intersect_full:
1576 * @caps1: a #GstCaps to intersect
1577 * @caps2: a #GstCaps to intersect
1578 * @mode: The intersection algorithm/mode to use
1580 * Creates a new #GstCaps that contains all the formats that are common
1581 * to both @caps1 and @caps2, the order is defined by the #GstCapsIntersectMode
1584 * Returns: the new #GstCaps
1587 gst_caps_intersect_full (GstCaps * caps1, GstCaps * caps2,
1588 GstCapsIntersectMode mode)
1590 g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1591 g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1594 case GST_CAPS_INTERSECT_FIRST:
1595 return gst_caps_intersect_first (caps1, caps2);
1597 g_warning ("Unknown caps intersect mode: %d", mode);
1599 case GST_CAPS_INTERSECT_ZIG_ZAG:
1600 return gst_caps_intersect_zig_zag (caps1, caps2);
1605 * gst_caps_intersect:
1606 * @caps1: a #GstCaps to intersect
1607 * @caps2: a #GstCaps to intersect
1609 * Creates a new #GstCaps that contains all the formats that are common
1610 * to both @caps1 and @caps2. Defaults to %GST_CAPS_INTERSECT_ZIG_ZAG mode.
1612 * Returns: the new #GstCaps
1615 gst_caps_intersect (GstCaps * caps1, GstCaps * caps2)
1617 return gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_ZIG_ZAG);
1620 /* subtract operation */
1624 const GstStructure *subtract_from;
1629 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1632 SubtractionEntry *e = user_data;
1633 GValue subtraction = { 0, };
1634 const GValue *other;
1635 GstStructure *structure;
1637 other = gst_structure_id_get_value (e->subtract_from, field_id);
1643 if (!gst_value_subtract (&subtraction, other, value))
1646 if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1647 g_value_unset (&subtraction);
1650 structure = gst_structure_copy (e->subtract_from);
1651 gst_structure_id_take_value (structure, field_id, &subtraction);
1652 e->put_into = g_slist_prepend (e->put_into, structure);
1658 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1659 const GstStructure * subtrahend)
1664 e.subtract_from = minuend;
1666 ret = gst_structure_foreach ((GstStructure *) subtrahend,
1667 gst_caps_structure_subtract_field, &e);
1674 for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1675 gst_structure_free (walk->data);
1677 g_slist_free (e.put_into);
1684 * gst_caps_subtract:
1685 * @minuend: #GstCaps to subtract from
1686 * @subtrahend: #GstCaps to subtract
1688 * Subtracts the @subtrahend from the @minuend.
1689 * <note>This function does not work reliably if optional properties for caps
1690 * are included on one caps and omitted on the other.</note>
1692 * Returns: the resulting caps
1695 gst_caps_subtract (GstCaps * minuend, GstCaps * subtrahend)
1700 GstCapsFeatures *min_f, *sub_f;
1701 GstCaps *dest = NULL, *src;
1703 g_return_val_if_fail (minuend != NULL, NULL);
1704 g_return_val_if_fail (subtrahend != NULL, NULL);
1706 if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
1707 return gst_caps_new_empty ();
1710 if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
1711 return gst_caps_ref (minuend);
1713 /* FIXME: Do we want this here or above?
1714 The reason we need this is that there is no definition about what
1715 ANY means for specific types, so it's not possible to reduce ANY partially
1716 You can only remove everything or nothing and that is done above.
1717 Note: there's a test that checks this behaviour. */
1719 g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
1720 sublen = GST_CAPS_LEN (subtrahend);
1721 g_assert (sublen > 0);
1723 src = _gst_caps_copy (minuend);
1724 for (i = 0; i < sublen; i++) {
1727 sub = gst_caps_get_structure_unchecked (subtrahend, i);
1728 sub_f = gst_caps_get_features_unchecked (subtrahend, i);
1730 sub_f = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1732 gst_caps_unref (src);
1735 dest = gst_caps_new_empty ();
1736 srclen = GST_CAPS_LEN (src);
1737 for (j = 0; j < srclen; j++) {
1738 min = gst_caps_get_structure_unchecked (src, j);
1739 min_f = gst_caps_get_features_unchecked (src, j);
1741 min_f = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
1742 if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub) &&
1743 gst_caps_features_is_equal (min_f, sub_f)) {
1746 if (gst_caps_structure_subtract (&list, min, sub)) {
1749 for (walk = list; walk; walk = g_slist_next (walk)) {
1750 gst_caps_append_structure_unchecked (dest,
1751 (GstStructure *) walk->data,
1752 gst_caps_features_copy_conditional (min_f));
1754 g_slist_free (list);
1756 gst_caps_append_structure_unchecked (dest, gst_structure_copy (min),
1757 gst_caps_features_copy_conditional (min_f));
1760 gst_caps_append_structure_unchecked (dest, gst_structure_copy (min),
1761 gst_caps_features_copy_conditional (min_f));
1765 if (CAPS_IS_EMPTY_SIMPLE (dest)) {
1766 gst_caps_unref (src);
1771 gst_caps_unref (src);
1772 dest = gst_caps_simplify (dest);
1777 /* normalize/simplify operations */
1779 typedef struct _NormalizeForeach
1782 GstStructure *structure;
1783 GstCapsFeatures *features;
1787 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1789 NormalizeForeach *nf = (NormalizeForeach *) ptr;
1793 if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1794 guint len = gst_value_list_get_size (value);
1796 for (i = 1; i < len; i++) {
1797 const GValue *v = gst_value_list_get_value (value, i);
1798 GstStructure *structure = gst_structure_copy (nf->structure);
1800 gst_structure_id_set_value (structure, field_id, v);
1801 gst_caps_append_structure_unchecked (nf->caps, structure,
1802 gst_caps_features_copy_conditional (nf->features));
1805 gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1806 gst_structure_id_take_value (nf->structure, field_id, &val);
1814 * gst_caps_normalize:
1815 * @caps: (transfer full): a #GstCaps to normalize
1817 * Returns a #GstCaps that represents the same set of formats as
1818 * @caps, but contains no lists. Each list is expanded into separate
1821 * This function takes ownership of @caps.
1823 * Returns: (transfer full): the normalized #GstCaps
1826 gst_caps_normalize (GstCaps * caps)
1828 NormalizeForeach nf;
1831 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1833 caps = gst_caps_make_writable (caps);
1836 for (i = 0; i < gst_caps_get_size (nf.caps); i++) {
1837 nf.structure = gst_caps_get_structure_unchecked (nf.caps, i);
1838 nf.features = gst_caps_get_features_unchecked (nf.caps, i);
1839 while (!gst_structure_foreach (nf.structure,
1840 gst_caps_normalize_foreach, &nf));
1847 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1850 const GstStructure *struct1 = ((const GstCapsArrayElement *) one)->structure;
1851 const GstStructure *struct2 = ((const GstCapsArrayElement *) two)->structure;
1853 /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1854 So what's the best way? */
1855 ret = strcmp (gst_structure_get_name (struct1),
1856 gst_structure_get_name (struct2));
1861 return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1868 GstStructure *compare;
1872 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1875 UnionField *u = user_data;
1876 const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1880 g_value_unset (&u->value);
1884 if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1888 g_value_unset (&u->value);
1893 gst_value_union (&u->value, val, value);
1899 gst_caps_structure_simplify (GstStructure ** result,
1900 GstStructure * simplify, GstStructure * compare)
1903 UnionField field = { 0, {0,}, NULL };
1905 /* try to subtract to get a real subset */
1906 if (gst_caps_structure_subtract (&list, simplify, compare)) {
1907 if (list == NULL) { /* no result */
1910 } else if (list->next == NULL) { /* one result */
1911 *result = list->data;
1912 g_slist_free (list);
1914 } else { /* multiple results */
1915 g_slist_foreach (list, (GFunc) gst_structure_free, NULL);
1916 g_slist_free (list);
1921 /* try to union both structs */
1922 field.compare = compare;
1923 if (gst_structure_foreach (simplify,
1924 gst_caps_structure_figure_out_union, &field)) {
1925 gboolean ret = FALSE;
1927 /* now we know all of simplify's fields are the same in compare
1928 * but at most one field: field.name */
1929 if (G_IS_VALUE (&field.value)) {
1930 if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1931 gst_structure_id_take_value (compare, field.name, &field.value);
1935 g_value_unset (&field.value);
1938 if (gst_structure_n_fields (simplify) <=
1939 gst_structure_n_fields (compare)) {
1940 /* compare is just more specific, will be optimized away later */
1941 /* FIXME: do this here? */
1942 GST_LOG ("found a case that will be optimized later.");
1944 gchar *one = gst_structure_to_string (simplify);
1945 gchar *two = gst_structure_to_string (compare);
1948 ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1960 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1961 GstStructure * new, gint i)
1963 gst_structure_set_parent_refcount (old, NULL);
1964 gst_structure_free (old);
1965 gst_structure_set_parent_refcount (new, &GST_CAPS_REFCOUNT (caps));
1966 g_array_index (GST_CAPS_ARRAY (caps), GstCapsArrayElement, i).structure = new;
1970 * gst_caps_simplify:
1971 * @caps: (transfer full): a #GstCaps to simplify
1973 * Converts the given @caps into a representation that represents the
1974 * same set of formats, but in a simpler form. Component structures that are
1975 * identical are merged. Component structures that have values that can be
1976 * merged are also merged.
1978 * This method does not preserve the original order of @caps.
1980 * Returns: The simplified caps.
1983 gst_caps_simplify (GstCaps * caps)
1985 GstStructure *simplify, *compare, *result = NULL;
1986 GstCapsFeatures *simplify_f, *compare_f;
1989 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1991 start = GST_CAPS_LEN (caps) - 1;
1992 /* one caps, already as simple as can be */
1996 caps = gst_caps_make_writable (caps);
1998 g_array_sort (GST_CAPS_ARRAY (caps), gst_caps_compare_structures);
2000 for (i = start; i >= 0; i--) {
2001 simplify = gst_caps_get_structure_unchecked (caps, i);
2002 simplify_f = gst_caps_get_features_unchecked (caps, i);
2004 simplify_f = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
2005 compare = gst_caps_get_structure_unchecked (caps, start);
2006 compare_f = gst_caps_get_features_unchecked (caps, start);
2008 compare_f = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
2009 if (gst_structure_get_name_id (simplify) !=
2010 gst_structure_get_name_id (compare) ||
2011 !gst_caps_features_is_equal (simplify_f, compare_f))
2013 for (j = start; j >= 0; j--) {
2016 compare = gst_caps_get_structure_unchecked (caps, j);
2017 compare_f = gst_caps_get_features_unchecked (caps, j);
2019 compare_f = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY;
2020 if (gst_structure_get_name_id (simplify) !=
2021 gst_structure_get_name_id (compare) ||
2022 !gst_caps_features_is_equal (simplify_f, compare_f)) {
2025 if (gst_caps_structure_simplify (&result, simplify, compare)) {
2027 gst_caps_switch_structures (caps, simplify, result, i);
2030 gst_caps_remove_structure (caps, i);
2042 * @caps: (transfer full): a #GstCaps to fixate
2044 * Modifies the given @caps into a representation with only fixed
2045 * values. First the caps will be truncated and then the first structure will be
2046 * fixated with gst_structure_fixate().
2048 * Returns: (transfer full): the fixated caps
2051 gst_caps_fixate (GstCaps * caps)
2055 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
2057 /* default fixation */
2058 caps = gst_caps_truncate (caps);
2059 caps = gst_caps_make_writable (caps);
2060 s = gst_caps_get_structure (caps, 0);
2061 gst_structure_fixate (s);
2069 * gst_caps_to_string:
2072 * Converts @caps to a string representation. This string representation
2073 * can be converted back to a #GstCaps by gst_caps_from_string().
2075 * For debugging purposes its easier to do something like this:
2077 * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
2079 * This prints the caps in human readable form.
2081 * Returns: (transfer full): a newly allocated string representing @caps.
2084 gst_caps_to_string (const GstCaps * caps)
2086 guint i, slen, clen;
2089 /* NOTE: This function is potentially called by the debug system,
2090 * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
2091 * should be careful to avoid recursion. This includes any functions
2092 * called by gst_caps_to_string. In particular, calls should
2093 * not use the GST_PTR_FORMAT extension. */
2096 return g_strdup ("NULL");
2098 if (CAPS_IS_ANY (caps)) {
2099 return g_strdup ("ANY");
2101 if (CAPS_IS_EMPTY_SIMPLE (caps)) {
2102 return g_strdup ("EMPTY");
2105 /* estimate a rough string length to avoid unnecessary reallocs in GString */
2107 clen = GST_CAPS_LEN (caps);
2108 for (i = 0; i < clen; i++) {
2112 STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked
2114 f = gst_caps_get_features_unchecked (caps, i);
2116 slen += FEATURES_ESTIMATED_STRING_LEN (f);
2119 s = g_string_sized_new (slen);
2120 for (i = 0; i < clen; i++) {
2121 GstStructure *structure;
2122 GstCapsFeatures *features;
2125 /* ';' is now added by gst_structure_to_string */
2126 g_string_append_c (s, ' ');
2129 structure = gst_caps_get_structure_unchecked (caps, i);
2130 features = gst_caps_get_features_unchecked (caps, i);
2132 g_string_append (s, gst_structure_get_name (structure));
2134 && !gst_caps_features_is_equal (features,
2135 GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY)) {
2136 g_string_append_c (s, '(');
2137 priv_gst_caps_features_append_to_gstring (features, s);
2138 g_string_append_c (s, ')');
2140 priv_gst_structure_append_to_gstring (structure, s);
2142 if (s->len && s->str[s->len - 1] == ';') {
2143 /* remove latest ';' */
2144 s->str[--s->len] = '\0';
2146 return g_string_free (s, FALSE);
2150 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
2152 GstStructure *structure;
2153 gchar *s, *copy, *end, *next, save;
2155 if (strcmp ("ANY", string) == 0) {
2156 GST_CAPS_FLAGS (caps) = GST_CAPS_FLAG_ANY;
2160 if (strcmp ("EMPTY", string) == 0 || strcmp ("NONE", string) == 0) {
2164 copy = s = g_strdup (string);
2166 GstCapsFeatures *features = NULL;
2168 while (g_ascii_isspace (*s))
2174 if (!priv_gst_structure_parse_name (s, &s, &end, &next)) {
2181 structure = gst_structure_new_empty (s);
2184 if (structure == NULL) {
2202 } else if (*end == ')') {
2211 features = gst_caps_features_from_string (s);
2213 gst_structure_free (structure);
2227 if (!priv_gst_structure_parse_fields (s, &s, structure)) {
2228 gst_structure_free (structure);
2234 gst_caps_append_structure_unchecked (caps, structure, features);
2245 * gst_caps_from_string:
2246 * @string: a string to convert to #GstCaps
2248 * Converts @caps from a string representation.
2250 * Returns: (transfer full): a newly allocated #GstCaps
2253 gst_caps_from_string (const gchar * string)
2257 g_return_val_if_fail (string, FALSE);
2259 caps = gst_caps_new_empty ();
2260 if (gst_caps_from_string_inplace (caps, string)) {
2263 gst_caps_unref (caps);
2269 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
2271 g_return_if_fail (G_IS_VALUE (src_value));
2272 g_return_if_fail (G_IS_VALUE (dest_value));
2273 g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
2274 g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
2275 || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
2277 g_value_take_string (dest_value,
2278 gst_caps_to_string (gst_value_get_caps (src_value)));