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: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/478>
This commit is contained in:
Thibault Saunier 2020-05-11 22:27:14 -04:00
parent b63dd628d2
commit f41f84538a
2 changed files with 35 additions and 0 deletions

View file

@ -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 */

View file

@ -50,6 +50,7 @@ struct _GstOutputSelector {
gint pad_negotiation_mode;
GstSegment segment;
guint32 segment_seqnum;
/* resend latest buffer after switch */
gboolean resend_latest;