From 80e69520135a82f3f0dee7eccd27f7dbf3de5ccb Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Wed, 18 Apr 2018 14:40:49 -0400 Subject: format_pcm: Correct behavior of fseek and ftell for G.722 There are twice as many samples in the same number of bytes, so redefine some of the G.722 format functions in terms of their PCM counterparts. Change-Id: I6a8c7352624b930a5f2d9e4857f75283fa5dd9f9 --- formats/format_pcm.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/formats/format_pcm.c b/formats/format_pcm.c index 35612c964..4e846d7cf 100644 --- a/formats/format_pcm.c +++ b/formats/format_pcm.c @@ -91,10 +91,7 @@ static struct ast_frame *pcm_read(struct ast_filestream *s, int *whennext) return NULL; } s->fr.datalen = res; - if (ast_format_cmp(s->fmt->format, ast_format_g722) == AST_FORMAT_CMP_EQUAL) - *whennext = s->fr.samples = res * 2; - else - *whennext = s->fr.samples = res; + *whennext = s->fr.samples = res; return &s->fr; } @@ -410,16 +407,11 @@ static int au_rewrite(struct ast_filestream *s, const char *comment) static int au_seek(struct ast_filestream *fs, off_t sample_offset, int whence) { off_t min, max, cur; - long offset = 0, bytes; + long offset = 0; struct au_desc *desc = fs->_private; min = desc->hdr_size; - if (ast_format_cmp(fs->fmt->format, ast_format_g722) == AST_FORMAT_CMP_EQUAL) - bytes = sample_offset / 2; - else - bytes = sample_offset; - if ((cur = ftello(fs->f)) < 0) { ast_log(AST_LOG_WARNING, "Unable to determine current position in au filestream %p: %s\n", fs, strerror(errno)); return -1; @@ -436,11 +428,11 @@ static int au_seek(struct ast_filestream *fs, off_t sample_offset, int whence) } if (whence == SEEK_SET) - offset = bytes + min; + offset = sample_offset + min; else if (whence == SEEK_CUR || whence == SEEK_FORCECUR) - offset = bytes + cur; + offset = sample_offset + cur; else if (whence == SEEK_END) - offset = max - bytes; + offset = max - sample_offset; if (whence != SEEK_FORCECUR) { offset = (offset > max) ? max : offset; @@ -479,6 +471,23 @@ static off_t au_tell(struct ast_filestream *fs) return offset - desc->hdr_size; } +static struct ast_frame *g722_read(struct ast_filestream *s, int *whennext) +{ + struct ast_frame *f = pcm_read(s, whennext); + *whennext = s->fr.samples = (*whennext * 2); + return f; +} + +static int g722_seek(struct ast_filestream *fs, off_t sample_offset, int whence) +{ + return pcm_seek(fs, sample_offset / 2, whence); +} + +static off_t g722_tell(struct ast_filestream *fs) +{ + return pcm_tell(fs) * 2; +} + static struct ast_format_def alaw_f = { .name = "alaw", .exts = "alaw|al|alw", @@ -510,10 +519,10 @@ static struct ast_format_def g722_f = { .name = "g722", .exts = "g722", .write = pcm_write, - .seek = pcm_seek, + .seek = g722_seek, .trunc = pcm_trunc, - .tell = pcm_tell, - .read = pcm_read, + .tell = g722_tell, + .read = g722_read, .buf_size = (BUF_SIZE * 2) + AST_FRIENDLY_OFFSET, }; -- cgit v1.2.3