Some minor (non-bitstream-affecting) changes to help us have better test vectors
[opus.git] / celt / bands.c
index f89a94e..666863f 100644 (file)
@@ -68,7 +68,7 @@ static int bitexact_log2tan(int isin,int icos)
    ls=EC_ILOG(isin);
    icos<<=15-lc;
    isin<<=15-ls;
-   return ((ls-lc)<<11)
+   return (ls-lc)*(1<<11)
          +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932)
          -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932);
 }
@@ -403,6 +403,8 @@ int spreading_decision(const CELTMode *m, celt_norm *X, int *average,
    int decision;
    int hf_sum=0;
 
+   celt_assert(end>0);
+
    N0 = M*m->shortMdctSize;
 
    if (M*(eBands[end]-eBands[end-1]) <= 8)
@@ -457,6 +459,7 @@ int spreading_decision(const CELTMode *m, celt_norm *X, int *average,
          *tapset_decision=0;
    }
    /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/
+   celt_assert(nbBands>0); /*M*(eBands[end]-eBands[end-1]) <= 8 assures this*/
    sum /= nbBands;
    /* Recursive averaging */
    sum = (sum+*average)>>1;
@@ -545,6 +548,7 @@ static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard
    SAVE_STACK;
    N = N0*stride;
    ALLOC(tmp, N, celt_norm);
+   celt_assert(stride>0);
    if (hadamard)
    {
       const int *ordery = ordery_table+stride-2;
@@ -751,16 +755,13 @@ static unsigned quant_band(int encode, const CELTMode *m, int i, celt_norm *X, c
    cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i];
    if (!stereo && LM != -1 && b > cache[cache[0]]+12 && N>2)
    {
-      if (LM>0 || (N&1)==0)
-      {
-         N >>= 1;
-         Y = X+N;
-         split = 1;
-         LM -= 1;
-         if (B==1)
-            fill = (fill&1)|(fill<<1);
-         B = (B+1)>>1;
-      }
+      N >>= 1;
+      Y = X+N;
+      split = 1;
+      LM -= 1;
+      if (B==1)
+         fill = (fill&1)|(fill<<1);
+      B = (B+1)>>1;
    }
 
    if (split)
@@ -775,7 +776,7 @@ static unsigned quant_band(int encode, const CELTMode *m, int i, celt_norm *X, c
       opus_int32 tell;
 
       /* Decide on the resolution to give to the split parameter theta */
-      pulse_cap = m->logN[i]+(LM<<BITRES);
+      pulse_cap = m->logN[i]+LM*(1<<BITRES);
       offset = (pulse_cap>>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET);
       qn = compute_qn(N, b, offset, pulse_cap, stereo);
       if (stereo && i>=intensity)