[Asterisk-code-review] format pcm: Correct behavior of fseek and ftell for G.722 (asterisk[13])

Sean Bright asteriskteam at digium.com
Wed Apr 18 13:42:16 CDT 2018


Sean Bright has uploaded this change for review. ( https://gerrit.asterisk.org/8815


Change subject: format_pcm: Correct behavior of fseek and ftell for G.722
......................................................................

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
---
M formats/format_pcm.c
1 file changed, 25 insertions(+), 16 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/15/8815/1

diff --git a/formats/format_pcm.c b/formats/format_pcm.c
index 8710370..e4021b2 100644
--- a/formats/format_pcm.c
+++ b/formats/format_pcm.c
@@ -93,10 +93,7 @@
 		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;
 }
 
@@ -412,15 +409,10 @@
 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));
@@ -438,11 +430,11 @@
 	}
 
 	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;
@@ -481,6 +473,23 @@
 	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",
@@ -512,10 +521,10 @@
 	.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,
 };
 

-- 
To view, visit https://gerrit.asterisk.org/8815
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a8c7352624b930a5f2d9e4857f75283fa5dd9f9
Gerrit-Change-Number: 8815
Gerrit-PatchSet: 1
Gerrit-Owner: Sean Bright <sean.bright at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20180418/a214384a/attachment.html>


More information about the asterisk-code-review mailing list