summaryrefslogtreecommitdiff
path: root/gst/proxy
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2019-05-21 16:17:40 +0300
committerSebastian Dröge <slomo@coaxion.net>2019-05-22 07:48:33 +0000
commitab9d42cc7fc0dca2e5a385eab54317b4dee7b3d1 (patch)
treef073e06262a3b8aef951f8bee4c5f7eeca706b02 /gst/proxy
parent70b08bdbfad43875c914600d86855009dc4de05e (diff)
downloadgstreamer-plugins-bad-ab9d42cc7fc0dca2e5a385eab54317b4dee7b3d1.tar.gz
proxy: Forward queries/events sent directly to the element correctly
Diffstat (limited to 'gst/proxy')
-rw-r--r--gst/proxy/gstproxysink.c31
-rw-r--r--gst/proxy/gstproxysrc.c40
2 files changed, 71 insertions, 0 deletions
diff --git a/gst/proxy/gstproxysink.c b/gst/proxy/gstproxysink.c
index 325b8a0f9..c53e65217 100644
--- a/gst/proxy/gstproxysink.c
+++ b/gst/proxy/gstproxysink.c
@@ -67,6 +67,10 @@ static gboolean gst_proxy_sink_sink_event (GstPad * pad, GstObject * parent,
static GstStateChangeReturn gst_proxy_sink_change_state (GstElement * element,
GstStateChange transition);
+static gboolean gst_proxy_sink_send_event (GstElement * element,
+ GstEvent * event);
+static gboolean gst_proxy_sink_query (GstElement * element, GstQuery * query);
+
static void
gst_proxy_sink_class_init (GstProxySinkClass * klass)
{
@@ -75,6 +79,8 @@ gst_proxy_sink_class_init (GstProxySinkClass * klass)
GST_DEBUG_CATEGORY_INIT (gst_proxy_sink_debug, "proxysink", 0, "proxy sink");
gstelement_class->change_state = gst_proxy_sink_change_state;
+ gstelement_class->send_event = gst_proxy_sink_send_event;
+ gstelement_class->query = gst_proxy_sink_query;
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&sink_template));
@@ -123,6 +129,31 @@ gst_proxy_sink_change_state (GstElement * element, GstStateChange transition)
}
static gboolean
+gst_proxy_sink_send_event (GstElement * element, GstEvent * event)
+{
+ GstProxySink *self = GST_PROXY_SINK (element);
+
+ if (GST_EVENT_IS_UPSTREAM (event)) {
+ return gst_pad_push_event (self->sinkpad, event);
+ } else {
+ gst_event_unref (event);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_proxy_sink_query (GstElement * element, GstQuery * query)
+{
+ GstProxySink *self = GST_PROXY_SINK (element);
+
+ if (GST_QUERY_IS_UPSTREAM (query)) {
+ return gst_pad_peer_query (self->sinkpad, query);
+ } else {
+ return FALSE;
+ }
+}
+
+static gboolean
gst_proxy_sink_sink_query (GstPad * pad, GstObject * parent, GstQuery * query)
{
GstProxySink *self = GST_PROXY_SINK (parent);
diff --git a/gst/proxy/gstproxysrc.c b/gst/proxy/gstproxysrc.c
index 2c4a1426a..c7fb4b62a 100644
--- a/gst/proxy/gstproxysrc.c
+++ b/gst/proxy/gstproxysrc.c
@@ -108,6 +108,9 @@ static gboolean gst_proxy_src_internal_src_event (GstPad * pad,
static GstStateChangeReturn gst_proxy_src_change_state (GstElement * element,
GstStateChange transition);
+static gboolean gst_proxy_src_send_event (GstElement * element,
+ GstEvent * event);
+static gboolean gst_proxy_src_query (GstElement * element, GstQuery * query);
static void gst_proxy_src_dispose (GObject * object);
static void
@@ -175,6 +178,8 @@ gst_proxy_src_class_init (GstProxySrcClass * klass)
GST_TYPE_PROXY_SINK, G_PARAM_READWRITE));
gstelement_class->change_state = gst_proxy_src_change_state;
+ gstelement_class->send_event = gst_proxy_src_send_event;
+ gstelement_class->query = gst_proxy_src_query;
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&src_template));
@@ -276,6 +281,41 @@ gst_proxy_src_change_state (GstElement * element, GstStateChange transition)
}
static gboolean
+gst_proxy_src_send_event (GstElement * element, GstEvent * event)
+{
+ GstProxySrc *self = GST_PROXY_SRC (element);
+
+ if (GST_EVENT_IS_DOWNSTREAM (event)) {
+ GstPad *sinkpad = gst_element_get_static_pad (self->queue, "sink");
+ gboolean ret;
+
+ ret = gst_pad_send_event (sinkpad, event);
+ gst_object_unref (sinkpad);
+ return ret;
+ } else {
+ gst_event_unref (event);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_proxy_src_query (GstElement * element, GstQuery * query)
+{
+ GstProxySrc *self = GST_PROXY_SRC (element);
+
+ if (GST_QUERY_IS_DOWNSTREAM (query)) {
+ GstPad *sinkpad = gst_element_get_static_pad (self->queue, "sink");
+ gboolean ret;
+
+ ret = gst_pad_query (sinkpad, query);
+ gst_object_unref (sinkpad);
+ return ret;
+ } else {
+ return FALSE;
+ }
+}
+
+static gboolean
gst_proxy_src_internal_src_query (GstPad * pad, GstObject * parent,
GstQuery * query)
{