From 1cf4ea2eb3d86b34c1f12b276f02d9d677786ab2 Mon Sep 17 00:00:00 2001 From: Mark Spencer <markster@digium.com> Date: Mon, 5 Apr 2004 20:47:44 +0000 Subject: [PATCH] Don't translate time for packets with no delivery git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2631 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- translate.c | 95 ++++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/translate.c b/translate.c index 35b10fc5ba..6433fc5376 100755 --- a/translate.c +++ b/translate.c @@ -140,42 +140,44 @@ struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f, p = path; /* Feed the first frame into the first translator */ p->step->framein(p->state, f); - if (path->nextin.tv_sec || path->nextin.tv_usec) { - /* Make sure this is in line with what we were expecting */ - if ((path->nextin.tv_sec != f->delivery.tv_sec) || - (path->nextin.tv_usec != f->delivery.tv_usec)) { - /* The time has changed between what we expected and this - most recent time on the new packet. Adjust our output - time appropriately */ - long sdiff; - long udiff; - sdiff = f->delivery.tv_sec - path->nextin.tv_sec; - udiff = f->delivery.tv_usec - path->nextin.tv_usec; + if (f->delivery.tv_sec || f->delivery.tv_usec) { + if (path->nextin.tv_sec || path->nextin.tv_usec) { + /* Make sure this is in line with what we were expecting */ + if ((path->nextin.tv_sec != f->delivery.tv_sec) || + (path->nextin.tv_usec != f->delivery.tv_usec)) { + /* The time has changed between what we expected and this + most recent time on the new packet. Adjust our output + time appropriately */ + long sdiff; + long udiff; + sdiff = f->delivery.tv_sec - path->nextin.tv_sec; + udiff = f->delivery.tv_usec - path->nextin.tv_usec; + path->nextin.tv_sec = f->delivery.tv_sec; + path->nextin.tv_usec = f->delivery.tv_usec; + path->nextout.tv_sec += sdiff; + path->nextout.tv_usec += udiff; + if (path->nextout.tv_usec < 0) { + path->nextout.tv_usec += 1000000; + path->nextout.tv_sec--; + } else if (path->nextout.tv_usec >= 1000000) { + path->nextout.tv_usec -= 1000000; + path->nextout.tv_sec++; + } + } + } else { + /* This is our first pass. Make sure the timing looks good */ path->nextin.tv_sec = f->delivery.tv_sec; path->nextin.tv_usec = f->delivery.tv_usec; - path->nextout.tv_sec += sdiff; - path->nextout.tv_usec += udiff; - if (path->nextout.tv_usec < 0) { - path->nextout.tv_usec += 1000000; - path->nextout.tv_sec--; - } else if (path->nextout.tv_usec >= 1000000) { - path->nextout.tv_usec -= 1000000; - path->nextout.tv_sec++; - } + path->nextout.tv_sec = f->delivery.tv_sec; + path->nextout.tv_usec = f->delivery.tv_usec; + } + /* Predict next incoming sample */ + path->nextin.tv_sec += (f->samples / 8000); + path->nextin.tv_usec += ((f->samples % 8000) * 125); + if (path->nextin.tv_usec >= 1000000) { + path->nextin.tv_usec -= 1000000; + path->nextin.tv_sec++; } - } else { - /* This is our first pass. Make sure the timing looks good */ - path->nextin.tv_sec = f->delivery.tv_sec; - path->nextin.tv_usec = f->delivery.tv_usec; - path->nextout.tv_sec = f->delivery.tv_sec; - path->nextout.tv_usec = f->delivery.tv_usec; - } - /* Predict next incoming sample */ - path->nextin.tv_sec += (f->samples / 8000); - path->nextin.tv_usec += ((f->samples % 8000) * 125); - if (path->nextin.tv_usec >= 1000000) { - path->nextin.tv_usec -= 1000000; - path->nextin.tv_sec++; } if (consume) ast_frfree(f); @@ -189,17 +191,22 @@ struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f, if (p->next) p->next->step->framein(p->next->state, out); else { - /* Use next predicted outgoing timestamp */ - out->delivery.tv_sec = path->nextout.tv_sec; - out->delivery.tv_usec = path->nextout.tv_usec; - - /* Predict next outgoing timestamp from samples in this - frame. */ - path->nextout.tv_sec += (out->samples / 8000); - path->nextout.tv_usec += ((out->samples % 8000) * 125); - if (path->nextout.tv_usec >= 1000000) { - path->nextout.tv_sec++; - path->nextout.tv_usec -= 1000000; + if (f->delivery.tv_sec || f->delivery.tv_usec) { + /* Use next predicted outgoing timestamp */ + out->delivery.tv_sec = path->nextout.tv_sec; + out->delivery.tv_usec = path->nextout.tv_usec; + + /* Predict next outgoing timestamp from samples in this + frame. */ + path->nextout.tv_sec += (out->samples / 8000); + path->nextout.tv_usec += ((out->samples % 8000) * 125); + if (path->nextout.tv_usec >= 1000000) { + path->nextout.tv_sec++; + path->nextout.tv_usec -= 1000000; + } + } else { + out->delivery.tv_sec = 0; + out->delivery.tv_usec = 0; } return out; } -- GitLab