]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 224671 via svnmerge from
authorKevin P. Fleming <kpfleming@digium.com>
Mon, 19 Oct 2009 23:56:31 +0000 (23:56 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Mon, 19 Oct 2009 23:56:31 +0000 (23:56 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

................
  r224671 | kpfleming | 2009-10-19 18:47:39 -0500 (Mon, 19 Oct 2009) | 14 lines

  Merged revisions 224670 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r224670 | kpfleming | 2009-10-19 18:44:07 -0500 (Mon, 19 Oct 2009) | 7 lines

    Correct timestamp calculations when RTP sample rates over 8kHz are used.

    While testing some endpoints that support 16kHz and 32kHz sample rates, some
    log messages were generated due to calc_rxstamp() computing timestamps in a way
    that produced odd results, so this patch sanitizes the result of the
    computations.
  ........
................

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

main/rtp.c

index f1231a576850f100016c5fb2818190bbbec4d4c6..e024858d0be674134a3924a2df1704b60f7a35fe 100644 (file)
@@ -1457,6 +1457,18 @@ struct ast_frame *ast_rtcp_read(struct ast_rtp *rtp)
        return f;
 }
 
+static void sanitize_tv(struct timeval *tv)
+{
+       while (tv->tv_usec < 0) {
+               tv->tv_usec += 1000000;
+               tv->tv_sec -= 1;
+       }
+       while (tv->tv_usec >= 1000000) {
+               tv->tv_usec -= 1000000;
+               tv->tv_sec += 1;
+       }
+}
+
 static void calc_rxstamp(struct timeval *when, struct ast_rtp *rtp, unsigned int timestamp, int mark)
 {
        struct timeval now;
@@ -1477,21 +1489,14 @@ static void calc_rxstamp(struct timeval *when, struct ast_rtp *rtp, unsigned int
                rtp->rxcore.tv_usec -= (timestamp % rate) * 125;
                /* Round to 0.1ms for nice, pretty timestamps */
                rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 100;
-               if (rtp->rxcore.tv_usec < 0) {
-                       /* Adjust appropriately if necessary */
-                       rtp->rxcore.tv_usec += 1000000;
-                       rtp->rxcore.tv_sec -= 1;
-               }
+               sanitize_tv(&rtp->rxcore);
        }
 
        gettimeofday(&now,NULL);
        /* rxcore is the mapping between the RTP timestamp and _our_ real time from gettimeofday() */
        when->tv_sec = rtp->rxcore.tv_sec + timestamp / rate;
        when->tv_usec = rtp->rxcore.tv_usec + (timestamp % rate) * 125;
-       if (when->tv_usec >= 1000000) {
-               when->tv_usec -= 1000000;
-               when->tv_sec += 1;
-       }
+       sanitize_tv(when);
        prog = (double)((timestamp-rtp->seedrxts)/(float)(rate));
        dtv = (double)rtp->drxcore + (double)(prog);
        current_time = (double)now.tv_sec + (double)now.tv_usec/1000000;