From fdf9bdf9295ff9ec781e0e1551ed18c581d1af34 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 13 Jun 2014 10:37:46 +0200 Subject: [PATCH] mpegtspacketizer: Fix wraparound detection issue Using 32bit unsigned values for corrected pcr/offset meant that we potentially ended up in bogus values Furthermore, refpcr - refpcroffset could end up being negative, which PCRTIME_TO_GSTTIME() can't handle (and returned a massive positive value) --- gst/mpegtsdemux/mpegtspacketizer.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 7785711fca..d39edefccd 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -1855,7 +1855,7 @@ record_pcr (MpegTSPacketizer2 * packetizer, MpegTSPCR * pcrtable, guint64 pcr, guint64 offset) { PCROffsetCurrent *current = pcrtable->current; - guint32 corpcr, coroffset; + gint64 corpcr, coroffset; packetizer->nb_seen_offsets += 1; @@ -1931,8 +1931,8 @@ record_pcr (MpegTSPacketizer2 * packetizer, MpegTSPCR * pcrtable, GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%u", GST_TIME_ARGS (PCRTIME_TO_GSTTIME (current->pending[current->last].pcr)), current->pending[current->last].offset); - GST_DEBUG ("To add (corrected) PCR:%" GST_TIME_FORMAT " offset:%u", - GST_TIME_ARGS (PCRTIME_TO_GSTTIME (corpcr)), coroffset); + GST_DEBUG ("To add (corrected) PCR:%" GST_TIME_FORMAT " offset:%" + G_GINT64_FORMAT, GST_TIME_ARGS (PCRTIME_TO_GSTTIME (corpcr)), coroffset); /* Do we need to close the current group ? */ /* Check for wrapover/discont */ @@ -2167,9 +2167,9 @@ mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, * returning bogus values if it's a PTS/DTS which is *just* * before the start of the current group */ - if (ABSDIFF (pts, PCRTIME_TO_GSTTIME (refpcr)) > GST_SECOND) - refpcr -= PCR_MAX_VALUE; - else + if (PCRTIME_TO_GSTTIME (refpcr) - pts > GST_SECOND) { + pts += PCR_GST_MAX_VALUE; + } else refpcr = G_MAXINT64; } } else { @@ -2213,7 +2213,8 @@ mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, } } if (refpcr != G_MAXINT64) - res = pts - PCRTIME_TO_GSTTIME (refpcr - refpcroffset); + res = + pts - PCRTIME_TO_GSTTIME (refpcr) + PCRTIME_TO_GSTTIME (refpcroffset); else GST_WARNING ("No groups, can't calculate timestamp"); } else