mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 18:21:04 +00:00
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.
This commit is contained in:
parent
8fc8b7ee33
commit
753b7c17f3
2 changed files with 36 additions and 6 deletions
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue