diff options
author | Thiago Santos <thiagoss@osg.samsung.com> | 2015-02-09 11:21:35 -0300 |
---|---|---|
committer | Thiago Santos <thiagoss@osg.samsung.com> | 2015-02-13 16:12:59 -0300 |
commit | 613039a4ea75aeb5d05f352f6e48b266bc7a4dd5 (patch) | |
tree | 50a1562bca6fcaf47f2e9be05120b890e438cb22 | |
parent | e7bd51255a9f946219757bedc744ca1d9e1f6460 (diff) | |
download | gstreamer-plugins-bad-613039a4ea75aeb5d05f352f6e48b266bc7a4dd5.tar.gz |
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
Conflicts:
gst/mpegtsdemux/tsdemux.c
-rw-r--r-- | gst/mpegtsdemux/tsdemux.c | 18 | ||||
-rw-r--r-- | gst/mpegtsdemux/tsdemux.h | 1 |
2 files changed, 9 insertions, 10 deletions
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index d97a7d52a..9b934ae5a 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -820,14 +820,11 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event) demux->rate = rate; res = GST_FLOW_OK; - if (flags & GST_SEEK_FLAG_ACCURATE) { - /* keep the seek infos for our segment */ - gst_segment_do_seek (&demux->segment, rate, format, flags, start_type, - start, stop_type, stop, NULL); - } else { - /* Drop segment infos, it will be recreated with actual seek infos */ - gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); - } + gst_segment_do_seek (&demux->segment, rate, format, flags, start_type, + start, stop_type, stop, NULL); + if (!(flags & GST_SEEK_FLAG_ACCURATE)) + demux->reset_segment = TRUE; + if (demux->segment_event) { gst_event_unref (demux->segment_event); demux->segment_event = NULL; @@ -836,12 +833,13 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event) for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) { TSDemuxStream *stream = tmp->data; - if (flags & GST_SEEK_FLAG_ACCURATE) stream->needs_keyframe = TRUE; stream->seeked_pts = GST_CLOCK_TIME_NONE; stream->seeked_dts = GST_CLOCK_TIME_NONE; + stream->need_newsegment = TRUE; + stream->first_dts = GST_CLOCK_TIME_NONE; } done: @@ -1957,7 +1955,7 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) demux->calculate_update_segment = FALSE; } - 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. */ GST_DEBUG ("Calculating actual segment"); if (base->segment.format == GST_FORMAT_TIME) { diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h index 16112fc9d..ae0cc9c62 100644 --- a/gst/mpegtsdemux/tsdemux.h +++ b/gst/mpegtsdemux/tsdemux.h @@ -69,6 +69,7 @@ struct _GstTSDemux /* segments to be sent */ GstSegment segment; GstEvent *segment_event; + gboolean reset_segment; /* global taglist */ GstTagList *global_tags; |