summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Bright <sean.bright@gmail.com>2018-04-18 14:40:49 -0400
committerSean Bright <sean.bright@gmail.com>2018-04-18 12:43:01 -0600
commit80e69520135a82f3f0dee7eccd27f7dbf3de5ccb (patch)
treebc7c62c918c525ba6070001508baba0ac62e0e88
parent3255a286b34a15d5bdaa93663d8654c0568ab14d (diff)
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
-rw-r--r--formats/format_pcm.c41
1 files 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,
};