From 62381ec467a801fe476ad28053b711348ae709ed Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Fri, 31 Jan 2014 10:05:22 +0100 Subject: [PATCH] Added packet loss statistics --- src/rtp/pbuf.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/src/rtp/pbuf.c b/src/rtp/pbuf.c index e3f5a57a3..000c7fe19 100644 --- a/src/rtp/pbuf.c +++ b/src/rtp/pbuf.c @@ -14,7 +14,7 @@ * * Copyright (c) 2003-2004 University of Southern California * Copyright (c) 2003-2004 University of Glasgow - * Copyright (c) 2005-2010 CESNET z.s.p.o. + * Copyright (c) 2005-2014 CESNET z.s.p.o. * * Redistribution and use in source and binary forms, with or without * modification, is permitted provided that the following conditions @@ -69,6 +69,8 @@ #define PBUF_MAGIC 0xcafebabe +#define STATS_INTERVAL 1000 + extern long frame_begin[2]; struct pbuf_node { @@ -89,6 +91,15 @@ struct pbuf { struct pbuf_node *last; double playout_delay; double deletion_delay; + + // for statistics + /// @todo figure out packet duplication + int pkt_count[2]; // first buffer is for last_rtp_seq + STATS_INTERVAL + // second for last_rtp_seq + 2 * STATS_INTERVAL + int last_rtp_seq; + int should_arrived; + int cumulative_count; + uint32_t last_display_ts; }; /*********************************************************************************/ @@ -150,7 +161,7 @@ struct pbuf *pbuf_init(void) { struct pbuf *playout_buf = NULL; - playout_buf = malloc(sizeof(struct pbuf)); + playout_buf = calloc(1, sizeof(struct pbuf)); if (playout_buf != NULL) { playout_buf->frst = NULL; playout_buf->last = NULL; @@ -235,9 +246,43 @@ static struct pbuf_node *create_new_pnode(rtp_packet * pkt, double playout_delay void pbuf_insert(struct pbuf *playout_buf, rtp_packet * pkt) { struct pbuf_node *tmp; - pbuf_validate(playout_buf); + // collect statistics + if ((((int) pkt->seq - playout_buf->last_rtp_seq + (1<<16)) % + (1<<16)) < STATS_INTERVAL * 2) { + + if ((((int) pkt->seq - playout_buf->last_rtp_seq + (1<<16)) + % (1<<16)) < STATS_INTERVAL) { + playout_buf->pkt_count[0] += 1; + } else { + playout_buf->pkt_count[1] += 1; + } + } else { + playout_buf->cumulative_count += playout_buf->pkt_count[0]; + playout_buf->should_arrived += STATS_INTERVAL; + playout_buf->last_rtp_seq = (playout_buf->last_rtp_seq + + STATS_INTERVAL) % (1<<16); + playout_buf->pkt_count[0] = playout_buf->pkt_count[1]; + playout_buf->pkt_count[1] = 1; + } + + // print statistics after 5 seconds + if ((pkt->ts - playout_buf->last_display_ts) > 90000 * 5 && + playout_buf->should_arrived > 0) { + // print stats + printf("SSRC %08x: %d packets expected, %d was received " + "successfully (%f%%).\n", + pkt->ssrc, + playout_buf->should_arrived, + playout_buf->cumulative_count, + (double) playout_buf->cumulative_count / + playout_buf->should_arrived * 100.0); + playout_buf->should_arrived = + playout_buf->cumulative_count = 0; + playout_buf->last_display_ts = pkt->ts; + } + if (playout_buf->frst == NULL && playout_buf->last == NULL) { /* playout buffer is empty - add new frame */ playout_buf->frst = create_new_pnode(pkt, playout_buf->playout_delay,