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
This commit is contained in:
Nanang Izzuddin 2008-05-17 14:54:18 +00:00
parent 415fc6fedf
commit 2d4ee7d379
12 changed files with 131 additions and 267 deletions

View File

@ -42,6 +42,7 @@
#include <pj/list.h> #include <pj/list.h>
#include <pj/lock.h> #include <pj/lock.h>
#include <pj/log.h> #include <pj/log.h>
#include <pj/math.h>
#include <pj/os.h> #include <pj/os.h>
#include <pj/pool.h> #include <pj/pool.h>
#include <pj/pool_buf.h> #include <pj/pool_buf.h>

View File

@ -76,7 +76,10 @@ struct pjmedia_jb_state
unsigned min_prefetch; /**< Minimum allowed prefetch, in frms. */ unsigned min_prefetch; /**< Minimum allowed prefetch, in frms. */
unsigned max_prefetch; /**< Maximum allowed prefetch, in frms. */ unsigned max_prefetch; /**< Maximum allowed prefetch, in frms. */
unsigned size; /**< Current buffer size, in frames. */ 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. */
}; };

View File

@ -28,7 +28,6 @@
#include <pjmedia/rtcp_xr.h> #include <pjmedia/rtcp_xr.h>
#include <pjmedia/rtp.h> #include <pjmedia/rtp.h>
PJ_BEGIN_DECL PJ_BEGIN_DECL
@ -180,26 +179,14 @@ struct pjmedia_rtcp_stream_stat
unsigned reorder; /**< Total number of out of order packets */ unsigned reorder; /**< Total number of out of order packets */
unsigned dup; /**< Total number of duplicates packets */ unsigned dup; /**< Total number of duplicates packets */
struct { pj_math_stat loss_period;/**< Loss period statistics (in usec) */
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. */
struct { struct {
unsigned burst:1; /**< Burst/sequential packet lost detected */ unsigned burst:1; /**< Burst/sequential packet lost detected */
unsigned random:1; /**< Random packet lost detected. */ unsigned random:1; /**< Random packet lost detected. */
} loss_type; /**< Types of loss detected. */ } loss_type; /**< Types of loss detected. */
struct { pj_math_stat jitter; /**< Jitter statistics (in usec) */
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. */
}; };
@ -220,14 +207,7 @@ struct pjmedia_rtcp_stat
pjmedia_rtcp_stream_stat tx; /**< Encoder stream statistics. */ pjmedia_rtcp_stream_stat tx; /**< Encoder stream statistics. */
pjmedia_rtcp_stream_stat rx; /**< Decoder stream statistics. */ pjmedia_rtcp_stream_stat rx; /**< Decoder stream statistics. */
struct { pj_math_stat rtt; /**< Round trip delay statistic(in usec)*/
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. */
}; };

View File

