diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h index a5c3afebb..472cc1c3a 100644 --- a/pjmedia/include/pjmedia/rtcp.h +++ b/pjmedia/include/pjmedia/rtcp.h @@ -160,6 +160,7 @@ struct pjmedia_rtcp_stream_stat unsigned dup; /**< 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) */ diff --git a/pjmedia/src/pjmedia/rtcp.c b/pjmedia/src/pjmedia/rtcp.c index 2a36f278b..3eeeea5c2 100644 --- a/pjmedia/src/pjmedia/rtcp.c +++ b/pjmedia/src/pjmedia/rtcp.c @@ -205,6 +205,29 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *sess, return; } + /* Calculate loss periods. */ + if (seq_st.diff > 1) { + unsigned count = seq_st.diff - 1; + unsigned period; + + period = count * sess->pkt_size * 1000 / sess->clock_rate; + period *= 1000; + + /* 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; + } + /* Only mark "good" packets */ ++sess->received;