summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-02-28 23:39:38 +0000
committerBenny Prijono <bennylp@teluu.com>2008-02-28 23:39:38 +0000
commit71cbdeee4cf6e59c054fa5961c1e682b11583ca6 (patch)
treef20912c4e09d1ca630e73ddd09b4d0cb0d044168 /pjmedia
parent7dee4085a6b72e8c27d3bfe70516b1a694947add (diff)
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
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/src/pjmedia/wsola.c48
1 files changed, 39 insertions, 9 deletions
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);
+ }
}
+
}
}