aboutsummaryrefslogtreecommitdiffstats
path: root/frame.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-03-13 03:52:14 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-03-13 03:52:14 +0000
commit5d2aed2d6d40f577334e5df9fcfc7277a5495787 (patch)
treec30d90fcd24175084edb8bc6c193b0d727af14e0 /frame.c
parent894a6228fe7ecc38bcc2f4cbe349b965f29421a4 (diff)
Move timestamp around in RTP.... Gotta do iax2 eventually here...
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2413 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'frame.c')
-rwxr-xr-xframe.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/frame.c b/frame.c
index 3c5fe8caf..9b2c55916 100755
--- a/frame.c
+++ b/frame.c
@@ -40,6 +40,7 @@ struct ast_smoother {
int optimizablestream;
float samplesperbyte;
struct ast_frame f;
+ struct timeval delivery;
char data[SMOOTHER_SIZE];
char framedata[SMOOTHER_SIZE + AST_FRIENDLY_OFFSET];
struct ast_frame *opt;
@@ -103,6 +104,9 @@ int ast_smoother_feed(struct ast_smoother *s, struct ast_frame *f)
} else
s->optimizablestream = 0;
memcpy(s->data + s->len, f->data, f->datalen);
+ /* If we're empty, reset delivery time */
+ if (!s->len)
+ s->delivery = f->delivery;
s->len += f->datalen;
return 0;
}
@@ -129,12 +133,20 @@ struct ast_frame *ast_smoother_read(struct ast_smoother *s)
s->f.offset = AST_FRIENDLY_OFFSET;
s->f.datalen = s->size;
s->f.samples = s->size * s->samplesperbyte;
+ s->f.delivery = s->delivery;
/* Fill Data */
memcpy(s->f.data, s->data, s->size);
s->len -= s->size;
/* Move remaining data to the front if applicable */
- if (s->len)
+ if (s->len) {
memmove(s->data, s->data + s->size, s->len);
+ s->delivery.tv_sec += (s->size * s->samplesperbyte) / 8000.0;
+ s->delivery.tv_usec += (((int)(s->size * s->samplesperbyte)) % 8000) * 125;
+ if (s->delivery.tv_usec > 1000000) {
+ s->delivery.tv_usec -= 1000000;
+ s->delivery.tv_sec += 1;
+ }
+ }
/* Return frame */
return &s->f;
}
@@ -257,6 +269,7 @@ struct ast_frame *ast_frdup(struct ast_frame *f)
out->subclass = f->subclass;
out->datalen = f->datalen;
out->samples = f->samples;
+ out->delivery = f->delivery;
out->mallocd = AST_MALLOCD_HDR;
out->offset = AST_FRIENDLY_OFFSET;
out->data = buf + sizeof(struct ast_frame) + AST_FRIENDLY_OFFSET;