avdemux: fix negative pts if start_time is bigger than the ts
authorGuillaume Desmottes <guillaume.desmottes@collabora.com>
Thu, 21 Feb 2019 07:48:31 +0000 (08:48 +0100)
committerGuillaume Desmottes <guillaume.desmottes@collabora.com>
Thu, 21 Feb 2019 07:56:34 +0000 (08:56 +0100)
The start time is supposed to be the ts of the first frame.
FFmpeg uses fractions to represent timestamps and the start time may use a
different base than the frame pts. So we may end up having the start
time bigger than the pts because of rounding when converting to gst ts.

See https://gitlab.freedesktop.org/gstreamer/gst-libav/issues/51
for details.

ext/libav/gstavdemux.c

index 30e0360..3b74f92 100644 (file)
@@ -1473,8 +1473,14 @@ gst_ffmpegdemux_loop (GstFFMpegDemux * demux)
     goto drop;
 #endif
 
-  if (GST_CLOCK_TIME_IS_VALID (timestamp))
-    timestamp -= demux->start_time;
+  if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+    /* start_time should be the ts of the first frame but it may actually be
+     * higher because of rounding when converting to gst ts. */
+    if (demux->start_time >= timestamp)
+      timestamp = 0;
+    else
+      timestamp -= demux->start_time;
+  }
 
   /* check if we ran outside of the segment */
   if (demux->segment.stop != -1 && timestamp > demux->segment.stop)