avdemux: reset to 0 negative pts
authorNicola Murino <nicola.murino@gmail.com>
Sat, 23 Sep 2017 15:14:03 +0000 (17:14 +0200)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Fri, 6 Oct 2017 01:40:55 +0000 (21:40 -0400)
for us pts are unsigned so reset to 0 negative pts returned from libav.
This is better than outputs completly wrong timestamps

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

ext/libav/gstavdemux.c

index c119798..3728705 100644 (file)
@@ -1394,6 +1394,7 @@ gst_ffmpegdemux_loop (GstFFMpegDemux * demux)
   gint outsize;
   gboolean rawvideo;
   GstFlowReturn stream_last_flow;
+  gint64 pts;
 
   /* open file if we didn't so already */
   if (!demux->opened)
@@ -1421,7 +1422,21 @@ gst_ffmpegdemux_loop (GstFFMpegDemux * demux)
 
   /* do timestamps, we do this first so that we can know when we
    * stepped over the segment stop position. */
-  timestamp = gst_ffmpeg_time_ff_to_gst (pkt.pts, avstream->time_base);
+  pts = pkt.pts;
+  if (G_UNLIKELY (pts < 0)) {
+    /* some streams have pts such this:
+     * 0
+     * -2
+     * -1
+     * 1
+     *
+     * we reset pts to 0 since for us timestamp are unsigned
+     */
+    GST_WARNING_OBJECT (demux,
+        "negative pts detected: %" G_GINT64_FORMAT " resetting to 0", pts);
+    pts = 0;
+  }
+  timestamp = gst_ffmpeg_time_ff_to_gst (pts, avstream->time_base);
   if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
     stream->last_ts = timestamp;
   }