streamsynchronizer: Do not advance segment starts beyond stop times
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>
Mon, 4 Oct 2010 13:01:19 +0000 (10:01 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>
Thu, 7 Oct 2010 14:20:48 +0000 (11:20 -0300)
Advance stop times too when they are getting higher than the
stop time of segments, avoiding assertions.

The stop time has to be advanced too so that running time keep in sync
for gapless mode.

https://bugzilla.gnome.org/show_bug.cgi?id=631312

gst/playback/gststreamsynchronizer.c

index 5967abd..10cf281 100644 (file)
@@ -634,9 +634,13 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstBuffer * buffer)
 
       /* Is there a 1 second lag? */
       if (last_stop != -1 && last_stop + GST_SECOND < timestamp_end) {
-        gint64 new_start;
+        gint64 new_start, new_stop;
 
         new_start = timestamp_end - GST_SECOND;
+        if (ostream->segment.stop == -1)
+          new_stop = -1;
+        else
+          new_stop = MAX (new_start, ostream->segment.stop);
 
         GST_DEBUG_OBJECT (ostream->sinkpad,
             "Advancing stream %u from %" GST_TIME_FORMAT " to %"
@@ -646,11 +650,10 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstBuffer * buffer)
         gst_pad_push_event (ostream->srcpad,
             gst_event_new_new_segment_full (TRUE, ostream->segment.rate,
                 ostream->segment.applied_rate, ostream->segment.format,
-                new_start, ostream->segment.stop, new_start));
+                new_start, new_stop, new_start));
         gst_segment_set_newsegment_full (&ostream->segment, TRUE,
             ostream->segment.rate, ostream->segment.applied_rate,
-            ostream->segment.format, new_start, ostream->segment.stop,
-            new_start);
+            ostream->segment.format, new_start, new_stop, new_start);
         gst_segment_set_last_stop (&ostream->segment, GST_FORMAT_TIME,
             new_start);
       }