Improves CELT bit allocation at very low bitrates v1.2-alpha
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Wed, 2 Nov 2016 21:59:32 +0000 (17:59 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Wed, 2 Nov 2016 22:01:14 +0000 (18:01 -0400)
We now try not to fold below band 17 since that produces a lot of harshness.
This mostly helps around 32-40 kb/s.

celt/rate.c

index 7dfa5be..ca4cc87 100644 (file)
@@ -348,12 +348,17 @@ static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end,
             /*This if() block is the only part of the allocation function that
                is not a mandatory part of the bitstream: any bands we choose to
                skip here must be explicitly signaled.*/
-            /*Choose a threshold with some hysteresis to keep bands from
-               fluctuating in and out.*/
+            int depth_threshold;
+            /*We choose a threshold with some hysteresis to keep bands from
+               fluctuating in and out, but we try not to fold below a certain point. */
+            if (codedBands > 17)
+               depth_threshold = j<prev ? 7 : 9;
+            else
+               depth_threshold = 0;
 #ifdef FUZZING
             if ((rand()&0x1) == 0)
 #else
-            if (codedBands<=start+2 || (band_bits > ((j<prev?7:9)*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth))
+            if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth))
 #endif
             {
                ec_enc_bit_logp(ec, 1, 1);