summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-04-05 16:56:19 +0000
committerBenny Prijono <bennylp@teluu.com>2006-04-05 16:56:19 +0000
commiteb2feefaafb68d7605ca86ae027f5683a86dbacf (patch)
tree4084370a9de62e932d167c0bf1b36e983617ed34 /pjmedia
parentb314eb0d0223a4c629b8c5a97877a413f1e14e3d (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.h6
-rw-r--r--pjmedia/src/pjmedia/rtcp.c38
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
+