From 5d4ac1cd3b6683a8d13d856c98adc09dbab25871 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 5 May 2017 11:19:10 -0500 Subject: [PATCH] FS-10284: [core] rtp session variable "ts" can wrap to zero for long running calls, causing incorrect logic to be executed #resolve --- src/switch_rtp.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 04c711c45c..253a9cef58 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -7737,6 +7737,22 @@ static int rtp_write_ready(switch_rtp_t *rtp_session, uint32_t bytes, int line) } +static int ts_delta(int last_val, int cur_val) +{ + int32_t delta; + int64_t x, y; + + x = last_val; + y = cur_val; + + if (x > UINT32_MAX / 2 && y < UINT32_MAX / 2) { + x -= (int64_t)UINT32_MAX+1; + } + + delta = (int32_t)y-x; + + return delta; +} static int rtp_common_write(switch_rtp_t *rtp_session, @@ -7797,12 +7813,14 @@ static int rtp_common_write(switch_rtp_t *rtp_session, } if (!switch_rtp_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO)) { - + if ((rtp_session->rtp_bugs & RTP_BUG_NEVER_SEND_MARKER)) { m = 0; } else { + int delta = ts_delta(rtp_session->last_write_ts, rtp_session->ts); + if (!rtp_session->flags[SWITCH_RTP_FLAG_UDPTL] && - ((!rtp_session->flags[SWITCH_RTP_FLAG_RESET] && (rtp_session->ts - rtp_session->last_write_ts > rtp_session->samples_per_interval * 10)) + ((!rtp_session->flags[SWITCH_RTP_FLAG_RESET] && (delta > rtp_session->samples_per_interval * 10)) || rtp_session->ts == rtp_session->samples_per_interval)) { m++; } @@ -7878,17 +7896,7 @@ static int rtp_common_write(switch_rtp_t *rtp_session, rtp_session->ts_norm.last_external = external; if (ntohl(send_msg->header.ts) != rtp_session->ts_norm.last_frame) { - int32_t delta; - int64_t x, y; - - x = rtp_session->ts_norm.last_frame; - y = ntohl(send_msg->header.ts); - - if (x > UINT32_MAX / 2 && y < UINT32_MAX / 2) { - x -= (int64_t)UINT32_MAX+1; - } - - delta = (int32_t)y-x; + int32_t delta = ts_delta(rtp_session->ts_norm.last_frame, ntohl(send_msg->header.ts)); if (delta < 0 || delta > 90000) { switch_core_media_gen_key_frame(rtp_session->session);