From 2d4ee7d379301863944a7581e5efb720e1e76ba5 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Sat, 17 May 2008 14:54:18 +0000 Subject: [PATCH] More on ticket #535: updated files using and related to math.h git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1961 74dad513-b988-da41-8d7b-12977e46ad98 --- pjlib/include/pjlib.h | 1 + pjmedia/include/pjmedia/jbuf.h | 5 +- pjmedia/include/pjmedia/rtcp.h | 26 +----- pjmedia/include/pjmedia/rtcp_xr.h | 36 ++------- pjmedia/src/pjmedia/jbuf.c | 28 ++++--- pjmedia/src/pjmedia/rtcp.c | 81 ++++--------------- pjmedia/src/pjmedia/rtcp_xr.c | 108 +++++-------------------- pjmedia/src/pjmedia/stream.c | 8 +- pjsip-apps/src/samples/siprtp.c | 12 +-- pjsip-apps/src/samples/siprtp_report.c | 10 +-- pjsip-apps/src/samples/streamutil.c | 52 +++++++----- pjsip/src/pjsua-lib/pjsua_call.c | 31 ++++--- 12 files changed, 131 insertions(+), 267 deletions(-) diff --git a/pjlib/include/pjlib.h b/pjlib/include/pjlib.h index ec027fcfc..523efdba2 100644 --- a/pjlib/include/pjlib.h +++ b/pjlib/include/pjlib.h @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include diff --git a/pjmedia/include/pjmedia/jbuf.h b/pjmedia/include/pjmedia/jbuf.h index a527d57b6..229f3f056 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 2633224e0..bffb5f83a 100644 --- a/pjmedia/include/pjmedia/rtcp.h +++ b/pjmedia/include/pjmedia/rtcp.h @@ -28,7 +28,6 @@ #include #include - 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 cdedc1dd9..c1eafa974 100644 --- a/pjmedia/include/pjmedia/rtcp_xr.h +++ b/pjmedia/include/pjmedia/rtcp_xr.h @@ -25,6 +25,7 @@ */ #include +#include 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 4ae3b3083..e3aa86e76 100644 --- a/pjmedia/src/pjmedia/jbuf.c +++ b/pjmedia/src/pjmedia/jbuf.c @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -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 5dc7623d9..c4a914b10 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 7bb7cb53b..6c49999cd 100644 --- a/pjmedia/src/pjmedia/rtcp_xr.c +++ b/pjmedia/src/pjmedia/rtcp_xr.c @@ -26,7 +26,7 @@ #include #include -#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 edf8a2307..2122033b3 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 a091d8399..61179ef47 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 adba64d68..3c084459d 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 dfd2ee541..29462c99a 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 6183a1d10..8c1041ebb 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';