shithub: opus

Download patch

ref: 06a651547f4a197c29b6abc23b530833855ee358
parent: adcb7bc21d0afa79c1975030b29dfeef76651839
author: Niclas Olmenius <niclas@voysys.se>
date: Wed Feb 19 08:58:35 EST 2020

Fix celt decoder assertion when using OPUS_CUSTOM

When using OPUS_CUSTOM, `CELTDecoder->end` can be larger than 21.
Assert against 25 instead in OPUS_CUSTOM builds.

Signed-off-by: Jean-Marc Valin <jmvalin@jmvalin.ca>

--- a/celt/celt_decoder.c
+++ b/celt/celt_decoder.c
@@ -117,6 +117,13 @@
 #ifndef CUSTOM_MODES
    celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL));
    celt_assert(st->overlap == 120);
+   celt_assert(st->end <= 21);
+#else
+/* From Section 4.3 in the spec: "The normal CELT layer uses 21 of those bands,
+   though Opus Custom (see Section 6.2) may use a different number of bands"
+
+   Check if it's within the maximum number of Bark frequency bands instead */
+   celt_assert(st->end <= 25);
 #endif
    celt_assert(st->channels == 1 || st->channels == 2);
    celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
@@ -123,7 +130,6 @@
    celt_assert(st->downsample > 0);
    celt_assert(st->start == 0 || st->start == 17);
    celt_assert(st->start < st->end);
-   celt_assert(st->end <= 21);
 #ifdef OPUS_ARCHMASK
    celt_assert(st->arch >= 0);
    celt_assert(st->arch <= OPUS_ARCHMASK);