From f41f84538a1ec0cc40753872db5f7140f9075865 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 11 May 2020 22:27:14 -0400 Subject: [PATCH] output-selector: Drop duplicated seek events When we get a seek event on several source pads, we should drop the duplicated ones as any element that has several srcpads (like demuxers). Part-of: --- plugins/elements/gstoutputselector.c | 34 ++++++++++++++++++++++++++++ plugins/elements/gstoutputselector.h | 1 + 2 files changed, 35 insertions(+) diff --git a/plugins/elements/gstoutputselector.c b/plugins/elements/gstoutputselector.c index 2b97b98419..b4fb5cc2f4 100644 --- a/plugins/elements/gstoutputselector.c +++ b/plugins/elements/gstoutputselector.c @@ -189,6 +189,7 @@ gst_output_selector_reset (GstOutputSelector * osel) gst_buffer_unref (osel->latest_buffer); osel->latest_buffer = NULL; } + osel->segment_seqnum = GST_SEQNUM_INVALID; GST_OBJECT_UNLOCK (osel); gst_segment_init (&osel->segment, GST_FORMAT_UNDEFINED); } @@ -320,6 +321,38 @@ forward_sticky_events (GstPad * pad, GstEvent ** event, gpointer user_data) return TRUE; } +static gboolean +gst_output_selector_srcpad_event_func (GstPad * pad, GstObject * parent, + GstEvent * event) +{ + GstOutputSelector *osel = GST_OUTPUT_SELECTOR (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + { + guint32 seqnum = gst_event_get_seqnum (event); + + GST_OBJECT_LOCK (osel); + if (seqnum == osel->segment_seqnum) { + GST_OBJECT_UNLOCK (osel); + + GST_DEBUG_OBJECT (pad, + "Drop duplicated SEEK event seqnum %" G_GUINT32_FORMAT, seqnum); + gst_event_unref (event); + return TRUE; + } + + osel->segment_seqnum = seqnum; + GST_OBJECT_UNLOCK (osel); + break; + } + default: + break; + } + + return gst_pad_event_default (pad, parent, event); +} + static GstPad * gst_output_selector_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name, const GstCaps * caps) @@ -337,6 +370,7 @@ gst_output_selector_request_new_pad (GstElement * element, srcpad = gst_pad_new_from_template (templ, padname); GST_OBJECT_UNLOCK (osel); + gst_pad_set_event_function (srcpad, gst_output_selector_srcpad_event_func); gst_pad_set_active (srcpad, TRUE); /* Forward sticky events to the new srcpad */ diff --git a/plugins/elements/gstoutputselector.h b/plugins/elements/gstoutputselector.h index c39c5b1596..7eb1b7d470 100644 --- a/plugins/elements/gstoutputselector.h +++ b/plugins/elements/gstoutputselector.h @@ -50,6 +50,7 @@ struct _GstOutputSelector { gint pad_negotiation_mode; GstSegment segment; + guint32 segment_seqnum; /* resend latest buffer after switch */ gboolean resend_latest;