Cleanups of RX/TX calculations
authorMark Spencer <markster@digium.com>
Sun, 14 Mar 2004 05:31:47 +0000 (05:31 +0000)
committerMark Spencer <markster@digium.com>
Sun, 14 Mar 2004 05:31:47 +0000 (05:31 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2416 65c4cc65-6c06-0410-ace0-fbb531ad65f3

rtp.c

diff --git a/rtp.c b/rtp.c
index d085158..d031c2d 100755 (executable)
--- a/rtp.c
+++ b/rtp.c
@@ -353,7 +353,7 @@ static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int t
 {
        if (!rtp->rxcore.tv_sec && !rtp->rxcore.tv_usec) {
                gettimeofday(&rtp->rxcore, NULL);
-               rtp->rxcore.tv_usec -= timestamp / 8000;
+               rtp->rxcore.tv_sec -= timestamp / 8000;
                rtp->rxcore.tv_usec -= (timestamp % 8000) * 125;
                if (rtp->rxcore.tv_usec < 0) {
                        /* Adjust appropriately if necessary */
@@ -847,7 +847,7 @@ static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
        }
        if (delivery && (delivery->tv_sec || delivery->tv_usec)) {
                /* Use previous txcore */
-               ms = (delivery->tv_sec - rtp->txcore.tv_usec) * 1000;
+               ms = (delivery->tv_sec - rtp->txcore.tv_sec) * 1000;
                ms += (delivery->tv_usec - rtp->txcore.tv_usec) / 1000;
                rtp->txcore.tv_sec = delivery->tv_sec;
                rtp->txcore.tv_usec = delivery->tv_usec;
@@ -969,14 +969,16 @@ static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec
                default:
                        ast_log(LOG_WARNING, "Not sure about timestamp format for codec format %s\n", ast_getformatname(f->subclass));
                }
-
                /* Re-calculate last TS */
                rtp->lastts = rtp->lastts + ms * 8;
-               /* If it's close to our prediction, go for it */
-               if (abs(rtp->lastts - pred) < 640)
-                       rtp->lastts = pred;
-               else
-                       ast_log(LOG_DEBUG, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
+               if (!f->delivery.tv_sec && f->delivery.tv_usec) {
+                       /* If this isn't an absolute delivery time, Check if it is close to our prediction, 
+                          and if so, go with our prediction */
+                       if (abs(rtp->lastts - pred) < 640)
+                               rtp->lastts = pred;
+                       else
+                               ast_log(LOG_DEBUG, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
+               }
        } else {
                mark = f->subclass & 0x1;
                pred = rtp->lastovidtimestamp + f->samples;