summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <thiagoss@osg.samsung.com>2015-02-09 11:21:35 -0300
committerThiago Santos <thiagoss@osg.samsung.com>2015-02-13 16:12:59 -0300
commit613039a4ea75aeb5d05f352f6e48b266bc7a4dd5 (patch)
tree50a1562bca6fcaf47f2e9be05120b890e438cb22
parente7bd51255a9f946219757bedc744ca1d9e1f6460 (diff)
downloadgstreamer-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.c18
-rw-r--r--gst/mpegtsdemux/tsdemux.h1
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;