mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
tsdemux: Fix segment and segment event handling during seeking
Always update the segment and not only for accurate seeking and always send a new segment event after seeks. For non-accurate force a reset of our segment info to start from where our seek led us as we don't need to be accurate https://bugzilla.gnome.org/show_bug.cgi?id=743363
This commit is contained in:
parent
84a9493a81
commit
b347ea9870
2 changed files with 9 additions and 10 deletions
|
@ -815,14 +815,11 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event)
|
||||||
demux->rate = rate;
|
demux->rate = rate;
|
||||||
res = GST_FLOW_OK;
|
res = GST_FLOW_OK;
|
||||||
|
|
||||||
if (flags & GST_SEEK_FLAG_ACCURATE) {
|
gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
|
||||||
/* keep the seek infos for our segment */
|
start, stop_type, stop, NULL);
|
||||||
gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
|
if (!(flags & GST_SEEK_FLAG_ACCURATE))
|
||||||
start, stop_type, stop, NULL);
|
demux->reset_segment = TRUE;
|
||||||
} else {
|
|
||||||
/* Drop segment infos, it will be recreated with actual seek infos */
|
|
||||||
gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED);
|
|
||||||
}
|
|
||||||
if (demux->segment_event) {
|
if (demux->segment_event) {
|
||||||
gst_event_unref (demux->segment_event);
|
gst_event_unref (demux->segment_event);
|
||||||
demux->segment_event = NULL;
|
demux->segment_event = NULL;
|
||||||
|
@ -831,12 +828,13 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event)
|
||||||
for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
|
for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
|
||||||
TSDemuxStream *stream = tmp->data;
|
TSDemuxStream *stream = tmp->data;
|
||||||
|
|
||||||
|
|
||||||
if (flags & GST_SEEK_FLAG_ACCURATE)
|
if (flags & GST_SEEK_FLAG_ACCURATE)
|
||||||
stream->needs_keyframe = TRUE;
|
stream->needs_keyframe = TRUE;
|
||||||
|
|
||||||
stream->seeked_pts = GST_CLOCK_TIME_NONE;
|
stream->seeked_pts = GST_CLOCK_TIME_NONE;
|
||||||
stream->seeked_dts = GST_CLOCK_TIME_NONE;
|
stream->seeked_dts = GST_CLOCK_TIME_NONE;
|
||||||
|
stream->need_newsegment = TRUE;
|
||||||
|
stream->first_dts = GST_CLOCK_TIME_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -1951,7 +1949,7 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream)
|
||||||
GST_DEBUG ("lowest_pts %" G_GUINT64_FORMAT " => clocktime %" GST_TIME_FORMAT,
|
GST_DEBUG ("lowest_pts %" G_GUINT64_FORMAT " => clocktime %" GST_TIME_FORMAT,
|
||||||
lowest_pts, GST_TIME_ARGS (firstts));
|
lowest_pts, GST_TIME_ARGS (firstts));
|
||||||
|
|
||||||
if (demux->segment.format != GST_FORMAT_TIME) {
|
if (demux->segment.format != GST_FORMAT_TIME || demux->reset_segment) {
|
||||||
/* It will happen only if it's first program or after flushes. */
|
/* It will happen only if it's first program or after flushes. */
|
||||||
GST_DEBUG ("Calculating actual segment");
|
GST_DEBUG ("Calculating actual segment");
|
||||||
if (base->segment.format == GST_FORMAT_TIME) {
|
if (base->segment.format == GST_FORMAT_TIME) {
|
||||||
|
|
|
@ -69,6 +69,7 @@ struct _GstTSDemux
|
||||||
/* segments to be sent */
|
/* segments to be sent */
|
||||||
GstSegment segment;
|
GstSegment segment;
|
||||||
GstEvent *segment_event;
|
GstEvent *segment_event;
|
||||||
|
gboolean reset_segment;
|
||||||
|
|
||||||
/* global taglist */
|
/* global taglist */
|
||||||
GstTagList *global_tags;
|
GstTagList *global_tags;
|
||||||
|
|
Loading…
Reference in a new issue