summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/libav/gstavdemux.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/ext/libav/gstavdemux.c b/ext/libav/gstavdemux.c
index c119798..3728705 100644
--- a/ext/libav/gstavdemux.c
+++ b/ext/libav/gstavdemux.c
@@ -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;
}