aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsruffell <sruffell@f38db490-d61c-443f-a65b-d21fe96a405b>2010-11-05 00:06:02 +0000
committersruffell <sruffell@f38db490-d61c-443f-a65b-d21fe96a405b>2010-11-05 00:06:02 +0000
commitabc4f2fe3cbcb14812e099c4a0c04f64decd83d4 (patch)
tree2dbf21823605cc879dde25696d71b9ccc41983b8
parent99ddbd0dea53397a2cfb59804ca75ed2c62845ea (diff)
Merged revisions 293968 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r293968 | sruffell | 2010-11-04 19:02:53 -0500 (Thu, 04 Nov 2010) | 17 lines codecs/codec_dahdi: Prevent "choppy" audio when receiving unexpected frame sizes. dahdi-linux 2.4.0 (specifically commit 9034) added the capability for the wctc4xxp to return more than a single packet of data in response to a read. However, when decoding packets, codec_dahdi was still assuming that the default number of samples was in each read. In other words, each packet your provider sent you, regardless of size, would result in 20 ms of decoded data (30 ms if decoding G723). If your provider was sending 60 ms packets then codec_dahdi would end up stripping 40 ms of data from each transcoded frame resulting in "choppy" audio. This would only affect systems where G729 packets are arriving in sizes greater than 20ms or G723 packets arriving in sizes greater than 30ms. DAHDI-744. ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.2@293969 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--codecs/codec_dahdi.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/codecs/codec_dahdi.c b/codecs/codec_dahdi.c
index efdf83cbf..4716bf289 100644
--- a/codecs/codec_dahdi.c
+++ b/codecs/codec_dahdi.c
@@ -92,10 +92,10 @@ struct codec_dahdi_pvt {
};
/* Only used by a decoder */
-static int ulawtolin(struct ast_trans_pvt *pvt)
+static int ulawtolin(struct ast_trans_pvt *pvt, int samples)
{
struct codec_dahdi_pvt *dahdip = pvt->pvt;
- int i = dahdip->required_samples;
+ int i = samples;
uint8_t *src = &dahdip->ulaw_buffer[0];
int16_t *dst = pvt->outbuf.i16 + pvt->datalen;
@@ -334,7 +334,7 @@ static struct ast_frame *dahdi_decoder_frameout(struct ast_trans_pvt *pvt)
}
} else {
if (dahdip->softslin) {
- ulawtolin(pvt);
+ ulawtolin(pvt, res);
pvt->f.datalen = res * 2;
} else {
pvt->f.datalen = res;
@@ -346,7 +346,7 @@ static struct ast_frame *dahdi_decoder_frameout(struct ast_trans_pvt *pvt)
pvt->f.offset = AST_FRIENDLY_OFFSET;
pvt->f.src = pvt->t->name;
pvt->f.data.ptr = pvt->outbuf.c;
- pvt->f.samples = dahdip->required_samples;
+ pvt->f.samples = res;
ast_set_flag(&pvt->f, AST_FRFLAG_FROM_TRANSLATOR);
pvt->samples = 0;