basesink: Update start time when losing state only if we were in PLAYING
authorSebastian Dröge <sebastian@centricular.com>
Mon, 13 Jun 2016 16:33:27 +0000 (18:33 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 13 Jun 2016 18:20:44 +0000 (20:20 +0200)
If we were in PAUSED, the current clock time and base time don't have much to
do with the running time anymore as the clock might have advanced while we
were PAUSED. The system clock does that for example, audio clocks often don't.

Updating the start time in PAUSED will cause a) the wrong position to be
reported, b) step events to step not just the requested amount but the amount
of time we spent in PAUSED. The start time should only ever be updated when
going from PLAYING to PAUSED to remember the current running time (to be able
to compensate later when going to PLAYING for the clock time advancing while
PAUSED), not when we are already in PAUSED.

Based on a patch by Kishore Arepalli <kishore.arepalli@gmail.com>

The updating of the start time when the state is lost was added in commit
ba943a82c0bbfd17c9ee9f5068d44c9d9274fd13 to fix the position reporting when
the state is lost. This still works correctly after this change.

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

libs/gst/base/gstbasesink.c

index 652fa05..0b66b5b 100644 (file)
@@ -2924,7 +2924,8 @@ gst_base_sink_update_start_time (GstBaseSink * basesink)
   GstClock *clock;
 
   GST_OBJECT_LOCK (basesink);
-  if ((clock = GST_ELEMENT_CLOCK (basesink))) {
+  if (GST_STATE (basesink) == GST_STATE_PLAYING
+      && (clock = GST_ELEMENT_CLOCK (basesink))) {
     GstClockTime now;
 
     gst_object_ref (clock);