From e3b554f0e63bac97bb57a7b81bc8c5ae3810cb3f Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Sun, 15 May 2016 19:04:20 +1000 Subject: [PATCH] mpegdemux: Fix backward timestamp scan on small files. When the file size is smaller than the configured 4MB scan limit for timestamps, don't underflow the guard variable when checking if it's time to stop. Limit the backward SCR scan to the same 4MB as the PTS scan. Add some comments. --- gst/mpegdemux/gstmpegdemux.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c index 5d7507bee2..3a7229d8af 100644 --- a/gst/mpegdemux/gstmpegdemux.c +++ b/gst/mpegdemux/gstmpegdemux.c @@ -2597,9 +2597,11 @@ gst_ps_demux_scan_forward_ts (GstPsDemux * demux, guint64 * pos, GstMapInfo map; do { + /* Check we can get at least scan_sz bytes */ if (offset + scan_sz > demux->sink_segment.stop) return FALSE; + /* Don't go further than 'limit' bytes */ if (limit && offset > *pos + limit) return FALSE; @@ -2658,10 +2660,12 @@ gst_ps_demux_scan_backward_ts (GstPsDemux * demux, guint64 * pos, GstMapInfo map; do { + /* Check we have at least scan_sz bytes available */ if (offset < scan_sz - 1) return FALSE; - if (limit && offset < *pos - limit) + /* Don't go backward past the start or 'limit' bytes */ + if (limit && offset + limit < *pos) return FALSE; if (offset > BLOCK_SZ) @@ -2750,7 +2754,8 @@ gst_ps_sink_get_duration (GstPsDemux * demux) demux->first_scr_offset = offset; /* scan for last SCR in the stream */ offset = demux->sink_segment.stop; - gst_ps_demux_scan_backward_ts (demux, &offset, SCAN_SCR, &demux->last_scr, 0); + gst_ps_demux_scan_backward_ts (demux, &offset, SCAN_SCR, &demux->last_scr, + DURATION_SCAN_LIMIT); GST_DEBUG_OBJECT (demux, "Last SCR: %" G_GINT64_FORMAT " %" GST_TIME_FORMAT " in packet starting at %" G_GUINT64_FORMAT, demux->last_scr, GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->last_scr)),