From 321be92b2057cfcaf86318bd93a2ddb5a4b17c71 Mon Sep 17 00:00:00 2001 From: Etienne CHAMPETIER Date: Mon, 25 Apr 2016 09:58:28 +0200 Subject: [PATCH] Rework getRoundTripDelay to reduce 'RTT computation may be wrong' If RTT is really small (<1ms, like in a test setup), we might end up with negative ntprtd value, but less than 1ms, which we can round to 0. This is normal because timeMs is System.currentTimeMillis(), so the (im)precision is 1ms at best. Signed-off-by: Etienne CHAMPETIER --- .../impl/neomedia/MediaStreamStatsImpl.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/MediaStreamStatsImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamStatsImpl.java index dcc6b1dac..5661f0164 100644 --- a/src/org/jitsi/impl/neomedia/MediaStreamStatsImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaStreamStatsImpl.java @@ -390,26 +390,32 @@ private int computeRTTInMs(RTCPFeedback feedback) */ public static int getRoundTripDelay(long timeMs, long lsr, long dlsr) { - int roundTripDelay = -1; + long ntpTime = TimeUtils.toNtpTime(timeMs); + ntpTime = TimeUtils.toNtpShortFormat(ntpTime); - if (lsr > 0) - { - long ntpTime = TimeUtils.toNtpTime(timeMs); - ntpTime = TimeUtils.toNtpShortFormat(ntpTime); + long ntprtd = ntpTime - lsr - dlsr; - long ntprtd = ntpTime - lsr - dlsr; + long delayLong; + if (ntprtd >= 0) + { + delayLong = TimeUtils.ntpShortToMs(ntprtd); + } + else + { + /* + * Even if ntprtd is negative we compute delayLong + * as it might round to zero. + * ntpShortToMs expect positive numbers. + */ + delayLong = -TimeUtils.ntpShortToMs(-ntprtd); + } - if (ntprtd > 0) - { - long delayLong = TimeUtils.ntpShortToMs(ntprtd); - if (delayLong < Integer.MAX_VALUE) - { - roundTripDelay = (int) delayLong; - } - } + if (delayLong >= 0 && delayLong < Integer.MAX_VALUE) + { + return (int) delayLong; } - return roundTripDelay; + return -1; } /**