summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-05-18 18:35:05 +0000
committerBenny Prijono <bennylp@teluu.com>2006-05-18 18:35:05 +0000
commit202d1a5c4b12735e9f7811c83a0e9494971b19fc (patch)
tree68a07c7e1d9887fa8b2ec8b14bc3dd989847c98a /pjmedia
parente134ae3866d21d3b6d0dd9d8d5599655573cf7eb (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
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/rtcp.h13
-rw-r--r--pjmedia/src/pjmedia/rtcp.c32
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;