@ -25,6 +25,7 @@
*/ */
#include <pjmedia/types.h> #include <pjmedia/types.h>
#include <pj/math.h>
PJ_BEGIN_DECL PJ_BEGIN_DECL
@ -246,22 +247,8 @@ typedef struct pjmedia_rtcp_xr_stream_stat
unsigned lost; /**< Number of packets lost */ unsigned lost; /**< Number of packets lost */
unsigned dup; /**< Number of duplicated packets */ unsigned dup; /**< Number of duplicated packets */
pj_math_stat jitter; /**< Jitter statistics (in usec) */
struct { pj_math_stat toh; /**< TTL of hop limit statistics. */
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. */
} stat_sum; } stat_sum;
struct { struct {
@ -300,18 +287,11 @@ typedef struct pjmedia_rtcp_xr_stream_stat
typedef struct pjmedia_rtcp_xr_stat typedef struct pjmedia_rtcp_xr_stat
{ {
pjmedia_rtcp_xr_stream_stat rx; pjmedia_rtcp_xr_stream_stat rx; /**< Decoding direction statistics. */
pjmedia_rtcp_xr_stream_stat tx; pjmedia_rtcp_xr_stream_stat tx; /**< Encoding direction statistics. */
pj_math_stat rtt; /**< Round-trip delay stat (in usec)
/* RTT calculated from receiver side */ the value is calculated from
struct { receiver side. */
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_stat; } pjmedia_rtcp_xr_stat;
/** /**

View File

@ -24,6 +24,7 @@
#include <pj/pool.h> #include <pj/pool.h>
#include <pj/assert.h> #include <pj/assert.h>
#include <pj/log.h> #include <pj/log.h>
#include <pj/math.h>
#include <pj/string.h> #include <pj/string.h>
@ -66,19 +67,13 @@ struct pjmedia_jbuf
int jb_min_prefetch; // Minimum allowable prefetch int jb_min_prefetch; // Minimum allowable prefetch
int jb_max_prefetch; // Maximum allowable prefetch int jb_max_prefetch; // Maximum allowable prefetch
int jb_status; // status is 'init' until the first 'put' operation int jb_status; // status is 'init' until the first 'put' operation
pj_math_stat jb_delay; // Delay statistics of jitter buffer (in frame unit)
int jb_max_size; // Maximum frames buffered ever
}; };
#define JB_STATUS_INITIALIZING 0 #define JB_STATUS_INITIALIZING 0
#define JB_STATUS_PROCESSING 1 #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 /* Enabling this would log the jitter buffer state about once per
* second. * 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_hist_level = 0;
jb->jb_max_count = max_count; jb->jb_max_count = max_count;
pj_math_stat_init(&jb->jb_delay);
*p_jb = jb; *p_jb = jb;
return PJ_SUCCESS; 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_stable_hist = 0;
jb->jb_status = JB_STATUS_INITIALIZING; jb->jb_status = JB_STATUS_INITIALIZING;
jb->jb_max_hist_level = 0; jb->jb_max_hist_level = 0;
jb->jb_max_size = 0;
jb_framelist_remove_head(&jb->jb_framelist, jb_framelist_remove_head(&jb->jb_framelist,
jb_framelist_size(&jb->jb_framelist)); jb_framelist_size(&jb->jb_framelist));
pj_math_stat_init(&jb->jb_delay);
return PJ_SUCCESS; return PJ_SUCCESS;
} }
@ -388,8 +387,6 @@ static void jbuf_calculate_jitter(pjmedia_jbuf *jb)
/* Update jb_max_size */ /* Update jb_max_size */
cur_size = jb_framelist_size(&jb->jb_framelist); 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 /* Only apply burst-level calculation on PUT operation since if VAD is
* active the burst-level may not be accurate. * active the burst-level may not be accurate.
@ -456,9 +453,13 @@ static void jbuf_calculate_jitter(pjmedia_jbuf *jb)
/* Drop frame(s)! */ /* Drop frame(s)! */
jb_framelist_remove_head(&jb->jb_framelist, diff); jb_framelist_remove_head(&jb->jb_framelist, diff);
pj_math_stat_update(&jb->jb_delay, cur_size - diff);
TRACE__((jb->name.ptr, TRACE__((jb->name.ptr,
"JB shrinking %d frame(s), size=%d", diff, "JB shrinking %d frame(s), size=%d", diff,
jb_framelist_size(&jb->jb_framelist))); jb_framelist_size(&jb->jb_framelist)));
} else {
pj_math_stat_update(&jb->jb_delay, cur_size);
} }
jb->jb_level = 0; 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->min_prefetch = jb->jb_min_prefetch;
state->max_prefetch = jb->jb_max_prefetch; state->max_prefetch = jb->jb_max_prefetch;
state->size = jb_framelist_size(&jb->jb_framelist); 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; return PJ_SUCCESS;
} }

View File

