Using high-band noise less aggressively
[opus.git] / libcelt / quant_bands.c
index 30e4bee..ba80fa9 100644 (file)
@@ -74,18 +74,20 @@ static int intra_decision(const celt_word16 *eBands, celt_word16 *oldEBands, int
    {
       for (i=start;i<end;i++)
       {
-         celt_word16 d = SUB16(eBands[i+c*len], oldEBands[i+c*len]);
+         celt_word16 d = SHR16(SUB16(eBands[i+c*len], oldEBands[i+c*len]),2);
          dist = MAC16_16(dist, d,d);
       }
    }
-   return SHR32(dist,2*DB_SHIFT) > 2*C*(end-start);
+   return SHR32(dist,2*DB_SHIFT-4) > 2*C*(end-start);
 }
 
-int *quant_prob_alloc(const CELTMode *m)
+#ifndef STATIC_MODES
+
+celt_int16 *quant_prob_alloc(const CELTMode *m)
 {
    int i;
-   int *prob;
-   prob = celt_alloc(4*m->nbEBands*sizeof(int));
+   celt_int16 *prob;
+   prob = celt_alloc(4*m->nbEBands*sizeof(celt_int16));
    if (prob==NULL)
      return NULL;
    for (i=0;i<m->nbEBands;i++)
@@ -101,14 +103,15 @@ int *quant_prob_alloc(const CELTMode *m)
    return prob;
 }
 
-void quant_prob_free(int *freq)
+void quant_prob_free(const celt_int16 *freq)
 {
-   celt_free(freq);
+   celt_free((celt_int16*)freq);
 }
+#endif
 
 static void quant_coarse_energy_impl(const CELTMode *m, int start, int end,
       const celt_word16 *eBands, celt_word16 *oldEBands, int budget,
-      int *prob, celt_word16 *error, ec_enc *enc, int _C, int LM,
+      const celt_int16 *prob, celt_word16 *error, ec_enc *enc, int _C, int LM,
       int intra, celt_word16 max_decay)
 {
    const int C = CHANNELS(_C);
@@ -151,7 +154,7 @@ static void quant_coarse_energy_impl(const CELTMode *m, int start, int end,
             that have just one bin) */
          if (qi < 0 && x < oldEBands[i+c*m->nbEBands]-max_decay)
          {
-            qi += SHR16(oldEBands[i+c*m->nbEBands]-max_decay-x, DB_SHIFT);
+            qi += (int)SHR16(oldEBands[i+c*m->nbEBands]-max_decay-x, DB_SHIFT);
             if (qi > 0)
                qi = 0;
          }
@@ -179,8 +182,8 @@ static void quant_coarse_energy_impl(const CELTMode *m, int start, int end,
 
 void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
       const celt_word16 *eBands, celt_word16 *oldEBands, int budget,
-      int *prob, celt_word16 *error, ec_enc *enc, int _C, int LM,
-      int nbAvailableBytes, int force_intra, int *delayedIntra)
+      const celt_int16 *prob, celt_word16 *error, ec_enc *enc, int _C, int LM,
+      int nbAvailableBytes, int force_intra, int *delayedIntra, int two_pass)
 {
    const int C = CHANNELS(_C);
    int intra;
@@ -210,11 +213,14 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
    buf_start_state = *(enc->buf);
 
    ALLOC(oldEBands_intra, C*m->nbEBands, celt_word16);
-   ALLOC(error_intra, m->nbEBands, celt_word16);
+   ALLOC(error_intra, C*m->nbEBands, celt_word16);
    CELT_COPY(oldEBands_intra, oldEBands, C*end);
 
-   quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget,
-         prob, error_intra, enc, C, LM, 1, max_decay);
+   if (two_pass || intra)
+   {
+      quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget,
+            prob, error_intra, enc, C, LM, 1, max_decay);
+   }
 
    if (!intra)
    {
@@ -238,7 +244,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
       quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget,
             prob, error, enc, C, LM, 0, max_decay);
 
-      if (ec_enc_tell(enc, 3) > tell_intra)
+      if (two_pass && ec_enc_tell(enc, 3) > tell_intra)
       {
          *enc = enc_intra_state;
          *(enc->buf) = buf_intra_state;
@@ -281,7 +287,7 @@ void quant_fine_energy(const CELTMode *m, int start, int end, celt_ener *eBands,
             q2 = 0;
          ec_enc_bits(enc, q2, fine_quant[i]);
 #ifdef FIXED_POINT
-         offset = SUB16(SHR16(SHL16(q2,DB_SHIFT)+QCONST16(.5,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
+         offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
 #else
          offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f;
 #endif
@@ -322,7 +328,7 @@ void quant_energy_finalise(const CELTMode *m, int start, int end, celt_ener *eBa
    }
 }
 
-void unquant_coarse_energy(const CELTMode *m, int start, int end, celt_ener *eBands, celt_word16 *oldEBands, int intra, int *prob, ec_dec *dec, int _C, int LM)
+void unquant_coarse_energy(const CELTMode *m, int start, int end, celt_ener *eBands, celt_word16 *oldEBands, int intra, const celt_int16 *prob, ec_dec *dec, int _C, int LM)
 {
    int i, c;
    celt_word32 prev[2] = {0, 0};
@@ -371,7 +377,7 @@ void unquant_fine_energy(const CELTMode *m, int start, int end, celt_ener *eBand
          celt_word16 offset;
          q2 = ec_dec_bits(dec, fine_quant[i]);
 #ifdef FIXED_POINT
-         offset = SUB16(SHR16(SHL16(q2,DB_SHIFT)+QCONST16(.5,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
+         offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
 #else
          offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f;
 #endif