mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
tsdemux: respect seqnums on seeks
Pass the seqnum to other events that are consequence of the original seek event
This commit is contained in:
parent
c70fceb16f
commit
efb27f19ec
1 changed files with 21 additions and 13 deletions
|
@ -1328,6 +1328,7 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
|
||||||
GstSeekFlags flags;
|
GstSeekFlags flags;
|
||||||
GstSeekType start_type, stop_type;
|
GstSeekType start_type, stop_type;
|
||||||
gint64 start, stop;
|
gint64 start, stop;
|
||||||
|
GstEvent *flush_event = NULL;
|
||||||
|
|
||||||
gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
|
gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
|
||||||
&stop_type, &stop);
|
&stop_type, &stop);
|
||||||
|
@ -1353,11 +1354,13 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
|
||||||
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||||
GST_WARNING ("seeking failed %s", gst_flow_get_name (ret));
|
GST_WARNING ("seeking failed %s", gst_flow_get_name (ret));
|
||||||
else {
|
else {
|
||||||
|
GstEvent *new_seek;
|
||||||
base->mode = BASE_MODE_SEEKING;
|
base->mode = BASE_MODE_SEEKING;
|
||||||
if (!gst_pad_push_event (base->sinkpad, gst_event_new_seek (rate,
|
|
||||||
GST_FORMAT_BYTES, flags,
|
new_seek = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
|
||||||
GST_SEEK_TYPE_SET, base->seek_offset,
|
GST_SEEK_TYPE_SET, base->seek_offset, GST_SEEK_TYPE_NONE, -1);
|
||||||
GST_SEEK_TYPE_NONE, -1)))
|
gst_event_set_seqnum (new_seek, GST_EVENT_SEQNUM (event));
|
||||||
|
if (!gst_pad_push_event (base->sinkpad, new_seek))
|
||||||
ret = GST_FLOW_ERROR;
|
ret = GST_FLOW_ERROR;
|
||||||
else
|
else
|
||||||
base->last_seek_seqnum = GST_EVENT_SEQNUM (event);
|
base->last_seek_seqnum = GST_EVENT_SEQNUM (event);
|
||||||
|
@ -1378,9 +1381,10 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
|
||||||
base->mode = BASE_MODE_SEEKING;
|
base->mode = BASE_MODE_SEEKING;
|
||||||
if (flush) {
|
if (flush) {
|
||||||
GST_DEBUG_OBJECT (base, "sending flush start");
|
GST_DEBUG_OBJECT (base, "sending flush start");
|
||||||
gst_pad_push_event (base->sinkpad, gst_event_new_flush_start ());
|
flush_event = gst_event_new_flush_start ();
|
||||||
GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base,
|
gst_event_set_seqnum (flush_event, GST_EVENT_SEQNUM (event));
|
||||||
gst_event_new_flush_start ());
|
gst_pad_push_event (base->sinkpad, gst_event_ref (flush_event));
|
||||||
|
GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, flush_event);
|
||||||
} else
|
} else
|
||||||
gst_pad_pause_task (base->sinkpad);
|
gst_pad_pause_task (base->sinkpad);
|
||||||
|
|
||||||
|
@ -1390,7 +1394,11 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
|
||||||
if (flush) {
|
if (flush) {
|
||||||
/* send a FLUSH_STOP for the sinkpad, since we need data for seeking */
|
/* send a FLUSH_STOP for the sinkpad, since we need data for seeking */
|
||||||
GST_DEBUG_OBJECT (base, "sending flush stop");
|
GST_DEBUG_OBJECT (base, "sending flush stop");
|
||||||
gst_pad_push_event (base->sinkpad, gst_event_new_flush_stop (TRUE));
|
flush_event = gst_event_new_flush_stop (TRUE);
|
||||||
|
gst_event_set_seqnum (flush_event, GST_EVENT_SEQNUM (event));
|
||||||
|
|
||||||
|
/* ref for it to be reused later */
|
||||||
|
gst_pad_push_event (base->sinkpad, gst_event_ref (flush_event));
|
||||||
/* And actually flush our pending data but allow to preserve some info
|
/* And actually flush our pending data but allow to preserve some info
|
||||||
* to perform the seek */
|
* to perform the seek */
|
||||||
mpegts_base_flush (base, FALSE);
|
mpegts_base_flush (base, FALSE);
|
||||||
|
@ -1415,15 +1423,15 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad,
|
||||||
GST_WARNING ("subclass has no seek implementation");
|
GST_WARNING ("subclass has no seek implementation");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flush) {
|
if (flush_event) {
|
||||||
/* if we sent a FLUSH_START, we now send a FLUSH_STOP */
|
/* if we sent a FLUSH_START, we now send a FLUSH_STOP */
|
||||||
GST_DEBUG_OBJECT (base, "sending flush stop");
|
GST_DEBUG_OBJECT (base, "sending flush stop");
|
||||||
//gst_pad_push_event (base->sinkpad, gst_event_new_flush_stop ());
|
GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, flush_event);
|
||||||
GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base,
|
flush_event = NULL;
|
||||||
gst_event_new_flush_stop (TRUE));
|
|
||||||
}
|
}
|
||||||
//else
|
|
||||||
done:
|
done:
|
||||||
|
if (flush_event)
|
||||||
|
gst_event_unref (flush_event);
|
||||||
gst_pad_start_task (base->sinkpad, (GstTaskFunction) mpegts_base_loop, base,
|
gst_pad_start_task (base->sinkpad, (GstTaskFunction) mpegts_base_loop, base,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue