diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-05-18 18:35:05 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-05-18 18:35:05 +0000 |
commit | 202d1a5c4b12735e9f7811c83a0e9494971b19fc (patch) | |
tree | 68a07c7e1d9887fa8b2ec8b14bc3dd989847c98a | |
parent | e134ae3866d21d3b6d0dd9d8d5599655573cf7eb (diff) |
Changed the way average jitter is calculated in rtcp
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@455 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjmedia/include/pjmedia/rtcp.h | 13 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/rtcp.c | 32 |
2 files changed, 27 insertions, 18 deletions
diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h index dcb800b5..12408fa4 100644 --- a/pjmedia/include/pjmedia/rtcp.h +++ b/pjmedia/include/pjmedia/rtcp.h @@ -175,6 +175,7 @@ struct pjmedia_rtcp_stream_stat } loss_type; /**< Types of loss detected. */ struct { + unsigned count; /**< Number of updates. */ unsigned min; /**< Minimum jitter (in usec) */ unsigned avg; /**< Average jitter (in usec) */ unsigned max; /**< Maximum jitter (in usec) */ @@ -217,6 +218,13 @@ struct pjmedia_rtcp_stat typedef struct pjmedia_rtcp_stat pjmedia_rtcp_stat; +#if defined(PJ_HAS_FLOATING_POINT) && PJ_HAS_FLOATING_POINT!=0 + typedef double PJMEDIA_AVG_JITTER_TYPE; +#else + typedef pj_uint32_t PJMEDIA_AVG_JITTER_TYPE; +#endif; + + /** * RTCP session is used to monitor the RTP session of one endpoint. There * should only be one RTCP session for a bidirectional RTP streams. @@ -244,6 +252,11 @@ struct pjmedia_rtcp_session pj_uint32_t peer_ssrc; /**< Peer SSRC */ pjmedia_rtcp_stat stat; /**< Bidirectional stream stat. */ + + /* Keep jitter calculation in floating point to prevent the values + * from being rounded-down to nearest integer. + */ + PJMEDIA_AVG_JITTER_TYPE avg_jitter; /**< Average RX jitter. */ }; /** diff --git a/pjmedia/src/pjmedia/rtcp.c b/pjmedia/src/pjmedia/rtcp.c index 1dab1c14..7c5b8d5f 100644 --- a/pjmedia/src/pjmedia/rtcp.c +++ b/pjmedia/src/pjmedia/rtcp.c @@ -138,6 +138,7 @@ PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *sess, /* Reset statistics */ pj_memset(&sess->stat, 0, sizeof(pjmedia_rtcp_stat)); + sess->avg_jitter = 0; /* Name */ sess->name = name ? name : THIS_FILE, @@ -285,11 +286,19 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *sess, jitter *= 1000; } + /* Add to average */ + sess->avg_jitter = + (jitter + sess->avg_jitter * sess->stat.rx.jitter.count) / + (sess->stat.rx.jitter.count + 1); + sess->stat.rx.jitter.avg = (unsigned)sess->avg_jitter; + ++sess->stat.rx.jitter.count; + /* Update jitter stat */ if (jitter < sess->stat.rx.jitter.min) sess->stat.rx.jitter.min = jitter; if (jitter > sess->stat.rx.jitter.max) sess->stat.rx.jitter.max = jitter; + sess->stat.rx.jitter.last = jitter; } } @@ -393,15 +402,16 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *sess, } /* Update jitter statistics */ - if (sess->stat.tx.update_cnt == 0) + if (sess->stat.tx.jitter.count == 0) sess->stat.tx.jitter.min = jitter; if (jitter < sess->stat.tx.jitter.min && jitter) sess->stat.tx.jitter.min = jitter; if (jitter > sess->stat.tx.jitter.max) sess->stat.tx.jitter.max = jitter; sess->stat.tx.jitter.avg = - (sess->stat.tx.jitter.avg * sess->stat.tx.update_cnt + jitter) / - (sess->stat.tx.update_cnt + 1); + (sess->stat.tx.jitter.avg * sess->stat.tx.jitter.count + jitter) / + (sess->stat.tx.jitter.count + 1); + ++sess->stat.tx.jitter.count; sess->stat.tx.jitter.last = jitter; @@ -508,7 +518,6 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp(pjmedia_rtcp_session *sess, int *len) { pj_uint32_t expected, expected_interval, received_interval, lost_interval; - pj_uint32_t jitter_samp, jitter; pjmedia_rtcp_pkt *rtcp_pkt = &sess->rtcp_pkt; pj_timestamp ts_now; pjmedia_rtcp_ntp_rec ntp; @@ -527,21 +536,8 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp(pjmedia_rtcp_session *sess, /* Jitter */ - jitter_samp = (sess->jitter >> 4); - rtcp_pkt->rr.jitter = pj_htonl(jitter_samp); + rtcp_pkt->rr.jitter = pj_htonl(sess->jitter >> 4); - /* Calculate jitter in usec, avoiding overflows */ - if (jitter_samp <= 4294) - jitter = jitter_samp * 1000000 / sess->clock_rate; - else { - jitter = jitter_samp * 1000 / sess->clock_rate; - jitter *= 1000; - } - - /* Update jitter statistics */ - sess->stat.rx.jitter.avg = - (sess->stat.rx.jitter.avg * sess->stat.rx.update_cnt + jitter) / - (sess->stat.rx.update_cnt + 1); /* Total lost. */ expected = pj_ntohl(rtcp_pkt->rr.last_seq) - sess->seq_ctrl.base_seq; |