summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjlib/include/pjlib.h1
-rw-r--r--pjmedia/include/pjmedia/jbuf.h5
-rw-r--r--pjmedia/include/pjmedia/rtcp.h26
-rw-r--r--pjmedia/include/pjmedia/rtcp_xr.h36
-rw-r--r--pjmedia/src/pjmedia/jbuf.c28
-rw-r--r--pjmedia/src/pjmedia/rtcp.c81
-rw-r--r--pjmedia/src/pjmedia/rtcp_xr.c108
-rw-r--r--pjmedia/src/pjmedia/stream.c8
-rw-r--r--pjsip-apps/src/samples/siprtp.c12
-rw-r--r--pjsip-apps/src/samples/siprtp_report.c10
-rw-r--r--pjsip-apps/src/samples/streamutil.c52
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c31
12 files changed, 131 insertions, 267 deletions
diff --git a/pjlib/include/pjlib.h b/pjlib/include/pjlib.h
index ec027fcf..523efdba 100644
--- a/pjlib/include/pjlib.h
+++ b/pjlib/include/pjlib.h
@@ -42,6 +42,7 @@
#include <pj/list.h>
#include <pj/lock.h>
#include <pj/log.h>
+#include <pj/math.h>
#include <pj/os.h>
#include <pj/pool.h>
#include <pj/pool_buf.h>
diff --git a/pjmedia/include/pjmedia/jbuf.h b/pjmedia/include/pjmedia/jbuf.h
index a527d57b..229f3f05 100644
--- a/pjmedia/include/pjmedia/jbuf.h
+++ b/pjmedia/include/pjmedia/jbuf.h
@@ -76,7 +76,10 @@ struct pjmedia_jb_state
unsigned min_prefetch; /**< Minimum allowed prefetch, in frms. */
unsigned max_prefetch; /**< Maximum allowed prefetch, in frms. */
unsigned size; /**< Current buffer size, in frames. */
- unsigned max_size; /**< Maximum size ever. */
+ unsigned avg_delay; /**< Average delay, in ms. */
+ unsigned min_delay; /**< Minimum delay, in ms. */
+ unsigned max_delay; /**< Maximum delay, in ms. */
+ unsigned dev_delay; /**< Standard deviation of delay, in ms. */
};
diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h
index 2633224e..bffb5f83 100644
--- a/pjmedia/include/pjmedia/rtcp.h
+++ b/pjmedia/include/pjmedia/rtcp.h
@@ -28,7 +28,6 @@
#include <pjmedia/rtcp_xr.h>
#include <pjmedia/rtp.h>
-
PJ_BEGIN_DECL
@@ -180,26 +179,14 @@ struct pjmedia_rtcp_stream_stat
unsigned reorder; /**< Total number of out of order packets */
unsigned dup; /**< Total number of duplicates packets */
- struct {
- unsigned count; /**< Number of period samples(to calc avg) */
- unsigned min; /**< Minimum loss period (in usec) */
- unsigned avg; /**< Average loss period (in usec) */
- unsigned max; /**< Maximum loss period (in usec) */
- unsigned last; /**< Last loss period (in usec) */
- } loss_period; /**< Lost period history. */
+ pj_math_stat loss_period;/**< Loss period statistics (in usec) */
struct {
unsigned burst:1; /**< Burst/sequential packet lost detected */
unsigned random:1; /**< Random packet lost detected. */
} loss_type; /**< Types of loss detected. */
- struct {
- unsigned count; /**< Number of updates. */
- unsigned min; /**< Minimum jitter (in usec) */
- unsigned avg; /**< Average jitter (in usec) */
- unsigned max; /**< Maximum jitter (in usec) */
- unsigned last; /**< Last jitter (in usec) */
- } jitter; /**< Jitter history. */
+ pj_math_stat jitter; /**< Jitter statistics (in usec) */
};
@@ -220,14 +207,7 @@ struct pjmedia_rtcp_stat
pjmedia_rtcp_stream_stat tx; /**< Encoder stream statistics. */
pjmedia_rtcp_stream_stat rx; /**< Decoder stream statistics. */
- struct {
- unsigned min; /**< Minimum round-trip delay (in usec) */
- unsigned avg; /**< Average round-trip delay (in usec) */
- unsigned max; /**< Maximum round-trip delay (in usec) */
- unsigned last; /**< Last round-trip delay (in usec) */
- } rtt; /**< Round trip delay history. */
-
- unsigned rtt_update_cnt; /**< Nb of times rtt is updated. */
+ pj_math_stat rtt; /**< Round trip delay statistic(in usec)*/
};
diff --git a/pjmedia/include/pjmedia/rtcp_xr.h b/pjmedia/include/pjmedia/rtcp_xr.h
index cdedc1dd..c1eafa97 100644
--- a/pjmedia/include/pjmedia/rtcp_xr.h
+++ b/pjmedia/include/pjmedia/rtcp_xr.h
@@ -25,6 +25,7 @@
*/
#include <pjmedia/types.h>
+#include <pj/math.h>
PJ_BEGIN_DECL
@@ -246,22 +247,8 @@ typedef struct pjmedia_rtcp_xr_stream_stat
unsigned lost; /**< Number of packets lost */
unsigned dup; /**< Number of duplicated packets */
-
- struct {
- unsigned min; /**< Minimum jitter (in usec) */
- unsigned max; /**< Maximum jitter (in usec) */
- unsigned dev; /**< Jitter deviation (in usec) */
- unsigned mean; /**< Average jitter (in usec) */
- unsigned count; /**< Update count */
- } jitter; /**< Jitter history. */
-
- struct {
- unsigned min; /**< Minimum ToH */
- unsigned max; /**< Maximum ToH */
- unsigned dev; /**< ToH deviation */
- unsigned mean; /**< Average ToH */
- unsigned count; /**< Update count */
- } toh; /**< TTL of hop limit history. */
+ pj_math_stat jitter; /**< Jitter statistics (in usec) */
+ pj_math_stat toh; /**< TTL of hop limit statistics. */
} stat_sum;
struct {
@@ -300,18 +287,11 @@ typedef struct pjmedia_rtcp_xr_stream_stat
typedef struct pjmedia_rtcp_xr_stat
{
- pjmedia_rtcp_xr_stream_stat rx;
- pjmedia_rtcp_xr_stream_stat tx;
-
- /* RTT calculated from receiver side */
- struct {
- unsigned min; /**< Minimum round-trip delay (in usec) */
- unsigned avg; /**< Average round-trip delay (in usec) */
- unsigned max; /**< Maximum round-trip delay (in usec) */
- unsigned last; /**< Last round-trip delay (in usec) */
- unsigned update_cnt; /**< Nb of times rtt is updated. */
- } rtt; /**< Round trip delay history. */
-
+ pjmedia_rtcp_xr_stream_stat rx; /**< Decoding direction statistics. */
+ pjmedia_rtcp_xr_stream_stat tx; /**< Encoding direction statistics. */
+ pj_math_stat rtt; /**< Round-trip delay stat (in usec)
+ the value is calculated from
+ receiver side. */
} pjmedia_rtcp_xr_stat;
/**
diff --git a/pjmedia/src/pjmedia/jbuf.c b/pjmedia/src/pjmedia/jbuf.c
index 4ae3b308..e3aa86e7 100644
--- a/pjmedia/src/pjmedia/jbuf.c
+++ b/pjmedia/src/pjmedia/jbuf.c
@@ -24,6 +24,7 @@
#include <pj/pool.h>
#include <pj/assert.h>
#include <pj/log.h>
+#include <pj/math.h>
#include <pj/string.h>
@@ -66,19 +67,13 @@ struct pjmedia_jbuf
int jb_min_prefetch; // Minimum allowable prefetch
int jb_max_prefetch; // Maximum allowable prefetch
int jb_status; // status is 'init' until the first 'put' operation
-
- int jb_max_size; // Maximum frames buffered ever
+ pj_math_stat jb_delay; // Delay statistics of jitter buffer (in frame unit)
};
#define JB_STATUS_INITIALIZING 0
#define JB_STATUS_PROCESSING 1
-#define PJ_ABS(x) ((x > 0) ? (x) : -(x))
-#define PJ_MAX(x, y) ((x > y) ? (x) : (y))
-#define PJ_MIN(x, y) ((x < y) ? (x) : (y))
-
-
/* Enabling this would log the jitter buffer state about once per
* second.
*/
@@ -313,6 +308,8 @@ PJ_DEF(pj_status_t) pjmedia_jbuf_create(pj_pool_t *pool,
jb->jb_max_hist_level = 0;
jb->jb_max_count = max_count;
+ pj_math_stat_init(&jb->jb_delay);
+
*p_jb = jb;
return PJ_SUCCESS;
}
@@ -368,10 +365,12 @@ PJ_DEF(pj_status_t) pjmedia_jbuf_reset(pjmedia_jbuf *jb)
jb->jb_stable_hist = 0;
jb->jb_status = JB_STATUS_INITIALIZING;
jb->jb_max_hist_level = 0;
- jb->jb_max_size = 0;
jb_framelist_remove_head(&jb->jb_framelist,
jb_framelist_size(&jb->jb_framelist));
+
+ pj_math_stat_init(&jb->jb_delay);
+
return PJ_SUCCESS;
}
@@ -388,8 +387,6 @@ static void jbuf_calculate_jitter(pjmedia_jbuf *jb)
/* Update jb_max_size */
cur_size = jb_framelist_size(&jb->jb_framelist);
- if (cur_size > jb->jb_max_size)
- jb->jb_max_size = cur_size;
/* Only apply burst-level calculation on PUT operation since if VAD is
* active the burst-level may not be accurate.
@@ -456,9 +453,13 @@ static void jbuf_calculate_jitter(pjmedia_jbuf *jb)
/* Drop frame(s)! */
jb_framelist_remove_head(&jb->jb_framelist, diff);
+ pj_math_stat_update(&jb->jb_delay, cur_size - diff);
+
TRACE__((jb->name.ptr,
"JB shrinking %d frame(s), size=%d", diff,
jb_framelist_size(&jb->jb_framelist)));
+ } else {
+ pj_math_stat_update(&jb->jb_delay, cur_size);
}
jb->jb_level = 0;
@@ -611,8 +612,11 @@ PJ_DEF(pj_status_t) pjmedia_jbuf_get_state( pjmedia_jbuf *jb,
state->min_prefetch = jb->jb_min_prefetch;
state->max_prefetch = jb->jb_max_prefetch;
state->size = jb_framelist_size(&jb->jb_framelist);
- state->max_size = jb->jb_max_size;
+ state->avg_delay = jb->jb_delay.mean * jb->jb_frame_ptime;
+ state->min_delay = jb->jb_delay.min * jb->jb_frame_ptime;
+ state->max_delay = jb->jb_delay.max * jb->jb_frame_ptime;
+ state->dev_delay = pj_math_stat_get_stddev(&jb->jb_delay) *
+ jb->jb_frame_ptime;
return PJ_SUCCESS;
}
-
diff --git a/pjmedia/src/pjmedia/rtcp.c b/pjmedia/src/pjmedia/rtcp.c
index 5dc7623d..c4a914b1 100644
--- a/pjmedia/src/pjmedia/rtcp.c
+++ b/pjmedia/src/pjmedia/rtcp.c
@@ -166,6 +166,13 @@ PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *sess,
pj_get_timestamp(&sess->ts_base);
pj_get_timestamp_freq(&sess->ts_freq);
+ /* 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);
+
/* RR will be initialized on receipt of the first RTP packet. */
}
@@ -274,18 +281,7 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess,
TRACE_((sess->name, "%d packet(s) lost", seq_st.diff - 1));
/* Update loss period stat */
- if (sess->stat.rx.loss_period.count == 0 ||
- period < sess->stat.rx.loss_period.min)
- {
- sess->stat.rx.loss_period.min = period;
- }
- if (period > sess->stat.rx.loss_period.max)
- sess->stat.rx.loss_period.max = period;
- sess->stat.rx.loss_period.avg =
- (sess->stat.rx.loss_period.avg * sess->stat.rx.loss_period.count +
- period) / (sess->stat.rx.loss_period.count + 1);
- sess->stat.rx.loss_period.last = period;
- ++sess->stat.rx.loss_period.count;
+ pj_math_stat_update(&sess->stat.rx.loss_period, period);
}
@@ -329,20 +325,8 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess,
jitter *= 1000;
}
- /* Add to average */
- sess->avg_jitter =
- (jitter + sess->avg_jitter * sess->stat.rx.jitter.count) /
- (sess->stat.rx.jitter.count + 1);
- sess->stat.rx.jitter.avg = (unsigned)sess->avg_jitter;
- ++sess->stat.rx.jitter.count;
-
/* Update jitter stat */
- if (jitter < sess->stat.rx.jitter.min)
- sess->stat.rx.jitter.min = jitter;
- if (jitter > sess->stat.rx.jitter.max)
- sess->stat.rx.jitter.max = jitter;
-
- sess->stat.rx.jitter.last = jitter;
+ 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,
@@ -463,17 +447,8 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *sess,
/* Loss period in usec */
period *= 1000;
- if (sess->stat.tx.update_cnt==0||sess->stat.tx.loss_period.min==0)
- sess->stat.tx.loss_period.min = period;
- if (period < sess->stat.tx.loss_period.min)
- sess->stat.tx.loss_period.min = period;
- if (period > sess->stat.tx.loss_period.max)
- sess->stat.tx.loss_period.max = period;
-
- sess->stat.tx.loss_period.avg =
- (sess->stat.tx.loss_period.avg*sess->stat.tx.update_cnt+period)
- / (sess->stat.tx.update_cnt + 1);
- sess->stat.tx.loss_period.last = period;
+ /* Update loss period stat */
+ pj_math_stat_update(&sess->stat.tx.loss_period, period);
}
/* Get jitter value in usec */
@@ -487,18 +462,7 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *sess,
}
/* Update jitter statistics */
- if (sess->stat.tx.jitter.count == 0)
- sess->stat.tx.jitter.min = jitter;
- if (jitter < sess->stat.tx.jitter.min && jitter)
- sess->stat.tx.jitter.min = jitter;
- if (jitter > sess->stat.tx.jitter.max)
- sess->stat.tx.jitter.max = jitter;
- sess->stat.tx.jitter.avg =
- (sess->stat.tx.jitter.avg * sess->stat.tx.jitter.count + jitter) /
- (sess->stat.tx.jitter.count + 1);
- ++sess->stat.tx.jitter.count;
- sess->stat.tx.jitter.last = jitter;
-
+ pj_math_stat_update(&sess->stat.tx.jitter, jitter);
/* Can only calculate if LSR and DLSR is present in RR */
if (rr->lsr && rr->dlsr) {
@@ -552,16 +516,14 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *sess,
goto end_rtt_calc;
}
- if (sess->stat.rtt_update_cnt == 0)
- sess->stat.rtt.min = rtt;
-
/* "Normalize" rtt value that is exceptionally high.
* For such values, "normalize" the rtt to be three times
* the average value.
*/
- if (rtt > (sess->stat.rtt.avg*3) && sess->stat.rtt_update_cnt!=0) {
+ if (rtt > ((unsigned)sess->stat.rtt.mean*3) && sess->stat.rtt.n!=0)
+ {
unsigned orig_rtt = rtt;
- rtt = sess->stat.rtt.avg*3;
+ rtt = sess->stat.rtt.mean*3;
PJ_LOG(5,(sess->name,
"RTT value %d usec is normalized to %d usec",
orig_rtt, rtt));
@@ -569,17 +531,8 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *sess,
TRACE_((sess->name, "RTCP RTT is set to %d usec", rtt));
- if (rtt < sess->stat.rtt.min && rtt)
- sess->stat.rtt.min = rtt;
- if (rtt > sess->stat.rtt.max)
- sess->stat.rtt.max = rtt;
-
- sess->stat.rtt.avg =
- (sess->stat.rtt.avg * sess->stat.rtt_update_cnt + rtt) /
- (sess->stat.rtt_update_cnt + 1);
-
- sess->stat.rtt.last = rtt;
- sess->stat.rtt_update_cnt++;
+ /* Update RTT stat */
+ pj_math_stat_update(&sess->stat.rtt, rtt);
} else {
PJ_LOG(5, (sess->name, "Internal RTCP NTP clock skew detected: "
diff --git a/pjmedia/src/pjmedia/rtcp_xr.c b/pjmedia/src/pjmedia/rtcp_xr.c
index 7bb7cb53..6c49999c 100644
--- a/pjmedia/src/pjmedia/rtcp_xr.c
+++ b/pjmedia/src/pjmedia/rtcp_xr.c
@@ -26,7 +26,7 @@
#include <pj/sock.h>
#include <pj/string.h>
-#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
+#if 1 //defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
#define THIS_FILE "rtcp_xr.c"
@@ -58,27 +58,6 @@
# define TRACE_(x) ;
#endif
-/* Integer square root for calculating standard deviation */
-static pj_uint32_t my_isqrt(pj_uint32_t i)
-{
- pj_uint32_t res = 1, prev;
-
- /* Rough guess */
- prev = i >> 2;
- while (prev) {
- prev >>= 2;
- res <<= 1;
- }
-
- /* Babilonian method */
- do {
- prev = res;
- res = (prev + i/prev) >> 1;
- } while ((prev+res)>>1 != res);
-
- return res;
-}
-
void pjmedia_rtcp_xr_init( pjmedia_rtcp_xr_session *session,
struct pjmedia_rtcp_session *parent_session,
pj_uint8_t gmin,
@@ -230,18 +209,16 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp_xr( pjmedia_rtcp_xr_session *sess,
if (sess->stat.rx.stat_sum.j) {
r->jitter_min = pj_htonl(sess->stat.rx.stat_sum.jitter.min);
r->jitter_max = pj_htonl(sess->stat.rx.stat_sum.jitter.max);
- r->jitter_mean = pj_htonl(sess->stat.rx.stat_sum.jitter.mean);
- sess->stat.rx.stat_sum.jitter.dev =
- my_isqrt(sess->stat.rx.stat_sum.jitter.dev);
- r->jitter_dev = pj_htonl(sess->stat.rx.stat_sum.jitter.dev);
+ r->jitter_mean =
+ pj_htonl((unsigned)sess->stat.rx.stat_sum.jitter.mean);
+ r->jitter_dev =
+ pj_htonl(pj_math_stat_get_stddev(&sess->stat.rx.stat_sum.jitter));
}
if (sess->stat.rx.stat_sum.t) {
r->toh_min = sess->stat.rx.stat_sum.toh.min;
r->toh_max = sess->stat.rx.stat_sum.toh.max;
- r->toh_mean = sess->stat.rx.stat_sum.toh.mean;
- sess->stat.rx.stat_sum.toh.dev =
- my_isqrt(sess->stat.rx.stat_sum.toh.dev);
- r->toh_dev = sess->stat.rx.stat_sum.toh.dev;
+ r->toh_mean = (unsigned) sess->stat.rx.stat_sum.toh.mean;
+ r->toh_dev = pj_math_stat_get_stddev(&sess->stat.rx.stat_sum.toh);
}
/* Reset TX statistics summary each time built */
@@ -292,7 +269,7 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp_xr( pjmedia_rtcp_xr_session *sess,
m = sess->ptime * sess->frames_per_packet;
/* Calculate burst and densities. */
- if (ctotal) {
+ if (c11 && (c23 || c33)) {
p32 = c32 / (c31 + c32 + c33);
if((c22 + c23) < 1) {
p23 = 1;
@@ -517,35 +494,21 @@ void pjmedia_rtcp_xr_rx_rtcp_xr( pjmedia_rtcp_xr_session *sess,
* We allow up to 30 seconds RTT!
*/
if (eedelay <= 30 * 1000 * 1000UL) {
- if (sess->stat.rtt.update_cnt == 0)
- sess->stat.rtt.min = rtt;
-
/* "Normalize" rtt value that is exceptionally high.
* For such values, "normalize" the rtt to be three times
* the average value.
*/
- if (rtt>(sess->stat.rtt.avg*3) && sess->stat.rtt.update_cnt!=0)
+ if (rtt>((unsigned)sess->stat.rtt.mean*3) && sess->stat.rtt.n!=0)
{
unsigned orig_rtt = rtt;
- rtt = sess->stat.rtt.avg*3;
+ rtt = (unsigned)sess->stat.rtt.mean*3;
PJ_LOG(5,(sess->name,
"RTT value %d usec is normalized to %d usec",
orig_rtt, rtt));
}
TRACE_((sess->name, "RTCP RTT is set to %d usec", rtt));
-
- if (rtt < sess->stat.rtt.min && rtt)
- sess->stat.rtt.min = rtt;
- if (rtt > sess->stat.rtt.max)
- sess->stat.rtt.max = rtt;
-
- sess->stat.rtt.avg =
- (sess->stat.rtt.avg * sess->stat.rtt.update_cnt + rtt) /
- (sess->stat.rtt.update_cnt + 1);
-
- sess->stat.rtt.last = rtt;
- sess->stat.rtt.update_cnt++;
+ pj_math_stat_update(&sess->stat.rtt, rtt);
}
} else {
PJ_LOG(5, (sess->name, "Internal RTCP NTP clock skew detected: "
@@ -585,15 +548,17 @@ void pjmedia_rtcp_xr_rx_rtcp_xr( pjmedia_rtcp_xr_session *sess,
if (sess->stat.tx.stat_sum.j) {
sess->stat.tx.stat_sum.jitter.min = pj_ntohl(rb_stats->jitter_min);
sess->stat.tx.stat_sum.jitter.max = pj_ntohl(rb_stats->jitter_max);
- sess->stat.tx.stat_sum.jitter.mean = pj_ntohl(rb_stats->jitter_mean);
- sess->stat.tx.stat_sum.jitter.dev = pj_ntohl(rb_stats->jitter_dev);
+ sess->stat.tx.stat_sum.jitter.mean= pj_ntohl(rb_stats->jitter_mean);
+ pj_math_stat_set_stddev(&sess->stat.tx.stat_sum.jitter,
+ pj_ntohl(rb_stats->jitter_dev));
}
if (sess->stat.tx.stat_sum.t) {
sess->stat.tx.stat_sum.toh.min = rb_stats->toh_min;
sess->stat.tx.stat_sum.toh.max = rb_stats->toh_max;
- sess->stat.tx.stat_sum.toh.mean = rb_stats->toh_mean;
- sess->stat.tx.stat_sum.toh.dev = rb_stats->toh_dev;
+ sess->stat.tx.stat_sum.toh.mean= rb_stats->toh_mean;
+ pj_math_stat_set_stddev(&sess->stat.tx.stat_sum.toh,
+ pj_ntohl(rb_stats->toh_dev));
}
pj_gettimeofday(&sess->stat.tx.stat_sum.update);
@@ -727,48 +692,13 @@ void pjmedia_rtcp_xr_rx_rtp( pjmedia_rtcp_xr_session *sess,
}
if (jitter >= 0) {
- pj_int32_t diff;
-
sess->stat.rx.stat_sum.j = PJ_TRUE;
- if (sess->stat.rx.stat_sum.jitter.min > (pj_uint32_t)jitter)
- sess->stat.rx.stat_sum.jitter.min = jitter;
- if (sess->stat.rx.stat_sum.jitter.max < (pj_uint32_t)jitter)
- sess->stat.rx.stat_sum.jitter.max = jitter;
- sess->stat.rx.stat_sum.jitter.mean =
- (jitter + sess->stat.rx.stat_sum.jitter.mean *
- sess->stat.rx.stat_sum.jitter.count) /
- (sess->stat.rx.stat_sum.jitter.count + 1);
-
- diff = sess->stat.rx.stat_sum.jitter.mean - jitter;
- sess->stat.rx.stat_sum.jitter.dev =
- (diff * diff + sess->stat.rx.stat_sum.jitter.dev *
- sess->stat.rx.stat_sum.jitter.count) /
- (sess->stat.rx.stat_sum.jitter.count + 1);
-
- ++sess->stat.rx.stat_sum.jitter.count;
+ pj_math_stat_update(&sess->stat.rx.stat_sum.jitter, jitter);
}
if (toh >= 0) {
- pj_int32_t diff;
-
sess->stat.rx.stat_sum.t = toh_ipv4? 1 : 2;
-
- if (sess->stat.rx.stat_sum.toh.min > (pj_uint32_t)toh)
- sess->stat.rx.stat_sum.toh.min = toh;
- if (sess->stat.rx.stat_sum.toh.max < (pj_uint32_t)toh)
- sess->stat.rx.stat_sum.toh.max = toh;
- sess->stat.rx.stat_sum.toh.mean =
- (toh + sess->stat.rx.stat_sum.toh.mean *
- sess->stat.rx.stat_sum.toh.count) /
- (sess->stat.rx.stat_sum.toh.count + 1);
-
- diff = sess->stat.rx.stat_sum.toh.mean - toh;
- sess->stat.rx.stat_sum.toh.dev =
- (diff * diff + sess->stat.rx.stat_sum.toh.dev *
- sess->stat.rx.stat_sum.toh.count) /
- (sess->stat.rx.stat_sum.toh.count + 1);
-
- ++sess->stat.rx.stat_sum.toh.count;
+ pj_math_stat_update(&sess->stat.rx.stat_sum.toh, toh);
}
/* Update burst metrics.
diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c
index edf8a230..2122033b 100644
--- a/pjmedia/src/pjmedia/stream.c
+++ b/pjmedia/src/pjmedia/stream.c
@@ -500,12 +500,12 @@ static void check_tx_rtcp(pjmedia_stream *stream, pj_uint32_t timestamp)
/* Update RTCP XR with current JB states */
pjmedia_jbuf_get_state(stream->jb, &jb_state);
- i = jb_state.size * stream->codec_param.info.frm_ptime;
+ i = jb_state.avg_delay;
pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,
PJMEDIA_RTCP_XR_INFO_JB_NOM,
i);
- i = jb_state.max_size* stream->codec_param.info.frm_ptime;
+ i = jb_state.max_delay;
pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,
PJMEDIA_RTCP_XR_INFO_JB_MAX,
i);
@@ -1673,12 +1673,12 @@ PJ_DEF(pj_status_t) pjmedia_stream_destroy( pjmedia_stream *stream )
/* Update RTCP XR with current JB states */
pjmedia_jbuf_get_state(stream->jb, &jb_state);
- i = jb_state.size * stream->codec_param.info.frm_ptime;
+ i = jb_state.avg_delay;
pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,
PJMEDIA_RTCP_XR_INFO_JB_NOM,
i);
- i = jb_state.max_size* stream->codec_param.info.frm_ptime;
+ i = jb_state.max_delay;
pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,
PJMEDIA_RTCP_XR_INFO_JB_MAX,
i);
diff --git a/pjsip-apps/src/samples/siprtp.c b/pjsip-apps/src/samples/siprtp.c
index a091d839..61179ef4 100644
--- a/pjsip-apps/src/samples/siprtp.c
+++ b/pjsip-apps/src/samples/siprtp.c
@@ -1659,7 +1659,7 @@ static void print_avg_stat(void)
/* Jitter */
MIN_(min_stat.rx.jitter.min, audio->rtcp.stat.rx.jitter.min);
MAX_(max_stat.rx.jitter.max, audio->rtcp.stat.rx.jitter.max);
- AVG_(avg_stat.rx.jitter.avg, audio->rtcp.stat.rx.jitter.avg);
+ AVG_(avg_stat.rx.jitter.mean, audio->rtcp.stat.rx.jitter.mean);
/* TX Statistisc: */
@@ -1692,13 +1692,13 @@ static void print_avg_stat(void)
/* Jitter */
MIN_(min_stat.tx.jitter.min, audio->rtcp.stat.tx.jitter.min);
MAX_(max_stat.tx.jitter.max, audio->rtcp.stat.tx.jitter.max);
- AVG_(avg_stat.tx.jitter.avg, audio->rtcp.stat.tx.jitter.avg);
+ AVG_(avg_stat.tx.jitter.mean, audio->rtcp.stat.tx.jitter.mean);
/* RTT */
MIN_(min_stat.rtt.min, audio->rtcp.stat.rtt.min);
MAX_(max_stat.rtt.max, audio->rtcp.stat.rtt.max);
- AVG_(avg_stat.rtt.avg, audio->rtcp.stat.rtt.avg);
+ AVG_(avg_stat.rtt.mean, audio->rtcp.stat.rtt.mean);
++count;
}
@@ -1767,7 +1767,7 @@ static void print_avg_stat(void)
"packets",
min_stat.rx.jitter.min/1000.0,
- avg_stat.rx.jitter.avg/1000.0,
+ avg_stat.rx.jitter.mean/1000.0,
max_stat.rx.jitter.max/1000.0,
"ms",
@@ -1798,13 +1798,13 @@ static void print_avg_stat(void)
"packets",
min_stat.tx.jitter.min/1000.0,
- avg_stat.tx.jitter.avg/1000.0,
+ avg_stat.tx.jitter.mean/1000.0,
max_stat.tx.jitter.max/1000.0,
"ms",
/* rtt */
min_stat.rtt.min/1000.0,
- avg_stat.rtt.avg/1000.0,
+ avg_stat.rtt.mean/1000.0,
max_stat.rtt.max/1000.0,
"ms"
);
diff --git a/pjsip-apps/src/samples/siprtp_report.c b/pjsip-apps/src/samples/siprtp_report.c
index adba64d6..3c084459 100644
--- a/pjsip-apps/src/samples/siprtp_report.c
+++ b/pjsip-apps/src/samples/siprtp_report.c
@@ -160,12 +160,12 @@ static void print_call(int call_index)
audio->rtcp.stat.rx.reorder * 100.0 / (audio->rtcp.stat.rx.pkt + audio->rtcp.stat.rx.loss),
"",
audio->rtcp.stat.rx.loss_period.min / 1000.0,
- audio->rtcp.stat.rx.loss_period.avg / 1000.0,
+ audio->rtcp.stat.rx.loss_period.mean / 1000.0,
audio->rtcp.stat.rx.loss_period.max / 1000.0,
audio->rtcp.stat.rx.loss_period.last / 1000.0,
"",
audio->rtcp.stat.rx.jitter.min / 1000.0,
- audio->rtcp.stat.rx.jitter.avg / 1000.0,
+ audio->rtcp.stat.rx.jitter.mean / 1000.0,
audio->rtcp.stat.rx.jitter.max / 1000.0,
audio->rtcp.stat.rx.jitter.last / 1000.0,
""
@@ -204,12 +204,12 @@ static void print_call(int call_index)
audio->rtcp.stat.tx.reorder * 100.0 / (audio->rtcp.stat.tx.pkt + audio->rtcp.stat.tx.loss),
"",
audio->rtcp.stat.tx.loss_period.min / 1000.0,
- audio->rtcp.stat.tx.loss_period.avg / 1000.0,
+ audio->rtcp.stat.tx.loss_period.mean / 1000.0,
audio->rtcp.stat.tx.loss_period.max / 1000.0,
audio->rtcp.stat.tx.loss_period.last / 1000.0,
"",
audio->rtcp.stat.tx.jitter.min / 1000.0,
- audio->rtcp.stat.tx.jitter.avg / 1000.0,
+ audio->rtcp.stat.tx.jitter.mean / 1000.0,
audio->rtcp.stat.tx.jitter.max / 1000.0,
audio->rtcp.stat.tx.jitter.last / 1000.0,
""
@@ -219,7 +219,7 @@ static void print_call(int call_index)
PJ_LOG(3, (THIS_FILE,
" RTT delay : %7.3f %7.3f %7.3f %7.3f%s\n",
audio->rtcp.stat.rtt.min / 1000.0,
- audio->rtcp.stat.rtt.avg / 1000.0,
+ audio->rtcp.stat.rtt.mean / 1000.0,
audio->rtcp.stat.rtt.max / 1000.0,
audio->rtcp.stat.rtt.last / 1000.0,
""
diff --git a/pjsip-apps/src/samples/streamutil.c b/pjsip-apps/src/samples/streamutil.c
index dfd2ee54..29462c99 100644
--- a/pjsip-apps/src/samples/streamutil.c
+++ b/pjsip-apps/src/samples/streamutil.c
@@ -768,9 +768,9 @@ static void print_stream_stat(pjmedia_stream *stream)
printf(" RX stat last update: %s\n"
" total %s packets %sB received (%sB +IP hdr)%s\n"
" pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n"
- " (msec) min avg max last\n"
- " loss period: %7.3f %7.3f %7.3f %7.3f%s\n"
- " jitter : %7.3f %7.3f %7.3f %7.3f%s\n",
+ " (msec) min avg max last dev\n"
+ " loss period: %7.3f %7.3f %7.3f %7.3f %7.3f%s\n"
+ " jitter : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
last_update,
good_number(packets, stat.rx.pkt),
good_number(bytes, stat.rx.bytes),
@@ -784,14 +784,16 @@ static void print_stream_stat(pjmedia_stream *stream)
stat.rx.reorder * 100.0 / (stat.rx.pkt + stat.rx.loss),
"",
stat.rx.loss_period.min / 1000.0,
- stat.rx.loss_period.avg / 1000.0,
+ stat.rx.loss_period.mean / 1000.0,
stat.rx.loss_period.max / 1000.0,
stat.rx.loss_period.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.rx.loss_period) / 1000.0,
"",
stat.rx.jitter.min / 1000.0,
- stat.rx.jitter.avg / 1000.0,
+ stat.rx.jitter.mean / 1000.0,
stat.rx.jitter.max / 1000.0,
stat.rx.jitter.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.rx.jitter) / 1000.0,
""
);
@@ -811,9 +813,9 @@ static void print_stream_stat(pjmedia_stream *stream)
printf(" TX stat last update: %s\n"
" total %s packets %sB sent (%sB +IP hdr)%s\n"
" pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n"
- " (msec) min avg max last\n"
- " loss period: %7.3f %7.3f %7.3f %7.3f%s\n"
- " jitter : %7.3f %7.3f %7.3f %7.3f%s\n",
+ " (msec) min avg max last dev\n"
+ " loss period: %7.3f %7.3f %7.3f %7.3f %7.3f%s\n"
+ " jitter : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
last_update,
good_number(packets, stat.tx.pkt),
good_number(bytes, stat.tx.bytes),
@@ -827,23 +829,26 @@ static void print_stream_stat(pjmedia_stream *stream)
stat.tx.reorder * 100.0 / (stat.tx.pkt + stat.tx.loss),
"",
stat.tx.loss_period.min / 1000.0,
- stat.tx.loss_period.avg / 1000.0,
+ stat.tx.loss_period.mean / 1000.0,
stat.tx.loss_period.max / 1000.0,
stat.tx.loss_period.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.tx.loss_period) / 1000.0,
"",
stat.tx.jitter.min / 1000.0,
- stat.tx.jitter.avg / 1000.0,
+ stat.tx.jitter.mean / 1000.0,
stat.tx.jitter.max / 1000.0,
stat.tx.jitter.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.tx.jitter) / 1000.0,
""
);
- printf(" RTT delay : %7.3f %7.3f %7.3f %7.3f%s\n",
+ printf(" RTT delay : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
stat.rtt.min / 1000.0,
- stat.rtt.avg / 1000.0,
+ stat.rtt.mean / 1000.0,
stat.rtt.max / 1000.0,
stat.rtt.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.rtt) / 1000.0,
""
);
@@ -885,8 +890,9 @@ static void print_stream_stat(pjmedia_stream *stream)
port->info.clock_rate);
SAMPLES_TO_USEC(jmean, xr_stat.rx.stat_sum.jitter.mean,
port->info.clock_rate);
- SAMPLES_TO_USEC(jdev, xr_stat.rx.stat_sum.jitter.dev,
- port->info.clock_rate);
+ SAMPLES_TO_USEC(jdev,
+ pj_math_stat_get_stddev(&xr_stat.rx.stat_sum.jitter),
+ port->info.clock_rate);
sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f",
jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0);
} else
@@ -897,7 +903,7 @@ static void print_stream_stat(pjmedia_stream *stream)
xr_stat.rx.stat_sum.toh.min,
xr_stat.rx.stat_sum.toh.mean,
xr_stat.rx.stat_sum.toh.max,
- xr_stat.rx.stat_sum.toh.dev);
+ pj_math_stat_get_stddev(&xr_stat.rx.stat_sum.toh));
} else
sprintf(toh, "(report not available)");
@@ -947,8 +953,9 @@ static void print_stream_stat(pjmedia_stream *stream)
port->info.clock_rate);
SAMPLES_TO_USEC(jmean, xr_stat.tx.stat_sum.jitter.mean,
port->info.clock_rate);
- SAMPLES_TO_USEC(jdev, xr_stat.tx.stat_sum.jitter.dev,
- port->info.clock_rate);
+ SAMPLES_TO_USEC(jdev,
+ pj_math_stat_get_stddev(&xr_stat.tx.stat_sum.jitter),
+ port->info.clock_rate);
sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f",
jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0);
} else
@@ -959,7 +966,7 @@ static void print_stream_stat(pjmedia_stream *stream)
xr_stat.tx.stat_sum.toh.min,
xr_stat.tx.stat_sum.toh.mean,
xr_stat.tx.stat_sum.toh.max,
- xr_stat.tx.stat_sum.toh.dev);
+ pj_math_stat_get_stddev(&xr_stat.rx.stat_sum.toh));
} else
sprintf(toh, "(report not available)");
@@ -1168,13 +1175,14 @@ static void print_stream_stat(pjmedia_stream *stream)
);
- /* RTT delay, need this? */
- printf(" (msec) min avg max last\n");
- printf(" RTT delay : %7.3f %7.3f %7.3f %7.3f%s\n",
+ /* RTT delay (by receiver side) */
+ printf(" (msec) min avg max last dev\n");
+ printf(" RTT delay : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
xr_stat.rtt.min / 1000.0,
- xr_stat.rtt.avg / 1000.0,
+ xr_stat.rtt.mean / 1000.0,
xr_stat.rtt.max / 1000.0,
xr_stat.rtt.last / 1000.0,
+ pj_math_stat_get_stddev(&xr_stat.rtt) / 1000.0,
""
);
} while (0);
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 6183a1d1..8c1041eb 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -2058,9 +2058,9 @@ static void dump_media_session(const char *indent,
"%s RX pt=%d, stat last update: %s\n"
"%s total %spkt %sB (%sB +IP hdr) @avg=%sbps/%sbps\n"
"%s pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)\n"
- "%s (msec) min avg max last\n"
- "%s loss period: %7.3f %7.3f %7.3f %7.3f\n"
- "%s jitter : %7.3f %7.3f %7.3f %7.3f%s",
+ "%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",
indent, info.stream_info[i].fmt.pt,
last_update,
indent,
@@ -2078,14 +2078,16 @@ static void dump_media_session(const char *indent,
stat.rx.reorder * 100.0 / (stat.rx.pkt + stat.rx.loss),
indent, indent,
stat.rx.loss_period.min / 1000.0,
- stat.rx.loss_period.avg / 1000.0,
+ stat.rx.loss_period.mean / 1000.0,
stat.rx.loss_period.max / 1000.0,
stat.rx.loss_period.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.rx.loss_period) / 1000.0,
indent,
stat.rx.jitter.min / 1000.0,
- stat.rx.jitter.avg / 1000.0,
+ stat.rx.jitter.mean / 1000.0,
stat.rx.jitter.max / 1000.0,
stat.rx.jitter.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.rx.jitter) / 1000.0,
""
);
@@ -2114,9 +2116,9 @@ static void dump_media_session(const char *indent,
"%s TX pt=%d, ptime=%dms, stat last update: %s\n"
"%s total %spkt %sB (%sB +IP hdr) @avg %sbps/%sbps\n"
"%s pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)\n"
- "%s (msec) min avg max last\n"
- "%s loss period: %7.3f %7.3f %7.3f %7.3f\n"
- "%s jitter : %7.3f %7.3f %7.3f %7.3f%s",
+ "%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",
indent,
info.stream_info[i].tx_pt,
info.stream_info[i].param->info.frm_ptime *
@@ -2140,14 +2142,16 @@ static void dump_media_session(const char *indent,
indent, indent,
stat.tx.loss_period.min / 1000.0,
- stat.tx.loss_period.avg / 1000.0,
+ stat.tx.loss_period.mean / 1000.0,
stat.tx.loss_period.max / 1000.0,
stat.tx.loss_period.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.tx.loss_period) / 1000.0,
indent,
stat.tx.jitter.min / 1000.0,
- stat.tx.jitter.avg / 1000.0,
+ stat.tx.jitter.mean / 1000.0,
stat.tx.jitter.max / 1000.0,
stat.tx.jitter.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.tx.jitter) / 1000.0,
""
);
@@ -2161,12 +2165,13 @@ static void dump_media_session(const char *indent,
*p = '\0';
len = pj_ansi_snprintf(p, end-p,
- "%s RTT msec : %7.3f %7.3f %7.3f %7.3f",
+ "%s RTT msec : %7.3f %7.3f %7.3f %7.3f %7.3f",
indent,
stat.rtt.min / 1000.0,
- stat.rtt.avg / 1000.0,
+ stat.rtt.mean / 1000.0,
stat.rtt.max / 1000.0,
- stat.rtt.last / 1000.0
+ stat.rtt.last / 1000.0,
+ pj_math_stat_get_stddev(&stat.rtt) / 1000.0
);
if (len < 1 || len > end-p) {
*p = '\0';