diff options
author | Alessandro Decina <alessandro.d@gmail.com> | 2012-04-19 08:37:28 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-05-24 14:31:55 +0200 |
commit | 51c8cd805d05295566c85b2008c6ce9cf774de14 (patch) | |
tree | 2790cb7c9e116a7851b63feb981f2c184abd42de /gst | |
parent | 66d95d808c51258cbfc1b270a79a9d3742446c56 (diff) | |
download | gstreamer-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.c | 29 |
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; |