summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2010-07-15 10:18:59 +0000
committerNanang Izzuddin <nanang@teluu.com>2010-07-15 10:18:59 +0000
commit4a4a96e9bd530e5f12dd10d85dcd9944ca3a1da6 (patch)
tree4b15bf23a3b4da4cab202222fb09fc20db6641b2
parentb52385e0e1b8dc08378d2857d8794aab184f2a6a (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
-rw-r--r--pjmedia/include/pjmedia/rtcp.h8
-rw-r--r--pjmedia/include/pjmedia/session.h12
-rw-r--r--pjmedia/include/pjmedia/stream.h11
-rw-r--r--pjmedia/src/pjmedia/rtcp.c44
-rw-r--r--pjmedia/src/pjmedia/session.c12
-rw-r--r--pjmedia/src/pjmedia/stream.c14
6 files changed, 89 insertions, 12 deletions
diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h
index df6e1848..a232388c 100644
--- a/pjmedia/include/pjmedia/rtcp.h
+++ b/pjmedia/include/pjmedia/rtcp.h
@@ -297,6 +297,14 @@ PJ_DECL(void) pjmedia_rtcp_session_setting_default(
/**
+ * Initialize bidirectional RTCP statistics.
+ *
+ * @param stat The bidirectional RTCP statistics.
+ */
+PJ_DECL(void) pjmedia_rtcp_init_stat(pjmedia_rtcp_stat *stat);
+
+
+/**
* Initialize RTCP session.
*
* @param session The session
diff --git a/pjmedia/include/pjmedia/session.h b/pjmedia/include/pjmedia/session.h
index 2fd7d1a2..575c89fc 100644
--- a/pjmedia/include/pjmedia/session.h
+++ b/pjmedia/include/pjmedia/session.h
@@ -282,6 +282,18 @@ PJ_DECL(pj_status_t) pjmedia_session_get_stream_stat(pjmedia_session *session,
pjmedia_rtcp_stat *stat);
+/**
+ * Reset session statistics.
+ *
+ * @param session The media session.
+ * @param index Stream index.
+ *
+ * @return PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t) pjmedia_session_reset_stream_stat(pjmedia_session *session,
+ unsigned index);
+
+
#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
/**
* Get extended session statistics. The extended statistic shows reports
diff --git a/pjmedia/include/pjmedia/stream.h b/pjmedia/include/pjmedia/stream.h
index 94727e25..84f6b1de 100644
--- a/pjmedia/include/pjmedia/stream.h
+++ b/pjmedia/include/pjmedia/stream.h
@@ -226,6 +226,17 @@ PJ_DECL(pj_status_t) pjmedia_stream_start(pjmedia_stream *stream);
PJ_DECL(pj_status_t) pjmedia_stream_get_stat( const pjmedia_stream *stream,
pjmedia_rtcp_stat *stat);
+
+/**
+ * Reset the stream statistics.
+ *
+ * @param stream The media stream.
+ *
+ * @return PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t) pjmedia_stream_reset_stat(pjmedia_stream *stream);
+
+
#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
/**
* Get the stream extended report statistics (RTCP XR).
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.