|
@@ -430,14 +430,20 @@ static decode_state helixaac_decode(void) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // we always have at least WRAPBUF_LEN unless it's the end of a stream
|
|
|
+ // we always have at least WRAPBUF_LEN unless it's the end of a stream
|
|
|
+ /* There is a bug in helixaac where it overflows its buffer when not having
|
|
|
+ * samples and enters an infinite loop so we can't do here the proper test
|
|
|
+ * if (bytes_wrap < WRAPBUF_LEN && bytes_wrap != bytes_total)
|
|
|
+ * but instead we'll zero the wrap buf and provide a safe overflow space
|
|
|
+ * for the decoder
|
|
|
+ */
|
|
|
if (bytes_wrap < WRAPBUF_LEN) {
|
|
|
// build a linear buffer if we are crossing the end of streambuf
|
|
|
memcpy(a->wrap_buf, streambuf->readp, bytes_wrap);
|
|
|
- memcpy(a->wrap_buf + bytes_wrap, streambuf->buf, min(WRAPBUF_LEN, bytes_total) - bytes_wrap);
|
|
|
-
|
|
|
+ memcpy(a->wrap_buf + bytes_wrap, streambuf->buf, min(WRAPBUF_LEN, bytes_total) - bytes_wrap);
|
|
|
sptr = a->wrap_buf;
|
|
|
- bytes = bytes_wrap = min(WRAPBUF_LEN, bytes_total);
|
|
|
+ if (bytes_total < WRAPBUF_LEN) memset(a->wrap_buf + bytes_total, 0, WRAPBUF_LEN - bytes_total);
|
|
|
+ else bytes = bytes_wrap = min(WRAPBUF_LEN, bytes_total);
|
|
|
} else {
|
|
|
sptr = streambuf->readp;
|
|
|
bytes = bytes_wrap;
|