From 81736228445912859347832f61b407743b01c6b6 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 6 Jul 2012 11:00:38 +0200 Subject: [PATCH] query: add flags to allocation query Make it possible to add API specific flags to the ALLOCATION query. This makes it possible to also check what kinds of subfeatures of the metadata API are supported. --- gst/gstquery.c | 47 ++++++++++++++++++++++++-------- gst/gstquery.h | 4 +-- libs/gst/base/gstbasetransform.c | 10 ++++--- libs/gst/base/gstbasetransform.h | 3 +- 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/gst/gstquery.c b/gst/gstquery.c index eb734c6ea7..a831d63a6f 100644 --- a/gst/gstquery.c +++ b/gst/gstquery.c @@ -1658,27 +1658,39 @@ gst_query_set_nth_allocation_pool (GstQuery * query, guint index, g_array_index (array, AllocationPool, index) = ap; } +typedef struct +{ + GType api; + guint flags; +} AllocationMeta; + /** * gst_query_add_allocation_meta: * @query: a GST_QUERY_ALLOCATION type query #GstQuery * @api: the metadata API + * @flags: API specific flags * - * Add @api as aone of the supported metadata API to @query. + * Add @api with @flags as one of the supported metadata API to @query. */ void -gst_query_add_allocation_meta (GstQuery * query, GType api) +gst_query_add_allocation_meta (GstQuery * query, GType api, guint flags) { GArray *array; GstStructure *structure; + AllocationMeta am; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION); g_return_if_fail (api != 0); g_return_if_fail (gst_query_is_writable (query)); structure = GST_QUERY_STRUCTURE (query); - array = ensure_array (structure, GST_QUARK (META), sizeof (GType), NULL); + array = + ensure_array (structure, GST_QUARK (META), sizeof (AllocationMeta), NULL); - g_array_append_val (array, api); + am.api = api; + am.flags = flags; + + g_array_append_val (array, am); } /** @@ -1699,7 +1711,8 @@ gst_query_get_n_allocation_metas (GstQuery * query) g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, 0); structure = GST_QUERY_STRUCTURE (query); - array = ensure_array (structure, GST_QUARK (META), sizeof (GType), NULL); + array = + ensure_array (structure, GST_QUARK (META), sizeof (AllocationMeta), NULL); return array->len; } @@ -1708,6 +1721,7 @@ gst_query_get_n_allocation_metas (GstQuery * query) * gst_query_parse_nth_allocation_meta: * @query: a GST_QUERY_ALLOCATION type query #GstQuery * @index: position in the metadata API array to read + * @flags: (out) (allow-none): API specific flags * * Parse an available query and get the metadata API * at @index of the metadata API array. @@ -1715,19 +1729,27 @@ gst_query_get_n_allocation_metas (GstQuery * query) * Returns: a #GType of the metadata API at @index. */ GType -gst_query_parse_nth_allocation_meta (GstQuery * query, guint index) +gst_query_parse_nth_allocation_meta (GstQuery * query, guint index, + guint * flags) { GArray *array; GstStructure *structure; + AllocationMeta *am; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, 0); structure = GST_QUERY_STRUCTURE (query); - array = ensure_array (structure, GST_QUARK (META), sizeof (GType), NULL); + array = + ensure_array (structure, GST_QUARK (META), sizeof (AllocationMeta), NULL); g_return_val_if_fail (index < array->len, 0); - return g_array_index (array, GType, index); + am = &g_array_index (array, AllocationMeta, index); + + if (flags) + *flags = am->flags; + + return am->api; } /** @@ -1747,7 +1769,8 @@ gst_query_remove_nth_allocation_meta (GstQuery * query, guint index) g_return_if_fail (gst_query_is_writable (query)); structure = GST_QUERY_STRUCTURE (query); - array = ensure_array (structure, GST_QUARK (META), sizeof (GType), NULL); + array = + ensure_array (structure, GST_QUARK (META), sizeof (AllocationMeta), NULL); g_return_if_fail (index < array->len); g_array_remove_index (array, index); @@ -1773,11 +1796,13 @@ gst_query_has_allocation_meta (GstQuery * query, GType api) g_return_val_if_fail (api != 0, FALSE); structure = GST_QUERY_STRUCTURE (query); - array = ensure_array (structure, GST_QUARK (META), sizeof (GType), NULL); + array = + ensure_array (structure, GST_QUARK (META), sizeof (AllocationMeta), NULL); len = array->len; for (i = 0; i < len; i++) { - if (g_array_index (array, GType, i) == api) + AllocationMeta *am = &g_array_index (array, AllocationMeta, i); + if (am->api == api) return TRUE; } return FALSE; diff --git a/gst/gstquery.h b/gst/gstquery.h index 15913e7879..be43a90772 100644 --- a/gst/gstquery.h +++ b/gst/gstquery.h @@ -427,9 +427,9 @@ void gst_query_set_nth_allocation_param (GstQuery *query, guint ind const GstAllocationParams *params); /* metadata */ -void gst_query_add_allocation_meta (GstQuery *query, GType api); +void gst_query_add_allocation_meta (GstQuery *query, GType api, guint flags); guint gst_query_get_n_allocation_metas (GstQuery *query); -GType gst_query_parse_nth_allocation_meta (GstQuery *query, guint index); +GType gst_query_parse_nth_allocation_meta (GstQuery *query, guint index, guint *flags); void gst_query_remove_nth_allocation_meta (GstQuery *query, guint index); gboolean gst_query_has_allocation_meta (GstQuery *query, GType api); diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c index 0e1dcae09a..9b15768615 100644 --- a/libs/gst/base/gstbasetransform.c +++ b/libs/gst/base/gstbasetransform.c @@ -813,9 +813,10 @@ gst_base_transform_default_decide_allocation (GstBaseTransform * trans, n_metas = gst_query_get_n_allocation_metas (query); for (i = 0; i < n_metas; i++) { GType api; + guint flags; gboolean remove; - api = gst_query_parse_nth_allocation_meta (query, i); + api = gst_query_parse_nth_allocation_meta (query, i, &flags); /* by default we remove all metadata, subclasses should implement a * filter_meta function */ @@ -827,7 +828,7 @@ gst_base_transform_default_decide_allocation (GstBaseTransform * trans, remove = TRUE; } else if (G_LIKELY (klass->filter_meta)) { /* remove if the subclass said so */ - remove = !klass->filter_meta (trans, query, api); + remove = !klass->filter_meta (trans, query, api, flags); GST_LOG_OBJECT (trans, "filter_meta for api %s returned: %s", g_type_name (api), (remove ? "remove" : "keep")); } else { @@ -1368,10 +1369,11 @@ gst_base_transform_default_propose_allocation (GstBaseTransform * trans, n_metas = gst_query_get_n_allocation_metas (decide_query); for (i = 0; i < n_metas; i++) { GType api; + guint flags; - api = gst_query_parse_nth_allocation_meta (decide_query, i); + api = gst_query_parse_nth_allocation_meta (decide_query, i, &flags); GST_DEBUG_OBJECT (trans, "proposing metadata %s", g_type_name (api)); - gst_query_add_allocation_meta (query, api); + gst_query_add_allocation_meta (query, api, flags); } ret = TRUE; } diff --git a/libs/gst/base/gstbasetransform.h b/libs/gst/base/gstbasetransform.h index 1ebb9d9aba..2ec3910beb 100644 --- a/libs/gst/base/gstbasetransform.h +++ b/libs/gst/base/gstbasetransform.h @@ -225,7 +225,8 @@ struct _GstBaseTransformClass { /* decide allocation query for output buffers */ gboolean (*decide_allocation) (GstBaseTransform *trans, GstQuery *query); - gboolean (*filter_meta) (GstBaseTransform *trans, GstQuery *query, GType api); + gboolean (*filter_meta) (GstBaseTransform *trans, GstQuery *query, + GType api, guint flags); /* propose allocation query parameters for input buffers */ gboolean (*propose_allocation) (GstBaseTransform *trans, GstQuery *decide_query,