diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-04-02 22:13:22 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-04-02 22:17:22 +0200 |
commit | 65c650d7d4f4f814950cbc90c1369abaeaed0a22 (patch) | |
tree | ee6dd49d780d1595d85ce7191f2760142627816c | |
parent | 0dd761101c2287e108370742594905e2c15408f0 (diff) |
capsfeatures: Add GST_CAPS_FEATURES_ANY
This is equal to any other caps features but results in unfixed caps. It
would be used by elements that only look at the buffer metadata or are
currently working in passthrough mode, and as such don't care about any
specific features.
-rw-r--r-- | docs/gst/gstreamer-sections.txt | 2 | ||||
-rw-r--r-- | gst/gstcaps.c | 5 | ||||
-rw-r--r-- | gst/gstcapsfeatures.c | 60 | ||||
-rw-r--r-- | gst/gstcapsfeatures.h | 6 | ||||
-rw-r--r-- | tests/check/gst/gstcapsfeatures.c | 14 |
5 files changed, 87 insertions, 0 deletions
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index d743b4836..5183a125b 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -459,6 +459,7 @@ gst_caps_intersect_mode_get_type GstCapsFeatures gst_caps_features_new gst_caps_features_new_empty +gst_caps_features_new_any gst_caps_features_new_id gst_caps_features_new_id_valist gst_caps_features_new_valist @@ -472,6 +473,7 @@ gst_caps_features_to_string gst_caps_features_set_parent_refcount gst_caps_features_is_equal +gst_caps_features_is_any gst_caps_features_contains gst_caps_features_contains_id diff --git a/gst/gstcaps.c b/gst/gstcaps.c index 0e8c798a5..aaa11310d 100644 --- a/gst/gstcaps.c +++ b/gst/gstcaps.c @@ -1075,12 +1075,17 @@ gboolean gst_caps_is_fixed (const GstCaps * caps) { GstStructure *structure; + GstCapsFeatures *features; g_return_val_if_fail (GST_IS_CAPS (caps), FALSE); if (GST_CAPS_LEN (caps) != 1) return FALSE; + features = gst_caps_get_features (caps, 0); + if (features && gst_caps_features_is_any (features)) + return FALSE; + structure = gst_caps_get_structure_unchecked (caps, 0); return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL); diff --git a/gst/gstcapsfeatures.c b/gst/gstcapsfeatures.c index 3a50254f6..56cd2d9fc 100644 --- a/gst/gstcapsfeatures.c +++ b/gst/gstcapsfeatures.c @@ -55,9 +55,11 @@ struct _GstCapsFeatures GType type; gint *parent_refcount; GArray *array; + gboolean is_any; }; GType _gst_caps_features_type = 0; +GstCapsFeatures *_gst_caps_features_any = NULL; GstCapsFeatures *_gst_caps_features_memory_system_memory = NULL; static GQuark _gst_caps_feature_memory_system_memory = 0; @@ -82,6 +84,7 @@ _priv_gst_caps_features_initialize (void) g_value_register_transform_func (_gst_caps_features_type, G_TYPE_STRING, gst_caps_features_transform_to_string); + _gst_caps_features_any = gst_caps_features_new_any (); _gst_caps_features_memory_system_memory = gst_caps_features_new_id (_gst_caps_feature_memory_system_memory, 0); @@ -148,6 +151,7 @@ gst_caps_features_new_empty (void) features->type = _gst_caps_features_type; features->parent_refcount = NULL; features->array = g_array_new (FALSE, FALSE, sizeof (GQuark)); + features->is_any = FALSE; GST_TRACE ("created caps features %p", features); @@ -155,6 +159,28 @@ gst_caps_features_new_empty (void) } /** + * gst_caps_features_new_any: + * + * Creates a new, ANY #GstCapsFeatures. This will be equal + * to any other #GstCapsFeatures but caps with these are + * unfixed. + * + * Free-function: gst_caps_features_free + * + * Returns: (transfer full): a new, ANY #GstCapsFeatures + */ +GstCapsFeatures * +gst_caps_features_new_any (void) +{ + GstCapsFeatures *features; + + features = gst_caps_features_new_empty (); + features->is_any = TRUE; + + return features; +} + +/** * gst_caps_features_new: * @feature1: name of first feature to set * @...: additional features @@ -388,6 +414,11 @@ priv_gst_caps_features_append_to_gstring (const GstCapsFeatures * features, g_return_if_fail (features != NULL); + if (features->array->len == 0 && features->is_any) { + g_string_append (s, "ANY"); + return; + } + n = features->array->len; for (i = 0; i < n; i++) { GQuark *quark = &g_array_index (features->array, GQuark, i); @@ -422,6 +453,11 @@ gst_caps_features_from_string (const gchar * features) if (!features || *features == '\0') return ret; + if (strcmp (features, "ANY") == 0) { + ret->is_any = TRUE; + return ret; + } + /* Skip trailing spaces */ while (*features == ' ') features++; @@ -582,6 +618,9 @@ gst_caps_features_contains_id (const GstCapsFeatures * features, GQuark feature) g_return_val_if_fail (features != NULL, FALSE); g_return_val_if_fail (feature != 0, FALSE); + if (features->is_any) + return TRUE; + n = features->array->len; if (n == 0) return feature == _gst_caps_feature_memory_system_memory; @@ -612,6 +651,9 @@ gst_caps_features_is_equal (const GstCapsFeatures * features1, g_return_val_if_fail (features1 != NULL, FALSE); g_return_val_if_fail (features2 != NULL, FALSE); + if (features1->is_any || features2->is_any) + return TRUE; + /* Check for the sysmem==empty case */ if (features1->array->len == 0 && features2->array->len == 0) return TRUE; @@ -637,6 +679,22 @@ gst_caps_features_is_equal (const GstCapsFeatures * features1, } /** + * gst_caps_features_is_any: + * @features: a #GstCapsFeatures. + * + * Returns %TRUE if @features is %GST_CAPS_FEATURES_ANY. + * + * Returns: %TRUE if @features is %GST_CAPS_FEATURES_ANY. + */ +gboolean +gst_caps_features_is_any (const GstCapsFeatures * features) +{ + g_return_val_if_fail (features != NULL, FALSE); + + return features->is_any; +} + +/** * gst_caps_features_add: * @features: a #GstCapsFeatures. * @feature: a feature. @@ -649,6 +707,7 @@ gst_caps_features_add (GstCapsFeatures * features, const gchar * feature) g_return_if_fail (features != NULL); g_return_if_fail (IS_MUTABLE (features)); g_return_if_fail (feature != NULL); + g_return_if_fail (!features->is_any); gst_caps_features_add_id (features, g_quark_from_string (feature)); } @@ -666,6 +725,7 @@ gst_caps_features_add_id (GstCapsFeatures * features, GQuark feature) g_return_if_fail (features != NULL); g_return_if_fail (IS_MUTABLE (features)); g_return_if_fail (feature != 0); + g_return_if_fail (!features->is_any); if (!gst_caps_feature_name_is_valid (g_quark_to_string (feature))) { g_warning ("Invalid caps feature name: %s", g_quark_to_string (feature)); diff --git a/gst/gstcapsfeatures.h b/gst/gstcapsfeatures.h index cb0359cb2..62d9e3c43 100644 --- a/gst/gstcapsfeatures.h +++ b/gst/gstcapsfeatures.h @@ -35,6 +35,9 @@ typedef struct _GstCapsFeatures GstCapsFeatures; #define GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY "memory:SystemMemory" +GST_EXPORT GstCapsFeatures *_gst_caps_features_any; +#define GST_CAPS_FEATURES_ANY (_gst_caps_features_any) + GST_EXPORT GstCapsFeatures *_gst_caps_features_memory_system_memory; #define GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY (_gst_caps_features_memory_system_memory) @@ -42,6 +45,7 @@ GType gst_caps_features_get_type (void); gboolean gst_is_caps_features (gconstpointer obj); GstCapsFeatures * gst_caps_features_new_empty (void); +GstCapsFeatures * gst_caps_features_new_any (void); GstCapsFeatures * gst_caps_features_new (const gchar *feature1, ...); GstCapsFeatures * gst_caps_features_new_valist (const gchar *feature1, va_list varargs); GstCapsFeatures * gst_caps_features_new_id (GQuark feature1, ...); @@ -63,6 +67,8 @@ gboolean gst_caps_features_contains (const GstCapsFeatures * features, gboolean gst_caps_features_contains_id (const GstCapsFeatures * features, GQuark feature); gboolean gst_caps_features_is_equal (const GstCapsFeatures * features1, const GstCapsFeatures * features2); +gboolean gst_caps_features_is_any (const GstCapsFeatures * features); + void gst_caps_features_add (GstCapsFeatures * features, const gchar * feature); void gst_caps_features_add_id ( GstCapsFeatures * features, GQuark feature); diff --git a/tests/check/gst/gstcapsfeatures.c b/tests/check/gst/gstcapsfeatures.c index 0c4b04ebf..5f76aa7d2 100644 --- a/tests/check/gst/gstcapsfeatures.c +++ b/tests/check/gst/gstcapsfeatures.c @@ -77,6 +77,20 @@ GST_START_TEST (test_from_to_string) gst_caps_features_free (a); gst_caps_features_free (b); g_free (str); + + a = gst_caps_features_new_any (); + fail_unless (a != NULL); + fail_unless (gst_caps_features_is_any (a)); + str = gst_caps_features_to_string (a); + fail_unless (str != NULL); + fail_unless_equals_string (str, "ANY"); + b = gst_caps_features_from_string (str); + fail_unless (b != NULL); + fail_unless (gst_caps_features_is_equal (a, b)); + fail_unless (gst_caps_features_is_any (b)); + gst_caps_features_free (a); + gst_caps_features_free (b); + g_free (str); } GST_END_TEST; |