X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Fgstcaps.c;h=9e6408d574ea34d19b1557bd9575d4de197b992e;hb=0c6f5b3e4c3dc55e684bca1e3fc9a2a9b74407b9;hp=6acc564fc34f4121e78012601a5a9ca4262711f6;hpb=1dd72f56eada174a5764015f4d3b157a6243b9a0;p=platform%2Fupstream%2Fgstreamer.git diff --git a/gst/gstcaps.c b/gst/gstcaps.c index 6acc564..9e6408d 100644 --- a/gst/gstcaps.c +++ b/gst/gstcaps.c @@ -19,6 +19,7 @@ /** * SECTION:gstcaps + * @title: GstCaps * @short_description: Structure describing sets of media formats * @see_also: #GstStructure, #GstMiniObject * @@ -34,7 +35,7 @@ * handle or produce at runtime. * * A #GstCaps can be constructed with the following code fragment: - * |[ + * |[ * GstCaps *caps = gst_caps_new_simple ("video/x-raw", * "format", G_TYPE_STRING, "I420", * "framerate", GST_TYPE_FRACTION, 25, 1, @@ -145,6 +146,15 @@ _priv_gst_caps_initialize (void) G_TYPE_STRING, gst_caps_transform_to_string); } +void +_priv_gst_caps_cleanup (void) +{ + gst_caps_unref (_gst_caps_any); + _gst_caps_any = NULL; + gst_caps_unref (_gst_caps_none); + _gst_caps_none = NULL; +} + GstCapsFeatures * __gst_caps_get_features_unchecked (const GstCaps * caps, guint idx) { @@ -165,8 +175,7 @@ _gst_caps_copy (const GstCaps * caps) GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps); n = GST_CAPS_LEN (caps); - GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, caps, "doing copy %p -> %p", - caps, newcaps); + GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "doing copy %p -> %p", caps, newcaps); for (i = 0; i < n; i++) { structure = gst_caps_get_structure_unchecked (caps, i); @@ -206,6 +215,11 @@ _gst_caps_free (GstCaps * caps) #ifdef DEBUG_REFCOUNT GST_CAT_TRACE (GST_CAT_CAPS, "freeing caps %p", caps); #endif + +#ifdef USE_POISONING + memset (caps, 0xff, sizeof (GstCapsImpl)); +#endif + g_slice_free1 (sizeof (GstCapsImpl), caps); } @@ -385,9 +399,10 @@ G_DEFINE_POINTER_TYPE (GstStaticCaps, gst_static_caps); * * Converts a #GstStaticCaps to a #GstCaps. * - * Returns: (transfer full): a pointer to the #GstCaps. Unref after usage. - * Since the core holds an additional ref to the returned caps, - * use gst_caps_make_writable() on the returned caps to modify it. + * Returns: (transfer full) (nullable): a pointer to the #GstCaps. Unref + * after usage. Since the core holds an additional ref to the + * returned caps, use gst_caps_make_writable() on the returned caps + * to modify it. */ GstCaps * gst_static_caps_get (GstStaticCaps * static_caps) @@ -415,8 +430,13 @@ gst_static_caps_get (GstStaticCaps * static_caps) *caps = gst_caps_from_string (string); /* convert to string */ - if (G_UNLIKELY (*caps == NULL)) + if (G_UNLIKELY (*caps == NULL)) { g_critical ("Could not convert static caps \"%s\"", string); + goto done; + } + + /* Caps generated from static caps are usually leaked */ + GST_MINI_OBJECT_FLAG_SET (*caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); GST_CAT_TRACE (GST_CAT_CAPS, "created %p from string %s", static_caps, string); @@ -498,8 +518,8 @@ gst_caps_remove_and_get_structure (GstCaps * caps, guint idx) * Retrieves the structure with the given index from the list of structures * contained in @caps. The caller becomes the owner of the returned structure. * - * Returns: (transfer full): a pointer to the #GstStructure corresponding - * to @index. + * Returns: (transfer full) (nullable): a pointer to the #GstStructure + * corresponding to @index. */ GstStructure * gst_caps_steal_structure (GstCaps * caps, guint index) @@ -841,8 +861,8 @@ gst_caps_get_structure (const GstCaps * caps, guint index) * You do not need to free or unref the structure returned, it * belongs to the #GstCaps. * - * Returns: (transfer none): a pointer to the #GstCapsFeatures corresponding - * to @index + * Returns: (transfer none) (nullable): a pointer to the #GstCapsFeatures + * corresponding to @index * * Since: 1.2 */ @@ -912,6 +932,39 @@ gst_caps_set_features (GstCaps * caps, guint index, GstCapsFeatures * features) } /** + * gst_caps_set_features_simple: + * @caps: a #GstCaps + * @features: (allow-none) (transfer full): the #GstCapsFeatures to set + * + * Sets the #GstCapsFeatures @features for all the structures of @caps. + * + * Since: 1.16 + */ +void +gst_caps_set_features_simple (GstCaps * caps, GstCapsFeatures * features) +{ + guint i; + guint n; + + g_return_if_fail (caps != NULL); + g_return_if_fail (IS_WRITABLE (caps)); + + n = gst_caps_get_size (caps); + + for (i = 0; i < n; i++) { + GstCapsFeatures *f; + + /* Transfer ownership of @features to the last structure */ + if (features && i < n - 1) + f = gst_caps_features_copy (features); + else + f = features; + + gst_caps_set_features (caps, i, f); + } +} + +/** * gst_caps_copy_nth: * @caps: the #GstCaps to copy * @nth: the nth structure to copy @@ -920,6 +973,8 @@ gst_caps_set_features (GstCaps * caps, guint index, GstCapsFeatures * features) * contained in @caps. * * Returns: (transfer full): the new #GstCaps + * + * Since: 1.16 */ GstCaps * gst_caps_copy_nth (const GstCaps * caps, guint nth) @@ -951,6 +1006,10 @@ gst_caps_copy_nth (const GstCaps * caps, guint nth) * Discard all but the first structure from @caps. Useful when * fixating. * + * This function takes ownership of @caps and will call gst_caps_make_writable() + * on it if necessary, so you must not use @caps afterwards unless you keep an + * additional reference to it with gst_caps_ref(). + * * Returns: (transfer full): truncated caps */ GstCaps * @@ -1024,6 +1083,7 @@ gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs) G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err); if (G_UNLIKELY (err)) { g_critical ("%s", err); + g_free (err); return; } @@ -1446,7 +1506,7 @@ gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2) len1 = GST_CAPS_LEN (caps1); len2 = GST_CAPS_LEN (caps2); for (i = 0; i < len1 + len2 - 1; i++) { - /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */ + /* superset index goes from 0 to superset->structs->len-1 */ j = MIN (i, len1 - 1); /* subset index stays 0 until i reaches superset->structs->len, then it * counts up from 1 to subset->structs->len - 1 */ @@ -1574,7 +1634,7 @@ gst_caps_intersect_zig_zag (GstCaps * caps1, GstCaps * caps2) * Unlike @gst_caps_intersect, the returned caps will be ordered in a similar * fashion as @caps1. * - * Returns: the new #GstCaps + * Returns: (transfer full): the new #GstCaps */ static GstCaps * gst_caps_intersect_first (GstCaps * caps1, GstCaps * caps2) @@ -1645,7 +1705,7 @@ gst_caps_intersect_first (GstCaps * caps1, GstCaps * caps2) * to both @caps1 and @caps2, the order is defined by the #GstCapsIntersectMode * used. * - * Returns: the new #GstCaps + * Returns: (transfer full): the new #GstCaps */ GstCaps * gst_caps_intersect_full (GstCaps * caps1, GstCaps * caps2, @@ -1673,7 +1733,7 @@ gst_caps_intersect_full (GstCaps * caps1, GstCaps * caps2, * Creates a new #GstCaps that contains all the formats that are common * to both @caps1 and @caps2. Defaults to %GST_CAPS_INTERSECT_ZIG_ZAG mode. * - * Returns: the new #GstCaps + * Returns: (transfer full): the new #GstCaps */ GstCaps * gst_caps_intersect (GstCaps * caps1, GstCaps * caps2) @@ -1750,10 +1810,10 @@ gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend, * @subtrahend: #GstCaps to subtract * * Subtracts the @subtrahend from the @minuend. - * This function does not work reliably if optional properties for caps - * are included on one caps and omitted on the other. + * > This function does not work reliably if optional properties for caps + * > are included on one caps and omitted on the other. * - * Returns: the resulting caps + * Returns: (transfer full): the resulting caps */ GstCaps * gst_caps_subtract (GstCaps * minuend, GstCaps * subtrahend) @@ -1886,7 +1946,9 @@ gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr) * @caps, but contains no lists. Each list is expanded into separate * @GstStructures. * - * This function takes ownership of @caps. + * This function takes ownership of @caps and will call gst_caps_make_writable() + * on it so you must not use @caps afterwards unless you keep an additional + * reference to it with gst_caps_ref(). * * Returns: (transfer full): the normalized #GstCaps */ @@ -2043,9 +2105,13 @@ gst_caps_switch_structures (GstCaps * caps, GstStructure * old, * identical are merged. Component structures that have values that can be * merged are also merged. * + * This function takes ownership of @caps and will call gst_caps_make_writable() + * on it if necessary, so you must not use @caps afterwards unless you keep an + * additional reference to it with gst_caps_ref(). + * * This method does not preserve the original order of @caps. * - * Returns: The simplified caps. + * Returns: (transfer full): The simplified caps. */ GstCaps * gst_caps_simplify (GstCaps * caps) @@ -2113,6 +2179,10 @@ gst_caps_simplify (GstCaps * caps) * values. First the caps will be truncated and then the first structure will be * fixated with gst_structure_fixate(). * + * This function takes ownership of @caps and will call gst_caps_make_writable() + * on it so you must not use @caps afterwards unless you keep an additional + * reference to it with gst_caps_ref(). + * * Returns: (transfer full): the fixated caps */ GstCaps * @@ -2149,7 +2219,7 @@ gst_caps_fixate (GstCaps * caps) * can be converted back to a #GstCaps by gst_caps_from_string(). * * For debugging purposes its easier to do something like this: - * |[ + * |[ * GST_LOG ("caps are %" GST_PTR_FORMAT, caps); * ]| * This prints the caps in human readable form. @@ -2332,7 +2402,7 @@ gst_caps_from_string_inplace (GstCaps * caps, const gchar * string) * The current implementation of serialization will lead to unexpected results * when there are nested #GstCaps / #GstStructure deeper than one level. * - * Returns: (transfer full): a newly allocated #GstCaps + * Returns: (transfer full) (nullable): a newly allocated #GstCaps */ GstCaps * gst_caps_from_string (const gchar * string) @@ -2510,3 +2580,23 @@ gst_caps_filter_and_map_in_place (GstCaps * caps, GstCapsFilterMapFunc func, } } } + +/** + * gst_caps_copy: + * @caps: a #GstCaps. + * + * Creates a new #GstCaps as a copy of the old @caps. The new caps will have a + * refcount of 1, owned by the caller. The structures are copied as well. + * + * Note that this function is the semantic equivalent of a gst_caps_ref() + * followed by a gst_caps_make_writable(). If you only want to hold on to a + * reference to the data, you should use gst_caps_ref(). + * + * When you are finished with the caps, call gst_caps_unref() on it. + * + * Returns: the new #GstCaps + */ +GstCaps *(gst_caps_copy) (const GstCaps * caps) +{ + return GST_CAPS (gst_mini_object_copy (GST_MINI_OBJECT_CAST (caps))); +}