diff options
author | Edward Hervey <bilboed@bilboed.com> | 2014-06-13 10:37:46 +0200 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2014-06-13 11:48:39 +0200 |
commit | fdf9bdf9295ff9ec781e0e1551ed18c581d1af34 (patch) | |
tree | c4095c8cfcf3863d8cfa5d8eb1f2e60fd6436511 /gst | |
parent | 20f3354c687d3c33f5ca4e75bcd3b46ff1642add (diff) | |
download | gstreamer-plugins-bad-fdf9bdf9295ff9ec781e0e1551ed18c581d1af34.tar.gz |
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)
Diffstat (limited to 'gst')
-rw-r--r-- | gst/mpegtsdemux/mpegtspacketizer.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 7785711fc..d39edefcc 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 |