diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2010-07-15 14:45:47 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2010-07-15 14:45:47 +0000 |
commit | 2493e2b525ad94e031c40acb5506fc5e1cd99266 (patch) | |
tree | aafa1ee1b295d5d861eec710d5321d06ac47d365 | |
parent | f086c93150a5743a95a71779c4739c2b151aea2f (diff) |
Re #1103:
- Added (back) raw jitter statistics into RTCP statistics, with the new name "rx_raw_jitter".
- Added IPDV statistics into RTCP statistics.
- Added new compile-time settings to enable/disable raw jitter and IPDV statistics.
- Updated call dump in pjsua-lib.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3239 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjmedia/include/pjmedia/config.h | 29 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/rtcp.h | 12 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/rtcp.c | 50 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 27 |
4 files changed, 115 insertions, 3 deletions
diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h index 948598b0..05e40148 100644 --- a/pjmedia/include/pjmedia/config.h +++ b/pjmedia/include/pjmedia/config.h @@ -430,6 +430,35 @@ # define PJMEDIA_RTCP_IGNORE_FIRST_PACKETS 25 #endif + +/** + * Specify whether RTCP statistics includes raw jitter statistics. + * Raw jitter is defined as absolute value of network transit time + * difference of two consecutive packets; refering to "difference D" + * term in interarrival jitter calculation in RFC 3550 section 6.4.1. + * + * Default: 0 (no). + */ +#ifndef PJMEDIA_RTCP_STAT_HAS_RAW_JITTER +# define PJMEDIA_RTCP_STAT_HAS_RAW_JITTER 0 +#endif + + +/** + * Specify whether RTCP statistics includes IP Delay Variation statistics. + * IPDV is defined as network transit time difference of two consecutive + * packets. The IPDV statistic can be useful to inspect clock skew existance + * and level, e.g: when the IPDV mean values were stable in positive numbers, + * then the remote clock (used in sending RTP packets) is faster than local + * system clock. Ideally, the IPDV mean values are always equal to 0. + * + * Default: 0 (no). + */ +#ifndef PJMEDIA_RTCP_STAT_HAS_IPDV +# define PJMEDIA_RTCP_STAT_HAS_IPDV 0 +#endif + + /** * Specify whether RTCP XR support should be built into PJMEDIA. Disabling * this feature will reduce footprint slightly. Note that even when this diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h index a232388c..4373f32e 100644 --- a/pjmedia/include/pjmedia/rtcp.h +++ b/pjmedia/include/pjmedia/rtcp.h @@ -214,6 +214,18 @@ struct pjmedia_rtcp_stat pj_uint32_t rtp_tx_last_ts; /**< Last TX RTP timestamp. */ pj_uint16_t rtp_tx_last_seq;/**< Last TX RTP sequence. */ + +#if defined(PJMEDIA_RTCP_STAT_HAS_IPDV) && PJMEDIA_RTCP_STAT_HAS_IPDV!=0 + pj_math_stat rx_ipdv;/**< Statistics of IP packet delay + variation in receiving direction + (in usec). */ +#endif + +#if defined(PJMEDIA_RTCP_STAT_HAS_RAW_JITTER) && PJMEDIA_RTCP_STAT_HAS_RAW_JITTER!=0 + pj_math_stat rx_raw_jitter;/**< Statistic of raw jitter in + receiving direction + (in usec). */ +#endif }; diff --git a/pjmedia/src/pjmedia/rtcp.c b/pjmedia/src/pjmedia/rtcp.c index 5c6c63f6..7d0a8f5c 100644 --- a/pjmedia/src/pjmedia/rtcp.c +++ b/pjmedia/src/pjmedia/rtcp.c @@ -153,6 +153,14 @@ PJ_DEF(void) pjmedia_rtcp_init_stat(pjmedia_rtcp_stat *stat) pj_math_stat_init(&stat->tx.loss_period); pj_math_stat_init(&stat->tx.jitter); +#if defined(PJMEDIA_RTCP_STAT_HAS_IPDV) && PJMEDIA_RTCP_STAT_HAS_IPDV!=0 + pj_math_stat_init(&stat->rx_ipdv); +#endif + +#if defined(PJMEDIA_RTCP_STAT_HAS_RAW_JITTER) && PJMEDIA_RTCP_STAT_HAS_RAW_JITTER!=0 + pj_math_stat_init(&stat->rx_raw_jitter); +#endif + pj_gettimeofday(&now); stat->start = now; } @@ -360,9 +368,8 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess, } else { pj_int32_t d; pj_uint32_t jitter; - + d = transit - sess->transit; - sess->transit = transit; if (d < 0) d = -d; @@ -381,6 +388,42 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess, pj_math_stat_update(&sess->stat.rx.jitter, jitter); +#if defined(PJMEDIA_RTCP_STAT_HAS_RAW_JITTER) && PJMEDIA_RTCP_STAT_HAS_RAW_JITTER!=0 + { + pj_uint32_t raw_jitter; + + /* Convert raw jitter unit from samples to usec */ + if (d < 4294) + raw_jitter = d * 1000000 / sess->clock_rate; + else { + raw_jitter = d * 1000 / sess->clock_rate; + raw_jitter *= 1000; + } + + /* Update jitter stat */ + pj_math_stat_update(&sess->stat.rx_raw_jitter, raw_jitter); + } +#endif + + +#if defined(PJMEDIA_RTCP_STAT_HAS_IPDV) && PJMEDIA_RTCP_STAT_HAS_IPDV!=0 + { + pj_int32_t ipdv; + + ipdv = transit - sess->transit; + /* Convert IPDV unit from samples to usec */ + if (ipdv > -2147 && ipdv < 2147) + ipdv = ipdv * 1000000 / (int)sess->clock_rate; + else { + ipdv = ipdv * 1000 / (int)sess->clock_rate; + ipdv *= 1000; + } + + /* Update jitter stat */ + pj_math_stat_update(&sess->stat.rx_ipdv, ipdv); + } +#endif + #if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) pjmedia_rtcp_xr_rx_rtp(&sess->xr_session, seq, 0, /* lost */ @@ -389,6 +432,9 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess, (sess->jitter >> 4), /* jitter */ -1, 0); /* toh */ #endif + + /* Update session transit */ + sess->transit = transit; } #if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) } else if (seq_st.diff > 1) { diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index 7fce1e44..8b695adf 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -2247,7 +2247,16 @@ static void dump_media_session(const char *indent, "%s pkt loss=%d (%3.1f%%), discrd=%d (%3.1f%%), dup=%d (%2.1f%%), reord=%d (%3.1f%%)\n" "%s (msec) min avg max last dev\n" "%s loss period: %7.3f %7.3f %7.3f %7.3f %7.3f\n" - "%s jitter : %7.3f %7.3f %7.3f %7.3f %7.3f%s", + "%s jitter : %7.3f %7.3f %7.3f %7.3f %7.3f" +#if defined(PJMEDIA_RTCP_STAT_HAS_RAW_JITTER) && PJMEDIA_RTCP_STAT_HAS_RAW_JITTER!=0 + "\n" + "%s raw jitter : %7.3f %7.3f %7.3f %7.3f %7.3f" +#endif +#if defined(PJMEDIA_RTCP_STAT_HAS_IPDV) && PJMEDIA_RTCP_STAT_HAS_IPDV!=0 + "\n" + "%s IPDV : %7.3f %7.3f %7.3f %7.3f %7.3f" +#endif + "%s", indent, info.stream_info[i].fmt.pt, last_update, indent, @@ -2277,6 +2286,22 @@ static void dump_media_session(const char *indent, stat.rx.jitter.max / 1000.0, stat.rx.jitter.last / 1000.0, pj_math_stat_get_stddev(&stat.rx.jitter) / 1000.0, +#if defined(PJMEDIA_RTCP_STAT_HAS_RAW_JITTER) && PJMEDIA_RTCP_STAT_HAS_RAW_JITTER!=0 + indent, + stat.rx_raw_jitter.min / 1000.0, + stat.rx_raw_jitter.mean / 1000.0, + stat.rx_raw_jitter.max / 1000.0, + stat.rx_raw_jitter.last / 1000.0, + pj_math_stat_get_stddev(&stat.rx_raw_jitter) / 1000.0, +#endif +#if defined(PJMEDIA_RTCP_STAT_HAS_IPDV) && PJMEDIA_RTCP_STAT_HAS_IPDV!=0 + indent, + stat.rx_ipdv.min / 1000.0, + stat.rx_ipdv.mean / 1000.0, + stat.rx_ipdv.max / 1000.0, + stat.rx_ipdv.last / 1000.0, + pj_math_stat_get_stddev(&stat.rx_ipdv) / 1000.0, +#endif "" ); |