@ -166,6 +166,13 @@ PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *sess,
pj_get_timestamp(&sess->ts_base); pj_get_timestamp(&sess->ts_base);
pj_get_timestamp_freq(&sess->ts_freq); 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. */ /* 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)); TRACE_((sess->name, "%d packet(s) lost", seq_st.diff - 1));
/* Update loss period stat */ /* Update loss period stat */
if (sess->stat.rx.loss_period.count == 0 || pj_math_stat_update(&sess->stat.rx.loss_period, period);
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;
} }
@ -329,20 +325,8 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess,
jitter *= 1000; 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 */ /* Update jitter stat */
if (jitter < sess->stat.rx.jitter.min) pj_math_stat_update(&sess->stat.rx.jitter, jitter);
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;
#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) #if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
pjmedia_rtcp_xr_rx_rtp(&sess->xr_session, seq, 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 */ /* Loss period in usec */
period *= 1000; period *= 1000;
if (sess->stat.tx.update_cnt==0||sess->stat.tx.loss_period.min==0) /* Update loss period stat */
sess->stat.tx.loss_period.min = period; pj_math_stat_update(&sess->stat.tx.loss_period, 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;
} }
/* Get jitter value in usec */ /* Get jitter value in usec */
@ -487,18 +462,7 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *sess,
} }
/* Update jitter statistics */ /* Update jitter statistics */
if (sess->stat.tx.jitter.count == 0) pj_math_stat_update(&sess->stat.tx.jitter, jitter);
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;
/* Can only calculate if LSR and DLSR is present in RR */ /* Can only calculate if LSR and DLSR is present in RR */
if (rr->lsr && rr->dlsr) { if (rr->lsr && rr->dlsr) {
@ -552,16 +516,14 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *sess,
goto end_rtt_calc; goto end_rtt_calc;
} }
if (sess->stat.rtt_update_cnt == 0)
sess->stat.rtt.min = rtt;
/* "Normalize" rtt value that is exceptionally high. /* "Normalize" rtt value that is exceptionally high.
* For such values, "normalize" the rtt to be three times * For such values, "normalize" the rtt to be three times
* the average value. * 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; unsigned orig_rtt = rtt;
rtt = sess->stat.rtt.avg*3; rtt = sess->stat.rtt.mean*3;
PJ_LOG(5,(sess->name, PJ_LOG(5,(sess->name,
"RTT value %d usec is normalized to %d usec", "RTT value %d usec is normalized to %d usec",
orig_rtt, rtt)); 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)); TRACE_((sess->name, "RTCP RTT is set to %d usec", rtt));
if (rtt < sess->stat.rtt.min && rtt) /* Update RTT stat */
sess->stat.rtt.min = rtt; pj_math_stat_update(&sess->stat.rtt, 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++;
} else { } else {
PJ_LOG(5, (sess->name, "Internal RTCP NTP clock skew detected: " PJ_LOG(5, (sess->name, "Internal RTCP NTP clock skew detected: "

View File

@ -26,7 +26,7 @@
#include <pj/sock.h> #include <pj/sock.h>
#include <pj/string.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" #define THIS_FILE "rtcp_xr.c"
@ -58,27 +58,6 @@
# define TRACE_(x) ; # define TRACE_(x) ;
#endif #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, void pjmedia_rtcp_xr_init( pjmedia_rtcp_xr_session *session,
struct pjmedia_rtcp_session *parent_session, struct pjmedia_rtcp_session *parent_session,
pj_uint8_t gmin, 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) { if (sess->stat.rx.stat_sum.j) {
r->jitter_min = pj_htonl(sess->stat.rx.stat_sum.jitter.min); 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_max = pj_htonl(sess->stat.rx.stat_sum.jitter.max);
r->jitter_mean = pj_htonl(sess->stat.rx.stat_sum.jitter.mean); r->jitter_mean =
sess->stat.rx.stat_sum.jitter.dev = pj_htonl((unsigned)sess->stat.rx.stat_sum.jitter.mean);
my_isqrt(sess->stat.rx.stat_sum.jitter.dev); r->jitter_dev =
r->jitter_dev = pj_htonl(sess->stat.rx.stat_sum.jitter.dev); pj_htonl(pj_math_stat_get_stddev(&sess->stat.rx.stat_sum.jitter));
} }
if (sess->stat.rx.stat_sum.t) { if (sess->stat.rx.stat_sum.t) {
r->toh_min = sess->stat.rx.stat_sum.toh.min; r->toh_min = sess->stat.rx.stat_sum.toh.min;
r->toh_max = sess->stat.rx.stat_sum.toh.max; r->toh_max = sess->stat.rx.stat_sum.toh.max;
r->toh_mean = sess->stat.rx.stat_sum.toh.mean; r->toh_mean = (unsigned) sess->stat.rx.stat_sum.toh.mean;
sess->stat.rx.stat_sum.toh.dev = r->toh_dev = pj_math_stat_get_stddev(&sess->stat.rx.stat_sum.toh);
my_isqrt(sess->stat.rx.stat_sum.toh.dev);
r->toh_dev = sess->stat.rx.stat_sum.toh.dev;
} }
/* Reset TX statistics summary each time built */ /* 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; m = sess->ptime * sess->frames_per_packet;
/* Calculate burst and densities. */ /* Calculate burst and densities. */
if (ctotal) { if (c11 && (c23 || c33)) {
p32 = c32 / (c31 + c32 + c33); p32 = c32 / (c31 + c32 + c33);
if((c22 + c23) < 1) { if((c22 + c23) < 1) {
p23 = 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! * We allow up to 30 seconds RTT!
*/ */
if (eedelay <= 30 * 1000 * 1000UL) { if (eedelay <= 30 * 1000 * 1000UL) {
if (sess->stat.rtt.update_cnt == 0)
sess->stat.rtt.min = rtt;
/* "Normalize" rtt value that is exceptionally high. /* "Normalize" rtt value that is exceptionally high.
* For such values, "normalize" the rtt to be three times * For such values, "normalize" the rtt to be three times
* the average value. * 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; unsigned orig_rtt = rtt;
rtt = sess->stat.rtt.avg*3; rtt = (unsigned)sess->stat.rtt.mean*3;
PJ_LOG(5,(sess->name, PJ_LOG(5,(sess->name,
"RTT value %d usec is normalized to %d usec", "RTT value %d usec is normalized to %d usec",
orig_rtt, rtt)); orig_rtt, rtt));
} }
TRACE_((sess->name, "RTCP RTT is set to %d usec", rtt)); TRACE_((sess->name, "RTCP RTT is set to %d usec", rtt));
pj_math_stat_update(&sess->stat.rtt, 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++;
} }
} else { } else {
PJ_LOG(5, (sess->name, "Internal RTCP NTP clock skew detected: " PJ_LOG(5, (sess->name, "Internal RTCP NTP clock skew detected: "
@ -586,14 +549,16 @@ void pjmedia_rtcp_xr_rx_rtcp_xr( pjmedia_rtcp_xr_session *sess,
sess->stat.tx.stat_sum.jitter.min = pj_ntohl(rb_stats->jitter_min); 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.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.mean= pj_ntohl(rb_stats->jitter_mean);
sess->stat.tx.stat_sum.jitter.dev = pj_ntohl(rb_stats->jitter_dev); pj_math_stat_set_stddev(&sess->stat.tx.stat_sum.jitter,
pj_ntohl(rb_stats->jitter_dev));
} }
if (sess->stat.tx.stat_sum.t) { if (sess->stat.tx.stat_sum.t) {
sess->stat.tx.stat_sum.toh.min = rb_stats->toh_min; 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.max = rb_stats->toh_max;
sess->stat.tx.stat_sum.toh.mean= rb_stats->toh_mean; sess->stat.tx.stat_sum.toh.mean= rb_stats->toh_mean;
sess->stat.tx.stat_sum.toh.dev = rb_stats->toh_dev; 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); 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) { if (jitter >= 0) {
pj_int32_t diff;
sess->stat.rx.stat_sum.j = PJ_TRUE; sess->stat.rx.stat_sum.j = PJ_TRUE;
if (sess->stat.rx.stat_sum.jitter.min > (pj_uint32_t)jitter) pj_math_stat_update(&sess->stat.rx.stat_sum.jitter, 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;
} }
if (toh >= 0) { if (toh >= 0) {
pj_int32_t diff;
sess->stat.rx.stat_sum.t = toh_ipv4? 1 : 2; sess->stat.rx.stat_sum.t = toh_ipv4? 1 : 2;
pj_math_stat_update(&sess->stat.rx.stat_sum.toh, toh);
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;
} }
/* Update burst metrics. /* Update burst metrics.

View File

@ -500,12 +500,12 @@ static void check_tx_rtcp(pjmedia_stream *stream, pj_uint32_t timestamp)
/* Update RTCP XR with current JB states */ /* Update RTCP XR with current JB states */
pjmedia_jbuf_get_state(stream->jb, &jb_state); 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_update_info(&stream->rtcp.xr_session,
PJMEDIA_RTCP_XR_INFO_JB_NOM, PJMEDIA_RTCP_XR_INFO_JB_NOM,
i); 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_update_info(&stream->rtcp.xr_session,
PJMEDIA_RTCP_XR_INFO_JB_MAX, PJMEDIA_RTCP_XR_INFO_JB_MAX,
i); i);
@ -1673,12 +1673,12 @@ PJ_DEF(pj_status_t) pjmedia_stream_destroy( pjmedia_stream *stream )
/* Update RTCP XR with current JB states */ /* Update RTCP XR with current JB states */
pjmedia_jbuf_get_state(stream->jb, &jb_state); 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_update_info(&stream->rtcp.xr_session,
PJMEDIA_RTCP_XR_INFO_JB_NOM, PJMEDIA_RTCP_XR_INFO_JB_NOM,
i); 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_update_info(&stream->rtcp.xr_session,
PJMEDIA_RTCP_XR_INFO_JB_MAX, PJMEDIA_RTCP_XR_INFO_JB_MAX,
i); i);

View File

@ -1659,7 +1659,7 @@ static void print_avg_stat(void)
/* Jitter */ /* Jitter */
MIN_(min_stat.rx.jitter.min, audio->rtcp.stat.rx.jitter.min); MIN_(min_stat.rx.jitter.min, audio->rtcp.stat.rx.jitter.min);
MAX_(max_stat.rx.jitter.max, audio->rtcp.stat.rx.jitter.max); 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: */ /* TX Statistisc: */
@ -1692,13 +1692,13 @@ static void print_avg_stat(void)
/* Jitter */ /* Jitter */
MIN_(min_stat.tx.jitter.min, audio->rtcp.stat.tx.jitter.min); MIN_(min_stat.tx.jitter.min, audio->rtcp.stat.tx.jitter.min);
MAX_(max_stat.tx.jitter.max, audio->rtcp.stat.tx.jitter.max); 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 */ /* RTT */
MIN_(min_stat.rtt.min, audio->rtcp.stat.rtt.min); MIN_(min_stat.rtt.min, audio->rtcp.stat.rtt.min);
MAX_(max_stat.rtt.max, audio->rtcp.stat.rtt.max); 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; ++count;
} }
@ -1767,7 +1767,7 @@ static void print_avg_stat(void)
"packets", "packets",
min_stat.rx.jitter.min/1000.0, 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, max_stat.rx.jitter.max/1000.0,
"ms", "ms",
@ -1798,13 +1798,13 @@ static void print_avg_stat(void)
"packets", "packets",
min_stat.tx.jitter.min/1000.0, 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, max_stat.tx.jitter.max/1000.0,
"ms", "ms",
/* rtt */ /* rtt */
min_stat.rtt.min/1000.0, min_stat.rtt.min/1000.0,
avg_stat.rtt.avg/1000.0, avg_stat.rtt.mean/1000.0,
max_stat.rtt.max/1000.0, max_stat.rtt.max/1000.0,
"ms" "ms"
); );

View File

@ -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.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.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.max / 1000.0,
audio->rtcp.stat.rx.loss_period.last / 1000.0, audio->rtcp.stat.rx.loss_period.last / 1000.0,
"", "",
audio->rtcp.stat.rx.jitter.min / 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.max / 1000.0,
audio->rtcp.stat.rx.jitter.last / 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.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.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.max / 1000.0,
audio->rtcp.stat.tx.loss_period.last / 1000.0, audio->rtcp.stat.tx.loss_period.last / 1000.0,
"", "",
audio->rtcp.stat.tx.jitter.min / 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.max / 1000.0,
audio->rtcp.stat.tx.jitter.last / 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, PJ_LOG(3, (THIS_FILE,
" RTT delay : %7.3f %7.3f %7.3f %7.3f%s\n", " RTT delay : %7.3f %7.3f %7.3f %7.3f%s\n",
audio->rtcp.stat.rtt.min / 1000.0, 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.max / 1000.0,
audio->rtcp.stat.rtt.last / 1000.0, audio->rtcp.stat.rtt.last / 1000.0,
"" ""

View File

@ -768,9 +768,9 @@ static void print_stream_stat(pjmedia_stream *stream)
printf(" RX stat last update: %s\n" printf(" RX stat last update: %s\n"
" total %s packets %sB received (%sB +IP hdr)%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" " pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n"
" (msec) min avg max last\n" " (msec) min avg max last dev\n"
" loss period: %7.3f %7.3f %7.3f %7.3f%s\n" " loss period: %7.3f %7.3f %7.3f %7.3f %7.3f%s\n"
" jitter : %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, last_update,
good_number(packets, stat.rx.pkt), good_number(packets, stat.rx.pkt),
good_number(bytes, stat.rx.bytes), 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.reorder * 100.0 / (stat.rx.pkt + stat.rx.loss),
"", "",
stat.rx.loss_period.min / 1000.0, 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.max / 1000.0,
stat.rx.loss_period.last / 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.min / 1000.0,
stat.rx.jitter.avg / 1000.0, stat.rx.jitter.mean / 1000.0,
stat.rx.jitter.max / 1000.0, stat.rx.jitter.max / 1000.0,
stat.rx.jitter.last / 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" printf(" TX stat last update: %s\n"
" total %s packets %sB sent (%sB +IP hdr)%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" " pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n"
" (msec) min avg max last\n" " (msec) min avg max last dev\n"
" loss period: %7.3f %7.3f %7.3f %7.3f%s\n" " loss period: %7.3f %7.3f %7.3f %7.3f %7.3f%s\n"
" jitter : %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, last_update,
good_number(packets, stat.tx.pkt), good_number(packets, stat.tx.pkt),
good_number(bytes, stat.tx.bytes), 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.reorder * 100.0 / (stat.tx.pkt + stat.tx.loss),
"", "",
stat.tx.loss_period.min / 1000.0, 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.max / 1000.0,
stat.tx.loss_period.last / 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.min / 1000.0,
stat.tx.jitter.avg / 1000.0, stat.tx.jitter.mean / 1000.0,
stat.tx.jitter.max / 1000.0, stat.tx.jitter.max / 1000.0,
stat.tx.jitter.last / 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.min / 1000.0,
stat.rtt.avg / 1000.0, stat.rtt.mean / 1000.0,
stat.rtt.max / 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,
"" ""
); );
@ -885,7 +890,8 @@ static void print_stream_stat(pjmedia_stream *stream)
port->info.clock_rate); port->info.clock_rate);
SAMPLES_TO_USEC(jmean, xr_stat.rx.stat_sum.jitter.mean, SAMPLES_TO_USEC(jmean, xr_stat.rx.stat_sum.jitter.mean,
port->info.clock_rate); port->info.clock_rate);
SAMPLES_TO_USEC(jdev, xr_stat.rx.stat_sum.jitter.dev, SAMPLES_TO_USEC(jdev,
pj_math_stat_get_stddev(&xr_stat.rx.stat_sum.jitter),
port->info.clock_rate); port->info.clock_rate);
sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f", sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f",
jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0); jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0);
@ -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.min,
xr_stat.rx.stat_sum.toh.mean, xr_stat.rx.stat_sum.toh.mean,
xr_stat.rx.stat_sum.toh.max, 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 } else
sprintf(toh, "(report not available)"); sprintf(toh, "(report not available)");
@ -947,7 +953,8 @@ static void print_stream_stat(pjmedia_stream *stream)
port->info.clock_rate); port->info.clock_rate);
SAMPLES_TO_USEC(jmean, xr_stat.tx.stat_sum.jitter.mean, SAMPLES_TO_USEC(jmean, xr_stat.tx.stat_sum.jitter.mean,
port->info.clock_rate); port->info.clock_rate);
SAMPLES_TO_USEC(jdev, xr_stat.tx.stat_sum.jitter.dev, SAMPLES_TO_USEC(jdev,
pj_math_stat_get_stddev(&xr_stat.tx.stat_sum.jitter),
port->info.clock_rate); port->info.clock_rate);
sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f", sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f",
jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0); jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0);
@ -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.min,
xr_stat.tx.stat_sum.toh.mean, xr_stat.tx.stat_sum.toh.mean,
xr_stat.tx.stat_sum.toh.max, 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 } else
sprintf(toh, "(report not available)"); sprintf(toh, "(report not available)");
@ -1168,13 +1175,14 @@ static void print_stream_stat(pjmedia_stream *stream)
); );
/* RTT delay, need this? */ /* RTT delay (by receiver side) */
printf(" (msec) min avg max last\n"); printf(" (msec) min avg max last dev\n");
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",
xr_stat.rtt.min / 1000.0, 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.max / 1000.0,
xr_stat.rtt.last / 1000.0, xr_stat.rtt.last / 1000.0,
pj_math_stat_get_stddev(&xr_stat.rtt) / 1000.0,
"" ""
); );
} while (0); } while (0);

