mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-28 20:05:38 +00:00
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:
parent
b63dd628d2
commit
f41f84538a
2 changed files with 35 additions and 0 deletions
|
@ -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 */
|
||||
|
|
|
@ -50,6 +50,7 @@ struct _GstOutputSelector {
|
|||
gint pad_negotiation_mode;
|
||||
|
||||
GstSegment segment;
|
||||
guint32 segment_seqnum;
|
||||
|
||||
/* resend latest buffer after switch */
|
||||
gboolean resend_latest;
|
||||
|
|
Loading…
Reference in a new issue