mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 20:42:30 +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)
|
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
|
||||||
|
|
Loading…
Reference in a new issue