1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Copyright (c) 2007-2008 CSIRO
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Copyright (c) 2007-2009 Xiph.Org Foundation
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Copyright (c) 2007-2009 Timothy B. Terriberry
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Written by Timothy B. Terriberry and Jean-Marc Valin */
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   modification, are permitted provided that the following conditions
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   are met:
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org*/
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h"
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "os_support.h"
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "cwrs.h"
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "mathops.h"
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "arch.h"
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef CUSTOM_MODES
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Guaranteed to return a conservatively large estimate of the binary logarithm
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   with frac bits of fractional precision.
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  Tested for all possible 32-bit inputs with frac=4, where the maximum
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   overestimation is 0.06254243 bits.*/
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint log2_frac(opus_uint32 val, int frac)
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  int l;
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  l=EC_ILOG(val);
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  if(val&(val-1)){
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /*This is (val>>l-16), but guaranteed to round up, even if adding a bias
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org       before the shift would cause overflow (e.g., for 0xFFFFxxxx).
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org       Doesn't work for val=0, but that case fails the test above.*/
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    if(l>16)val=((val-1)>>(l-16))+1;
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    else val<<=16-l;
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    l=(l-1)<<frac;
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /*Note that we always need one iteration, since the rounding up above means
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org       that we might need to adjust the integer part of the logarithm.*/
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    do{
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      int b;
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      b=(int)(val>>16);
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      l+=b<<frac;
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      val=(val+b)>>b;
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      val=(val*val+0x7FFF)>>15;
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    }
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    while(frac-->0);
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /*If val is not exactly 0x8000, then we have to round up the remainder.*/
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    return l+(val>0x8000);
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  }
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  /*Exact powers of two require no rounding.*/
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  else return (l-1)<<frac;
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Although derived separately, the pulse vector coding scheme is equivalent to
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   a Pyramid Vector Quantizer \cite{Fis86}.
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  Some additional notes about an early version appear at
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   and the definitions of some terms have evolved since that was written.
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  The conversion from a pulse vector to an integer index (encoding) and back
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   (decoding) is governed by two related functions, V(N,K) and U(N,K).
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  V(N,K) = the number of combinations, with replacement, of N items, taken K
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   at a time, when a sign bit is added to each item taken at least once (i.e.,
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   the number of N-dimensional unit pulse vectors with K pulses).
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  One way to compute this is via
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1,
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   where choose() is the binomial function.
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  A table of values for N<10 and K<10 looks like:
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  V[10][10] = {
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1,  0,   0,    0,    0,     0,     0,      0,      0,       0},
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1,  2,   2,    2,    2,     2,     2,      2,      2,       2},
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1,  4,   8,   12,   16,    20,    24,     28,     32,      36},
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1,  6,  18,   38,   66,   102,   146,    198,    258,     326},
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1,  8,  32,   88,  192,   360,   608,    952,   1408,    1992},
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1, 10,  50,  170,  450,  1002,  1970,   3530,   5890,    9290},
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1, 12,  72,  292,  912,  2364,  5336,  10836,  20256,   35436},
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1, 14,  98,  462, 1666,  4942, 12642,  28814,  59906,  115598},
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1, 16, 128,  688, 2816,  9424, 27008,  68464, 157184,  332688},
100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1, 18, 162,  978, 4482, 16722, 53154, 148626, 374274,  864146}
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  };
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  U(N,K) = the number of such combinations wherein N-1 objects are taken at
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   most K-1 at a time.
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  This is given by
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(N,K) = sum(k=0...K-1,V(N-1,k))
107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org           = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0.
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  The latter expression also makes clear that U(N,K) is half the number of such
109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   combinations wherein the first object is taken at least once.
110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  Although it may not be clear from either of these definitions, U(N,K) is the
111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   natural function to work with when enumerating the pulse vector codebooks,
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   not V(N,K).
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  U(N,K) is not well-defined for N=0, but with the extension
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(0,K) = K>0 ? 0 : 1,
115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   the function becomes symmetric: U(N,K) = U(K,N), with a similar table:
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  U[10][10] = {
117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {1, 0,  0,   0,    0,    0,     0,     0,      0,      0},
118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1,  1,   1,    1,    1,     1,     1,      1,      1},
119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1,  3,   5,    7,    9,    11,    13,     15,     17},
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1,  5,  13,   25,   41,    61,    85,    113,    145},
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1,  7,  25,   63,  129,   231,   377,    575,    833},
122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1,  9,  41,  129,  321,   681,  1289,   2241,   3649},
123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1, 11,  61,  231,  681,  1683,  3653,   7183,  13073},
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1, 13,  85,  377, 1289,  3653,  8989,  19825,  40081},
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1, 15, 113,  575, 2241,  7183, 19825,  48639, 108545},
126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {0, 1, 17, 145,  833, 3649, 13073, 40081, 108545, 265729}
127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  };
128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  With this extension, V(N,K) may be written in terms of U(N,K):
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    V(N,K) = U(N,K) + U(N,K+1)
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for all N>=0, K>=0.
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  Thus U(N,K+1) represents the number of combinations where the first element
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   is positive or zero, and U(N,K) represents the number of combinations where
134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   it is negative.
135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  With a large enough table of U(N,K) values, we could write O(N) encoding
136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   and O(min(N*log(K),N+K)) decoding routines, but such a table would be
137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   prohibitively large for small embedded devices (K may be as large as 32767
138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for small N, and N may be as large as 200).
139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  Both functions obey the same recurrence relation:
141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1),
142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1),
143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for all N>0, K>0, with different initial conditions at N=0 or K=0.
144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  This allows us to construct a row of one of the tables above given the
145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   previous row or the next row.
146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  Thus we can derive O(NK) encoding and decoding routines with O(K) memory
147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   using only addition and subtraction.
148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  When encoding, we build up from the U(2,K) row and work our way forwards.
150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  When decoding, we need to start at the U(N,K) row and work our way backwards,
151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   which requires a means of computing U(N,K).
152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  U(N,K) may be computed from two previous values with the same N:
153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2)
154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for all N>1, and since U(N,K) is symmetric, a similar relation holds for two
155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   previous values with the same K:
156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K)
157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for all K>1.
158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  This allows us to construct an arbitrary row of the U(N,K) table by starting
159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   with the first two values, which are constants.
160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K)
161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   multiplications.
162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  Similar relations can be derived for V(N,K), but are not used here.
163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree
165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   polynomial for fixed N.
166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  The first few are
167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(1,K) = 1,
168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(2,K) = 2*K-1,
169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(3,K) = (2*K-2)*K+1,
170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(4,K) = (((4*K-6)*K+8)*K-3)/3,
171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3,
172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   and
173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    V(1,K) = 2,
174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    V(2,K) = 4*K,
175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    V(3,K) = 4*K*K+2,
176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    V(4,K) = 8*(K*K+2)*K/3,
177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    V(5,K) = ((4*K*K+20)*K*K+6)/3,
178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for all K>0.
179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for
180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   small N (and indeed decoding is also O(N) for N<3).
181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  @ARTICLE{Fis86,
183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    author="Thomas R. Fischer",
184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    title="A Pyramid Vector Quantizer",
185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    journal="IEEE Transactions on Information Theory",
186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    volume="IT-32",
187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    number=4,
188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    pages="568--583",
189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    month=Jul,
190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    year=1986
191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  }*/
192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
193e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if !defined(SMALL_FOOTPRINT)
194e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
195e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/*U(N,K) = U(K,N) := N>0?K>0?U(N-1,K)+U(N,K-1)+U(N-1,K-1):0:K>0?1:0*/
196e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org# define CELT_PVQ_U(_n,_k) (CELT_PVQ_U_ROW[IMIN(_n,_k)][IMAX(_n,_k)])
197e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/*V(N,K) := U(N,K)+U(N,K+1) = the number of PVQ codewords for a band of size N
198e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   with K pulses allocated to it.*/
199e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org# define CELT_PVQ_V(_n,_k) (CELT_PVQ_U(_n,_k)+CELT_PVQ_U(_n,(_k)+1))
200e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
201e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/*For each V(N,K) supported, we will access element U(min(N,K+1),max(N,K+1)).
202e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  Thus, the number of entries in row I is the larger of the maximum number of
203e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   pulses we will ever allocate for a given N=I (K=128, or however many fit in
204e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   32 bits, whichever is smaller), plus one, and the maximum N for which
205e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   K=I-1 pulses fit in 32 bits.
206e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  The largest band size in an Opus Custom mode is 208.
207e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  Otherwise, we can limit things to the set of N which can be achieved by
208e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   splitting a band from a standard Opus mode: 176, 144, 96, 88, 72, 64, 48,
209e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   44, 36, 32, 24, 22, 18, 16, 8, 4, 2).*/
210e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
211e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgstatic const opus_uint32 CELT_PVQ_U_DATA[1488]={
212e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else
213e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgstatic const opus_uint32 CELT_PVQ_U_DATA[1272]={
214e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
215e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=0, K=0...176:*/
216e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
217e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
218e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
219e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
220e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
221e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
222e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
223e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
224e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...208:*/
225e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
226e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  0, 0, 0, 0, 0, 0,
227e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
228e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=1, K=1...176:*/
229e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
230e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
231e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
232e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
233e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
234e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
235e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
236e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
237e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...208:*/
238e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
239e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1, 1, 1, 1, 1, 1,
240e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
241e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=2, K=2...176:*/
242e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41,
243e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79,
244e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113,
245e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143,
246e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173,
247e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203,
248e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233,
249e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263,
250e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293,
251e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 317, 319, 321, 323,
252e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  325, 327, 329, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351,
253e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
254e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...208:*/
255e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381,
256e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411,
257e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  413, 415,
258e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
259e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=3, K=3...176:*/
260e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  13, 25, 41, 61, 85, 113, 145, 181, 221, 265, 313, 365, 421, 481, 545, 613,
261e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  685, 761, 841, 925, 1013, 1105, 1201, 1301, 1405, 1513, 1625, 1741, 1861,
262e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1985, 2113, 2245, 2381, 2521, 2665, 2813, 2965, 3121, 3281, 3445, 3613, 3785,
263e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  3961, 4141, 4325, 4513, 4705, 4901, 5101, 5305, 5513, 5725, 5941, 6161, 6385,
264e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  6613, 6845, 7081, 7321, 7565, 7813, 8065, 8321, 8581, 8845, 9113, 9385, 9661,
265e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  9941, 10225, 10513, 10805, 11101, 11401, 11705, 12013, 12325, 12641, 12961,
266e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  13285, 13613, 13945, 14281, 14621, 14965, 15313, 15665, 16021, 16381, 16745,
267e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  17113, 17485, 17861, 18241, 18625, 19013, 19405, 19801, 20201, 20605, 21013,
268e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  21425, 21841, 22261, 22685, 23113, 23545, 23981, 24421, 24865, 25313, 25765,
269e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  26221, 26681, 27145, 27613, 28085, 28561, 29041, 29525, 30013, 30505, 31001,
270e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  31501, 32005, 32513, 33025, 33541, 34061, 34585, 35113, 35645, 36181, 36721,
271e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  37265, 37813, 38365, 38921, 39481, 40045, 40613, 41185, 41761, 42341, 42925,
272e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  43513, 44105, 44701, 45301, 45905, 46513, 47125, 47741, 48361, 48985, 49613,
273e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  50245, 50881, 51521, 52165, 52813, 53465, 54121, 54781, 55445, 56113, 56785,
274e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  57461, 58141, 58825, 59513, 60205, 60901, 61601,
275e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
276e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...208:*/
277e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  62305, 63013, 63725, 64441, 65161, 65885, 66613, 67345, 68081, 68821, 69565,
278e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  70313, 71065, 71821, 72581, 73345, 74113, 74885, 75661, 76441, 77225, 78013,
279e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  78805, 79601, 80401, 81205, 82013, 82825, 83641, 84461, 85285, 86113,
280e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
281e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=4, K=4...176:*/
282e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  63, 129, 231, 377, 575, 833, 1159, 1561, 2047, 2625, 3303, 4089, 4991, 6017,
283e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  7175, 8473, 9919, 11521, 13287, 15225, 17343, 19649, 22151, 24857, 27775,
284e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  30913, 34279, 37881, 41727, 45825, 50183, 54809, 59711, 64897, 70375, 76153,
285e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  82239, 88641, 95367, 102425, 109823, 117569, 125671, 134137, 142975, 152193,
286e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  161799, 171801, 182207, 193025, 204263, 215929, 228031, 240577, 253575,
287e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  267033, 280959, 295361, 310247, 325625, 341503, 357889, 374791, 392217,
288e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  410175, 428673, 447719, 467321, 487487, 508225, 529543, 551449, 573951,
289e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  597057, 620775, 645113, 670079, 695681, 721927, 748825, 776383, 804609,
290e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  833511, 863097, 893375, 924353, 956039, 988441, 1021567, 1055425, 1090023,
291e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1125369, 1161471, 1198337, 1235975, 1274393, 1313599, 1353601, 1394407,
292e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1436025, 1478463, 1521729, 1565831, 1610777, 1656575, 1703233, 1750759,
293e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1799161, 1848447, 1898625, 1949703, 2001689, 2054591, 2108417, 2163175,
294e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2218873, 2275519, 2333121, 2391687, 2451225, 2511743, 2573249, 2635751,
295e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2699257, 2763775, 2829313, 2895879, 2963481, 3032127, 3101825, 3172583,
296e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  3244409, 3317311, 3391297, 3466375, 3542553, 3619839, 3698241, 3777767,
297e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  3858425, 3940223, 4023169, 4107271, 4192537, 4278975, 4366593, 4455399,
298e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  4545401, 4636607, 4729025, 4822663, 4917529, 5013631, 5110977, 5209575,
299e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  5309433, 5410559, 5512961, 5616647, 5721625, 5827903, 5935489, 6044391,
300e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  6154617, 6266175, 6379073, 6493319, 6608921, 6725887, 6844225, 6963943,
301e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  7085049, 7207551,
302e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
303e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...208:*/
304e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  7331457, 7456775, 7583513, 7711679, 7841281, 7972327, 8104825, 8238783,
305e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  8374209, 8511111, 8649497, 8789375, 8930753, 9073639, 9218041, 9363967,
306e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  9511425, 9660423, 9810969, 9963071, 10116737, 10271975, 10428793, 10587199,
307e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  10747201, 10908807, 11072025, 11236863, 11403329, 11571431, 11741177,
308e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  11912575,
309e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
310e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=5, K=5...176:*/
311e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  321, 681, 1289, 2241, 3649, 5641, 8361, 11969, 16641, 22569, 29961, 39041,
312e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  50049, 63241, 78889, 97281, 118721, 143529, 172041, 204609, 241601, 283401,
313e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  330409, 383041, 441729, 506921, 579081, 658689, 746241, 842249, 947241,
314e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1061761, 1186369, 1321641, 1468169, 1626561, 1797441, 1981449, 2179241,
315e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2391489, 2618881, 2862121, 3121929, 3399041, 3694209, 4008201, 4341801,
316e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  4695809, 5071041, 5468329, 5888521, 6332481, 6801089, 7295241, 7815849,
317e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  8363841, 8940161, 9545769, 10181641, 10848769, 11548161, 12280841, 13047849,
318e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  13850241, 14689089, 15565481, 16480521, 17435329, 18431041, 19468809,
319e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  20549801, 21675201, 22846209, 24064041, 25329929, 26645121, 28010881,
320e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  29428489, 30899241, 32424449, 34005441, 35643561, 37340169, 39096641,
321e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  40914369, 42794761, 44739241, 46749249, 48826241, 50971689, 53187081,
322e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  55473921, 57833729, 60268041, 62778409, 65366401, 68033601, 70781609,
323e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  73612041, 76526529, 79526721, 82614281, 85790889, 89058241, 92418049,
324e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  95872041, 99421961, 103069569, 106816641, 110664969, 114616361, 118672641,
325e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  122835649, 127107241, 131489289, 135983681, 140592321, 145317129, 150160041,
326e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  155123009, 160208001, 165417001, 170752009, 176215041, 181808129, 187533321,
327e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  193392681, 199388289, 205522241, 211796649, 218213641, 224775361, 231483969,
328e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  238341641, 245350569, 252512961, 259831041, 267307049, 274943241, 282741889,
329e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  290705281, 298835721, 307135529, 315607041, 324252609, 333074601, 342075401,
330e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  351257409, 360623041, 370174729, 379914921, 389846081, 399970689, 410291241,
331e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  420810249, 431530241, 442453761, 453583369, 464921641, 476471169, 488234561,
332e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  500214441, 512413449, 524834241, 537479489, 550351881, 563454121, 576788929,
333e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  590359041, 604167209, 618216201, 632508801,
334e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
335e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...208:*/
336e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  647047809, 661836041, 676876329, 692171521, 707724481, 723538089, 739615241,
337e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  755958849, 772571841, 789457161, 806617769, 824056641, 841776769, 859781161,
338e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  878072841, 896654849, 915530241, 934702089, 954173481, 973947521, 994027329,
339e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1014416041, 1035116809, 1056132801, 1077467201, 1099123209, 1121104041,
340e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1143412929, 1166053121, 1189027881, 1212340489, 1235994241,
341e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
342e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=6, K=6...96:*/
343e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1683, 3653, 7183, 13073, 22363, 36365, 56695, 85305, 124515, 177045, 246047,
344e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  335137, 448427, 590557, 766727, 982729, 1244979, 1560549, 1937199, 2383409,
345e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2908411, 3522221, 4235671, 5060441, 6009091, 7095093, 8332863, 9737793,
346e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  11326283, 13115773, 15124775, 17372905, 19880915, 22670725, 25765455,
347e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  29189457, 32968347, 37129037, 41699767, 46710137, 52191139, 58175189,
348e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  64696159, 71789409, 79491819, 87841821, 96879431, 106646281, 117185651,
349e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  128542501, 140763503, 153897073, 167993403, 183104493, 199284183, 216588185,
350e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  235074115, 254801525, 275831935, 298228865, 322057867, 347386557, 374284647,
351e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  402823977, 433078547, 465124549, 499040399, 534906769, 572806619, 612825229,
352e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  655050231, 699571641, 746481891, 795875861, 847850911, 902506913, 959946283,
353e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1020274013, 1083597703, 1150027593, 1219676595, 1292660325, 1369097135,
354e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1449108145, 1532817275, 1620351277, 1711839767, 1807415257, 1907213187,
355e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2011371957, 2120032959,
356e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
357e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...109:*/
358e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2233340609U, 2351442379U, 2474488829U, 2602633639U, 2736033641U, 2874848851U,
359e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  3019242501U, 3169381071U, 3325434321U, 3487575323U, 3655980493U, 3830829623U,
360e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  4012305913U,
361e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
362e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=7, K=7...54*/
363e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  8989, 19825, 40081, 75517, 134245, 227305, 369305, 579125, 880685, 1303777,
364e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1884961, 2668525, 3707509, 5064793, 6814249, 9041957, 11847485, 15345233,
365e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  19665841, 24957661, 31388293, 39146185, 48442297, 59511829, 72616013,
366e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  88043969, 106114625, 127178701, 151620757, 179861305, 212358985, 249612805,
367e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  292164445, 340600625, 395555537, 457713341, 527810725, 606639529, 695049433,
368e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  793950709, 904317037, 1027188385, 1163673953, 1314955181, 1482288821,
369e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1667010073, 1870535785, 2094367717,
370e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
371e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...60:*/
372e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2340095869U, 2609401873U, 2904062449U, 3225952925U, 3577050821U, 3959439497U,
373e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
374e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=8, K=8...37*/
375e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  48639, 108545, 224143, 433905, 795455, 1392065, 2340495, 3800305, 5984767,
376e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  9173505, 13726991, 20103025, 28875327, 40754369, 56610575, 77500017,
377e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  104692735, 139703809, 184327311, 240673265, 311207743, 398796225, 506750351,
378e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  638878193, 799538175, 993696769, 1226990095, 1505789553, 1837271615,
379e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2229491905U,
380e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
381e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...40:*/
382e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2691463695U, 3233240945U, 3866006015U,
383e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
384e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=9, K=9...28:*/
385e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  265729, 598417, 1256465, 2485825, 4673345, 8405905, 14546705, 24331777,
386e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  39490049, 62390545, 96220561, 145198913, 214828609, 312193553, 446304145,
387e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  628496897, 872893441, 1196924561, 1621925137, 2173806145U,
388e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
389e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...29:*/
390e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2883810113U,
391e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
392e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=10, K=10...24:*/
393e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1462563, 3317445, 7059735, 14218905, 27298155, 50250765, 89129247, 152951073,
394e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  254831667, 413442773, 654862247, 1014889769, 1541911931, 2300409629U,
395e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  3375210671U,
396e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=11, K=11...19:*/
397e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  8097453, 18474633, 39753273, 81270333, 158819253, 298199265, 540279585,
398e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  948062325, 1616336765,
399e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
400e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*...20:*/
401e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  2684641785U,
402e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
403e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=12, K=12...18:*/
404e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  45046719, 103274625, 224298231, 464387817, 921406335, 1759885185,
405e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  3248227095U,
406e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=13, K=13...16:*/
407e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  251595969, 579168825, 1267854873, 2653649025U,
408e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*N=14, K=14:*/
409e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  1409933619
410e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org};
411885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
412e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
4133c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic const opus_uint32 *const CELT_PVQ_U_ROW[15]={
414e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+   0,CELT_PVQ_U_DATA+ 208,CELT_PVQ_U_DATA+ 415,
415e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+ 621,CELT_PVQ_U_DATA+ 826,CELT_PVQ_U_DATA+1030,
416e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+1233,CELT_PVQ_U_DATA+1336,CELT_PVQ_U_DATA+1389,
417e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+1421,CELT_PVQ_U_DATA+1441,CELT_PVQ_U_DATA+1455,
418e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+1464,CELT_PVQ_U_DATA+1470,CELT_PVQ_U_DATA+1473
419e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org};
420e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else
4213c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic const opus_uint32 *const CELT_PVQ_U_ROW[15]={
422e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+   0,CELT_PVQ_U_DATA+ 176,CELT_PVQ_U_DATA+ 351,
423e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+ 525,CELT_PVQ_U_DATA+ 698,CELT_PVQ_U_DATA+ 870,
424e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+1041,CELT_PVQ_U_DATA+1131,CELT_PVQ_U_DATA+1178,
425e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+1207,CELT_PVQ_U_DATA+1226,CELT_PVQ_U_DATA+1240,
426e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  CELT_PVQ_U_DATA+1248,CELT_PVQ_U_DATA+1254,CELT_PVQ_U_DATA+1257
427e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org};
428e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
429e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
430e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(CUSTOM_MODES)
431e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){
432e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  int k;
433e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*_maxk==0 => there's nothing to do.*/
434e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  celt_assert(_maxk>0);
435e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  _bits[0]=0;
436e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  for(k=1;k<=_maxk;k++)_bits[k]=log2_frac(CELT_PVQ_V(_n,k),_frac);
437885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
438e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
439885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
440e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgstatic opus_uint32 icwrs(int _n,const int *_y){
441e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  opus_uint32 i;
442e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  int         j;
443e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  int         k;
444e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  celt_assert(_n>=2);
445e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  j=_n-1;
446e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  i=_y[j]<0;
447e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  k=abs(_y[j]);
448e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  do{
449e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    j--;
450e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    i+=CELT_PVQ_U(_n-j,k);
451e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    k+=abs(_y[j]);
452e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    if(_y[j]<0)i+=CELT_PVQ_U(_n-j,k+1);
453e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  }
454e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  while(j>0);
455e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  return i;
456885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
457885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
458e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){
459885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  celt_assert(_k>0);
460e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k));
461885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
462885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
463e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgstatic void cwrsi(int _n,int _k,opus_uint32 _i,int *_y){
464e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  opus_uint32 p;
465e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  int         s;
466e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  int         k0;
467885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  celt_assert(_k>0);
468e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  celt_assert(_n>1);
469e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  while(_n>2){
470e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    opus_uint32 q;
471e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    /*Lots of pulses case:*/
472e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    if(_k>=_n){
473e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      const opus_uint32 *row;
474e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      row=CELT_PVQ_U_ROW[_n];
475e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /*Are the pulses in this dimension negative?*/
476e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      p=row[_k+1];
477e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      s=-(_i>=p);
478e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      _i-=p&s;
479e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /*Count how many pulses were placed in this dimension.*/
480e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      k0=_k;
481e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      q=row[_n];
482e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if(q>_i){
483e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        celt_assert(p>q);
484e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        _k=_n;
485e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        do p=CELT_PVQ_U_ROW[--_k][_n];
486e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        while(p>_i);
487e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      }
488e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      else for(p=row[_k];p>_i;p=row[_k])_k--;
489e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      _i-=p;
490e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      *_y++=(k0-_k+s)^s;
491e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    }
492e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    /*Lots of dimensions case:*/
493e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    else{
494e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      /*Are there any pulses in this dimension at all?*/
495e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      p=CELT_PVQ_U_ROW[_k][_n];
496e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      q=CELT_PVQ_U_ROW[_k+1][_n];
497e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      if(p<=_i&&_i<q){
498e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        _i-=p;
499e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        *_y++=0;
500e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      }
501e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      else{
502e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        /*Are the pulses in this dimension negative?*/
503e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        s=-(_i>=q);
504e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        _i-=q&s;
505e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        /*Count how many pulses were placed in this dimension.*/
506e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        k0=_k;
507e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        do p=CELT_PVQ_U_ROW[--_k][_n];
508e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        while(p>_i);
509e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        _i-=p;
510e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        *_y++=(k0-_k+s)^s;
511e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      }
512e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    }
513e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org    _n--;
514e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  }
515e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*_n==2*/
516e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  p=2*_k+1;
517e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  s=-(_i>=p);
518e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  _i-=p&s;
519e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  k0=_k;
520e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  _k=(_i+1)>>1;
521e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  if(_k)_i-=2*_k-1;
522e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  *_y++=(k0-_k+s)^s;
523e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*_n==1*/
524e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  s=-(int)_i;
525e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  *_y=(_k+s)^s;
526885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
527885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
528e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){
529e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y);
530885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
531885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
532e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else /* SMALL_FOOTPRINT */
533885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
534885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Computes the next row/column of any recurrence that obeys the relation
535885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1].
536885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _ui0 is the base case for the new row/column.*/
5373c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){
538885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  opus_uint32 ui1;
539885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  unsigned      j;
540885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  /*This do-while will overrun the array if we don't have storage for at least
541885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org     2 values.*/
542885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  j=1; do {
543885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0);
544885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    _ui[j-1]=_ui0;
545885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    _ui0=ui1;
546885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  } while (++j<_len);
547885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _ui[j-1]=_ui0;
548885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
549885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
550885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Computes the previous row/column of any recurrence that obeys the relation
551885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1].
552885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _ui0 is the base case for the new row/column.*/
5533c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){
554885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  opus_uint32 ui1;
555885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  unsigned      j;
556885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  /*This do-while will overrun the array if we don't have storage for at least
557885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org     2 values.*/
558885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  j=1; do {
559885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0);
560885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    _ui[j-1]=_ui0;
561885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    _ui0=ui1;
562885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  } while (++j<_n);
563885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _ui[j-1]=_ui0;
564885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
565885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
566885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Compute V(_n,_k), as well as U(_n,0..._k+1).
567885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/
568885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){
569885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  opus_uint32 um2;
570885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  unsigned      len;
571885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  unsigned      k;
572885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  len=_k+2;
573885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  /*We require storage at least 3 values (e.g., _k>0).*/
574885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  celt_assert(len>=3);
575885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _u[0]=0;
576885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _u[1]=um2=1;
577e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*If _n==0, _u[0] should be 1 and the rest should be 0.*/
578e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*If _n==1, _u[i] should be 1 for i>1.*/
579e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  celt_assert(_n>=2);
580e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  /*If _k==0, the following do-while loop will overflow the buffer.*/
581e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  celt_assert(_k>0);
582e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  k=2;
583e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  do _u[k]=(k<<1)-1;
584e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  while(++k<len);
585e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  for(k=2;k<_n;k++)unext(_u+1,_k+1,1);
586885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  return _u[_k]+_u[_k+1];
587885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
588885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
589885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Returns the _i'th combination of _k elements chosen from a set of size _n
590885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   with associated sign bits.
591885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _y: Returns the vector of pulses.
592885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _u: Must contain entries [0..._k+1] of row _n of U() on input.
593885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      Its contents will be destructively modified.*/
594885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic void cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){
595885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  int j;
596885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  celt_assert(_n>0);
597885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  j=0;
598885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  do{
599885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_uint32 p;
600885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int           s;
601885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int           yj;
602885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    p=_u[_k+1];
603885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    s=-(_i>=p);
604885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    _i-=p&s;
605885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    yj=_k;
606885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    p=_u[_k];
607885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    while(p>_i)p=_u[--_k];
608885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    _i-=p;
609885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    yj-=_k;
610885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    _y[j]=(yj+s)^s;
611885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    uprev(_u,_k+2,0);
612885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  }
613885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  while(++j<_n);
614885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
615885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
616885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Returns the index of the given combination of K elements chosen from a set
617885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   of size 1 with associated sign bits.
618885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _y: The vector of pulses, whose sum of absolute values is K.
619885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _k: Returns K.*/
6203c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){
621885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *_k=abs(_y[0]);
622885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  return _y[0]<0;
623885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
624885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
625885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Returns the index of the given combination of K elements chosen from a set
626885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   of size _n with associated sign bits.
627885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _y:  The vector of pulses, whose sum of absolute values must be _k.
628885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _nc: Returns V(_n,_k).*/
6293c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y,
630885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint32 *_u){
631885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  opus_uint32 i;
632e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  int         j;
633e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  int         k;
634885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  /*We can't unroll the first two iterations of the loop unless _n>=2.*/
635885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  celt_assert(_n>=2);
636885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _u[0]=0;
637885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1;
638885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  i=icwrs1(_y+_n-1,&k);
639885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  j=_n-2;
640885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  i+=_u[k];
641885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  k+=abs(_y[j]);
642885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  if(_y[j]<0)i+=_u[k+1];
643885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  while(j-->0){
644885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    unext(_u,_k+2,0);
645885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    i+=_u[k];
646885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    k+=abs(_y[j]);
647885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    if(_y[j]<0)i+=_u[k+1];
648885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  }
649885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *_nc=_u[k]+_u[k+1];
650885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  return i;
651885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
652885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
653885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef CUSTOM_MODES
654885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){
655885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  int k;
656885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  /*_maxk==0 => there's nothing to do.*/
657885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  celt_assert(_maxk>0);
658885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  _bits[0]=0;
659885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  if (_n==1)
660885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  {
661885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    for (k=1;k<=_maxk;k++)
662885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      _bits[k] = 1<<_frac;
663885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  }
664885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  else {
665885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    VARDECL(opus_uint32,u);
666885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    SAVE_STACK;
667885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ALLOC(u,_maxk+2U,opus_uint32);
668885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ncwrs_urow(_n,_maxk,u);
669885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    for(k=1;k<=_maxk;k++)
670885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      _bits[k]=log2_frac(u[k]+u[k+1],_frac);
671885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    RESTORE_STACK;
672885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  }
673885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
674885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif /* CUSTOM_MODES */
675885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
676885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){
677885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  opus_uint32 i;
678e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  VARDECL(opus_uint32,u);
679e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  opus_uint32 nc;
680e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  SAVE_STACK;
681885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  celt_assert(_k>0);
682e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  ALLOC(u,_k+2U,opus_uint32);
683e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  i=icwrs(_n,_k,&nc,_y,u);
684e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  ec_enc_uint(_enc,i,nc);
685e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  RESTORE_STACK;
686885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
687885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
688e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){
689e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  VARDECL(opus_uint32,u);
690e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  SAVE_STACK;
691885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  celt_assert(_k>0);
692e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  ALLOC(u,_k+2U,opus_uint32);
693e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u);
694e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org  RESTORE_STACK;
695885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
696e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org
697e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif /* SMALL_FOOTPRINT */
698