diff options
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/include/pjmedia/rtcp.h | 8 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/session.h | 12 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/stream.h | 11 | ||||
-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 |
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. |