mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 12:32:29 +00:00
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:
parent
20f3354c68
commit
fdf9bdf929
1 changed files with 8 additions and 7 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue