From 9b1a57442e7b4d875d66e6d37fe95bdf81f1d3bb Mon Sep 17 00:00:00 2001 From: Olivier Crete Date: Wed, 2 Apr 2008 22:46:12 +0000 Subject: [PATCH] [MOVED FROM GST-P-FARSIGHT] Import adder src event handling 20080402224612-3e2dc-21a682b18fe18782bf7fa48983c13c1ad86dc5a1.gz --- gst/liveadder/liveadder.c | 85 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/gst/liveadder/liveadder.c b/gst/liveadder/liveadder.c index 808fdca8ca..36e5280856 100644 --- a/gst/liveadder/liveadder.c +++ b/gst/liveadder/liveadder.c @@ -115,6 +115,8 @@ static GstCaps * gst_live_adder_sink_getcaps (GstPad * pad); static gboolean gst_live_adder_src_activate_push (GstPad * pad, gboolean active); +static gboolean +gst_live_adder_src_event (GstPad * pad, GstEvent * event); static void gst_live_adder_loop (gpointer data); @@ -222,6 +224,8 @@ gst_live_adder_init (GstLiveAdder * adder, GstLiveAdderClass *klass) GST_DEBUG_FUNCPTR (gst_live_adder_setcaps)); gst_pad_set_query_function (adder->srcpad, GST_DEBUG_FUNCPTR (gst_live_adder_query)); + gst_pad_set_event_function (adder->srcpad, + GST_DEBUG_FUNCPTR (gst_live_adder_src_event)); gst_pad_set_activatepush_function (adder->srcpad, GST_DEBUG_FUNCPTR (gst_live_adder_src_activate_push)); gst_element_add_pad (GST_ELEMENT (adder), adder->srcpad); @@ -680,6 +684,87 @@ gst_live_adder_query (GstPad * pad, GstQuery * query) return res; } +static gboolean +forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) +{ + gst_event_ref (event); + GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event)); + if (!gst_pad_push_event (pad, event)) { + g_value_set_boolean (ret, FALSE); + GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", + event, GST_EVENT_TYPE_NAME (event)); + } else { + GST_LOG_OBJECT (pad, "Sent event %p (%s).", + event, GST_EVENT_TYPE_NAME (event)); + } + gst_object_unref (pad); + return TRUE; +} + +/* forwards the event to all sinkpads, takes ownership of the + * event + * + * Returns: TRUE if the event could be forwarded on all + * sinkpads. + */ +static gboolean +forward_event (GstLiveAdder * adder, GstEvent * event) +{ + gboolean ret; + GstIterator *it; + GValue vret = { 0 }; + + GST_LOG_OBJECT (adder, "Forwarding event %p (%s)", event, + GST_EVENT_TYPE_NAME (event)); + + ret = TRUE; + + g_value_init (&vret, G_TYPE_BOOLEAN); + g_value_set_boolean (&vret, TRUE); + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (adder)); + gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func, &vret, + event); + gst_iterator_free (it); + gst_event_unref (event); + + ret = g_value_get_boolean (&vret); + + return ret; +} + + +static gboolean +gst_live_adder_src_event (GstPad * pad, GstEvent * event) +{ + GstLiveAdder *adder; + gboolean result; + + adder = GST_LIVE_ADDER (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS: + /* QoS might be tricky */ + result = FALSE; + break; + case GST_EVENT_SEEK: + /* I'm not certain how to handle seeks yet */ + result = FALSE; + break; + case GST_EVENT_NAVIGATION: + /* navigation is rather pointless. */ + result = FALSE; + break; + default: + /* just forward the rest for now */ + result = forward_event (adder, event); + break; + + } + gst_object_unref (adder); + + return result; +} + static guint gst_live_adder_length_from_duration (GstLiveAdder *adder, GstClockTime duration) {