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)
This commit is contained in:
Edward Hervey 2014-06-13 10:37:46 +02:00
parent 20f3354c68
commit fdf9bdf929

View file

@ -1855,7 +1855,7 @@ record_pcr (MpegTSPacketizer2 * packetizer, MpegTSPCR * pcrtable,
guint64 pcr, guint64 offset) guint64 pcr, guint64 offset)
{ {
PCROffsetCurrent *current = pcrtable->current; PCROffsetCurrent *current = pcrtable->current;
guint32 corpcr, coroffset; gint64 corpcr, coroffset;
packetizer->nb_seen_offsets += 1; 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_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%u",
GST_TIME_ARGS (PCRTIME_TO_GSTTIME (current->pending[current->last].pcr)), GST_TIME_ARGS (PCRTIME_TO_GSTTIME (current->pending[current->last].pcr)),
current->pending[current->last].offset); current->pending[current->last].offset);
GST_DEBUG ("To add (corrected) PCR:%" GST_TIME_FORMAT " offset:%u", GST_DEBUG ("To add (corrected) PCR:%" GST_TIME_FORMAT " offset:%"
GST_TIME_ARGS (PCRTIME_TO_GSTTIME (corpcr)), coroffset); G_GINT64_FORMAT, GST_TIME_ARGS (PCRTIME_TO_GSTTIME (corpcr)), coroffset);
/* Do we need to close the current group ? */ /* Do we need to close the current group ? */
/* Check for wrapover/discont */ /* 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* * returning bogus values if it's a PTS/DTS which is *just*
* before the start of the current group * before the start of the current group
*/ */
if (ABSDIFF (pts, PCRTIME_TO_GSTTIME (refpcr)) > GST_SECOND) if (PCRTIME_TO_GSTTIME (refpcr) - pts > GST_SECOND) {
refpcr -= PCR_MAX_VALUE; pts += PCR_GST_MAX_VALUE;
else } else
refpcr = G_MAXINT64; refpcr = G_MAXINT64;
} }
} else { } else {
@ -2213,7 +2213,8 @@ mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer,
} }
} }
if (refpcr != G_MAXINT64) if (refpcr != G_MAXINT64)
res = pts - PCRTIME_TO_GSTTIME (refpcr - refpcroffset); res =
pts - PCRTIME_TO_GSTTIME (refpcr) + PCRTIME_TO_GSTTIME (refpcroffset);
else else
GST_WARNING ("No groups, can't calculate timestamp"); GST_WARNING ("No groups, can't calculate timestamp");
} else } else