mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
rtpbin: Safer ts-offset-smoothing-factor calculation
Protect the ts-offset-smoothing-factor calculation from overflow. Output warning and fallback to ts-offset if it is detected. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1409>
This commit is contained in:
parent
31dd9226ce
commit
265878c4ba
1 changed files with 21 additions and 3 deletions
|
@ -1353,10 +1353,28 @@ stream_set_ts_offset (GstRtpBin * bin, GstRtpBinStream * stream,
|
||||||
if (!stream->is_initialized) {
|
if (!stream->is_initialized) {
|
||||||
stream->avg_ts_offset = ts_offset;
|
stream->avg_ts_offset = ts_offset;
|
||||||
stream->is_initialized = TRUE;
|
stream->is_initialized = TRUE;
|
||||||
|
} else {
|
||||||
|
/* RMA algorithm using smoothing factor is following, but split into
|
||||||
|
* parts to check for overflows:
|
||||||
|
* stream->avg_ts_offset =
|
||||||
|
* ((bin->ts_offset_smoothing_factor - 1) * stream->avg_ts_offset
|
||||||
|
* + ts_offset) / bin->ts_offset_smoothing_factor
|
||||||
|
*/
|
||||||
|
guint64 max_possible_smoothing_factor =
|
||||||
|
G_MAXINT64 / ABS (stream->avg_ts_offset);
|
||||||
|
gint64 cur_avg_product =
|
||||||
|
(bin->ts_offset_smoothing_factor - 1) * stream->avg_ts_offset;
|
||||||
|
|
||||||
|
if ((max_possible_smoothing_factor < bin->ts_offset_smoothing_factor) ||
|
||||||
|
(cur_avg_product > 0 && G_MAXINT64 - cur_avg_product < ts_offset) ||
|
||||||
|
(cur_avg_product < 0 && G_MININT64 - cur_avg_product > ts_offset)) {
|
||||||
|
GST_WARNING_OBJECT (bin,
|
||||||
|
"ts-offset-smoothing-factor calculation overflow, fallback to using ts-offset directly");
|
||||||
|
stream->avg_ts_offset = ts_offset;
|
||||||
} else {
|
} else {
|
||||||
stream->avg_ts_offset =
|
stream->avg_ts_offset =
|
||||||
((bin->ts_offset_smoothing_factor - 1) * stream->avg_ts_offset +
|
(cur_avg_product + ts_offset) / bin->ts_offset_smoothing_factor;
|
||||||
ts_offset) / bin->ts_offset_smoothing_factor;
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stream->avg_ts_offset = ts_offset;
|
stream->avg_ts_offset = ts_offset;
|
||||||
|
|
Loading…
Reference in a new issue