proxy: Forward queries/events sent directly to the element correctly
authorSebastian Dröge <sebastian@centricular.com>
Tue, 21 May 2019 13:17:40 +0000 (16:17 +0300)
committerTim-Philipp Müller <tim@centricular.com>
Thu, 8 Aug 2019 22:12:54 +0000 (23:12 +0100)
gst/proxy/gstproxysink.c
gst/proxy/gstproxysrc.c

index 325b8a0..c53e652 100644 (file)
@@ -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);
index 2c4a142..c7fb4b6 100644 (file)
@@ -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)
 {