summaryrefslogtreecommitdiff
path: root/gst/interleave
diff options
context:
space:
mode:
authorThiago Santos <thiagoss@osg.samsung.com>2015-09-30 10:00:31 -0300
committerThiago Santos <thiagoss@osg.samsung.com>2015-09-30 12:48:30 -0300
commit74c05502f7cc40395e0f45bafa8eff88b595333d (patch)
tree1025bc7be24f5c8b2154c208df0b154036801fcb /gst/interleave
parentad5bc461c82e113f5882432a143c6eb814e6bb11 (diff)
downloadgstreamer-plugins-good-74c05502f7cc40395e0f45bafa8eff88b595333d.tar.gz
deinterleave: implement a caps query handler for the sinkpad
It was missing and apparently code relied on having it there for not allowing a change in the number of channels
Diffstat (limited to 'gst/interleave')
-rw-r--r--gst/interleave/deinterleave.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/gst/interleave/deinterleave.c b/gst/interleave/deinterleave.c
index c3373450b..074d812bb 100644
--- a/gst/interleave/deinterleave.c
+++ b/gst/interleave/deinterleave.c
@@ -134,6 +134,8 @@ gst_deinterleave_change_state (GstElement * element, GstStateChange transition);
static gboolean gst_deinterleave_sink_event (GstPad * pad, GstObject * parent,
GstEvent * event);
+static gboolean gst_deinterleave_sink_query (GstPad * pad, GstObject * parent,
+ GstQuery * query);
static gboolean gst_deinterleave_src_query (GstPad * pad, GstObject * parent,
GstQuery * query);
@@ -212,6 +214,8 @@ gst_deinterleave_init (GstDeinterleave * self)
GST_DEBUG_FUNCPTR (gst_deinterleave_chain));
gst_pad_set_event_function (self->sink,
GST_DEBUG_FUNCPTR (gst_deinterleave_sink_event));
+ gst_pad_set_query_function (self->sink,
+ GST_DEBUG_FUNCPTR (gst_deinterleave_sink_query));
gst_element_add_pad (GST_ELEMENT (self), self->sink);
}
@@ -501,8 +505,7 @@ __set_channels (GstCaps * caps, gint channels)
}
static GstCaps *
-gst_deinterleave_sink_getcaps (GstPad * pad, GstObject * parent,
- GstCaps * filter)
+gst_deinterleave_getcaps (GstPad * pad, GstObject * parent, GstCaps * filter)
{
GstDeinterleave *self = GST_DEINTERLEAVE (parent);
GstCaps *ret;
@@ -615,6 +618,31 @@ gst_deinterleave_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
}
static gboolean
+gst_deinterleave_sink_query (GstPad * pad, GstObject * parent, GstQuery * query)
+{
+ gboolean res;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CAPS:{
+ GstCaps *filter;
+ GstCaps *caps;
+
+ gst_query_parse_caps (query, &filter);
+ caps = gst_deinterleave_getcaps (pad, parent, filter);
+ gst_query_set_caps_result (query, caps);
+ gst_caps_unref (caps);
+ res = TRUE;
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, parent, query);
+ break;
+ }
+
+ return res;
+}
+
+static gboolean
gst_deinterleave_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
{
GstDeinterleave *self = GST_DEINTERLEAVE (parent);
@@ -650,7 +678,7 @@ gst_deinterleave_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
GstCaps *filter, *caps;
gst_query_parse_caps (query, &filter);
- caps = gst_deinterleave_sink_getcaps (pad, parent, filter);
+ caps = gst_deinterleave_getcaps (pad, parent, filter);
gst_query_set_caps_result (query, caps);
gst_caps_unref (caps);
}