From 63a21ca8b1efac8c05b4f7372ac7cdf21540dac3 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Thu, 25 Aug 2011 11:02:16 +0100 Subject: [PATCH] BaseTransform: Add a query vfunc --- libs/gst/base/gstbasetransform.c | 32 +++++++++++++++++++++++++++----- libs/gst/base/gstbasetransform.h | 7 ++++++- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c index a46642ea24..debeccb6d7 100644 --- a/libs/gst/base/gstbasetransform.c +++ b/libs/gst/base/gstbasetransform.c @@ -350,6 +350,8 @@ static gboolean gst_base_transform_setcaps (GstPad * pad, GstCaps * caps); static GstFlowReturn gst_base_transform_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); static gboolean gst_base_transform_query (GstPad * pad, GstQuery * query); +static gboolean gst_base_transform_default_query (GstBaseTransform * trans, + GstPad * pad, GstQuery * query); static const GstQueryType *gst_base_transform_query_type (GstPad * pad); /* static guint gst_base_transform_signals[LAST_SIGNAL] = { 0 }; */ @@ -397,6 +399,7 @@ gst_base_transform_class_init (GstBaseTransformClass * klass) klass->src_event = GST_DEBUG_FUNCPTR (gst_base_transform_src_eventfunc); klass->accept_caps = GST_DEBUG_FUNCPTR (gst_base_transform_acceptcaps_default); + klass->query = GST_DEBUG_FUNCPTR (gst_base_transform_default_query); } static void @@ -1234,15 +1237,12 @@ failed_configure: } static gboolean -gst_base_transform_query (GstPad * pad, GstQuery * query) +gst_base_transform_default_query (GstBaseTransform * trans, + GstPad * pad, GstQuery * query) { gboolean ret = FALSE; - GstBaseTransform *trans; GstPad *otherpad; - trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad)); - if (G_UNLIKELY (trans == NULL)) - return FALSE; otherpad = (pad == trans->srcpad) ? trans->sinkpad : trans->srcpad; switch (GST_QUERY_TYPE (query)) { @@ -1274,7 +1274,29 @@ gst_base_transform_query (GstPad * pad, GstQuery * query) break; } + return ret; +} + +static gboolean +gst_base_transform_query (GstPad * pad, GstQuery * query) +{ + GstBaseTransform *trans; + GstBaseTransformClass *bclass; + gboolean ret; + + trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad)); + if (G_UNLIKELY (trans == NULL)) + return FALSE; + + bclass = GST_BASE_TRANSFORM_GET_CLASS (trans); + + if (bclass->query) + ret = bclass->query (trans, pad, query); + else + ret = gst_pad_query_default (pad, query); + gst_object_unref (trans); + return ret; } diff --git a/libs/gst/base/gstbasetransform.h b/libs/gst/base/gstbasetransform.h index 72c2b2a9de..8914260e44 100644 --- a/libs/gst/base/gstbasetransform.h +++ b/libs/gst/base/gstbasetransform.h @@ -190,6 +190,10 @@ struct _GstBaseTransform { * Subclasses can override this method to check if @caps can be * handled by the element. The default implementation might not be * the most optimal way to check this in all cases. + * @query: Optional Since 0.10.36 + * Handle a requested query. Subclasses that implement this + * should must chain up to the parent if they didn't handle the + * query * * Subclasses can override any of the available virtual methods or not, as * needed. At minimum either @transform or @transform_ip need to be overridden. @@ -243,9 +247,10 @@ struct _GstBaseTransformClass { gboolean (*accept_caps) (GstBaseTransform *trans, GstPadDirection direction, GstCaps *caps); + gboolean (*query) (GstBaseTransform *trans, GstPad *pad, GstQuery *query); /*< private >*/ - gpointer _gst_reserved[GST_PADDING_LARGE - 3]; + gpointer _gst_reserved[GST_PADDING_LARGE - 4]; }; GType gst_base_transform_get_type (void);