From 753b7c17f35994cc29f4bac0a087d040b25cae48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alicia=20Boya=20Garc=C3=ADa?= Date: Wed, 14 Nov 2018 08:57:55 +0100 Subject: [PATCH] matroskademux: Defer seeks received before GST_MATROSKA_READ_STATE_DATA This patch enables matroskademux to receive seeks before it reaches GST_MATROSKA_READ_STATE_DATA. Closes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/issues/514 This also enables receiving seeks in the element READY state. When such a seek is received, it is stored to be later handled when GST_MATROSKA_READ_STATE_DATA is reached. --- gst/matroska/matroska-demux.c | 40 +++++++++++++++++++++++++++++------ gst/matroska/matroska-demux.h | 2 ++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index 2362c97734..b06c2df315 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -357,6 +357,11 @@ gst_matroska_demux_reset (GstElement * element) demux->cached_length = G_MAXUINT64; + if (demux->deferred_seek_event) + gst_event_unref (demux->deferred_seek_event); + demux->deferred_seek_event = NULL; + demux->deferred_seek_pad = NULL; + gst_flow_combiner_clear (demux->flowcombiner); } @@ -1898,9 +1903,13 @@ gst_matroska_demux_element_send_event (GstElement * element, GstEvent * event) if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { /* no seeking until we are (safely) ready */ if (demux->common.state != GST_MATROSKA_READ_STATE_DATA) { - GST_DEBUG_OBJECT (demux, "not ready for seeking yet"); - gst_event_unref (event); - return FALSE; + GST_DEBUG_OBJECT (demux, + "not ready for seeking yet, deferring seek: %" GST_PTR_FORMAT, event); + if (demux->deferred_seek_event) + gst_event_unref (demux->deferred_seek_event); + demux->deferred_seek_event = event; + demux->deferred_seek_pad = NULL; + return TRUE; } res = gst_matroska_demux_handle_seek_event (demux, NULL, event); } else { @@ -3009,9 +3018,14 @@ gst_matroska_demux_handle_src_event (GstPad * pad, GstObject * parent, case GST_EVENT_SEEK: /* no seeking until we are (safely) ready */ if (demux->common.state != GST_MATROSKA_READ_STATE_DATA) { - GST_DEBUG_OBJECT (demux, "not ready for seeking yet"); - gst_event_unref (event); - return FALSE; + GST_DEBUG_OBJECT (demux, + "not ready for seeking yet, deferring seek event: %" GST_PTR_FORMAT, + event); + if (demux->deferred_seek_event) + gst_event_unref (demux->deferred_seek_event); + demux->deferred_seek_event = event; + demux->deferred_seek_pad = pad; + return TRUE; } { @@ -5324,6 +5338,20 @@ gst_matroska_demux_parse_id (GstMatroskaDemux * demux, guint32 id, demux->common.offset = demux->first_cluster_offset; } + if (demux->deferred_seek_event) { + GstEvent *seek_event; + GstPad *seek_pad; + seek_event = demux->deferred_seek_event; + seek_pad = demux->deferred_seek_pad; + demux->deferred_seek_event = NULL; + demux->deferred_seek_pad = NULL; + GST_DEBUG_OBJECT (demux, + "Handling deferred seek event: %" GST_PTR_FORMAT, seek_event); + gst_matroska_demux_handle_seek_event (demux, seek_pad, + seek_event); + gst_event_unref (seek_event); + } + /* send initial segment - we wait till we know the first incoming timestamp, so we can properly set the start of the segment. */ diff --git a/gst/matroska/matroska-demux.h b/gst/matroska/matroska-demux.h index 67a261007d..68569b5901 100644 --- a/gst/matroska/matroska-demux.h +++ b/gst/matroska/matroska-demux.h @@ -100,6 +100,8 @@ typedef struct _GstMatroskaDemux { gboolean building_index; guint64 index_offset; GstEvent *seek_event; + GstEvent *deferred_seek_event; + GstPad *deferred_seek_pad; gboolean need_segment; guint32 segment_seqnum;