shithub: opus

Download patch

ref: 9d069846eeee8517c2cb97cd6e8e81cb4e34424c
parent: cee66b512e9bea7879e0df047fa47b10f0201511
author: Jean-Marc Valin <[email protected]>
date: Tue May 25 19:54:56 EDT 2010

More recombining "infrastructure"

--- a/libcelt/bands.c
+++ b/libcelt/bands.c
@@ -492,7 +492,7 @@
 
    if (!stereo && spread > 1 && level == 0 && tf_change>0)
    {
-      while (spread>1 && recombine<2)
+      while (spread>1 && tf_change>0)
       {
          spread>>=1;
          N_B<<=1;
@@ -501,6 +501,7 @@
          if (lowband)
             haar1(lowband, N_B, spread);
          recombine++;
+         tf_change--;
       }
       spread0=spread;
       N_B0 = N_B;
@@ -508,22 +509,26 @@
 
    if (!stereo && spread>1 && level==0)
    {
-      if ((N_B&1) == 0 && tf_change<0)
+      while ((N_B&1) == 0 && tf_change<0 && spread <= (1<<LM))
       {
          if (encode)
-            haar1(X, N_B0, spread0);
+            haar1(X, N_B, spread);
          if (lowband)
-            haar1(lowband, N_B0, spread0);
+            haar1(lowband, N_B, spread);
          spread <<= 1;
          N_B >>= 1;
          time_divide++;
-         spread0 = spread;
-         N_B0 = N_B;
+         tf_change++;
       }
-      if (encode)
-         deinterleave_vector(X, N_B, spread0);
-      if (lowband)
-         deinterleave_vector(lowband, N_B, spread0);
+      spread0 = spread;
+      N_B0 = N_B;
+      if (spread0>1)
+      {
+         if (encode)
+            deinterleave_vector(X, N_B, spread0);
+         if (lowband)
+            deinterleave_vector(lowband, N_B, spread0);
+      }
    }
 
    /* If we need more than 32 bits, try splitting the band in two. */