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-yuv",
47 * "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
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;
119 _gst_caps_initialize (void)
121 _gst_caps_type = gst_mini_object_register ("GstCaps");
123 g_value_register_transform_func (_gst_caps_type,
124 G_TYPE_STRING, gst_caps_transform_to_string);
128 _gst_caps_copy (const GstCaps * caps)
131 GstStructure *structure;
134 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
136 newcaps = gst_caps_new_empty ();
137 GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
138 n = GST_CAPS_LEN (caps);
140 for (i = 0; i < n; i++) {
141 structure = gst_caps_get_structure_unchecked (caps, i);
142 gst_caps_append_structure (newcaps, gst_structure_copy (structure));
148 /* creation/deletion */
150 _gst_caps_free (GstCaps * caps)
152 GstStructure *structure;
155 /* The refcount must be 0, but since we're only called by gst_caps_unref,
156 * don't bother testing. */
157 len = GST_CAPS_LEN (caps);
158 /* This can be used to get statistics about caps sizes */
159 /*GST_CAT_INFO (GST_CAT_CAPS, "caps size: %d", len); */
160 for (i = 0; i < len; i++) {
161 structure = (GstStructure *) gst_caps_get_structure_unchecked (caps, i);
162 gst_structure_set_parent_refcount (structure, NULL);
163 gst_structure_free (structure);
165 g_ptr_array_free (GST_CAPS_ARRAY (caps), TRUE);
167 #ifdef DEBUG_REFCOUNT
168 GST_CAT_LOG (GST_CAT_CAPS, "freeing caps %p", caps);
170 g_slice_free1 (GST_MINI_OBJECT_SIZE (caps), caps);
174 gst_caps_init (GstCaps * caps, gsize size)
176 gst_mini_object_init (GST_MINI_OBJECT_CAST (caps), _gst_caps_type, size);
178 caps->mini_object.copy = (GstMiniObjectCopyFunction) _gst_caps_copy;
179 caps->mini_object.dispose = NULL;
180 caps->mini_object.free = (GstMiniObjectFreeFunction) _gst_caps_free;
182 /* the 32 has been determined by logging caps sizes in _gst_caps_free
183 * but g_ptr_array uses 16 anyway if it expands once, so this does not help
185 * GST_CAPS_ARRAY (caps) = g_ptr_array_sized_new (32);
187 caps->priv = g_ptr_array_new ();
191 * gst_caps_new_empty:
193 * Creates a new #GstCaps that is empty. That is, the returned
194 * #GstCaps contains no media formats.
195 * Caller is responsible for unreffing the returned caps.
197 * Returns: (transfer full): the new #GstCaps
200 gst_caps_new_empty (void)
204 caps = g_slice_new (GstCaps);
206 gst_caps_init (caps, sizeof (GstCaps));
208 #ifdef DEBUG_REFCOUNT
209 GST_CAT_LOG (GST_CAT_CAPS, "created caps %p", caps);
218 * Creates a new #GstCaps that indicates that it is compatible with
221 * Returns: (transfer full): the new #GstCaps
224 gst_caps_new_any (void)
226 GstCaps *caps = gst_caps_new_empty ();
228 GST_CAPS_FLAG_SET (caps, GST_CAPS_FLAGS_ANY);
234 * gst_caps_new_simple:
235 * @media_type: the media type of the structure
236 * @fieldname: first field to set
237 * @...: additional arguments
239 * Creates a new #GstCaps that contains one #GstStructure. The
240 * structure is defined by the arguments, which have the same format
241 * as gst_structure_new().
242 * Caller is responsible for unreffing the returned caps.
244 * Returns: (transfer full): the new #GstCaps
247 gst_caps_new_simple (const char *media_type, const char *fieldname, ...)
250 GstStructure *structure;
253 caps = gst_caps_new_empty ();
255 va_start (var_args, fieldname);
256 structure = gst_structure_new_valist (media_type, fieldname, var_args);
260 gst_caps_append_structure_unchecked (caps, structure);
262 gst_caps_replace (&caps, NULL);
269 * @struct1: the first structure to add
270 * @...: additional structures to add
272 * Creates a new #GstCaps and adds all the structures listed as
273 * arguments. The list must be NULL-terminated. The structures
274 * are not copied; the returned #GstCaps owns the structures.
276 * Returns: (transfer full): the new #GstCaps
279 gst_caps_new_full (GstStructure * struct1, ...)
284 va_start (var_args, struct1);
285 caps = gst_caps_new_full_valist (struct1, var_args);
292 * gst_caps_new_full_valist:
293 * @structure: the first structure to add
294 * @var_args: additional structures to add
296 * Creates a new #GstCaps and adds all the structures listed as
297 * arguments. The list must be NULL-terminated. The structures
298 * are not copied; the returned #GstCaps owns the structures.
300 * Returns: (transfer full): the new #GstCaps
303 gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
307 caps = gst_caps_new_empty ();
310 gst_caps_append_structure_unchecked (caps, structure);
311 structure = va_arg (var_args, GstStructure *);
318 gst_static_caps_get_type (void)
320 static GType staticcaps_type = 0;
322 if (G_UNLIKELY (staticcaps_type == 0)) {
323 staticcaps_type = g_pointer_type_register_static ("GstStaticCaps");
325 return staticcaps_type;
330 * gst_static_caps_get:
331 * @static_caps: the #GstStaticCaps to convert
333 * Converts a #GstStaticCaps to a #GstCaps.
335 * Returns: (transfer full): a pointer to the #GstCaps. Unref after usage.
336 * Since the core holds an additional ref to the returned caps,
337 * use gst_caps_make_writable() on the returned caps to modify it.
340 gst_static_caps_get (GstStaticCaps * static_caps)
344 g_return_val_if_fail (static_caps != NULL, NULL);
346 caps = (GstCaps *) static_caps;
348 /* refcount is 0 when we need to convert */
349 if (G_UNLIKELY (GST_CAPS_REFCOUNT_VALUE (caps) == 0)) {
353 G_LOCK (static_caps_lock);
354 /* check if other thread already updated */
355 if (G_UNLIKELY (GST_CAPS_REFCOUNT_VALUE (caps) > 0))
358 string = static_caps->string;
360 if (G_UNLIKELY (string == NULL))
363 GST_CAT_LOG (GST_CAT_CAPS, "creating %p", static_caps);
365 /* we construct the caps on the stack, then copy over the struct into our
366 * real caps, refcount last. We do this because we must leave the refcount
367 * of the result caps to 0 so that other threads don't run away with the
368 * caps while we are constructing it. */
369 gst_caps_init (&temp, sizeof (GstCaps));
371 /* convert to string */
372 if (G_UNLIKELY (!gst_caps_from_string_inplace (&temp, string)))
373 g_critical ("Could not convert static caps \"%s\"", string);
375 gst_caps_init (caps, sizeof (GstCaps));
376 /* now copy stuff over to the real caps. */
377 GST_CAPS_FLAGS (caps) = GST_CAPS_FLAGS (&temp);
378 caps->priv = GST_CAPS_ARRAY (&temp);
380 GST_CAT_LOG (GST_CAT_CAPS, "created %p", static_caps);
382 G_UNLOCK (static_caps_lock);
384 /* ref the caps, makes it not writable */
392 G_UNLOCK (static_caps_lock);
393 g_warning ("static caps %p string is NULL", static_caps);
399 * gst_static_caps_cleanup:
400 * @static_caps: the #GstStaticCaps to convert
402 * Clean up the caps contained in @static_caps when the refcount is 0.
405 gst_static_caps_cleanup (GstStaticCaps * static_caps)
407 GstCaps *caps = (GstCaps *) static_caps;
409 /* FIXME: this is not threadsafe */
410 if (GST_CAPS_REFCOUNT_VALUE (caps) == 1) {
411 GstStructure *structure;
414 clen = GST_CAPS_LEN (caps);
416 for (i = 0; i < clen; i++) {
417 structure = (GstStructure *) gst_caps_get_structure (caps, i);
418 gst_structure_set_parent_refcount (structure, NULL);
419 gst_structure_free (structure);
421 g_ptr_array_free (GST_CAPS_ARRAY (caps), TRUE);
422 GST_CAPS_REFCOUNT (caps) = 0;
428 static GstStructure *
429 gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
431 /* don't use index_fast, gst_caps_do_simplify relies on the order */
432 GstStructure *s = g_ptr_array_remove_index (GST_CAPS_ARRAY (caps), idx);
434 gst_structure_set_parent_refcount (s, NULL);
439 * gst_caps_steal_structure:
440 * @caps: the #GstCaps to retrieve from
441 * @index: Index of the structure to retrieve
443 * Retrieves the stucture with the given index from the list of structures
444 * contained in @caps. The caller becomes the owner of the returned structure.
446 * Returns: (transfer full): a pointer to the #GstStructure corresponding
452 gst_caps_steal_structure (GstCaps * caps, guint index)
454 g_return_val_if_fail (caps != NULL, NULL);
455 g_return_val_if_fail (IS_WRITABLE (caps), NULL);
457 if (G_UNLIKELY (index >= GST_CAPS_LEN (caps)))
460 return gst_caps_remove_and_get_structure (caps, index);
465 * @caps1: the #GstCaps that will be appended to
466 * @caps2: (transfer full): the #GstCaps to append
468 * Appends the structures contained in @caps2 to @caps1. The structures in
469 * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
470 * freed. If either caps is ANY, the resulting caps will be ANY.
473 gst_caps_append (GstCaps * caps1, GstCaps * caps2)
475 GstStructure *structure;
478 g_return_if_fail (GST_IS_CAPS (caps1));
479 g_return_if_fail (GST_IS_CAPS (caps2));
480 g_return_if_fail (IS_WRITABLE (caps1));
481 g_return_if_fail (IS_WRITABLE (caps2));
483 if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))) {
484 /* FIXME: this leaks */
485 GST_CAPS_FLAGS (caps1) |= GST_CAPS_FLAGS_ANY;
486 for (i = GST_CAPS_LEN (caps2) - 1; i >= 0; i--) {
487 structure = gst_caps_remove_and_get_structure (caps2, i);
488 gst_structure_free (structure);
491 for (i = GST_CAPS_LEN (caps2); i; i--) {
492 structure = gst_caps_remove_and_get_structure (caps2, 0);
493 gst_caps_append_structure_unchecked (caps1, structure);
496 gst_caps_unref (caps2); /* guaranteed to free it */
501 * @caps1: the #GstCaps that will take the new entries
502 * @caps2: (transfer full): the #GstCaps to merge in
504 * Appends the structures contained in @caps2 to @caps1 if they are not yet
505 * expressed by @caps1. The structures in @caps2 are not copied -- they are
506 * transferred to @caps1, and then @caps2 is freed.
507 * If either caps is ANY, the resulting caps will be ANY.
512 gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
514 GstStructure *structure;
517 g_return_if_fail (GST_IS_CAPS (caps1));
518 g_return_if_fail (GST_IS_CAPS (caps2));
519 g_return_if_fail (IS_WRITABLE (caps1));
520 g_return_if_fail (IS_WRITABLE (caps2));
522 if (G_UNLIKELY (CAPS_IS_ANY (caps1))) {
523 for (i = GST_CAPS_LEN (caps2) - 1; i >= 0; i--) {
524 structure = gst_caps_remove_and_get_structure (caps2, i);
525 gst_structure_free (structure);
527 } else if (G_UNLIKELY (CAPS_IS_ANY (caps2))) {
528 GST_CAPS_FLAGS (caps1) |= GST_CAPS_FLAGS_ANY;
529 for (i = GST_CAPS_LEN (caps1) - 1; i >= 0; i--) {
530 structure = gst_caps_remove_and_get_structure (caps1, i);
531 gst_structure_free (structure);
534 for (i = GST_CAPS_LEN (caps2); i; i--) {
535 structure = gst_caps_remove_and_get_structure (caps2, 0);
536 gst_caps_merge_structure (caps1, structure);
539 GstCaps *com = gst_caps_intersect (caps1, caps2);
540 GstCaps *add = gst_caps_subtract (caps2, com);
542 GST_DEBUG ("common : %d", gst_caps_get_size (com));
543 GST_DEBUG ("adding : %d", gst_caps_get_size (add));
544 gst_caps_append (caps1, add);
545 gst_caps_unref (com);
548 gst_caps_unref (caps2); /* guaranteed to free it */
552 * gst_caps_append_structure:
553 * @caps: the #GstCaps that will be appended to
554 * @structure: (transfer full): the #GstStructure to append
556 * Appends @structure to @caps. The structure is not copied; @caps
557 * becomes the owner of @structure.
560 gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
562 g_return_if_fail (GST_IS_CAPS (caps));
563 g_return_if_fail (IS_WRITABLE (caps));
565 if (G_LIKELY (structure)) {
566 gst_caps_append_structure_unchecked (caps, structure);
571 * gst_caps_remove_structure:
572 * @caps: the #GstCaps to remove from
573 * @idx: Index of the structure to remove
575 * removes the stucture with the given index from the list of structures
576 * contained in @caps.
579 gst_caps_remove_structure (GstCaps * caps, guint idx)
581 GstStructure *structure;
583 g_return_if_fail (caps != NULL);
584 g_return_if_fail (idx <= gst_caps_get_size (caps));
585 g_return_if_fail (IS_WRITABLE (caps));
587 structure = gst_caps_remove_and_get_structure (caps, idx);
588 gst_structure_free (structure);
592 * gst_caps_merge_structure:
593 * @caps: the #GstCaps that will the the new structure
594 * @structure: (transfer full): the #GstStructure to merge
596 * Appends @structure to @caps if its not already expressed by @caps. The
597 * structure is not copied; @caps becomes the owner of @structure.
600 gst_caps_merge_structure (GstCaps * caps, GstStructure * structure)
602 g_return_if_fail (GST_IS_CAPS (caps));
603 g_return_if_fail (IS_WRITABLE (caps));
605 if (G_LIKELY (structure)) {
606 GstStructure *structure1;
608 gboolean unique = TRUE;
610 /* check each structure */
611 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
612 structure1 = gst_caps_get_structure_unchecked (caps, i);
613 /* if structure is a subset of structure1, then skip it */
614 if (gst_structure_is_subset (structure, structure1)) {
620 gst_caps_append_structure_unchecked (caps, structure);
622 gst_structure_free (structure);
631 * Gets the number of structures contained in @caps.
633 * Returns: the number of structures that @caps contains
636 gst_caps_get_size (const GstCaps * caps)
638 g_return_val_if_fail (GST_IS_CAPS (caps), 0);
640 return GST_CAPS_LEN (caps);
644 * gst_caps_get_structure:
646 * @index: the index of the structure
648 * Finds the structure in @caps that has the index @index, and
651 * WARNING: This function takes a const GstCaps *, but returns a
652 * non-const GstStructure *. This is for programming convenience --
653 * the caller should be aware that structures inside a constant
654 * #GstCaps should not be modified. However, if you know the caps
655 * are writable, either because you have just copied them or made
656 * them writable with gst_caps_make_writable(), you may modify the
657 * structure returned in the usual way, e.g. with functions like
658 * gst_structure_set().
660 * You do not need to free or unref the structure returned, it
661 * belongs to the #GstCaps.
663 * Returns: (transfer none): a pointer to the #GstStructure corresponding
667 gst_caps_get_structure (const GstCaps * caps, guint index)
669 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
670 g_return_val_if_fail (index < GST_CAPS_LEN (caps), NULL);
672 return gst_caps_get_structure_unchecked (caps, index);
677 * @caps: the #GstCaps to copy
678 * @nth: the nth structure to copy
680 * Creates a new #GstCaps and appends a copy of the nth structure
681 * contained in @caps.
683 * Returns: (transfer full): the new #GstCaps
686 gst_caps_copy_nth (const GstCaps * caps, guint nth)
689 GstStructure *structure;
691 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
693 newcaps = gst_caps_new_empty ();
694 GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
696 if (G_LIKELY (GST_CAPS_LEN (caps) > nth)) {
697 structure = gst_caps_get_structure_unchecked (caps, nth);
698 gst_caps_append_structure_unchecked (newcaps,
699 gst_structure_copy (structure));
707 * @caps: the #GstCaps to truncate
709 * Destructively discard all but the first structure from @caps. Useful when
710 * fixating. @caps must be writable.
713 gst_caps_truncate (GstCaps * caps)
717 g_return_if_fail (GST_IS_CAPS (caps));
718 g_return_if_fail (IS_WRITABLE (caps));
720 i = GST_CAPS_LEN (caps) - 1;
723 gst_caps_remove_structure (caps, i--);
727 * gst_caps_set_value:
728 * @caps: a writable caps
729 * @field: name of the field to set
730 * @value: value to set the field to
732 * Sets the given @field on all structures of @caps to the given @value.
733 * This is a convenience function for calling gst_structure_set_value() on
734 * all structures of @caps.
739 gst_caps_set_value (GstCaps * caps, const char *field, const GValue * value)
743 g_return_if_fail (GST_IS_CAPS (caps));
744 g_return_if_fail (IS_WRITABLE (caps));
745 g_return_if_fail (field != NULL);
746 g_return_if_fail (G_IS_VALUE (value));
748 len = GST_CAPS_LEN (caps);
749 for (i = 0; i < len; i++) {
750 GstStructure *structure = gst_caps_get_structure_unchecked (caps, i);
751 gst_structure_set_value (structure, field, value);
756 * gst_caps_set_simple_valist:
757 * @caps: the #GstCaps to set
758 * @field: first field to set
759 * @varargs: additional parameters
761 * Sets fields in a #GstCaps. The arguments must be passed in the same
762 * manner as gst_structure_set(), and be NULL-terminated.
763 * <note>Prior to GStreamer version 0.10.26, this function failed when
764 * @caps was not simple. If your code needs to work with those versions
765 * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
766 * is %TRUE for @caps.</note>
769 gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs)
771 GValue value = { 0, };
773 g_return_if_fail (GST_IS_CAPS (caps));
774 g_return_if_fail (IS_WRITABLE (caps));
780 type = va_arg (varargs, GType);
782 if (G_UNLIKELY (type == G_TYPE_DATE)) {
783 g_warning ("Don't use G_TYPE_DATE, use GST_TYPE_DATE instead\n");
784 type = GST_TYPE_DATE;
786 G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
787 if (G_UNLIKELY (err)) {
788 g_critical ("%s", err);
792 gst_caps_set_value (caps, field, &value);
794 g_value_unset (&value);
796 field = va_arg (varargs, const gchar *);
801 * gst_caps_set_simple:
802 * @caps: the #GstCaps to set
803 * @field: first field to set
804 * @...: additional parameters
806 * Sets fields in a #GstCaps. The arguments must be passed in the same
807 * manner as gst_structure_set(), and be NULL-terminated.
808 * <note>Prior to GStreamer version 0.10.26, this function failed when
809 * @caps was not simple. If your code needs to work with those versions
810 * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
811 * is %TRUE for @caps.</note>
814 gst_caps_set_simple (GstCaps * caps, const char *field, ...)
818 g_return_if_fail (GST_IS_CAPS (caps));
819 g_return_if_fail (IS_WRITABLE (caps));
821 va_start (var_args, field);
822 gst_caps_set_simple_valist (caps, field, var_args);
830 * @caps: the #GstCaps to test
832 * Determines if @caps represents any media format.
834 * Returns: TRUE if @caps represents any format.
837 gst_caps_is_any (const GstCaps * caps)
839 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
841 return (CAPS_IS_ANY (caps));
846 * @caps: the #GstCaps to test
848 * Determines if @caps represents no media formats.
850 * Returns: TRUE if @caps represents no formats.
853 gst_caps_is_empty (const GstCaps * caps)
855 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
857 if (CAPS_IS_ANY (caps))
860 return CAPS_IS_EMPTY_SIMPLE (caps);
864 gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
867 return gst_value_is_fixed (value);
872 * @caps: the #GstCaps to test
874 * Fixed #GstCaps describe exactly one format, that is, they have exactly
875 * one structure, and each field in the structure describes a fixed type.
876 * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
878 * Returns: TRUE if @caps is fixed
881 gst_caps_is_fixed (const GstCaps * caps)
883 GstStructure *structure;
885 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
887 if (GST_CAPS_LEN (caps) != 1)
890 structure = gst_caps_get_structure_unchecked (caps, 0);
892 return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
896 * gst_caps_is_equal_fixed:
897 * @caps1: the #GstCaps to test
898 * @caps2: the #GstCaps to test
900 * Tests if two #GstCaps are equal. This function only works on fixed
903 * Returns: TRUE if the arguments represent the same format
906 gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
908 GstStructure *struct1, *struct2;
910 g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
911 g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
913 struct1 = gst_caps_get_structure_unchecked (caps1, 0);
914 struct2 = gst_caps_get_structure_unchecked (caps2, 0);
916 return gst_structure_is_equal (struct1, struct2);
920 * gst_caps_is_always_compatible:
921 * @caps1: the #GstCaps to test
922 * @caps2: the #GstCaps to test
924 * A given #GstCaps structure is always compatible with another if
925 * every media format that is in the first is also contained in the
926 * second. That is, @caps1 is a subset of @caps2.
928 * Returns: TRUE if @caps1 is a subset of @caps2.
931 gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
933 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
934 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
936 return gst_caps_is_subset (caps1, caps2);
940 * gst_caps_is_subset:
941 * @subset: a #GstCaps
942 * @superset: a potentially greater #GstCaps
944 * Checks if all caps represented by @subset are also represented by @superset.
945 * <note>This function does not work reliably if optional properties for caps
946 * are included on one caps and omitted on the other.</note>
948 * Returns: %TRUE if @subset is a subset of @superset
951 gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
953 GstStructure *s1, *s2;
957 g_return_val_if_fail (subset != NULL, FALSE);
958 g_return_val_if_fail (superset != NULL, FALSE);
960 if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
962 if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
965 for (i = GST_CAPS_LEN (subset) - 1; i >= 0; i--) {
966 for (j = GST_CAPS_LEN (superset) - 1; j >= 0; j--) {
967 s1 = gst_caps_get_structure_unchecked (subset, i);
968 s2 = gst_caps_get_structure_unchecked (superset, j);
969 if (gst_structure_is_subset (s1, s2)) {
970 /* If we found a superset, continue with the next
971 * subset structure */
975 /* If we found no superset for this subset structure
976 * we return FALSE immediately */
987 * gst_caps_is_subset_structure:
989 * @structure: a potential #GstStructure subset of @caps
991 * Checks if @structure is a subset of @caps. See gst_caps_is_subset()
992 * for more information.
994 * Returns: %TRUE if @structure is a subset of @caps
999 gst_caps_is_subset_structure (const GstCaps * caps,
1000 const GstStructure * structure)
1005 g_return_val_if_fail (caps != NULL, FALSE);
1006 g_return_val_if_fail (structure != NULL, FALSE);
1008 if (CAPS_IS_ANY (caps))
1010 if (CAPS_IS_EMPTY (caps))
1013 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
1014 s = gst_caps_get_structure_unchecked (caps, i);
1015 if (gst_structure_is_subset (structure, s)) {
1016 /* If we found a superset return TRUE */
1025 * gst_caps_is_equal:
1026 * @caps1: a #GstCaps
1027 * @caps2: another #GstCaps
1029 * Checks if the given caps represent the same set of caps.
1030 * <note>This function does not work reliably if optional properties for caps
1031 * are included on one caps and omitted on the other.</note>
1033 * This function deals correctly with passing NULL for any of the caps.
1035 * Returns: TRUE if both caps are equal.
1038 gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
1040 /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
1041 * So there should be an assertion that caps1 and caps2 != NULL */
1043 /* NULL <-> NULL is allowed here */
1044 if (G_UNLIKELY (caps1 == caps2))
1047 /* one of them NULL => they are different (can't be both NULL because
1048 * we checked that above) */
1049 if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
1052 if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
1053 return gst_caps_is_equal_fixed (caps1, caps2);
1055 return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
1058 /* intersect operation */
1061 * gst_caps_can_intersect:
1062 * @caps1: a #GstCaps to intersect
1063 * @caps2: a #GstCaps to intersect
1065 * Tries intersecting @caps1 and @caps2 and reports whether the result would not
1068 * Returns: %TRUE if intersection would be not empty
1073 gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
1075 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1076 guint j, k, len1, len2;
1077 GstStructure *struct1;
1078 GstStructure *struct2;
1080 g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
1081 g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
1083 /* caps are exactly the same pointers */
1084 if (G_UNLIKELY (caps1 == caps2))
1087 /* empty caps on either side, return empty */
1088 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1091 /* one of the caps is any */
1092 if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
1095 /* run zigzag on top line then right line, this preserves the caps order
1096 * much better than a simple loop.
1098 * This algorithm zigzags over the caps structures as demonstrated in
1099 * the folowing matrix:
1102 * +------------- total distance: +-------------
1103 * | 1 2 4 7 0 | 0 1 2 3
1104 * caps2 | 3 5 8 10 1 | 1 2 3 4
1105 * | 6 9 11 12 2 | 2 3 4 5
1107 * First we iterate over the caps1 structures (top line) intersecting
1108 * the structures diagonally down, then we iterate over the caps2
1109 * structures. The result is that the intersections are ordered based on the
1110 * sum of the indexes in the list.
1112 len1 = GST_CAPS_LEN (caps1);
1113 len2 = GST_CAPS_LEN (caps2);
1114 for (i = 0; i < len1 + len2 - 1; i++) {
1115 /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */
1116 j = MIN (i, len1 - 1);
1117 /* subset index stays 0 until i reaches superset->structs->len, then it
1118 * counts up from 1 to subset->structs->len - 1 */
1121 /* now run the diagonal line, end condition is the left or bottom
1124 struct1 = gst_caps_get_structure_unchecked (caps1, j);
1125 struct2 = gst_caps_get_structure_unchecked (caps2, k);
1127 if (gst_structure_can_intersect (struct1, struct2)) {
1130 /* move down left */
1132 if (G_UNLIKELY (j == 0))
1133 break; /* so we don't roll back to G_MAXUINT */
1141 gst_caps_intersect_zig_zag (const GstCaps * caps1, const GstCaps * caps2)
1143 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1144 guint j, k, len1, len2;
1146 GstStructure *struct1;
1147 GstStructure *struct2;
1149 GstStructure *istruct;
1151 /* caps are exactly the same pointers, just copy one caps */
1152 if (G_UNLIKELY (caps1 == caps2))
1153 return _gst_caps_copy (caps1);
1155 /* empty caps on either side, return empty */
1156 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1157 return gst_caps_new_empty ();
1159 /* one of the caps is any, just copy the other caps */
1160 if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1161 return _gst_caps_copy (caps2);
1162 if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1163 return _gst_caps_copy (caps1);
1165 dest = gst_caps_new_empty ();
1167 /* run zigzag on top line then right line, this preserves the caps order
1168 * much better than a simple loop.
1170 * This algorithm zigzags over the caps structures as demonstrated in
1171 * the folowing matrix:
1179 * First we iterate over the caps1 structures (top line) intersecting
1180 * the structures diagonally down, then we iterate over the caps2
1183 len1 = GST_CAPS_LEN (caps1);
1184 len2 = GST_CAPS_LEN (caps2);
1185 for (i = 0; i < len1 + len2 - 1; i++) {
1186 /* caps1 index goes from 0 to GST_CAPS_LEN (caps1)-1 */
1187 j = MIN (i, len1 - 1);
1188 /* caps2 index stays 0 until i reaches GST_CAPS_LEN (caps1), then it counts
1189 * up from 1 to GST_CAPS_LEN (caps2) - 1 */
1192 /* now run the diagonal line, end condition is the left or bottom
1195 struct1 = gst_caps_get_structure_unchecked (caps1, j);
1196 struct2 = gst_caps_get_structure_unchecked (caps2, k);
1198 istruct = gst_structure_intersect (struct1, struct2);
1200 gst_caps_merge_structure (dest, istruct);
1201 /* move down left */
1203 if (G_UNLIKELY (j == 0))
1204 break; /* so we don't roll back to G_MAXUINT */
1212 * gst_caps_intersect_first:
1213 * @caps1: a #GstCaps to intersect
1214 * @caps2: a #GstCaps to intersect
1216 * Creates a new #GstCaps that contains all the formats that are common
1217 * to both @caps1 and @caps2.
1219 * Unlike @gst_caps_intersect, the returned caps will be ordered in a similar
1220 * fashion as @caps1.
1222 * Returns: the new #GstCaps
1225 gst_caps_intersect_first (const GstCaps * caps1, const GstCaps * caps2)
1227 guint64 i; /* index can be up to 2 * G_MAX_UINT */
1228 guint j, len1, len2;
1230 GstStructure *struct1;
1231 GstStructure *struct2;
1233 GstStructure *istruct;
1235 /* caps are exactly the same pointers, just copy one caps */
1236 if (G_UNLIKELY (caps1 == caps2))
1237 return gst_caps_copy (caps1);
1239 /* empty caps on either side, return empty */
1240 if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
1241 return gst_caps_new_empty ();
1243 /* one of the caps is any, just copy the other caps */
1244 if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
1245 return gst_caps_copy (caps2);
1246 if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
1247 return gst_caps_copy (caps1);
1249 dest = gst_caps_new_empty ();
1251 len1 = GST_CAPS_LEN (caps1);
1252 len2 = GST_CAPS_LEN (caps2);
1253 for (i = 0; i < len1; i++) {
1254 struct1 = gst_caps_get_structure_unchecked (caps1, i);
1255 for (j = 0; j < len2; j++) {
1256 struct2 = gst_caps_get_structure_unchecked (caps2, j);
1257 istruct = gst_structure_intersect (struct1, struct2);
1259 gst_caps_merge_structure (dest, istruct);
1267 * gst_caps_intersect_full:
1268 * @caps1: a #GstCaps to intersect
1269 * @caps2: a #GstCaps to intersect
1270 * @mode: The intersection algorithm/mode to use
1272 * Creates a new #GstCaps that contains all the formats that are common
1273 * to both @caps1 and @caps2, the order is defined by the #GstCapsIntersectMode
1276 * Returns: the new #GstCaps
1280 gst_caps_intersect_full (const GstCaps * caps1, const GstCaps * caps2,
1281 GstCapsIntersectMode mode)
1283 g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
1284 g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
1287 case GST_CAPS_INTERSECT_FIRST:
1288 return gst_caps_intersect_first (caps1, caps2);
1290 g_warning ("Unknown caps intersect mode: %d", mode);
1292 case GST_CAPS_INTERSECT_ZIG_ZAG:
1293 return gst_caps_intersect_zig_zag (caps1, caps2);
1298 * gst_caps_intersect:
1299 * @caps1: a #GstCaps to intersect
1300 * @caps2: a #GstCaps to intersect
1302 * Creates a new #GstCaps that contains all the formats that are common
1303 * to both @caps1 and @caps2. Defaults to %GST_CAPS_INTERSECT_ZIG_ZAG mode.
1305 * Returns: the new #GstCaps
1308 gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
1310 return gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_ZIG_ZAG);
1314 /* subtract operation */
1318 const GstStructure *subtract_from;
1324 gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
1327 SubtractionEntry *e = user_data;
1328 GValue subtraction = { 0, };
1329 const GValue *other;
1330 GstStructure *structure;
1332 other = gst_structure_id_get_value (e->subtract_from, field_id);
1336 if (!gst_value_subtract (&subtraction, other, value))
1338 if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
1339 g_value_unset (&subtraction);
1342 structure = gst_structure_copy (e->subtract_from);
1343 gst_structure_id_set_value (structure, field_id, &subtraction);
1344 g_value_unset (&subtraction);
1345 e->put_into = g_slist_prepend (e->put_into, structure);
1351 gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
1352 const GstStructure * subtrahend)
1357 e.subtract_from = minuend;
1360 ret = gst_structure_foreach ((GstStructure *) subtrahend,
1361 gst_caps_structure_subtract_field, &e);
1367 for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
1368 gst_structure_free (walk->data);
1370 g_slist_free (e.put_into);
1376 * gst_caps_subtract:
1377 * @minuend: #GstCaps to substract from
1378 * @subtrahend: #GstCaps to substract
1380 * Subtracts the @subtrahend from the @minuend.
1381 * <note>This function does not work reliably if optional properties for caps
1382 * are included on one caps and omitted on the other.</note>
1384 * Returns: the resulting caps
1387 gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
1392 GstCaps *dest = NULL, *src;
1394 g_return_val_if_fail (minuend != NULL, NULL);
1395 g_return_val_if_fail (subtrahend != NULL, NULL);
1397 if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
1398 return gst_caps_new_empty ();
1400 if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
1401 return _gst_caps_copy (minuend);
1403 /* FIXME: Do we want this here or above?
1404 The reason we need this is that there is no definition about what
1405 ANY means for specific types, so it's not possible to reduce ANY partially
1406 You can only remove everything or nothing and that is done above.
1407 Note: there's a test that checks this behaviour. */
1408 g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
1409 sublen = GST_CAPS_LEN (subtrahend);
1410 g_assert (sublen > 0);
1412 src = _gst_caps_copy (minuend);
1413 for (i = 0; i < sublen; i++) {
1416 sub = gst_caps_get_structure_unchecked (subtrahend, i);
1418 gst_caps_unref (src);
1421 dest = gst_caps_new_empty ();
1422 srclen = GST_CAPS_LEN (src);
1423 for (j = 0; j < srclen; j++) {
1424 min = gst_caps_get_structure_unchecked (src, j);
1425 if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
1428 if (gst_caps_structure_subtract (&list, min, sub)) {
1431 for (walk = list; walk; walk = g_slist_next (walk)) {
1432 gst_caps_append_structure_unchecked (dest,
1433 (GstStructure *) walk->data);
1435 g_slist_free (list);
1437 gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1440 gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
1443 if (CAPS_IS_EMPTY_SIMPLE (dest)) {
1444 gst_caps_unref (src);
1449 gst_caps_unref (src);
1450 gst_caps_do_simplify (dest);
1454 /* union operation */
1457 static GstStructure *
1458 gst_caps_structure_union (const GstStructure * struct1,
1459 const GstStructure * struct2)
1463 const GstStructureField *field1;
1464 const GstStructureField *field2;
1467 /* FIXME this doesn't actually work */
1469 if (struct1->name != struct2->name)
1472 dest = gst_structure_id_empty_new (struct1->name);
1474 for (i = 0; i < struct1->fields->len; i++) {
1475 GValue dest_value = { 0 };
1477 field1 = GST_STRUCTURE_FIELD (struct1, i);
1478 field2 = gst_structure_id_get_field (struct2, field1->name);
1480 if (field2 == NULL) {
1483 if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
1484 gst_structure_set_value (dest, g_quark_to_string (field1->name),
1487 ret = gst_value_compare (&field1->value, &field2->value);
1498 * @caps1: a #GstCaps to union
1499 * @caps2: a #GstCaps to union
1501 * Creates a new #GstCaps that contains all the formats that are in
1502 * either @caps1 and @caps2.
1504 * Returns: the new #GstCaps
1507 gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
1512 /* NULL pointers are no correct GstCaps */
1513 g_return_val_if_fail (caps1 != NULL, NULL);
1514 g_return_val_if_fail (caps2 != NULL, NULL);
1516 if (CAPS_IS_EMPTY (caps1))
1517 return _gst_caps_copy (caps2);
1519 if (CAPS_IS_EMPTY (caps2))
1520 return _gst_caps_copy (caps1);
1522 if (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))
1523 return gst_caps_new_any ();
1525 dest1 = _gst_caps_copy (caps1);
1526 dest2 = _gst_caps_copy (caps2);
1527 gst_caps_append (dest1, dest2);
1529 gst_caps_do_simplify (dest1);
1533 /* normalize/simplify operations */
1535 typedef struct _NormalizeForeach
1538 GstStructure *structure;
1543 gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
1545 NormalizeForeach *nf = (NormalizeForeach *) ptr;
1549 if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
1550 guint len = gst_value_list_get_size (value);
1551 for (i = 1; i < len; i++) {
1552 const GValue *v = gst_value_list_get_value (value, i);
1553 GstStructure *structure = gst_structure_copy (nf->structure);
1555 gst_structure_id_set_value (structure, field_id, v);
1556 gst_caps_append_structure_unchecked (nf->caps, structure);
1559 gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
1560 gst_structure_id_set_value (nf->structure, field_id, &val);
1561 g_value_unset (&val);
1569 * gst_caps_normalize:
1570 * @caps: a #GstCaps to normalize
1572 * Creates a new #GstCaps that represents the same set of formats as
1573 * @caps, but contains no lists. Each list is expanded into separate
1576 * Returns: the new #GstCaps
1579 gst_caps_normalize (const GstCaps * caps)
1581 NormalizeForeach nf;
1585 g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
1587 newcaps = _gst_caps_copy (caps);
1590 for (i = 0; i < gst_caps_get_size (newcaps); i++) {
1591 nf.structure = gst_caps_get_structure_unchecked (newcaps, i);
1593 while (!gst_structure_foreach (nf.structure,
1594 gst_caps_normalize_foreach, &nf));
1601 gst_caps_compare_structures (gconstpointer one, gconstpointer two)
1604 const GstStructure *struct1 = *((const GstStructure **) one);
1605 const GstStructure *struct2 = *((const GstStructure **) two);
1607 /* FIXME: this orders alphabetically, but ordering the quarks might be faster
1608 So what's the best way? */
1609 ret = strcmp (gst_structure_get_name (struct1),
1610 gst_structure_get_name (struct2));
1614 return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
1621 GstStructure *compare;
1626 gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
1629 UnionField *u = user_data;
1630 const GValue *val = gst_structure_id_get_value (u->compare, field_id);
1634 g_value_unset (&u->value);
1637 if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
1640 g_value_unset (&u->value);
1644 gst_value_union (&u->value, val, value);
1649 gst_caps_structure_simplify (GstStructure ** result,
1650 const GstStructure * simplify, GstStructure * compare)
1653 UnionField field = { 0, {0,}, NULL };
1655 /* try to subtract to get a real subset */
1656 if (gst_caps_structure_subtract (&list, simplify, compare)) {
1657 if (list == NULL) { /* no result */
1660 } else if (list->next == NULL) { /* one result */
1661 *result = list->data;
1662 g_slist_free (list);
1664 } else { /* multiple results */
1665 g_slist_foreach (list, (GFunc) gst_structure_free, NULL);
1666 g_slist_free (list);
1671 /* try to union both structs */
1672 field.compare = compare;
1673 if (gst_structure_foreach ((GstStructure *) simplify,
1674 gst_caps_structure_figure_out_union, &field)) {
1675 gboolean ret = FALSE;
1677 /* now we know all of simplify's fields are the same in compare
1678 * but at most one field: field.name */
1679 if (G_IS_VALUE (&field.value)) {
1680 if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
1681 gst_structure_id_set_value (compare, field.name, &field.value);
1685 g_value_unset (&field.value);
1686 } else if (gst_structure_n_fields (simplify) <=
1687 gst_structure_n_fields (compare)) {
1688 /* compare is just more specific, will be optimized away later */
1689 /* FIXME: do this here? */
1690 GST_LOG ("found a case that will be optimized later.");
1692 gchar *one = gst_structure_to_string (simplify);
1693 gchar *two = gst_structure_to_string (compare);
1696 ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
1708 gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
1709 GstStructure * new, gint i)
1711 gst_structure_set_parent_refcount (old, NULL);
1712 gst_structure_free (old);
1713 gst_structure_set_parent_refcount (new, &GST_CAPS_REFCOUNT (caps));
1714 g_ptr_array_index (GST_CAPS_ARRAY (caps), i) = new;
1718 * gst_caps_do_simplify:
1719 * @caps: a #GstCaps to simplify
1721 * Modifies the given @caps inplace into a representation that represents the
1722 * same set of formats, but in a simpler form. Component structures that are
1723 * identical are merged. Component structures that have values that can be
1724 * merged are also merged.
1726 * Returns: TRUE, if the caps could be simplified
1729 gst_caps_do_simplify (GstCaps * caps)
1731 GstStructure *simplify, *compare, *result = NULL;
1733 gboolean changed = FALSE;
1735 g_return_val_if_fail (caps != NULL, FALSE);
1736 g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
1738 if (gst_caps_get_size (caps) < 2)
1741 g_ptr_array_sort (GST_CAPS_ARRAY (caps), gst_caps_compare_structures);
1743 start = GST_CAPS_LEN (caps) - 1;
1744 for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
1745 simplify = gst_caps_get_structure_unchecked (caps, i);
1746 if (gst_structure_get_name_id (simplify) !=
1747 gst_structure_get_name_id (gst_caps_get_structure_unchecked (caps,
1750 for (j = start; j >= 0; j--) {
1753 compare = gst_caps_get_structure_unchecked (caps, j);
1754 if (gst_structure_get_name_id (simplify) !=
1755 gst_structure_get_name_id (compare)) {
1758 if (gst_caps_structure_simplify (&result, simplify, compare)) {
1760 gst_caps_switch_structures (caps, simplify, result, i);
1763 gst_caps_remove_structure (caps, i);
1775 /* gst_caps_do_simplify (caps); */
1782 * gst_caps_to_string:
1785 * Converts @caps to a string representation. This string representation
1786 * can be converted back to a #GstCaps by gst_caps_from_string().
1788 * For debugging purposes its easier to do something like this:
1790 * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
1792 * This prints the caps in human readble form.
1794 * Returns: (transfer full): a newly allocated string representing @caps.
1797 gst_caps_to_string (const GstCaps * caps)
1799 guint i, slen, clen;
1802 /* NOTE: This function is potentially called by the debug system,
1803 * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
1804 * should be careful to avoid recursion. This includes any functions
1805 * called by gst_caps_to_string. In particular, calls should
1806 * not use the GST_PTR_FORMAT extension. */
1809 return g_strdup ("NULL");
1811 if (CAPS_IS_ANY (caps)) {
1812 return g_strdup ("ANY");
1814 if (CAPS_IS_EMPTY_SIMPLE (caps)) {
1815 return g_strdup ("EMPTY");
1818 /* estimate a rough string length to avoid unnecessary reallocs in GString */
1820 clen = GST_CAPS_LEN (caps);
1821 for (i = 0; i < clen; i++) {
1823 STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked (caps,
1827 s = g_string_sized_new (slen);
1828 for (i = 0; i < clen; i++) {
1829 GstStructure *structure;
1832 /* ';' is now added by gst_structure_to_string */
1833 g_string_append_c (s, ' ');
1836 structure = gst_caps_get_structure_unchecked (caps, i);
1837 priv_gst_structure_append_to_gstring (structure, s);
1839 if (s->len && s->str[s->len - 1] == ';') {
1840 /* remove latest ';' */
1841 s->str[--s->len] = '\0';
1843 return g_string_free (s, FALSE);
1847 gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
1849 GstStructure *structure;
1852 if (strcmp ("ANY", string) == 0) {
1853 GST_CAPS_FLAGS (caps) = GST_CAPS_FLAGS_ANY;
1856 if (strcmp ("EMPTY", string) == 0) {
1860 structure = gst_structure_from_string (string, &s);
1861 if (structure == NULL) {
1864 gst_caps_append_structure_unchecked (caps, structure);
1868 while (g_ascii_isspace (*s))
1873 structure = gst_structure_from_string (s, &s);
1874 if (structure == NULL) {
1877 gst_caps_append_structure_unchecked (caps, structure);
1885 * gst_caps_from_string:
1886 * @string: a string to convert to #GstCaps
1888 * Converts @caps from a string representation.
1890 * Returns: (transfer full): a newly allocated #GstCaps
1893 gst_caps_from_string (const gchar * string)
1897 g_return_val_if_fail (string, FALSE);
1899 caps = gst_caps_new_empty ();
1900 if (gst_caps_from_string_inplace (caps, string)) {
1903 gst_caps_unref (caps);
1909 gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
1911 g_return_if_fail (G_IS_VALUE (src_value));
1912 g_return_if_fail (G_IS_VALUE (dest_value));
1913 g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
1914 g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
1915 || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
1917 dest_value->data[0].v_pointer =
1918 gst_caps_to_string (src_value->data[0].v_pointer);