mpegdemux: Fix backward timestamp scan on small files.
authorJan Schmidt <jan@centricular.com>
Sun, 15 May 2016 09:04:20 +0000 (19:04 +1000)
committerJan Schmidt <jan@centricular.com>
Sun, 15 May 2016 09:30:55 +0000 (19:30 +1000)
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

index 5d7507b..3a7229d 100644 (file)
@@ -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)),