View File

@ -2058,9 +2058,9 @@ static void dump_media_session(const char *indent,
"%s RX pt=%d, stat last update: %s\n" "%s RX pt=%d, stat last update: %s\n"
"%s total %spkt %sB (%sB +IP hdr) @avg=%sbps/%sbps\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 pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)\n"
"%s (msec) min avg max last\n" "%s (msec) min avg max last dev\n"
"%s loss period: %7.3f %7.3f %7.3f %7.3f\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%s", "%s jitter : %7.3f %7.3f %7.3f %7.3f %7.3f%s",
indent, info.stream_info[i].fmt.pt, indent, info.stream_info[i].fmt.pt,
last_update, last_update,
indent, indent,
@ -2078,14 +2078,16 @@ static void dump_media_session(const char *indent,
stat.rx.reorder * 100.0 / (stat.rx.pkt + stat.rx.loss), stat.rx.reorder * 100.0 / (stat.rx.pkt + stat.rx.loss),
indent, indent, indent, indent,
stat.rx.loss_period.min / 1000.0, 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.max / 1000.0,
stat.rx.loss_period.last / 1000.0, stat.rx.loss_period.last / 1000.0,
pj_math_stat_get_stddev(&stat.rx.loss_period) / 1000.0,
indent, indent,
stat.rx.jitter.min / 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.max / 1000.0,
stat.rx.jitter.last / 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 TX pt=%d, ptime=%dms, stat last update: %s\n"
"%s total %spkt %sB (%sB +IP hdr) @avg %sbps/%sbps\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 pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)\n"
"%s (msec) min avg max last\n" "%s (msec) min avg max last dev \n"
"%s loss period: %7.3f %7.3f %7.3f %7.3f\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%s", "%s jitter : %7.3f %7.3f %7.3f %7.3f %7.3f%s",
indent, indent,
info.stream_info[i].tx_pt, info.stream_info[i].tx_pt,
info.stream_info[i].param->info.frm_ptime * info.stream_info[i].param->info.frm_ptime *
@ -2140,14 +2142,16 @@ static void dump_media_session(const char *indent,
indent, indent, indent, indent,
stat.tx.loss_period.min / 1000.0, 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.max / 1000.0,
stat.tx.loss_period.last / 1000.0, stat.tx.loss_period.last / 1000.0,
pj_math_stat_get_stddev(&stat.tx.loss_period) / 1000.0,
indent, indent,
stat.tx.jitter.min / 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.max / 1000.0,
stat.tx.jitter.last / 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'; *p = '\0';
len = pj_ansi_snprintf(p, end-p, 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, indent,
stat.rtt.min / 1000.0, stat.rtt.min / 1000.0,
stat.rtt.avg / 1000.0, stat.rtt.mean / 1000.0,
stat.rtt.max / 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) { if (len < 1 || len > end-p) {
*p = '\0'; *p = '\0';