diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-04-05 16:56:19 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-04-05 16:56:19 +0000 |
commit | eb2feefaafb68d7605ca86ae027f5683a86dbacf (patch) | |
tree | 4084370a9de62e932d167c0bf1b36e983617ed34 /pjmedia | |
parent | b314eb0d0223a4c629b8c5a97877a413f1e14e3d (diff) |
Fixed bug in RTT calculation in RTCP and increase RTT resolution to usec
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@384 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/include/pjmedia/rtcp.h | 6 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/rtcp.c | 38 |
2 files changed, 35 insertions, 9 deletions
diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h index 1ce8362b..c577556c 100644 --- a/pjmedia/include/pjmedia/rtcp.h +++ b/pjmedia/include/pjmedia/rtcp.h @@ -163,10 +163,10 @@ struct pjmedia_rtcp_session pj_uint32_t jitter; /**< Scaled jitter */ pj_timestamp ts_freq; /**< System timestamp frequency. */ - pjmedia_rtcp_ntp_rec rtcp_lsr; /**< NTP ts in last SR received */ + pjmedia_rtcp_ntp_rec rtcp_lsr; /**< NTP ts in last SR received */ pj_timestamp rtcp_lsr_time;/**< Time when last SR is received*/ - pj_uint32_t peer_ssrc; /**< Peer SSRC */ - unsigned ee_delay; /**< End-to-end delay, in msec. */ + pj_uint32_t peer_ssrc; /**< Peer SSRC */ + unsigned rtt_us; /**< End-to-end delay, in usec. */ }; /** diff --git a/pjmedia/src/pjmedia/rtcp.c b/pjmedia/src/pjmedia/rtcp.c index bb5666e9..777aa929 100644 --- a/pjmedia/src/pjmedia/rtcp.c +++ b/pjmedia/src/pjmedia/rtcp.c @@ -19,10 +19,12 @@ #include <pjmedia/rtcp.h> #include <pjmedia/errno.h> #include <pj/assert.h> +#include <pj/log.h> #include <pj/os.h> #include <pj/sock.h> #include <pj/string.h> +#define THIS_FILE "rtcp.c" #define RTCP_SR 200 #define RTCP_RR 201 @@ -32,6 +34,11 @@ # error "High resolution timer needs to be enabled" #endif +#if 0 +# define TRACE_(x) PJ_LOG(3,x) +#else +# define TRACE_(x) +#endif /* * Get NTP time. @@ -182,12 +189,13 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *session, /* Calculate SR arrival time for DLSR */ pj_get_timestamp(&session->rtcp_lsr_time); - /* Calculate ee_delay if it has RR */ + /* Calculate RTT if it has RR */ if (size >= sizeof(pjmedia_rtcp_pkt)) { /* Can only calculate if LSR and DLSR is present in RR */ if (rtcp->rr.lsr && rtcp->rr.dlsr) { - pj_uint32_t lsr, now, dlsr, eedelay; + pj_uint32_t lsr, now, dlsr; + pj_uint64_t eedelay; pjmedia_rtcp_ntp_rec ntp; /* LSR is the middle 32bit of NTP. It has 1/65536 second @@ -206,10 +214,25 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *session, /* End-to-end delay is (now-lsr-dlsr) */ eedelay = now - lsr - dlsr; - /* Convert end to end delay to msec: + /* Convert end to end delay to usec (keeping the calculation in + * 64bit space):: * session->ee_delay = (eedelay * 1000) / 65536; */ - session->ee_delay = (eedelay * 1000) >> 16; + eedelay = (eedelay * 1000000) >> 16; + + TRACE_((THIS_FILE, "Rx RTCP: lsr=%p, dlsr=%p (%d:%03dms), " + "now=%p, rtt=%p", + lsr, dlsr, dlsr/65536, (dlsr%65536)*1000/65536, + now, (pj_uint32_t)eedelay)); + + /* Only save calculation if "now" is greater than lsr, or + * otherwise rtt will be invalid + */ + if (now-dlsr >= lsr) { + session->rtt_us = (pj_uint32_t)eedelay; + } else { + TRACE_((THIS_FILE, "NTP clock running backwards?")); + } } } } @@ -271,7 +294,7 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp(pjmedia_rtcp_session *session, rtcp_pkt->sr.ntp_sec = pj_htonl(ntp.hi); rtcp_pkt->sr.ntp_frac = pj_htonl(ntp.lo); - if (session->rtcp_lsr_time.u64 == 0 || session->rtcp_lsr.lo == 0) { + if (session->rtcp_lsr_time.u64 == 0) { rtcp_pkt->rr.lsr = 0; rtcp_pkt->rr.dlsr = 0; } else { @@ -289,6 +312,9 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp(pjmedia_rtcp_session *session, */ pj_get_timestamp(&ts); + /* Calculate DLSR */ + ts.u64 -= session->rtcp_lsr_time.u64; + /* Convert interval to 1/65536 seconds value */ ts.u64 = ((ts.u64 - session->rtcp_lsr_time.u64) << 16) / session->ts_freq.u64; @@ -302,4 +328,4 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp(pjmedia_rtcp_session *session, *len = sizeof(pjmedia_rtcp_pkt); } -
\ No newline at end of file + |