From 64209a3edf1b9d00f26775bc54b62ae3de5f4113 Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date: Mon, 5 Apr 2010 09:26:22 -0400
Subject: [PATCH] A few minor optimisations (compute_allocation,
 denormalise_bands, deemphasis)

---
 libcelt/bands.c | 17 ++++++++++++-----
 libcelt/celt.c  | 18 ++++++++++++------
 libcelt/rate.c  |  2 +-
 3 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/libcelt/bands.c b/libcelt/bands.c
index 362879800..ff503ec8f 100644
--- a/libcelt/bands.c
+++ b/libcelt/bands.c
@@ -200,16 +200,23 @@ void denormalise_bands(const CELTMode *m, const celt_norm * restrict X, celt_sig
       celt_fatal("denormalise_bands() not implemented for >2 channels");
    for (c=0;c<C;c++)
    {
+      celt_sig * restrict f;
+      const celt_norm * restrict x;
+      f = freq+c*N;
+      x = X+c*N;
       for (i=0;i<m->nbEBands;i++)
       {
-         int j;
+         int j, end;
          celt_word32 g = SHR32(bank[i+c*m->nbEBands],1);
-         j=eBands[i]; do {
-            freq[j+c*N] = SHL32(MULT16_32_Q15(X[j+c*N], g),2);
-         } while (++j<eBands[i+1]);
+         j=eBands[i];
+         end = eBands[i+1];
+         do {
+            *f++ = SHL32(MULT16_32_Q15(*x, g),2);
+            x++;
+         } while (++j<end);
       }
       for (i=eBands[m->nbEBands];i<eBands[m->nbEBands+1];i++)
-         freq[i+c*N] = 0;
+         *f++ = 0;
    }
 }
 
diff --git a/libcelt/celt.c b/libcelt/celt.c
index eeb341856..01ac8da8b 100644
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -491,22 +491,28 @@ static void decode_flags(ec_dec *dec, int *intra_ener, int *has_pitch, int *shor
    /*printf ("dec %d: %d %d %d %d\n", flag_bits, *intra_ener, *has_pitch, *shortBlocks, *has_fold);*/
 }
 
-static void deemphasis(celt_sig *in, celt_word16 *pcm, int N, int _C, celt_word16 coef, celt_sig *mem)
+void deemphasis(celt_sig *in, celt_word16 *pcm, int N, int _C, celt_word16 coef, celt_sig *mem)
 {
    const int C = CHANNELS(_C);
    int c;
    for (c=0;c<C;c++)
    {
       int j;
+      celt_sig * restrict x;
+      celt_word16  * restrict y;
+      celt_sig m = mem[c];
+      x = &in[C*(MAX_PERIOD-N)+c];
+      y = pcm+c;
       for (j=0;j<N;j++)
       {
-         celt_sig tmp = MAC16_32_Q15(in[C*(MAX_PERIOD-N)+C*j+c],
-                                       coef,mem[c]);
-         mem[c] = tmp;
-         pcm[C*j+c] = SCALEOUT(SIG2WORD16(tmp));
+         celt_sig tmp = MAC16_32_Q15(*x, coef,m);
+         m = tmp;
+         *y = SCALEOUT(SIG2WORD16(tmp));
+         x+=C;
+         y+=C;
       }
+      mem[c] = m;
    }
-
 }
 
 static void mdct_shape(const CELTMode *mode, celt_norm *X, int start, int end, int N, int nbShortMdcts, int mdct_weight_shift, int _C)
diff --git a/libcelt/rate.c b/libcelt/rate.c
index 6b41109a0..2ae1ebccb 100644
--- a/libcelt/rate.c
+++ b/libcelt/rate.c
@@ -102,7 +102,7 @@ celt_int16 **compute_alloc_cache(CELTMode *m, int C)
 
 
 
-static void interp_bits2pulses(const CELTMode *m, int start, int *bits1, int *bits2, int total, int *bits, int *ebits, int *fine_priority, int len, int _C)
+static inline void interp_bits2pulses(const CELTMode *m, int start, int *bits1, int *bits2, int total, int *bits, int *ebits, int *fine_priority, int len, int _C)
 {
    int psum;
    int lo, hi;
-- 
GitLab