aboutsummaryrefslogtreecommitdiffstats
path: root/frame.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-04-22 03:02:27 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-04-22 03:02:27 +0000
commita1862b9cd7fdceb4e1f0a4651c4d99fa1fe60c52 (patch)
treed1ed439eeecab87ea36178c651d5db81c0597ab9 /frame.c
parentf34a4547ee9ba82397ebb5945f4c1de31d39cc8d (diff)
Handle transitions in delivery time and non-delivery time
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2739 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'frame.c')
-rwxr-xr-xframe.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/frame.c b/frame.c
index 68b2c33c9..3fa8ff5d6 100755
--- a/frame.c
+++ b/frame.c
@@ -122,8 +122,9 @@ int ast_smoother_feed(struct ast_smoother *s, struct ast_frame *f)
}
}
memcpy(s->data + s->len, f->data, f->datalen);
- /* If we're empty, reset delivery time */
- if (!s->len)
+ /* If either side is empty, reset the delivery time */
+ if (!s->len || (!f->delivery.tv_sec && !f->delivery.tv_usec) ||
+ (!s->delivery.tv_sec && !s->delivery.tv_usec))
s->delivery = f->delivery;
s->len += f->datalen;
return 0;
@@ -166,11 +167,14 @@ struct ast_frame *ast_smoother_read(struct ast_smoother *s)
/* In principle this should all be fine because if we are sending
G.729 VAD, the next timestamp will take over anyawy */
memmove(s->data, s->data + len, s->len);
- s->delivery.tv_sec += (len * s->samplesperbyte) / 8000.0;
- s->delivery.tv_usec += (((int)(len * s->samplesperbyte)) % 8000) * 125;
- if (s->delivery.tv_usec > 1000000) {
- s->delivery.tv_usec -= 1000000;
- s->delivery.tv_sec += 1;
+ if (s->delivery.tv_sec || s->delivery.tv_usec) {
+ /* If we have delivery time, increment it, otherwise, leave it at 0 */
+ s->delivery.tv_sec += (len * s->samplesperbyte) / 8000.0;
+ s->delivery.tv_usec += (((int)(len * s->samplesperbyte)) % 8000) * 125;
+ if (s->delivery.tv_usec > 1000000) {
+ s->delivery.tv_usec -= 1000000;
+ s->delivery.tv_sec += 1;
+ }
}
}
/* Return frame */