summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjmedia/include/pjmedia/rtcp.h1
-rw-r--r--pjmedia/src/pjmedia/rtcp.c23
2 files changed, 24 insertions, 0 deletions
diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h
index a5c3afeb..472cc1c3 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 2a36f278..3eeeea5c 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;