summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-04-05 17:13:42 +0000
committerBenny Prijono <bennylp@teluu.com>2006-04-05 17:13:42 +0000
commitd3800eee7ccb891b4f77fcd4c2d4bc8ec5721e25 (patch)
treeb121db7caf7e2165ed1d705d7deb128405eb654a
parenteb2feefaafb68d7605ca86ae027f5683a86dbacf (diff)
Fixed RTT calculation bug in RTCP
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@385 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/include/pjmedia/rtcp.h4
-rw-r--r--pjmedia/src/pjmedia/rtcp.c26
2 files changed, 13 insertions, 17 deletions
diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h
index c577556c..78498a80 100644
--- a/pjmedia/include/pjmedia/rtcp.h
+++ b/pjmedia/include/pjmedia/rtcp.h
@@ -163,8 +163,8 @@ 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 */
- pj_timestamp rtcp_lsr_time;/**< Time when last SR is received*/
+ pj_uint32_t rx_lsr; /**< NTP ts in last SR received */
+ pj_timestamp rx_lsr_time;/**< Time when last SR is received */
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 777aa929..b522c279 100644
--- a/pjmedia/src/pjmedia/rtcp.c
+++ b/pjmedia/src/pjmedia/rtcp.c
@@ -76,8 +76,8 @@ PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *s,
s->clock_rate = clock_rate;
/* Init time */
- s->rtcp_lsr.hi = s->rtcp_lsr.lo = 0;
- s->rtcp_lsr_time.u64 = 0;
+ s->rx_lsr = 0;
+ s->rx_lsr_time.u64 = 0;
/* Init common RTCP header */
rtcp_pkt->common.version = 2;
@@ -182,12 +182,12 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *session,
/* Must at least contain SR */
pj_assert(size >= sizeof(pjmedia_rtcp_common)+sizeof(pjmedia_rtcp_sr));
- /* Save NTP timestamp */
- session->rtcp_lsr.hi = pj_ntohl(rtcp->sr.ntp_sec);
- session->rtcp_lsr.lo = pj_ntohl(rtcp->sr.ntp_frac);
+ /* Save LSR from NTP timestamp of RTCP packet */
+ session->rx_lsr = ((pj_ntohl(rtcp->sr.ntp_sec) & 0x0000FFFF) << 16) |
+ ((pj_ntohl(rtcp->sr.ntp_frac) >> 16) & 0xFFFF);
/* Calculate SR arrival time for DLSR */
- pj_get_timestamp(&session->rtcp_lsr_time);
+ pj_get_timestamp(&session->rx_lsr_time);
/* Calculate RTT if it has RR */
if (size >= sizeof(pjmedia_rtcp_pkt)) {
@@ -294,30 +294,26 @@ 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) {
+ if (session->rx_lsr_time.u64 == 0 || session->rx_lsr == 0) {
rtcp_pkt->rr.lsr = 0;
rtcp_pkt->rr.dlsr = 0;
} else {
pj_timestamp ts;
+ pj_uint32_t lsr = session->rx_lsr;
+ pj_uint64_t lsr_time = session->rx_lsr_time.u64;
/* Fill in LSR.
LSR is the middle 32bit of the last SR NTP time received.
*/
- rtcp_pkt->rr.lsr = ((session->rtcp_lsr.hi & 0x0000FFFF) << 16) |
- ((session->rtcp_lsr.lo >> 16) & 0xFFFF);
- rtcp_pkt->rr.lsr = pj_htonl(rtcp_pkt->rr.lsr);
+ rtcp_pkt->rr.lsr = pj_htonl(lsr);
/* Fill in DLSR.
DLSR is Delay since Last SR, in 1/65536 seconds.
*/
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;
+ ts.u64 = ((ts.u64 - lsr_time) << 16) / session->ts_freq.u64;
rtcp_pkt->rr.dlsr = pj_htonl( (pj_uint32_t)ts.u64 );
}