mpegpsdemux: several fixes on the seeking function in pul mode.
authorJosep Torra <n770galaxy@gmail.com>
Wed, 4 Feb 2009 21:17:36 +0000 (22:17 +0100)
committerJosep Torra <n770galaxy@gmail.com>
Wed, 4 Feb 2009 21:17:36 +0000 (22:17 +0100)
Removed a line wrongly copy pasted in my previous commit.
Avoid an unsigned integer overflow.
Seek last_stop in stream time.
Clamp last_stop in stream time between first and last SCR.
Fixed a typo in the GST_DEBUG line and added some more info.

gst/mpegdemux/gstmpegdemux.c

index f79e8330535ec1596506d0b5da98291f51320ed6..cb2bfa9bfd1964e36bfce289826e65f478d275f8 100644 (file)
@@ -941,21 +941,22 @@ gst_flups_demux_do_seek (GstFluPSDemux * demux, GstSegment * seeksegment)
 {
   gboolean found;
   guint64 fscr, offset;
-  guint64 scr =
-      MIN (demux->last_scr, GSTTIME_TO_MPEGTIME (seeksegment->last_stop));
+  guint64 scr = GSTTIME_TO_MPEGTIME (seeksegment->last_stop + demux->base_time);
   guint64 scr_rate_n = demux->last_scr_offset - demux->first_scr_offset;
   guint64 scr_rate_d = demux->last_scr - demux->first_scr;
 
+  scr = MIN (demux->last_scr, scr);
+  scr = MAX (demux->first_scr, scr);
+  fscr = scr;
+
 #if POST_10_10
-  GST_INFO_OBJECT (demux, "sink segment configured %" GST_SEGMENT_FORMAT,
-      &demux->sink_segment);
+  GST_INFO_OBJECT (demux, "sink segment configured %" GST_SEGMENT_FORMAT
+      ", trying to go at SCR: %" G_GUINT64_FORMAT, &demux->sink_segment, scr);
 #endif
 
   offset = MIN (gst_util_uint64_scale (scr, scr_rate_n, scr_rate_d),
       demux->sink_segment.stop);
 
-  gst_flups_demux_scan_forward_ts (demux, &offset, SCAN_SCR, &demux->first_scr);
-
   found = gst_flups_demux_scan_forward_ts (demux, &offset, SCAN_SCR, &fscr);
   if (!found) {
     found = gst_flups_demux_scan_backward_ts (demux, &offset, SCAN_SCR, &fscr);
@@ -966,13 +967,13 @@ gst_flups_demux_do_seek (GstFluPSDemux * demux, GstSegment * seeksegment)
     found = gst_flups_demux_scan_forward_ts (demux, &offset, SCAN_SCR, &fscr);
   }
 
-  while (found && fscr > scr) {
+  while (found && fscr > scr && offset > 0) {
     offset--;
     found = gst_flups_demux_scan_backward_ts (demux, &offset, SCAN_SCR, &fscr);
   }
 
   GST_INFO_OBJECT (demux, "doing seek at offset %" G_GUINT64_FORMAT
-      " SRC: %" G_GUINT64_FORMAT " %" GST_TIME_FORMAT,
+      " SCR: %" G_GUINT64_FORMAT " %" GST_TIME_FORMAT,
       offset, fscr, GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (fscr)));
   gst_segment_set_last_stop (&demux->sink_segment, GST_FORMAT_BYTES, offset);
 }