diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2010-07-15 10:18:59 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2010-07-15 10:18:59 +0000 |
commit | 4a4a96e9bd530e5f12dd10d85dcd9944ca3a1da6 (patch) | |
tree | 4b15bf23a3b4da4cab202222fb09fc20db6641b2 /pjmedia/src | |
parent | b52385e0e1b8dc08378d2857d8794aab184f2a6a (diff) |
Re #1103:
- Updated RTCP jitter statistics calculation (in receiving direction) to use "interarrival jitter" (was using "difference D") of RFC 3550.
- Added APIs to reset RTCP statistics.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3237 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r-- | pjmedia/src/pjmedia/rtcp.c | 44 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/session.c | 12 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/stream.c | 14 |
3 files changed, 58 insertions, 12 deletions
diff --git a/pjmedia/src/pjmedia/rtcp.c b/pjmedia/src/pjmedia/rtcp.c index cbb9ecbd..5c6c63f6 100644 --- a/pjmedia/src/pjmedia/rtcp.c +++ b/pjmedia/src/pjmedia/rtcp.c @@ -136,6 +136,29 @@ PJ_DEF(void) pjmedia_rtcp_session_setting_default( /* + * Initialize bidirectional RTCP statistics. + * + */ +PJ_DEF(void) pjmedia_rtcp_init_stat(pjmedia_rtcp_stat *stat) +{ + pj_time_val now; + + pj_assert(stat); + + pj_bzero(stat, sizeof(pjmedia_rtcp_stat)); + + pj_math_stat_init(&stat->rtt); + pj_math_stat_init(&stat->rx.loss_period); + pj_math_stat_init(&stat->rx.jitter); + pj_math_stat_init(&stat->tx.loss_period); + pj_math_stat_init(&stat->tx.jitter); + + pj_gettimeofday(&now); + stat->start = now; +} + + +/* * Initialize RTCP session. */ PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *sess, @@ -194,17 +217,12 @@ PJ_DEF(void) pjmedia_rtcp_init2( pjmedia_rtcp_session *sess, /* Get time and timestamp base and frequency */ pj_gettimeofday(&now); sess->tv_base = now; - sess->stat.start = now; pj_get_timestamp(&sess->ts_base); pj_get_timestamp_freq(&sess->ts_freq); sess->rtp_ts_base = settings->rtp_ts_base; /* Initialize statistics states */ - pj_math_stat_init(&sess->stat.rtt); - pj_math_stat_init(&sess->stat.rx.loss_period); - pj_math_stat_init(&sess->stat.rx.jitter); - pj_math_stat_init(&sess->stat.tx.loss_period); - pj_math_stat_init(&sess->stat.tx.jitter); + pjmedia_rtcp_init_stat(&sess->stat); /* RR will be initialized on receipt of the first RTP packet. */ } @@ -350,17 +368,19 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess, sess->jitter += d - ((sess->jitter + 8) >> 4); - /* Get jitter in usec */ - if (d < 4294) - jitter = d * 1000000 / sess->clock_rate; + /* Update jitter stat */ + jitter = sess->jitter >> 4; + + /* Convert jitter unit from samples to usec */ + if (jitter < 4294) + jitter = jitter * 1000000 / sess->clock_rate; else { - jitter = d * 1000 / sess->clock_rate; + jitter = jitter * 1000 / sess->clock_rate; jitter *= 1000; } - - /* Update jitter stat */ pj_math_stat_update(&sess->stat.rx.jitter, jitter); + #if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) pjmedia_rtcp_xr_rx_rtp(&sess->xr_session, seq, 0, /* lost */ diff --git a/pjmedia/src/pjmedia/session.c b/pjmedia/src/pjmedia/session.c index 097ae4b7..409d1e69 100644 --- a/pjmedia/src/pjmedia/session.c +++ b/pjmedia/src/pjmedia/session.c @@ -841,6 +841,18 @@ PJ_DEF(pj_status_t) pjmedia_session_get_stream_stat( pjmedia_session *session, } +/** + * Reset session statistics. + */ +PJ_DEF(pj_status_t) pjmedia_session_reset_stream_stat( pjmedia_session *session, + unsigned index) +{ + PJ_ASSERT_RETURN(session && index < session->stream_cnt, PJ_EINVAL); + + return pjmedia_stream_reset_stat(session->stream[index]); +} + + #if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) /* * Get extended statistics diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c index ba5fad5c..f6d53d0a 100644 --- a/pjmedia/src/pjmedia/stream.c +++ b/pjmedia/src/pjmedia/stream.c @@ -2484,6 +2484,20 @@ PJ_DEF(pj_status_t) pjmedia_stream_get_stat( const pjmedia_stream *stream, return PJ_SUCCESS; } + +/* + * Reset the stream statistics in the middle of a stream session. + */ +PJ_DEF(pj_status_t) pjmedia_stream_reset_stat(pjmedia_stream *stream) +{ + PJ_ASSERT_RETURN(stream, PJ_EINVAL); + + pjmedia_rtcp_init_stat(&stream->rtcp.stat); + + return PJ_SUCCESS; +} + + #if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) /* * Get stream extended statistics. |