summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorAlessandro Decina <alessandro.d@gmail.com>2012-04-19 08:37:28 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-05-24 14:31:55 +0200
commit51c8cd805d05295566c85b2008c6ce9cf774de14 (patch)
tree2790cb7c9e116a7851b63feb981f2c184abd42de /gst
parent66d95d808c51258cbfc1b270a79a9d3742446c56 (diff)
downloadgstreamer-plugins-good-51c8cd805d05295566c85b2008c6ce9cf774de14.tar.gz
matroskademux: increase NEWSEGMENT accuracy after seeking
demux->common.segment is populated during seek handling with the target start/stop positions. Don't override them when sending out a NEWSEGMENT. Conflicts: gst/matroska/matroska-demux.c
Diffstat (limited to 'gst')
-rw-r--r--gst/matroska/matroska-demux.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c
index 9c475adb6..0580e35f5 100644
--- a/gst/matroska/matroska-demux.c
+++ b/gst/matroska/matroska-demux.c
@@ -1975,10 +1975,10 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
* would be determined again when parsing, but anyway ... */
seeksegment.duration = demux->common.segment.duration;
- flush = !!(flags & GST_SEEK_FLAG_FLUSH);
- keyunit = !!(flags & GST_SEEK_FLAG_KEY_UNIT);
- after = !!(flags & GST_SEEK_FLAG_SNAP_AFTER);
- before = !!(flags & GST_SEEK_FLAG_SNAP_BEFORE);
+ flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
+ keyunit = ! !(flags & GST_SEEK_FLAG_KEY_UNIT);
+ after = ! !(flags & GST_SEEK_FLAG_SNAP_AFTER);
+ before = ! !(flags & GST_SEEK_FLAG_SNAP_BEFORE);
GST_DEBUG_OBJECT (demux, "New segment %" GST_SEGMENT_FORMAT, &seeksegment);
@@ -3432,14 +3432,19 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
"Setting stream start time to %" GST_TIME_FORMAT,
GST_TIME_ARGS (lace_time));
}
- if (GST_CLOCK_TIME_IS_VALID (segment->stop))
- segment_duration = segment->stop - segment->start;
- else if (GST_CLOCK_TIME_IS_VALID (segment->position))
- segment_duration = segment->position - segment->start;
- segment->base += segment_duration / fabs (segment->rate);
- segment->start = MAX (lace_time, demux->stream_start_time);
- segment->stop = GST_CLOCK_TIME_NONE;
- segment->position = segment->start - demux->stream_start_time;
+ if (demux->common.segment.start == 0) {
+ /* set segment fields only if they weren't already set by seek handling
+ * code
+ */
+ if (GST_CLOCK_TIME_IS_VALID (segment->stop))
+ segment_duration = segment->stop - segment->start;
+ else if (GST_CLOCK_TIME_IS_VALID (segment->position))
+ segment_duration = segment->position - segment->start;
+ segment->base += segment_duration / fabs (segment->rate);
+ segment->start = MAX (lace_time, demux->stream_start_time);
+ segment->stop = GST_CLOCK_TIME_NONE;
+ segment->position = segment->start - demux->stream_start_time;
+ }
/* now convey our segment notion downstream */
gst_matroska_demux_send_event (demux, gst_event_new_segment (segment));
demux->need_segment = FALSE;