Correct output of RTCP jitter statistics in SR and RR reports
authorKinsey Moore <kmoore@digium.com>
Thu, 19 Jan 2012 22:44:38 +0000 (22:44 +0000)
committerKinsey Moore <kmoore@digium.com>
Thu, 19 Jan 2012 22:44:38 +0000 (22:44 +0000)
Change the RTCP RR and SR generation code to convert Asterisk's internal jitter
statistics to be represented in RTP timestamp units based on the rate of the
codec in use instead of in seconds.

(closes issue ASTERISK-14530)
........

Merged revisions 351611 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 351612 from http://svn.asterisk.org/svn/asterisk/branches/10

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@351613 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_rtp_asterisk.c

index eb1d07d..d804d2c 100644 (file)
@@ -137,7 +137,7 @@ struct ast_rtp {
        unsigned int txcount;           /*!< How many packets have we sent? */
        unsigned int txoctetcount;      /*!< How many octets have we sent? (txcount*160)*/
        unsigned int cycles;            /*!< Shifted count of sequence number cycles */
        unsigned int txcount;           /*!< How many packets have we sent? */
        unsigned int txoctetcount;      /*!< How many octets have we sent? (txcount*160)*/
        unsigned int cycles;            /*!< Shifted count of sequence number cycles */
-       double rxjitter;                /*!< Interarrival jitter at the moment */
+       double rxjitter;                /*!< Interarrival jitter at the moment in seconds */
        double rxtransit;               /*!< Relative transit time for previous packet */
        struct ast_format lasttxformat;
        struct ast_format lastrxformat;
        double rxtransit;               /*!< Relative transit time for previous packet */
        struct ast_format lasttxformat;
        struct ast_format lastrxformat;
@@ -900,6 +900,7 @@ static int ast_rtcp_write_rr(struct ast_rtp_instance *instance)
        char bdata[1024];
        struct timeval dlsr;
        int fraction;
        char bdata[1024];
        struct timeval dlsr;
        int fraction;
+       int rate = rtp_get_rate(&rtp->f.subclass.format);
 
        double rxlost_current;
 
 
        double rxlost_current;
 
@@ -949,7 +950,7 @@ static int ast_rtcp_write_rr(struct ast_rtp_instance *instance)
        rtcpheader[2] = htonl(rtp->themssrc);
        rtcpheader[3] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
        rtcpheader[4] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
        rtcpheader[2] = htonl(rtp->themssrc);
        rtcpheader[3] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
        rtcpheader[4] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
-       rtcpheader[5] = htonl((unsigned int)(rtp->rxjitter * 65536.));
+       rtcpheader[5] = htonl((unsigned int)(rtp->rxjitter * rate));
        rtcpheader[6] = htonl(rtp->rtcp->themrxlsr);
        rtcpheader[7] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
 
        rtcpheader[6] = htonl(rtp->rtcp->themrxlsr);
        rtcpheader[7] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
 
@@ -1003,6 +1004,7 @@ static int ast_rtcp_write_sr(struct ast_rtp_instance *instance)
        int fraction;
        struct timeval dlsr;
        char bdata[512];
        int fraction;
        struct timeval dlsr;
        char bdata[512];
+       int rate = rtp_get_rate(&rtp->f.subclass.format);
 
        if (!rtp || !rtp->rtcp)
                return 0;
 
        if (!rtp || !rtp->rtcp)
                return 0;
@@ -1043,7 +1045,7 @@ static int ast_rtcp_write_sr(struct ast_rtp_instance *instance)
        rtcpheader[7] = htonl(rtp->themssrc);
        rtcpheader[8] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
        rtcpheader[9] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
        rtcpheader[7] = htonl(rtp->themssrc);
        rtcpheader[8] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
        rtcpheader[9] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
-       rtcpheader[10] = htonl((unsigned int)(rtp->rxjitter * 65536.));
+       rtcpheader[10] = htonl((unsigned int)(rtp->rxjitter * rate));
        rtcpheader[11] = htonl(rtp->rtcp->themrxlsr);
        rtcpheader[12] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
        len += 24;
        rtcpheader[11] = htonl(rtp->rtcp->themrxlsr);
        rtcpheader[12] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
        len += 24;