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:
parent
415fc6fedf
commit
2d4ee7d379
|
@ -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>
|
||||
|
|
|
@ -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. */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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)*/
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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: "
|
||||
|
|
|
@ -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: "
|
||||
|
@ -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.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);
|
||||
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;
|
||||
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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
);
|
||||
|
|
|
@ -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,
|
||||
""
|
||||
|
|
|
@ -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,7 +890,8 @@ 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,
|
||||
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);
|
||||
|
@ -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,7 +953,8 @@ 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,
|
||||
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);
|
||||
|
@ -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);
|
||||
|
|
|
@ -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';
|
||||
|
|
Loading…
Reference in New Issue