qtdemux: always keep media segments within total duration
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Wed, 20 Jan 2010 14:18:47 +0000 (15:18 +0100)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Wed, 20 Jan 2010 15:03:21 +0000 (16:03 +0100)
... as opposed to only doing so following a seek.

gst/qtdemux/qtdemux.c

index 3b8d3b4..c428a44 100644 (file)
@@ -2054,6 +2054,14 @@ gst_qtdemux_activate_segment (GstQTDemux * qtdemux, QtDemuxStream * stream,
     return FALSE;
   }
 
+  /* segment lies beyond total indicated duration */
+  if (G_UNLIKELY (segment->duration != -1 && segment->time > segment->duration)) {
+    GST_WARNING_OBJECT (qtdemux, "segment->duration %" G_GUINT64_FORMAT
+        " < segment->time %" G_GUINT64_FORMAT, segment->duration,
+        segment->time);
+    return FALSE;
+  }
+
   /* get time in this segment */
   seg_time = offset - segment->time;
 
@@ -2072,12 +2080,14 @@ gst_qtdemux_activate_segment (GstQTDemux * qtdemux, QtDemuxStream * stream,
    * In order to compare the two, we need to bring segment.stop
    * into the track-time-realm */
 
-  if (qtdemux->segment.stop == -1)
+  stop = qtdemux->segment.stop;
+  if (stop == -1)
+    stop = qtdemux->segment.duration;
+  if (stop == -1)
     stop = segment->media_stop;
   else
     stop =
-        MIN (segment->media_stop,
-        qtdemux->segment.stop - segment->time + segment->media_start);
+        MIN (segment->media_stop, stop - segment->time + segment->media_start);
 
   if (qtdemux->segment.rate >= 0) {
     start = MIN (segment->media_start + seg_time, stop);