summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2010-07-15 14:45:47 +0000
committerNanang Izzuddin <nanang@teluu.com>2010-07-15 14:45:47 +0000
commit2493e2b525ad94e031c40acb5506fc5e1cd99266 (patch)
treeaafa1ee1b295d5d861eec710d5321d06ac47d365
parentf086c93150a5743a95a71779c4739c2b151aea2f (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.h29
-rw-r--r--pjmedia/include/pjmedia/rtcp.h12
-rw-r--r--pjmedia/src/pjmedia/rtcp.c50
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c27
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
""
);