fixed-point: unquant_energy_mono() has received the fixed-point code from
[opus.git] / libcelt / cwrs.c
index 3ec3b84..5d72707 100644 (file)
@@ -1,4 +1,5 @@
-/* (C) 2007 Timothy B. Terriberry */
+/* (C) 2007 Timothy B. Terriberry
+   (C) 2008 Jean-Marc Valin */
 /*
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
+
+/* Functions for encoding and decoding pulse vectors. For more details, see:
+   http://people.xiph.org/~tterribe/notes/cwrs.html
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <stdlib.h>
 #include "cwrs.h"
 
 /* Knowing ncwrs() for a fixed number of pulses m and for all vector sizes n,
    compute ncwrs() for m+1, for all n. Could also be used when m and n are
    swapped just by changing nc */
-static celt_uint32_t next_ncwrs32(celt_uint32_t *nc, int len, int nc0)
+static void next_ncwrs32(celt_uint32_t *nc, int len, int nc0)
 {
    int i;
    celt_uint32_t mem;
@@ -51,7 +61,7 @@ static celt_uint32_t next_ncwrs32(celt_uint32_t *nc, int len, int nc0)
 /* Knowing ncwrs() for a fixed number of pulses m and for all vector sizes n,
    compute ncwrs() for m-1, for all n. Could also be used when m and n are
    swapped just by changing nc */
-static celt_uint32_t prev_ncwrs32(celt_uint32_t *nc, int len, int nc0)
+static void prev_ncwrs32(celt_uint32_t *nc, int len, int nc0)
 {
    int i;
    celt_uint32_t mem;
@@ -66,7 +76,7 @@ static celt_uint32_t prev_ncwrs32(celt_uint32_t *nc, int len, int nc0)
    }
 }
 
-static celt_uint64_t next_ncwrs64(celt_uint64_t *nc, int len, int nc0)
+static void next_ncwrs64(celt_uint64_t *nc, int len, int nc0)
 {
    int i;
    celt_uint64_t mem;
@@ -81,7 +91,7 @@ static celt_uint64_t next_ncwrs64(celt_uint64_t *nc, int len, int nc0)
    }
 }
 
-static celt_uint64_t prev_ncwrs64(celt_uint64_t *nc, int len, int nc0)
+static void prev_ncwrs64(celt_uint64_t *nc, int len, int nc0)
 {
    int i;
    celt_uint64_t mem;
@@ -101,8 +111,8 @@ static celt_uint64_t prev_ncwrs64(celt_uint64_t *nc, int len, int nc0)
 celt_uint32_t ncwrs(int _n,int _m)
 {
    int i;
-   celt_uint32_t ret;
-   celt_uint32_t nc[_n+1];
+   VARDECL(celt_uint32_t *nc);
+   ALLOC(nc,_n+1, celt_uint32_t);
    for (i=0;i<_n+1;i++)
       nc[i] = 1;
    for (i=0;i<_m;i++)
@@ -115,8 +125,8 @@ celt_uint32_t ncwrs(int _n,int _m)
 celt_uint64_t ncwrs64(int _n,int _m)
 {
    int i;
-   celt_uint64_t ret;
-   celt_uint64_t nc[_n+1];
+   VARDECL(celt_uint64_t *nc);
+   ALLOC(nc,_n+1, celt_uint64_t);
    for (i=0;i<_n+1;i++)
       nc[i] = 1;
    for (i=0;i<_m;i++)
@@ -132,7 +142,8 @@ celt_uint64_t ncwrs64(int _n,int _m)
 void cwrsi(int _n,int _m,celt_uint32_t _i,int *_x,int *_s){
   int j;
   int k;
-  celt_uint32_t nc[_n+1];
+  VARDECL(celt_uint32_t *nc);
+  ALLOC(nc,_n+1, celt_uint32_t);
   for (j=0;j<_n+1;j++)
     nc[j] = 1;
   for (k=0;k<_m-1;k++)
@@ -175,7 +186,8 @@ celt_uint32_t icwrs(int _n,int _m,const int *_x,const int *_s, celt_uint32_t *bo
   celt_uint32_t i;
   int      j;
   int      k;
-  celt_uint32_t nc[_n+1];
+  VARDECL(celt_uint32_t *nc);
+  ALLOC(nc,_n+1, celt_uint32_t);
   for (j=0;j<_n+1;j++)
     nc[j] = 1;
   for (k=0;k<_m;k++)
@@ -216,7 +228,8 @@ celt_uint32_t icwrs(int _n,int _m,const int *_x,const int *_s, celt_uint32_t *bo
 void cwrsi64(int _n,int _m,celt_uint64_t _i,int *_x,int *_s){
   int j;
   int k;
-  celt_uint64_t nc[_n+1];
+  VARDECL(celt_uint64_t *nc);
+  ALLOC(nc,_n+1, celt_uint64_t);
   for (j=0;j<_n+1;j++)
     nc[j] = 1;
   for (k=0;k<_m-1;k++)
@@ -259,7 +272,8 @@ celt_uint64_t icwrs64(int _n,int _m,const int *_x,const int *_s, celt_uint64_t *
   celt_uint64_t i;
   int           j;
   int           k;
-  celt_uint64_t nc[_n+1];
+  VARDECL(celt_uint64_t *nc);
+  ALLOC(nc,_n+1, celt_uint64_t);
   for (j=0;j<_n+1;j++)
     nc[j] = 1;
   for (k=0;k<_m;k++)
@@ -334,8 +348,12 @@ void pulse2comb(int _n,int _m,int *_x,int *_s,const int *_y){
 
 void encode_pulses(int *_y, int N, int K, ec_enc *enc)
 {
-   int comb[K];
-   int signs[K];
+   VARDECL(int *comb);
+   VARDECL(int *signs);
+   
+   ALLOC(comb, K, int);
+   ALLOC(signs, K, int);
+   
    pulse2comb(N, K, comb, signs, _y);
    /* Go with 32-bit path if we're sure we can */
    if (N<=13 && K<=13)
@@ -352,8 +370,11 @@ void encode_pulses(int *_y, int N, int K, ec_enc *enc)
 
 void decode_pulses(int *_y, int N, int K, ec_dec *dec)
 {
-   int comb[K];
-   int signs[K];   
+   VARDECL(int *comb);
+   VARDECL(int *signs);
+   
+   ALLOC(comb, K, int);
+   ALLOC(signs, K, int);
    if (N<=13 && K<=13)
    {
       cwrsi(N, K, ec_dec_uint(dec, ncwrs(N, K)), comb, signs);