2 * Copyright (C) <2003> David A. Schleef <ds@schleef.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
22 * @short_description: Structure describing sets of media formats
23 * @see_also: #GstStructure
25 * Caps (capabilities) are lighweight refcounted objects describing media types.
26 * They are composed of an array of #GstStructure.
28 * Caps are exposed on #GstPadTemplate to describe all possible types a
29 * given pad can handle. They are also stored in the #GstRegistry along with
30 * a description of the #GstElement.
32 * Caps are exposed on the element pads using the gst_pad_get_caps() pad
33 * function. This function describes the possible types that the pad can
34 * handle or produce at runtime.
36 * Caps are also attached to buffers to describe to content of the data
37 * pointed to by the buffer with gst_buffer_set_caps(). Caps attached to
38 * a #GstBuffer allow for format negotiation upstream and downstream.
40 * A #GstCaps can be constructed with the following code fragment:
43 * <title>Creating caps</title>
46 * caps = gst_caps_new_simple ("video/x-raw",
47 * "format", G_TYPE_STRING, "I420"),
48 * "framerate", GST_TYPE_FRACTION, 25, 1,
49 * "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
50 * "width", G_TYPE_INT, 320,
51 * "height", G_TYPE_INT, 240,
56 * A #GstCaps is fixed when it has no properties with ranges or lists. Use
57 * gst_caps_is_fixed() to test for fixed caps. Only fixed caps can be
58 * set on a #GstPad or #GstBuffer.
60 * Various methods exist to work with the media types such as subtracting
63 * Last reviewed on 2007-02-13 (0.10.10)
72 #include "gst_private.h"
74 #include <gobject/gvaluecollector.h>
76 #define DEBUG_REFCOUNT
79 #define GST_CAPS_ARRAY(c) ((GPtrArray *)((c)->priv))
81 #define GST_CAPS_LEN(c) (GST_CAPS_ARRAY(c)->len)
83 #define IS_WRITABLE(caps) \
84 (GST_CAPS_REFCOUNT_VALUE (caps) == 1)
86 /* same as gst_caps_is_any () */
87 #define CAPS_IS_ANY(caps) \
88 (GST_CAPS_FLAGS(caps) & GST_CAPS_FLAGS_ANY)
90 /* same as gst_caps_is_empty () */
91 #define CAPS_IS_EMPTY(caps) \
92 (!CAPS_IS_ANY(caps) && CAPS_IS_EMPTY_SIMPLE(caps))
94 #define CAPS_IS_EMPTY_SIMPLE(caps) \
95 ((GST_CAPS_ARRAY (caps) == NULL) || (GST_CAPS_LEN (caps) == 0))
97 /* quick way to get a caps structure at an index without doing a type or array
99 #define gst_caps_get_structure_unchecked(caps, index) \
100 ((GstStructure *)g_ptr_array_index (GST_CAPS_ARRAY (caps), (index)))
101 /* quick way to append a structure without checking the args */
102 #define gst_caps_append_structure_unchecked(caps, structure) G_STMT_START{\
103 GstStructure *__s=structure; \
104 if (gst_structure_set_parent_refcount (__s, &GST_MINI_OBJECT_REFCOUNT(caps))) \
105 g_ptr_array_add (GST_CAPS_ARRAY (caps), __s); \
108 /* lock to protect multiple invocations of static caps to caps conversion */
109 G_LOCK_DEFINE_STATIC (static_caps_lock);
111 static void gst_caps_transform_to_string (const GValue * src_value,
112 GValue * dest_value);
113 static gboolean gst_caps_from_string_inplace (GstCaps * caps,
114 const gchar * string);
116 GType _gst_caps_type = 0;
118 GST_DEFINE_MINI_OBJECT_TYPE (GstCaps, gst_caps);
121 _priv_gst_caps_initialize (void)
123 _gst_caps_type = gst_caps_get_type ();
125 g_value_register_transform_func (_gst_caps_type,
126 G_TYPE_STRING, gst_caps_transform_to_string);
130 _gst_caps_copy (const GstCaps * caps)
133 GstStructure *structure;
136 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
138 newcaps = gst_caps_new_empty ();
139 GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
140 n = GST_CAPS_LEN (caps);
142 for (i = 0; i < n; i++) {
143 structure = gst_caps_get_structure_unchecked (caps, i);
144 gst_caps_append_structure (newcaps, gst_structure_copy (structure));
150 /* creation/deletion */
152 _gst_caps_free (GstCaps * caps)
154 GstStructure *structure;
157 /* The refcount must be 0, but since we're only called by gst_caps_unref,
158 * don't bother testing. */
159 len = GST_CAPS_LEN (caps);
160 /* This can be used to get statistics about caps sizes */
161 /*GST_CAT_INFO (GST_CAT_CAPS, "caps size: %d", len); */
162 for (i = 0; i < len; i++) {
163 structure = (GstStructure *) gst_caps_get_structure_unchecked (caps, i);
164 gst_structure_set_parent_refcount (structure, NULL);
165 gst_structure_free (structure);
167 g_ptr_array_free (GST_CAPS_ARRAY (caps), TRUE);
169 #ifdef DEBUG_REFCOUNT
170 GST_CAT_LOG (GST_CAT_CAPS, "freeing caps %p", caps);
172 g_slice_free1 (GST_MINI_OBJECT_SIZE (caps), caps);
176 gst_caps_init (GstCaps * caps, gsize size)
178 gst_mini_object_init (GST_MINI_OBJECT_CAST (caps), _gst_caps_type, size);
180 caps->mini_object.copy = (GstMiniObjectCopyFunction) _gst_caps_copy;
181 caps->mini_object.dispose = NULL;
182 caps->mini_object.free = (GstMiniObjectFreeFunction) _gst_caps_free;
184 /* the 32 has been determined by logging caps sizes in _gst_caps_free
185 * but g_ptr_array uses 16 anyway if it expands once, so this does not help
187 * GST_CAPS_ARRAY (caps) = g_ptr_array_sized_new (32);
189 caps->priv = g_ptr_array_new ();
193 * gst_caps_new_empty:
195 * Creates a new #GstCaps that is empty. That is, the returned
196 * #GstCaps contains no media formats.
197 * Caller is responsible for unreffing the returned caps.
199 * Returns: (transfer full): the new #GstCaps
202 gst_caps_new_empty (void)
206 caps = g_slice_new (GstCaps);
208 gst_caps_init (caps, sizeof (GstCaps));
210 #ifdef DEBUG_REFCOUNT
211 GST_CAT_TRACE (GST_CAT_CAPS, "created caps %p", caps);
220 * Creates a new #GstCaps that indicates that it is compatible with
223 * Returns: (transfer full): the new #GstCaps
226 gst_caps_new_any (void)
228 GstCaps *caps = gst_caps_new_empty ();
230 GST_CAPS_FLAG_SET (caps, GST_CAPS_FLAGS_ANY);
236 * gst_caps_new_simple:
237 * @media_type: the media type of the structure
238 * @fieldname: first field to set
239 * @...: additional arguments
241 * Creates a new #GstCaps that contains one #GstStructure. The
242 * structure is defined by the arguments, which have the same format
243 * as gst_structure_new().
244 * Caller is responsible for unreffing the returned caps.
246 * Returns: (transfer full): the new #GstCaps
249 gst_caps_new_simple (const char *media_type, const char *fieldname, ...)
252 GstStructure *structure;
255 caps = gst_caps_new_empty ();
257 va_start (var_args, fieldname);
258 structure = gst_structure_new_valist (media_type, fieldname, var_args);
262 gst_caps_append_structure_unchecked (caps, structure);
264 gst_caps_replace (&caps, NULL);
271 * @struct1: the first structure to add
272 * @...: additional structures to add
274 * Creates a new #GstCaps and adds all the structures listed as
275 * arguments. The list must be NULL-terminated. The structures
276 * are not copied; the returned #GstCaps owns the structures.
278 * Returns: (transfer full): the new #GstCaps
281 gst_caps_new_full (GstStructure * struct1, ...)
286 va_start (var_args, struct1);
287 caps = gst_caps_new_full_valist (struct1, var_args);
294 * gst_caps_new_full_valist:
295 * @structure: the first structure to add
296 * @var_args: additional structures to add
298 * Creates a new #GstCaps and adds all the structures listed as
299 * arguments. The list must be NULL-terminated. The structures
300 * are not copied; the returned #GstCaps owns the structures.
302 * Returns: (transfer full): the new #GstCaps
305 gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
309 caps = gst_caps_new_empty ();
312 gst_caps_append_structure_unchecked (caps, structure);
313 structure = va_arg (var_args, GstStructure *);
320 gst_static_caps_get_type (void)
322 static GType staticcaps_type = 0;
324 if (G_UNLIKELY (staticcaps_type == 0)) {
325 staticcaps_type = g_pointer_type_register_static ("GstStaticCaps");
327 return staticcaps_type;
332 * gst_static_caps_get:
333 * @static_caps: the #GstStaticCaps to convert
335 * Converts a #GstStaticCaps to a #GstCaps.
337 * Returns: (transfer full): a pointer to the #GstCaps. Unref after usage.
338 * Since the core holds an additional ref to the returned caps,
339 * use gst_caps_make_writable() on the returned caps to modify it.
342 gst_static_caps_get (GstStaticCaps * static_caps)
346 g_return_val_if_fail (static_caps != NULL, NULL);
348 caps = (GstCaps *) static_caps;
350 /* refcount is 0 when we need to convert */
351 if (G_UNLIKELY (GST_CAPS_REFCOUNT_VALUE (caps) == 0)) {
355 G_LOCK (static_caps_lock);
356 /* check if other thread already updated */
357 if (G_UNLIKELY (GST_CAPS_REFCOUNT_VALUE (caps) > 0))
360 string = static_caps->string;
362 if (G_UNLIKELY (string == NULL))
365 GST_CAT_TRACE (GST_CAT_CAPS, "creating %p", static_caps);
367 /* we construct the caps on the stack, then copy over the struct into our
368 * real caps, refcount last. We do this because we must leave the refcount
369 * of the result caps to 0 so that other threads don't run away with the
370 * caps while we are constructing it. */
371 gst_caps_init (&temp, sizeof (GstCaps));
373 /* convert to string */
374 if (G_UNLIKELY (!gst_caps_from_string_inplace (&temp, string)))
375 g_critical ("Could not convert static caps \"%s\"", string);
377 GST_MINI_OBJECT_REFCOUNT (&temp) = 0;
378 memcpy (caps, &temp, sizeof (GstCaps));
381 GST_CAT_TRACE (GST_CAT_CAPS, "created %p", static_caps);
383 G_UNLOCK (static_caps_lock);
385 /* ref the caps, makes it not writable */
393 G_UNLOCK (static_caps_lock);
394 g_warning ("static caps %p string is NULL", static_caps);
400 * gst_static_caps_cleanup:
401 * @static_caps: the #GstStaticCaps to convert
403 * Clean up the caps contained in @static_caps when the refcount is 0.
406 gst_static_caps_cleanup (GstStaticCaps * static_caps)
408 GstCaps *caps = (GstCaps *) static_caps;
410 /* FIXME: this is not threadsafe */
411 if (GST_CAPS_REFCOUNT_VALUE (caps) == 1) {
412 GstStructure *structure;
415 clen = GST_CAPS_LEN (caps);
417 for (i = 0; i < clen; i++) {
418 structure = (GstStructure *) gst_caps_get_structure (caps, i);
419 gst_structure_set_parent_refcount (structure, NULL);
420 gst_structure_free (structure);
422 g_ptr_array_free (GST_CAPS_ARRAY (caps), TRUE);
423 GST_CAPS_REFCOUNT (caps) = 0;
429 static GstStructure *
430 gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
432 /* don't use index_fast, gst_caps_do_simplify relies on the order */
433 GstStructure *s = g_ptr_array_remove_index (GST_CAPS_ARRAY (caps), idx);
435 gst_structure_set_parent_refcount (s, NULL);
440 * gst_caps_steal_structure:
441 * @caps: the #GstCaps to retrieve from
442 * @index: Index of the structure to retrieve
444 * Retrieves the stucture with the given index from the list of structures
445 * contained in @caps. The caller becomes the owner of the returned structure.
447 * Returns: (transfer full): a pointer to the #GstStructure corresponding
453 gst_caps_steal_structure (GstCaps * caps, guint index)
455 g_return_val_if_fail (caps != NULL, NULL);
456 g_return_val_if_fail (IS_WRITABLE (caps), NULL);
458 if (G_UNLIKELY (index >= GST_CAPS_LEN (caps)))
461 return gst_caps_remove_and_get_structure (caps, index);
466 * @caps1: the #GstCaps that will be appended to
467 * @caps2: (transfer full): the #GstCaps to append
469 * Appends the structures contained in @caps2 to @caps1. The structures in
470 * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
471 * freed. If either caps is ANY, the resulting caps will be ANY.
474 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
476 GstStructure *structure;
479 g_return_if_fail (GST_IS_CAPS (caps1));
480 g_return_if_fail (GST_IS_CAPS (caps2));
481 g_return_if_fail (IS_WRITABLE (caps1));
483 caps2 = gst_caps_make_writable (caps2);
485 if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))) {
486 /* FIXME: this leaks */
487 GST_CAPS_FLAGS (caps1) |= GST_CAPS_FLAGS_ANY;
488 for (i = GST_CAPS_LEN (caps2) - 1; i >= 0; i--) {
489 structure = gst_caps_remove_and_get_structure (caps2, i);
490 gst_structure_free (structure);
493 for (i = GST_CAPS_LEN (caps2); i; i--) {
494 structure = gst_caps_remove_and_get_structure (caps2, 0);
495 gst_caps_append_structure_unchecked (caps1, structure);
498 gst_caps_unref (caps2); /* guaranteed to free it */
503 * @caps1: the #GstCaps that will take the new entries
504 * @caps2: (transfer full): the #GstCaps to merge in
506 * Appends the structures contained in @caps2 to @caps1 if they are not yet
507 * expressed by @caps1. The structures in @caps2 are not copied -- they are
508 * transferred to @caps1, and then @caps2 is freed.
509 * If either caps is ANY, the resulting caps will be ANY.
514 gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
516 GstStructure *structure;
519 g_return_if_fail (GST_IS_CAPS (caps1));
520 g_return_if_fail (GST_IS_CAPS (caps2));
521 g_return_if_fail (IS_WRITABLE (caps1));
523 caps2 = gst_caps_make_writable (caps2);
525 if (G_UNLIKELY (CAPS_IS_ANY (caps1))) {
526 for (i = GST_CAPS_LEN (caps2) - 1; i >= 0; i--) {
527 structure = gst_caps_remove_and_get_structure (caps2, i);
528 gst_structure_free (structure);
530 } else if (G_UNLIKELY (CAPS_IS_ANY (caps2))) {
531 GST_CAPS_FLAGS (caps1) |= GST_CAPS_FLAGS_ANY;
532 for (i = GST_CAPS_LEN (caps1) - 1; i >= 0; i--) {
533 structure = gst_caps_remove_and_get_structure (caps1, i);
534 gst_structure_free (structure);
537 for (i = GST_CAPS_LEN (caps2); i; i--) {
538 structure = gst_caps_remove_and_get_structure (caps2, 0);
539 gst_caps_merge_structure (caps1, structure);
542 GstCaps *com = gst_caps_intersect (caps1, caps2);
543 GstCaps *add = gst_caps_subtract (caps2, com);
545 GST_DEBUG ("common : %d", gst_caps_get_size (com));
546 GST_DEBUG ("adding : %d", gst_caps_get_size (add));
547 gst_caps_append (caps1, add);
548 gst_caps_unref (com);
551 gst_caps_unref (caps2); /* guaranteed to free it */
555 * gst_caps_append_structure:
556 * @caps: the #GstCaps that will be appended to
557 * @structure: (transfer full): the #GstStructure to append
559 * Appends @structure to @caps. The structure is not copied; @caps
560 * becomes the owner of @structure.
563 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
565 g_return_if_fail (GST_IS_CAPS (caps));
566 g_return_if_fail (IS_WRITABLE (caps));
568 if (G_LIKELY (structure)) {
569 gst_caps_append_structure_unchecked (caps, structure);
574 * gst_caps_remove_structure:
575 * @caps: the #GstCaps to remove from
576 * @idx: Index of the structure to remove
578 * removes the stucture with the given index from the list of structures
579 * contained in @caps.
582 gst_caps_remove_structure (GstCaps * caps, guint idx)
584 GstStructure *structure;
586 g_return_if_fail (caps != NULL);
587 g_return_if_fail (idx <= gst_caps_get_size (caps));
588 g_return_if_fail (IS_WRITABLE (caps));
590 structure = gst_caps_remove_and_get_structure (caps, idx);
591 gst_structure_free (structure);
595 * gst_caps_merge_structure:
596 * @caps: the #GstCaps that will the new structure
597 * @structure: (transfer full): the #GstStructure to merge
599 * Appends @structure to @caps if its not already expressed by @caps. The
600 * structure is not copied; @caps becomes the owner of @structure.
603 gst_caps_merge_structure (GstCaps * caps, GstStructure * structure)
605 g_return_if_fail (GST_IS_CAPS (caps));
606 g_return_if_fail (IS_WRITABLE (caps));
608 if (G_LIKELY (structure)) {
609 GstStructure *structure1;
611 gboolean unique = TRUE;
613 /* check each structure */
614 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
615 structure1 = gst_caps_get_structure_unchecked (caps, i);
616 /* if structure is a subset of structure1, then skip it */
617 if (gst_structure_is_subset (structure, structure1)) {
623 gst_caps_append_structure_unchecked (caps, structure);
625 gst_structure_free (structure);
634 * Gets the number of structures contained in @caps.
636 * Returns: the number of structures that @caps contains
639 gst_caps_get_size (const GstCaps * caps)
641 g_return_val_if_fail (GST_IS_CAPS (caps), 0);
643 return GST_CAPS_LEN (caps);
647 * gst_caps_get_structure:
649 * @index: the index of the structure
651 * Finds the structure in @caps that has the index @index, and
654 * WARNING: This function takes a const GstCaps *, but returns a
655 * non-const GstStructure *. This is for programming convenience --
656 * the caller should be aware that structures inside a constant
657 * #GstCaps should not be modified. However, if you know the caps
658 * are writable, either because you have just copied them or made
659 * them writable with gst_caps_make_writable(), you may modify the
660 * structure returned in the usual way, e.g. with functions like
661 * gst_structure_set().
663 * You do not need to free or unref the structure returned, it
664 * belongs to the #GstCaps.
666 * Returns: (transfer none): a pointer to the #GstStructure corresponding
670 gst_caps_get_structure (const GstCaps * caps, guint index)
672 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
673 g_return_val_if_fail (index < GST_CAPS_LEN (caps), NULL);
675 return gst_caps_get_structure_unchecked (caps, index);
680 * @caps: the #GstCaps to copy
681 * @nth: the nth structure to copy
683 * Creates a new #GstCaps and appends a copy of the nth structure
684 * contained in @caps.
686 * Returns: (transfer full): the new #GstCaps
689 gst_caps_copy_nth (const GstCaps * caps, guint nth)
692 GstStructure *structure;
694 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
696 newcaps = gst_caps_new_empty ();
697 GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
699 if (G_LIKELY (GST_CAPS_LEN (caps) > nth)) {
700 structure = gst_caps_get_structure_unchecked (caps, nth);
701 gst_caps_append_structure_unchecked (newcaps,
702 gst_structure_copy (structure));
710 * @caps: the #GstCaps to truncate
712 * Destructively discard all but the first structure from @caps. Useful when
713 * fixating. @caps must be writable.
716 gst_caps_truncate (GstCaps * caps)
720 g_return_if_fail (GST_IS_CAPS (caps));
721 g_return_if_fail (IS_WRITABLE (caps));
723 i = GST_CAPS_LEN (caps) - 1;
726 gst_caps_remove_structure (caps, i--);
730 * gst_caps_set_value:
731 * @caps: a writable caps
732 * @field: name of the field to set
733 * @value: value to set the field to
735 * Sets the given @field on all structures of @caps to the given @value.
736 * This is a convenience function for calling gst_structure_set_value() on
737 * all structures of @caps.
742 gst_caps_set_value (GstCaps * caps, const char *field, const GValue * value)
746 g_return_if_fail (GST_IS_CAPS (caps));
747 g_return_if_fail (IS_WRITABLE (caps));
748 g_return_if_fail (field != NULL);
749 g_return_if_fail (G_IS_VALUE (value));
751 len = GST_CAPS_LEN (caps);
752 for (i = 0; i < len; i++) {
753 GstStructure *structure = gst_caps_get_structure_unchecked (caps, i);
754 gst_structure_set_value (structure, field, value);
759 * gst_caps_set_simple_valist:
760 * @caps: the #GstCaps to set
761 * @field: first field to set
762 * @varargs: additional parameters
764 * Sets fields in a #GstCaps. The arguments must be passed in the same
765 * manner as gst_structure_set(), and be NULL-terminated.
766 * <note>Prior to GStreamer version 0.10.26, this function failed when
767 * @caps was not simple. If your code needs to work with those versions
768 * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
769 * is %TRUE for @caps.</note>
772 gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs)
774 GValue value = { 0, };
776 g_return_if_fail (GST_IS_CAPS (caps));
777 g_return_if_fail (IS_WRITABLE (caps));
783 type = va_arg (varargs, GType);
785 if (G_UNLIKELY (type == G_TYPE_DATE)) {
786 g_warning ("Don't use G_TYPE_DATE, use GST_TYPE_DATE instead\n");
787 type = GST_TYPE_DATE;
789 G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
790 if (G_UNLIKELY (err)) {
791 g_critical ("%s", err);
795 gst_caps_set_value (caps, field, &value);
797 g_value_unset (&value);
799 field = va_arg (varargs, const gchar *);
804 * gst_caps_set_simple:
805 * @caps: the #GstCaps to set
806 * @field: first field to set
807 * @...: additional parameters
809 * Sets fields in a #GstCaps. The arguments must be passed in the same
810 * manner as gst_structure_set(), and be NULL-terminated.
811 * <note>Prior to GStreamer version 0.10.26, this function failed when
812 * @caps was not simple. If your code needs to work with those versions
813 * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
814 * is %TRUE for @caps.</note>
817 gst_caps_set_simple (GstCaps * caps, const char *field, ...)
821 g_return_if_fail (GST_IS_CAPS (caps));
822 g_return_if_fail (IS_WRITABLE (caps));
824 va_start (var_args, field);
825 gst_caps_set_simple_valist (caps, field, var_args);
833 * @caps: the #GstCaps to test
835 * Determines if @caps represents any media format.
837 * Returns: TRUE if @caps represents any format.
840 gst_caps_is_any (const GstCaps * caps)
842 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
844 return (CAPS_IS_ANY (caps));
849 * @caps: the #GstCaps to test
851 * Determines if @caps represents no media formats.
853 * Returns: TRUE if @caps represents no formats.
856 gst_caps_is_empty (const GstCaps * caps)
858 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
860 if (CAPS_IS_ANY (caps))
863 return CAPS_IS_EMPTY_SIMPLE (caps);
867 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
870 return gst_value_is_fixed (value);
875 * @caps: the #GstCaps to test
877 * Fixed #GstCaps describe exactly one format, that is, they have exactly
878 * one structure, and each field in the structure describes a fixed type.
879 * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
881 * Returns: TRUE if @caps is fixed
884 gst_caps_is_fixed (const GstCaps * caps)
886 GstStructure *structure;
888 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
890 if (GST_CAPS_LEN (caps) != 1)
893 structure = gst_caps_get_structure_unchecked (caps, 0);
895 return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
899 * gst_caps_is_equal_fixed:
900 * @caps1: the #GstCaps to test
901 * @caps2: the #GstCaps to test
903 * Tests if two #GstCaps are equal. This function only works on fixed
906 * Returns: TRUE if the arguments represent the same format
909 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
911 GstStructure *struct1, *struct2;
913 g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
914 g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
916 struct1 = gst_caps_get_structure_unchecked (caps1, 0);
917 struct2 = gst_caps_get_structure_unchecked (caps2, 0);
919 return gst_structure_is_equal (struct1, struct2);
923 * gst_caps_is_always_compatible:
924 * @caps1: the #GstCaps to test
925 * @caps2: the #GstCaps to test
927 * A given #GstCaps structure is always compatible with another if
928 * every media format that is in the first is also contained in the
929 * second. That is, @caps1 is a subset of @caps2.
931 * Returns: TRUE if @caps1 is a subset of @caps2.
934 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
936 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
937 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
939 return gst_caps_is_subset (caps1, caps2);
943 * gst_caps_is_subset:
944 * @subset: a #GstCaps
945 * @superset: a potentially greater #GstCaps
947 * Checks if all caps represented by @subset are also represented by @superset.
948 * <note>This function does not work reliably if optional properties for caps
949 * are included on one caps and omitted on the other.</note>
951 * Returns: %TRUE if @subset is a subset of @superset
954 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
956 GstStructure *s1, *s2;
960 g_return_val_if_fail (subset != NULL, FALSE);
961 g_return_val_if_fail (superset != NULL, FALSE);
963 if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
965 if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
968 for (i = GST_CAPS_LEN (subset) - 1; i >= 0; i--) {
969 for (j = GST_CAPS_LEN (superset) - 1; j >= 0; j--) {
970 s1 = gst_caps_get_structure_unchecked (subset, i);
971 s2 = gst_caps_get_structure_unchecked (superset, j);
972 if (gst_structure_is_subset (s1, s2)) {
973 /* If we found a superset, continue with the next
974 * subset structure */
978 /* If we found no superset for this subset structure
979 * we return FALSE immediately */
990 * gst_caps_is_subset_structure:
992 * @structure: a potential #GstStructure subset of @caps
994 * Checks if @structure is a subset of @caps. See gst_caps_is_subset()
995 * for more information.
997 * Returns: %TRUE if @structure is a subset of @caps
1002 gst_caps_is_subset_structure (const GstCaps * caps,
1003 const GstStructure * structure)
1008 g_return_val_if_fail (caps != NULL, FALSE);
1009 g_return_val_if_fail (structure != NULL, FALSE);
1011 if (CAPS_IS_ANY (caps))
1013 if (CAPS_IS_EMPTY (caps))
1016 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
1017 s = gst_caps_get_structure_unchecked (caps, i);
1018 if (gst_structure_is_subset (structure, s)) {
1019 /* If we found a superset return TRUE */
1028 * gst_caps_is_equal:
1029 * @caps1: a #GstCaps
1030 * @caps2: another #GstCaps
1032 * Checks if the given caps represent the same set of caps.
1033 * <note>This function does not work reliably if optional properties for caps
1034 * are included on one caps and omitted on the other.</note>
1036 * This function deals correctly with passing NULL for any of the caps.
1038 * Returns: TRUE if both caps are equal.
1041 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
1043 /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
1044 * So there should be an assertion that caps1 and caps2 != NULL */
1046 /* NULL <-> NULL is allowed here */
1047 if (G_UNLIKELY (caps1 == caps2))
1050 /* one of them NULL => they are different (can't be both NULL because
1051 * we checked that above) */
1052 if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
1055 if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
1056 return gst_caps_is_equal_fixed (caps1, caps2);
1058 return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1061 /* intersect operation */
1064 * gst_caps_can_intersect:
1065 * @caps1: a #GstCaps to intersect
1066 * @caps2: a #GstCaps to intersect
1068 * Tries intersecting @caps1 and @caps2 and reports whether the result would not
1071 * Returns: %TRUE if intersection would be not empty
1076 gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
1078 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1079 guint j, k, len1, len2;
1080 GstStructure *struct1;
1081 GstStructure *struct2;
1083 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1084 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1086 /* caps are exactly the same pointers */
1087 if (G_UNLIKELY (caps1 == caps2))
1090 /* empty caps on either side, return empty */
1091 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1094 /* one of the caps is any */
1095 if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
1098 /* run zigzag on top line then right line, this preserves the caps order
1099 * much better than a simple loop.
1101 * This algorithm zigzags over the caps structures as demonstrated in
1102 * the folowing matrix:
1105 * +------------- total distance: +-------------
1106 * | 1 2 4 7 0 | 0 1 2 3
1107 * caps2 | 3 5 8 10 1 | 1 2 3 4
1108 * | 6 9 11 12 2 | 2 3 4 5
1110 * First we iterate over the caps1 structures (top line) intersecting
1111 * the structures diagonally down, then we iterate over the caps2
1112 * structures. The result is that the intersections are ordered based on the
1113 * sum of the indexes in the list.
1115 len1 = GST_CAPS_LEN (caps1);
1116 len2 = GST_CAPS_LEN (caps2);
1117 for (i = 0; i < len1 + len2 - 1; i++) {
1118 /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */
1119 j = MIN (i, len1 - 1);
1120 /* subset index stays 0 until i reaches superset->structs->len, then it
1121 * counts up from 1 to subset->structs->len - 1 */
1122 k = (i > j) ? (i - j) : 0; /* MAX (0, i - j) */
1124 /* now run the diagonal line, end condition is the left or bottom
1127 struct1 = gst_caps_get_structure_unchecked (caps1, j);
1128 struct2 = gst_caps_get_structure_unchecked (caps2, k);
1130 if (gst_structure_can_intersect (struct1, struct2)) {
1133 /* move down left */
1135 if (G_UNLIKELY (j == 0))
1136 break; /* so we don't roll back to G_MAXUINT */
1144 gst_caps_intersect_zig_zag (const GstCaps * caps1, const GstCaps * caps2)
1146 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1147 guint j, k, len1, len2;
1149 GstStructure *struct1;
1150 GstStructure *struct2;
1152 GstStructure *istruct;
1154 /* caps are exactly the same pointers, just copy one caps */
1155 if (G_UNLIKELY (caps1 == caps2))
1156 return _gst_caps_copy (caps1);
1158 /* empty caps on either side, return empty */
1159 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1160 return gst_caps_new_empty ();
1162 /* one of the caps is any, just copy the other caps */
1163 if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1164 return _gst_caps_copy (caps2);
1165 if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1166 return _gst_caps_copy (caps1);
1168 dest = gst_caps_new_empty ();
1170 /* run zigzag on top line then right line, this preserves the caps order
1171 * much better than a simple loop.
1173 * This algorithm zigzags over the caps structures as demonstrated in
1174 * the folowing matrix:
1182 * First we iterate over the caps1 structures (top line) intersecting
1183 * the structures diagonally down, then we iterate over the caps2
1186 len1 = GST_CAPS_LEN (caps1);
1187 len2 = GST_CAPS_LEN (caps2);
1188 for (i = 0; i < len1 + len2 - 1; i++) {
1189 /* caps1 index goes from 0 to GST_CAPS_LEN (caps1)-1 */
1190 j = MIN (i, len1 - 1);
1191 /* caps2 index stays 0 until i reaches GST_CAPS_LEN (caps1), then it counts
1192 * up from 1 to GST_CAPS_LEN (caps2) - 1 */
1193 k = (i > j) ? (i - j) : 0; /* MAX (0, i - j) */
1195 /* now run the diagonal line, end condition is the left or bottom
1198 struct1 = gst_caps_get_structure_unchecked (caps1, j);
1199 struct2 = gst_caps_get_structure_unchecked (caps2, k);
1201 istruct = gst_structure_intersect (struct1, struct2);
1203 gst_caps_merge_structure (dest, istruct);
1204 /* move down left */
1206 if (G_UNLIKELY (j == 0))
1207 break; /* so we don't roll back to G_MAXUINT */
1215 * gst_caps_intersect_first:
1216 * @caps1: a #GstCaps to intersect
1217 * @caps2: a #GstCaps to intersect
1219 * Creates a new #GstCaps that contains all the formats that are common
1220 * to both @caps1 and @caps2.
1222 * Unlike @gst_caps_intersect, the returned caps will be ordered in a similar
1223 * fashion as @caps1.
1225 * Returns: the new #GstCaps
1228 gst_caps_intersect_first (const GstCaps * caps1, const GstCaps * caps2)
1230 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1231 guint j, len1, len2;
1233 GstStructure *struct1;
1234 GstStructure *struct2;
1236 GstStructure *istruct;
1238 /* caps are exactly the same pointers, just copy one caps */
1239 if (G_UNLIKELY (caps1 == caps2))
1240 return gst_caps_copy (caps1);
1242 /* empty caps on either side, return empty */
1243 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1244 return gst_caps_new_empty ();
1246 /* one of the caps is any, just copy the other caps */
1247 if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1248 return gst_caps_copy (caps2);
1249 if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1250 return gst_caps_copy (caps1);
1252 dest = gst_caps_new_empty ();
1254 len1 = GST_CAPS_LEN (caps1);
1255 len2 = GST_CAPS_LEN (caps2);
1256 for (i = 0; i < len1; i++) {
1257 struct1 = gst_caps_get_structure_unchecked (caps1, i);
1258 for (j = 0; j < len2; j++) {
1259 struct2 = gst_caps_get_structure_unchecked (caps2, j);
1260 istruct = gst_structure_intersect (struct1, struct2);
1262 gst_caps_merge_structure (dest, istruct);
1270 * gst_caps_intersect_full:
1271 * @caps1: a #GstCaps to intersect
1272 * @caps2: a #GstCaps to intersect
1273 * @mode: The intersection algorithm/mode to use
1275 * Creates a new #GstCaps that contains all the formats that are common
1276 * to both @caps1 and @caps2, the order is defined by the #GstCapsIntersectMode
1279 * Returns: the new #GstCaps
1283 gst_caps_intersect_full (const GstCaps * caps1, const GstCaps * caps2,
1284 GstCapsIntersectMode mode)
1286 g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1287 g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1290 case GST_CAPS_INTERSECT_FIRST:
1291 return gst_caps_intersect_first (caps1, caps2);
1293 g_warning ("Unknown caps intersect mode: %d", mode);
1295 case GST_CAPS_INTERSECT_ZIG_ZAG:
1296 return gst_caps_intersect_zig_zag (caps1, caps2);
1301 * gst_caps_intersect:
1302 * @caps1: a #GstCaps to intersect
1303 * @caps2: a #GstCaps to intersect
1305 * Creates a new #GstCaps that contains all the formats that are common
1306 * to both @caps1 and @caps2. Defaults to %GST_CAPS_INTERSECT_ZIG_ZAG mode.
1308 * Returns: the new #GstCaps
1311 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1313 return gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_ZIG_ZAG);
1317 /* subtract operation */
1321 const GstStructure *subtract_from;
1327 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1330 SubtractionEntry *e = user_data;
1331 GValue subtraction = { 0, };
1332 const GValue *other;
1333 GstStructure *structure;
1335 other = gst_structure_id_get_value (e->subtract_from, field_id);
1339 if (!gst_value_subtract (&subtraction, other, value))
1341 if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1342 g_value_unset (&subtraction);
1345 structure = gst_structure_copy (e->subtract_from);
1346 gst_structure_id_set_value (structure, field_id, &subtraction);
1347 g_value_unset (&subtraction);
1348 e->put_into = g_slist_prepend (e->put_into, structure);
1354 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1355 const GstStructure * subtrahend)
1360 e.subtract_from = minuend;
1363 ret = gst_structure_foreach ((GstStructure *) subtrahend,
1364 gst_caps_structure_subtract_field, &e);
1370 for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1371 gst_structure_free (walk->data);
1373 g_slist_free (e.put_into);
1379 * gst_caps_subtract:
1380 * @minuend: #GstCaps to subtract from
1381 * @subtrahend: #GstCaps to subtract
1383 * Subtracts the @subtrahend from the @minuend.
1384 * <note>This function does not work reliably if optional properties for caps
1385 * are included on one caps and omitted on the other.</note>
1387 * Returns: the resulting caps
1390 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1395 GstCaps *dest = NULL, *src;
1397 g_return_val_if_fail (minuend != NULL, NULL);
1398 g_return_val_if_fail (subtrahend != NULL, NULL);
1400 if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
1401 return gst_caps_new_empty ();
1403 if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
1404 return _gst_caps_copy (minuend);
1406 /* FIXME: Do we want this here or above?
1407 The reason we need this is that there is no definition about what
1408 ANY means for specific types, so it's not possible to reduce ANY partially
1409 You can only remove everything or nothing and that is done above.
1410 Note: there's a test that checks this behaviour. */
1411 g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
1412 sublen = GST_CAPS_LEN (subtrahend);
1413 g_assert (sublen > 0);
1415 src = _gst_caps_copy (minuend);
1416 for (i = 0; i < sublen; i++) {
1419 sub = gst_caps_get_structure_unchecked (subtrahend, i);
1421 gst_caps_unref (src);
1424 dest = gst_caps_new_empty ();
1425 srclen = GST_CAPS_LEN (src);
1426 for (j = 0; j < srclen; j++) {
1427 min = gst_caps_get_structure_unchecked (src, j);
1428 if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1431 if (gst_caps_structure_subtract (&list, min, sub)) {
1434 for (walk = list; walk; walk = g_slist_next (walk)) {
1435 gst_caps_append_structure_unchecked (dest,
1436 (GstStructure *) walk->data);
1438 g_slist_free (list);
1440 gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1443 gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1446 if (CAPS_IS_EMPTY_SIMPLE (dest)) {
1447 gst_caps_unref (src);
1452 gst_caps_unref (src);
1453 gst_caps_do_simplify (dest);
1457 /* union operation */
1460 static GstStructure *
1461 gst_caps_structure_union (const GstStructure * struct1,
1462 const GstStructure * struct2)
1466 const GstStructureField *field1;
1467 const GstStructureField *field2;
1470 /* FIXME this doesn't actually work */
1472 if (struct1->name != struct2->name)
1475 dest = gst_structure_id_empty_new (struct1->name);
1477 for (i = 0; i < struct1->fields->len; i++) {
1478 GValue dest_value = { 0 };
1480 field1 = GST_STRUCTURE_FIELD (struct1, i);
1481 field2 = gst_structure_id_get_field (struct2, field1->name);
1483 if (field2 == NULL) {
1486 if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1487 gst_structure_set_value (dest, g_quark_to_string (field1->name),
1490 ret = gst_value_compare (&field1->value, &field2->value);
1501 * @caps1: a #GstCaps to union
1502 * @caps2: a #GstCaps to union
1504 * Creates a new #GstCaps that contains all the formats that are in
1505 * either @caps1 and @caps2.
1507 * Returns: the new #GstCaps
1510 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1515 /* NULL pointers are no correct GstCaps */
1516 g_return_val_if_fail (caps1 != NULL, NULL);
1517 g_return_val_if_fail (caps2 != NULL, NULL);
1519 if (CAPS_IS_EMPTY (caps1))
1520 return _gst_caps_copy (caps2);
1522 if (CAPS_IS_EMPTY (caps2))
1523 return _gst_caps_copy (caps1);
1525 if (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))
1526 return gst_caps_new_any ();
1528 dest1 = _gst_caps_copy (caps1);
1529 dest2 = _gst_caps_copy (caps2);
1530 gst_caps_append (dest1, dest2);
1532 gst_caps_do_simplify (dest1);
1536 /* normalize/simplify operations */
1538 typedef struct _NormalizeForeach
1541 GstStructure *structure;
1546 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1548 NormalizeForeach *nf = (NormalizeForeach *) ptr;
1552 if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1553 guint len = gst_value_list_get_size (value);
1554 for (i = 1; i < len; i++) {
1555 const GValue *v = gst_value_list_get_value (value, i);
1556 GstStructure *structure = gst_structure_copy (nf->structure);
1558 gst_structure_id_set_value (structure, field_id, v);
1559 gst_caps_append_structure_unchecked (nf->caps, structure);
1562 gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1563 gst_structure_id_set_value (nf->structure, field_id, &val);
1564 g_value_unset (&val);
1572 * gst_caps_normalize:
1573 * @caps: a #GstCaps to normalize
1575 * Creates a new #GstCaps that represents the same set of formats as
1576 * @caps, but contains no lists. Each list is expanded into separate
1579 * Returns: the new #GstCaps
1582 gst_caps_normalize (const GstCaps * caps)
1584 NormalizeForeach nf;
1588 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1590 newcaps = _gst_caps_copy (caps);
1593 for (i = 0; i < gst_caps_get_size (newcaps); i++) {
1594 nf.structure = gst_caps_get_structure_unchecked (newcaps, i);
1596 while (!gst_structure_foreach (nf.structure,
1597 gst_caps_normalize_foreach, &nf));
1604 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1607 const GstStructure *struct1 = *((const GstStructure **) one);
1608 const GstStructure *struct2 = *((const GstStructure **) two);
1610 /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1611 So what's the best way? */
1612 ret = strcmp (gst_structure_get_name (struct1),
1613 gst_structure_get_name (struct2));
1617 return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1624 GstStructure *compare;
1629 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1632 UnionField *u = user_data;
1633 const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1637 g_value_unset (&u->value);
1640 if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1643 g_value_unset (&u->value);
1647 gst_value_union (&u->value, val, value);
1652 gst_caps_structure_simplify (GstStructure ** result,
1653 const GstStructure * simplify, GstStructure * compare)
1656 UnionField field = { 0, {0,}, NULL };
1658 /* try to subtract to get a real subset */
1659 if (gst_caps_structure_subtract (&list, simplify, compare)) {
1660 if (list == NULL) { /* no result */
1663 } else if (list->next == NULL) { /* one result */
1664 *result = list->data;
1665 g_slist_free (list);
1667 } else { /* multiple results */
1668 g_slist_foreach (list, (GFunc) gst_structure_free, NULL);
1669 g_slist_free (list);
1674 /* try to union both structs */
1675 field.compare = compare;
1676 if (gst_structure_foreach ((GstStructure *) simplify,
1677 gst_caps_structure_figure_out_union, &field)) {
1678 gboolean ret = FALSE;
1680 /* now we know all of simplify's fields are the same in compare
1681 * but at most one field: field.name */
1682 if (G_IS_VALUE (&field.value)) {
1683 if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1684 gst_structure_id_set_value (compare, field.name, &field.value);
1688 g_value_unset (&field.value);
1689 } else if (gst_structure_n_fields (simplify) <=
1690 gst_structure_n_fields (compare)) {
1691 /* compare is just more specific, will be optimized away later */
1692 /* FIXME: do this here? */
1693 GST_LOG ("found a case that will be optimized later.");
1695 gchar *one = gst_structure_to_string (simplify);
1696 gchar *two = gst_structure_to_string (compare);
1699 ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1711 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1712 GstStructure * new, gint i)
1714 gst_structure_set_parent_refcount (old, NULL);
1715 gst_structure_free (old);
1716 gst_structure_set_parent_refcount (new, &GST_CAPS_REFCOUNT (caps));
1717 g_ptr_array_index (GST_CAPS_ARRAY (caps), i) = new;
1721 * gst_caps_do_simplify:
1722 * @caps: a #GstCaps to simplify
1724 * Modifies the given @caps inplace into a representation that represents the
1725 * same set of formats, but in a simpler form. Component structures that are
1726 * identical are merged. Component structures that have values that can be
1727 * merged are also merged.
1729 * Returns: TRUE, if the caps could be simplified
1732 gst_caps_do_simplify (GstCaps * caps)
1734 GstStructure *simplify, *compare, *result = NULL;
1736 gboolean changed = FALSE;
1738 g_return_val_if_fail (caps != NULL, FALSE);
1739 g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1741 if (gst_caps_get_size (caps) < 2)
1744 g_ptr_array_sort (GST_CAPS_ARRAY (caps), gst_caps_compare_structures);
1746 start = GST_CAPS_LEN (caps) - 1;
1747 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
1748 simplify = gst_caps_get_structure_unchecked (caps, i);
1749 if (gst_structure_get_name_id (simplify) !=
1750 gst_structure_get_name_id (gst_caps_get_structure_unchecked (caps,
1753 for (j = start; j >= 0; j--) {
1756 compare = gst_caps_get_structure_unchecked (caps, j);
1757 if (gst_structure_get_name_id (simplify) !=
1758 gst_structure_get_name_id (compare)) {
1761 if (gst_caps_structure_simplify (&result, simplify, compare)) {
1763 gst_caps_switch_structures (caps, simplify, result, i);
1766 gst_caps_remove_structure (caps, i);
1778 /* gst_caps_do_simplify (caps); */
1784 * @caps: a #GstCaps to fixate
1786 * Modifies the given @caps inplace into a representation with only fixed
1787 * values. First the caps will be truncated and then the first structure will be
1788 * fixated with gst_structure_fixate(). @caps should be writable.
1791 gst_caps_fixate (GstCaps * caps)
1795 g_return_if_fail (GST_IS_CAPS (caps));
1796 g_return_if_fail (IS_WRITABLE (caps));
1798 /* default fixation */
1799 gst_caps_truncate (caps);
1800 s = gst_caps_get_structure (caps, 0);
1801 gst_structure_fixate (s);
1807 * gst_caps_to_string:
1810 * Converts @caps to a string representation. This string representation
1811 * can be converted back to a #GstCaps by gst_caps_from_string().
1813 * For debugging purposes its easier to do something like this:
1815 * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
1817 * This prints the caps in human readble form.
1819 * Returns: (transfer full): a newly allocated string representing @caps.
1822 gst_caps_to_string (const GstCaps * caps)
1824 guint i, slen, clen;
1827 /* NOTE: This function is potentially called by the debug system,
1828 * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
1829 * should be careful to avoid recursion. This includes any functions
1830 * called by gst_caps_to_string. In particular, calls should
1831 * not use the GST_PTR_FORMAT extension. */
1834 return g_strdup ("NULL");
1836 if (CAPS_IS_ANY (caps)) {
1837 return g_strdup ("ANY");
1839 if (CAPS_IS_EMPTY_SIMPLE (caps)) {
1840 return g_strdup ("EMPTY");
1843 /* estimate a rough string length to avoid unnecessary reallocs in GString */
1845 clen = GST_CAPS_LEN (caps);
1846 for (i = 0; i < clen; i++) {
1848 STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked (caps,
1852 s = g_string_sized_new (slen);
1853 for (i = 0; i < clen; i++) {
1854 GstStructure *structure;
1857 /* ';' is now added by gst_structure_to_string */
1858 g_string_append_c (s, ' ');
1861 structure = gst_caps_get_structure_unchecked (caps, i);
1862 priv_gst_structure_append_to_gstring (structure, s);
1864 if (s->len && s->str[s->len - 1] == ';') {
1865 /* remove latest ';' */
1866 s->str[--s->len] = '\0';
1868 return g_string_free (s, FALSE);
1872 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
1874 GstStructure *structure;
1877 if (strcmp ("ANY", string) == 0) {
1878 GST_CAPS_FLAGS (caps) = GST_CAPS_FLAGS_ANY;
1881 if (strcmp ("EMPTY", string) == 0) {
1885 structure = gst_structure_from_string (string, &s);
1886 if (structure == NULL) {
1889 gst_caps_append_structure_unchecked (caps, structure);
1893 while (g_ascii_isspace (*s))
1898 structure = gst_structure_from_string (s, &s);
1899 if (structure == NULL) {
1902 gst_caps_append_structure_unchecked (caps, structure);
1910 * gst_caps_from_string:
1911 * @string: a string to convert to #GstCaps
1913 * Converts @caps from a string representation.
1915 * Returns: (transfer full): a newly allocated #GstCaps
1918 gst_caps_from_string (const gchar * string)
1922 g_return_val_if_fail (string, FALSE);
1924 caps = gst_caps_new_empty ();
1925 if (gst_caps_from_string_inplace (caps, string)) {
1928 gst_caps_unref (caps);
1934 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
1936 g_return_if_fail (G_IS_VALUE (src_value));
1937 g_return_if_fail (G_IS_VALUE (dest_value));
1938 g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
1939 g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
1940 || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
1942 g_value_take_string (dest_value,
1943 gst_caps_to_string (gst_value_get_caps (src_value)));