From 71cbdeee4cf6e59c054fa5961c1e682b11583ca6 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 28 Feb 2008 23:39:38 +0000 Subject: Fixed bug in wsola when discarding frame in non-contiguous buffer git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1829 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/wsola.c | 48 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia/wsola.c b/pjmedia/src/pjmedia/wsola.c index 4a35137a..b0be6aba 100644 --- a/pjmedia/src/pjmedia/wsola.c +++ b/pjmedia/src/pjmedia/wsola.c @@ -589,10 +589,19 @@ PJ_DEF(pj_status_t) pjmedia_wsola_discard( pjmedia_wsola *wsola, } else { unsigned buf_cnt = buf1_cnt + buf2_cnt; - unsigned max; + short *rem; /* remainder */ + unsigned rem_cnt; - if (buf_cnt > ERASE_CNT * wsola->samples_per_frame) + if (buf_cnt > ERASE_CNT * wsola->samples_per_frame) { buf_cnt = ERASE_CNT * wsola->samples_per_frame; + + rem_cnt = buf1_cnt + buf2_cnt - buf_cnt; + rem = buf2 + buf2_cnt - rem_cnt; + + } else { + rem = NULL; + rem_cnt = 0; + } pjmedia_copy_samples(wsola->erasebuf, buf1, buf1_cnt); pjmedia_copy_samples(wsola->erasebuf+buf1_cnt, buf2, @@ -602,14 +611,35 @@ PJ_DEF(pj_status_t) pjmedia_wsola_discard( pjmedia_wsola *wsola, buf_cnt -= (*del_cnt); - max = buf_cnt; - if (max > buf1_cnt) - max = buf1_cnt; - pjmedia_copy_samples(buf1, wsola->erasebuf, max); - - if (max < buf_cnt) { - pjmedia_copy_samples(buf2, wsola->erasebuf+max, buf_cnt-max); + /* Copy back to buffers */ + if (buf_cnt == buf1_cnt) { + pjmedia_copy_samples(buf1, wsola->erasebuf, buf_cnt); + if (rem_cnt) { + pjmedia_move_samples(buf2, rem, rem_cnt); + } + } else if (buf_cnt < buf1_cnt) { + pjmedia_copy_samples(buf1, wsola->erasebuf, buf_cnt); + if (rem_cnt) { + unsigned c = rem_cnt; + if (c > buf1_cnt-buf_cnt) { + c = buf1_cnt-buf_cnt; + } + pjmedia_copy_samples(buf1+buf_cnt, rem, c); + rem += c; + rem_cnt -= c; + if (rem_cnt) + pjmedia_move_samples(buf2, rem, rem_cnt); + } + } else { + pjmedia_copy_samples(buf1, wsola->erasebuf, buf1_cnt); + pjmedia_copy_samples(buf2, wsola->erasebuf+buf1_cnt, + buf_cnt-buf1_cnt); + if (rem_cnt) { + pjmedia_move_samples(buf2+buf_cnt-buf1_cnt, rem, + rem_cnt); + } } + } } -- cgit v1.2.3