annotate src/opus-1.3/celt/cwrs.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 4664ac0c1032
children
rev   line source
cannam@154 1 /* Copyright (c) 2007-2008 CSIRO
cannam@154 2 Copyright (c) 2007-2009 Xiph.Org Foundation
cannam@154 3 Copyright (c) 2007-2009 Timothy B. Terriberry
cannam@154 4 Written by Timothy B. Terriberry and Jean-Marc Valin */
cannam@154 5 /*
cannam@154 6 Redistribution and use in source and binary forms, with or without
cannam@154 7 modification, are permitted provided that the following conditions
cannam@154 8 are met:
cannam@154 9
cannam@154 10 - Redistributions of source code must retain the above copyright
cannam@154 11 notice, this list of conditions and the following disclaimer.
cannam@154 12
cannam@154 13 - Redistributions in binary form must reproduce the above copyright
cannam@154 14 notice, this list of conditions and the following disclaimer in the
cannam@154 15 documentation and/or other materials provided with the distribution.
cannam@154 16
cannam@154 17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
cannam@154 18 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
cannam@154 19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
cannam@154 20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
cannam@154 21 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
cannam@154 22 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
cannam@154 23 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
cannam@154 24 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
cannam@154 25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
cannam@154 26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
cannam@154 27 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cannam@154 28 */
cannam@154 29
cannam@154 30 #ifdef HAVE_CONFIG_H
cannam@154 31 #include "config.h"
cannam@154 32 #endif
cannam@154 33
cannam@154 34 #include "os_support.h"
cannam@154 35 #include "cwrs.h"
cannam@154 36 #include "mathops.h"
cannam@154 37 #include "arch.h"
cannam@154 38
cannam@154 39 #ifdef CUSTOM_MODES
cannam@154 40
cannam@154 41 /*Guaranteed to return a conservatively large estimate of the binary logarithm
cannam@154 42 with frac bits of fractional precision.
cannam@154 43 Tested for all possible 32-bit inputs with frac=4, where the maximum
cannam@154 44 overestimation is 0.06254243 bits.*/
cannam@154 45 int log2_frac(opus_uint32 val, int frac)
cannam@154 46 {
cannam@154 47 int l;
cannam@154 48 l=EC_ILOG(val);
cannam@154 49 if(val&(val-1)){
cannam@154 50 /*This is (val>>l-16), but guaranteed to round up, even if adding a bias
cannam@154 51 before the shift would cause overflow (e.g., for 0xFFFFxxxx).
cannam@154 52 Doesn't work for val=0, but that case fails the test above.*/
cannam@154 53 if(l>16)val=((val-1)>>(l-16))+1;
cannam@154 54 else val<<=16-l;
cannam@154 55 l=(l-1)<<frac;
cannam@154 56 /*Note that we always need one iteration, since the rounding up above means
cannam@154 57 that we might need to adjust the integer part of the logarithm.*/
cannam@154 58 do{
cannam@154 59 int b;
cannam@154 60 b=(int)(val>>16);
cannam@154 61 l+=b<<frac;
cannam@154 62 val=(val+b)>>b;
cannam@154 63 val=(val*val+0x7FFF)>>15;
cannam@154 64 }
cannam@154 65 while(frac-->0);
cannam@154 66 /*If val is not exactly 0x8000, then we have to round up the remainder.*/
cannam@154 67 return l+(val>0x8000);
cannam@154 68 }
cannam@154 69 /*Exact powers of two require no rounding.*/
cannam@154 70 else return (l-1)<<frac;
cannam@154 71 }
cannam@154 72 #endif
cannam@154 73
cannam@154 74 /*Although derived separately, the pulse vector coding scheme is equivalent to
cannam@154 75 a Pyramid Vector Quantizer \cite{Fis86}.
cannam@154 76 Some additional notes about an early version appear at
cannam@154 77 https://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering
cannam@154 78 and the definitions of some terms have evolved since that was written.
cannam@154 79
cannam@154 80 The conversion from a pulse vector to an integer index (encoding) and back
cannam@154 81 (decoding) is governed by two related functions, V(N,K) and U(N,K).
cannam@154 82
cannam@154 83 V(N,K) = the number of combinations, with replacement, of N items, taken K
cannam@154 84 at a time, when a sign bit is added to each item taken at least once (i.e.,
cannam@154 85 the number of N-dimensional unit pulse vectors with K pulses).
cannam@154 86 One way to compute this is via
cannam@154 87 V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1,
cannam@154 88 where choose() is the binomial function.
cannam@154 89 A table of values for N<10 and K<10 looks like:
cannam@154 90 V[10][10] = {
cannam@154 91 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
cannam@154 92 {1, 2, 2, 2, 2, 2, 2, 2, 2, 2},
cannam@154 93 {1, 4, 8, 12, 16, 20, 24, 28, 32, 36},
cannam@154 94 {1, 6, 18, 38, 66, 102, 146, 198, 258, 326},
cannam@154 95 {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992},
cannam@154 96 {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290},
cannam@154 97 {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436},
cannam@154 98 {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598},
cannam@154 99 {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688},
cannam@154 100 {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146}
cannam@154 101 };
cannam@154 102
cannam@154 103 U(N,K) = the number of such combinations wherein N-1 objects are taken at
cannam@154 104 most K-1 at a time.
cannam@154 105 This is given by
cannam@154 106 U(N,K) = sum(k=0...K-1,V(N-1,k))
cannam@154 107 = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0.
cannam@154 108 The latter expression also makes clear that U(N,K) is half the number of such
cannam@154 109 combinations wherein the first object is taken at least once.
cannam@154 110 Although it may not be clear from either of these definitions, U(N,K) is the
cannam@154 111 natural function to work with when enumerating the pulse vector codebooks,
cannam@154 112 not V(N,K).
cannam@154 113 U(N,K) is not well-defined for N=0, but with the extension
cannam@154 114 U(0,K) = K>0 ? 0 : 1,
cannam@154 115 the function becomes symmetric: U(N,K) = U(K,N), with a similar table:
cannam@154 116 U[10][10] = {
cannam@154 117 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
cannam@154 118 {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
cannam@154 119 {0, 1, 3, 5, 7, 9, 11, 13, 15, 17},
cannam@154 120 {0, 1, 5, 13, 25, 41, 61, 85, 113, 145},
cannam@154 121 {0, 1, 7, 25, 63, 129, 231, 377, 575, 833},
cannam@154 122 {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649},
cannam@154 123 {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073},
cannam@154 124 {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081},
cannam@154 125 {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545},
cannam@154 126 {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729}
cannam@154 127 };
cannam@154 128
cannam@154 129 With this extension, V(N,K) may be written in terms of U(N,K):
cannam@154 130 V(N,K) = U(N,K) + U(N,K+1)
cannam@154 131 for all N>=0, K>=0.
cannam@154 132 Thus U(N,K+1) represents the number of combinations where the first element
cannam@154 133 is positive or zero, and U(N,K) represents the number of combinations where
cannam@154 134 it is negative.
cannam@154 135 With a large enough table of U(N,K) values, we could write O(N) encoding
cannam@154 136 and O(min(N*log(K),N+K)) decoding routines, but such a table would be
cannam@154 137 prohibitively large for small embedded devices (K may be as large as 32767
cannam@154 138 for small N, and N may be as large as 200).
cannam@154 139
cannam@154 140 Both functions obey the same recurrence relation:
cannam@154 141 V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1),
cannam@154 142 U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1),
cannam@154 143 for all N>0, K>0, with different initial conditions at N=0 or K=0.
cannam@154 144 This allows us to construct a row of one of the tables above given the
cannam@154 145 previous row or the next row.
cannam@154 146 Thus we can derive O(NK) encoding and decoding routines with O(K) memory
cannam@154 147 using only addition and subtraction.
cannam@154 148
cannam@154 149 When encoding, we build up from the U(2,K) row and work our way forwards.
cannam@154 150 When decoding, we need to start at the U(N,K) row and work our way backwards,
cannam@154 151 which requires a means of computing U(N,K).
cannam@154 152 U(N,K) may be computed from two previous values with the same N:
cannam@154 153 U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2)
cannam@154 154 for all N>1, and since U(N,K) is symmetric, a similar relation holds for two
cannam@154 155 previous values with the same K:
cannam@154 156 U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K)
cannam@154 157 for all K>1.
cannam@154 158 This allows us to construct an arbitrary row of the U(N,K) table by starting
cannam@154 159 with the first two values, which are constants.
cannam@154 160 This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K)
cannam@154 161 multiplications.
cannam@154 162 Similar relations can be derived for V(N,K), but are not used here.
cannam@154 163
cannam@154 164 For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree
cannam@154 165 polynomial for fixed N.
cannam@154 166 The first few are
cannam@154 167 U(1,K) = 1,
cannam@154 168 U(2,K) = 2*K-1,
cannam@154 169 U(3,K) = (2*K-2)*K+1,
cannam@154 170 U(4,K) = (((4*K-6)*K+8)*K-3)/3,
cannam@154 171 U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3,
cannam@154 172 and
cannam@154 173 V(1,K) = 2,
cannam@154 174 V(2,K) = 4*K,
cannam@154 175 V(3,K) = 4*K*K+2,
cannam@154 176 V(4,K) = 8*(K*K+2)*K/3,
cannam@154 177 V(5,K) = ((4*K*K+20)*K*K+6)/3,
cannam@154 178 for all K>0.
cannam@154 179 This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for
cannam@154 180 small N (and indeed decoding is also O(N) for N<3).
cannam@154 181
cannam@154 182 @ARTICLE{Fis86,
cannam@154 183 author="Thomas R. Fischer",
cannam@154 184 title="A Pyramid Vector Quantizer",
cannam@154 185 journal="IEEE Transactions on Information Theory",
cannam@154 186 volume="IT-32",
cannam@154 187 number=4,
cannam@154 188 pages="568--583",
cannam@154 189 month=Jul,
cannam@154 190 year=1986
cannam@154 191 }*/
cannam@154 192
cannam@154 193 #if !defined(SMALL_FOOTPRINT)
cannam@154 194
cannam@154 195 /*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*/
cannam@154 196 # define CELT_PVQ_U(_n,_k) (CELT_PVQ_U_ROW[IMIN(_n,_k)][IMAX(_n,_k)])
cannam@154 197 /*V(N,K) := U(N,K)+U(N,K+1) = the number of PVQ codewords for a band of size N
cannam@154 198 with K pulses allocated to it.*/
cannam@154 199 # define CELT_PVQ_V(_n,_k) (CELT_PVQ_U(_n,_k)+CELT_PVQ_U(_n,(_k)+1))
cannam@154 200
cannam@154 201 /*For each V(N,K) supported, we will access element U(min(N,K+1),max(N,K+1)).
cannam@154 202 Thus, the number of entries in row I is the larger of the maximum number of
cannam@154 203 pulses we will ever allocate for a given N=I (K=128, or however many fit in
cannam@154 204 32 bits, whichever is smaller), plus one, and the maximum N for which
cannam@154 205 K=I-1 pulses fit in 32 bits.
cannam@154 206 The largest band size in an Opus Custom mode is 208.
cannam@154 207 Otherwise, we can limit things to the set of N which can be achieved by
cannam@154 208 splitting a band from a standard Opus mode: 176, 144, 96, 88, 72, 64, 48,
cannam@154 209 44, 36, 32, 24, 22, 18, 16, 8, 4, 2).*/
cannam@154 210 #if defined(CUSTOM_MODES)
cannam@154 211 static const opus_uint32 CELT_PVQ_U_DATA[1488]={
cannam@154 212 #else
cannam@154 213 static const opus_uint32 CELT_PVQ_U_DATA[1272]={
cannam@154 214 #endif
cannam@154 215 /*N=0, K=0...176:*/
cannam@154 216 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,
cannam@154 217 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,
cannam@154 218 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,
cannam@154 219 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,
cannam@154 220 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,
cannam@154 221 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,
cannam@154 222 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
cannam@154 223 #if defined(CUSTOM_MODES)
cannam@154 224 /*...208:*/
cannam@154 225 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,
cannam@154 226 0, 0, 0, 0, 0, 0,
cannam@154 227 #endif
cannam@154 228 /*N=1, K=1...176:*/
cannam@154 229 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,
cannam@154 230 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,
cannam@154 231 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,
cannam@154 232 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,
cannam@154 233 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,
cannam@154 234 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,
cannam@154 235 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
cannam@154 236 #if defined(CUSTOM_MODES)
cannam@154 237 /*...208:*/
cannam@154 238 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,
cannam@154 239 1, 1, 1, 1, 1, 1,
cannam@154 240 #endif
cannam@154 241 /*N=2, K=2...176:*/
cannam@154 242 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41,
cannam@154 243 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79,
cannam@154 244 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113,
cannam@154 245 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143,
cannam@154 246 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173,
cannam@154 247 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203,
cannam@154 248 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233,
cannam@154 249 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263,
cannam@154 250 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293,
cannam@154 251 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 317, 319, 321, 323,
cannam@154 252 325, 327, 329, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351,
cannam@154 253 #if defined(CUSTOM_MODES)
cannam@154 254 /*...208:*/
cannam@154 255 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381,
cannam@154 256 383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411,
cannam@154 257 413, 415,
cannam@154 258 #endif
cannam@154 259 /*N=3, K=3...176:*/
cannam@154 260 13, 25, 41, 61, 85, 113, 145, 181, 221, 265, 313, 365, 421, 481, 545, 613,
cannam@154 261 685, 761, 841, 925, 1013, 1105, 1201, 1301, 1405, 1513, 1625, 1741, 1861,
cannam@154 262 1985, 2113, 2245, 2381, 2521, 2665, 2813, 2965, 3121, 3281, 3445, 3613, 3785,
cannam@154 263 3961, 4141, 4325, 4513, 4705, 4901, 5101, 5305, 5513, 5725, 5941, 6161, 6385,
cannam@154 264 6613, 6845, 7081, 7321, 7565, 7813, 8065, 8321, 8581, 8845, 9113, 9385, 9661,
cannam@154 265 9941, 10225, 10513, 10805, 11101, 11401, 11705, 12013, 12325, 12641, 12961,
cannam@154 266 13285, 13613, 13945, 14281, 14621, 14965, 15313, 15665, 16021, 16381, 16745,
cannam@154 267 17113, 17485, 17861, 18241, 18625, 19013, 19405, 19801, 20201, 20605, 21013,
cannam@154 268 21425, 21841, 22261, 22685, 23113, 23545, 23981, 24421, 24865, 25313, 25765,
cannam@154 269 26221, 26681, 27145, 27613, 28085, 28561, 29041, 29525, 30013, 30505, 31001,
cannam@154 270 31501, 32005, 32513, 33025, 33541, 34061, 34585, 35113, 35645, 36181, 36721,
cannam@154 271 37265, 37813, 38365, 38921, 39481, 40045, 40613, 41185, 41761, 42341, 42925,
cannam@154 272 43513, 44105, 44701, 45301, 45905, 46513, 47125, 47741, 48361, 48985, 49613,
cannam@154 273 50245, 50881, 51521, 52165, 52813, 53465, 54121, 54781, 55445, 56113, 56785,
cannam@154 274 57461, 58141, 58825, 59513, 60205, 60901, 61601,
cannam@154 275 #if defined(CUSTOM_MODES)
cannam@154 276 /*...208:*/
cannam@154 277 62305, 63013, 63725, 64441, 65161, 65885, 66613, 67345, 68081, 68821, 69565,
cannam@154 278 70313, 71065, 71821, 72581, 73345, 74113, 74885, 75661, 76441, 77225, 78013,
cannam@154 279 78805, 79601, 80401, 81205, 82013, 82825, 83641, 84461, 85285, 86113,
cannam@154 280 #endif
cannam@154 281 /*N=4, K=4...176:*/
cannam@154 282 63, 129, 231, 377, 575, 833, 1159, 1561, 2047, 2625, 3303, 4089, 4991, 6017,
cannam@154 283 7175, 8473, 9919, 11521, 13287, 15225, 17343, 19649, 22151, 24857, 27775,
cannam@154 284 30913, 34279, 37881, 41727, 45825, 50183, 54809, 59711, 64897, 70375, 76153,
cannam@154 285 82239, 88641, 95367, 102425, 109823, 117569, 125671, 134137, 142975, 152193,
cannam@154 286 161799, 171801, 182207, 193025, 204263, 215929, 228031, 240577, 253575,
cannam@154 287 267033, 280959, 295361, 310247, 325625, 341503, 357889, 374791, 392217,
cannam@154 288 410175, 428673, 447719, 467321, 487487, 508225, 529543, 551449, 573951,
cannam@154 289 597057, 620775, 645113, 670079, 695681, 721927, 748825, 776383, 804609,
cannam@154 290 833511, 863097, 893375, 924353, 956039, 988441, 1021567, 1055425, 1090023,
cannam@154 291 1125369, 1161471, 1198337, 1235975, 1274393, 1313599, 1353601, 1394407,
cannam@154 292 1436025, 1478463, 1521729, 1565831, 1610777, 1656575, 1703233, 1750759,
cannam@154 293 1799161, 1848447, 1898625, 1949703, 2001689, 2054591, 2108417, 2163175,
cannam@154 294 2218873, 2275519, 2333121, 2391687, 2451225, 2511743, 2573249, 2635751,
cannam@154 295 2699257, 2763775, 2829313, 2895879, 2963481, 3032127, 3101825, 3172583,
cannam@154 296 3244409, 3317311, 3391297, 3466375, 3542553, 3619839, 3698241, 3777767,
cannam@154 297 3858425, 3940223, 4023169, 4107271, 4192537, 4278975, 4366593, 4455399,
cannam@154 298 4545401, 4636607, 4729025, 4822663, 4917529, 5013631, 5110977, 5209575,
cannam@154 299 5309433, 5410559, 5512961, 5616647, 5721625, 5827903, 5935489, 6044391,
cannam@154 300 6154617, 6266175, 6379073, 6493319, 6608921, 6725887, 6844225, 6963943,
cannam@154 301 7085049, 7207551,
cannam@154 302 #if defined(CUSTOM_MODES)
cannam@154 303 /*...208:*/
cannam@154 304 7331457, 7456775, 7583513, 7711679, 7841281, 7972327, 8104825, 8238783,
cannam@154 305 8374209, 8511111, 8649497, 8789375, 8930753, 9073639, 9218041, 9363967,
cannam@154 306 9511425, 9660423, 9810969, 9963071, 10116737, 10271975, 10428793, 10587199,
cannam@154 307 10747201, 10908807, 11072025, 11236863, 11403329, 11571431, 11741177,
cannam@154 308 11912575,
cannam@154 309 #endif
cannam@154 310 /*N=5, K=5...176:*/
cannam@154 311 321, 681, 1289, 2241, 3649, 5641, 8361, 11969, 16641, 22569, 29961, 39041,
cannam@154 312 50049, 63241, 78889, 97281, 118721, 143529, 172041, 204609, 241601, 283401,
cannam@154 313 330409, 383041, 441729, 506921, 579081, 658689, 746241, 842249, 947241,
cannam@154 314 1061761, 1186369, 1321641, 1468169, 1626561, 1797441, 1981449, 2179241,
cannam@154 315 2391489, 2618881, 2862121, 3121929, 3399041, 3694209, 4008201, 4341801,
cannam@154 316 4695809, 5071041, 5468329, 5888521, 6332481, 6801089, 7295241, 7815849,
cannam@154 317 8363841, 8940161, 9545769, 10181641, 10848769, 11548161, 12280841, 13047849,
cannam@154 318 13850241, 14689089, 15565481, 16480521, 17435329, 18431041, 19468809,
cannam@154 319 20549801, 21675201, 22846209, 24064041, 25329929, 26645121, 28010881,
cannam@154 320 29428489, 30899241, 32424449, 34005441, 35643561, 37340169, 39096641,
cannam@154 321 40914369, 42794761, 44739241, 46749249, 48826241, 50971689, 53187081,
cannam@154 322 55473921, 57833729, 60268041, 62778409, 65366401, 68033601, 70781609,
cannam@154 323 73612041, 76526529, 79526721, 82614281, 85790889, 89058241, 92418049,
cannam@154 324 95872041, 99421961, 103069569, 106816641, 110664969, 114616361, 118672641,
cannam@154 325 122835649, 127107241, 131489289, 135983681, 140592321, 145317129, 150160041,
cannam@154 326 155123009, 160208001, 165417001, 170752009, 176215041, 181808129, 187533321,
cannam@154 327 193392681, 199388289, 205522241, 211796649, 218213641, 224775361, 231483969,
cannam@154 328 238341641, 245350569, 252512961, 259831041, 267307049, 274943241, 282741889,
cannam@154 329 290705281, 298835721, 307135529, 315607041, 324252609, 333074601, 342075401,
cannam@154 330 351257409, 360623041, 370174729, 379914921, 389846081, 399970689, 410291241,
cannam@154 331 420810249, 431530241, 442453761, 453583369, 464921641, 476471169, 488234561,
cannam@154 332 500214441, 512413449, 524834241, 537479489, 550351881, 563454121, 576788929,
cannam@154 333 590359041, 604167209, 618216201, 632508801,
cannam@154 334 #if defined(CUSTOM_MODES)
cannam@154 335 /*...208:*/
cannam@154 336 647047809, 661836041, 676876329, 692171521, 707724481, 723538089, 739615241,
cannam@154 337 755958849, 772571841, 789457161, 806617769, 824056641, 841776769, 859781161,
cannam@154 338 878072841, 896654849, 915530241, 934702089, 954173481, 973947521, 994027329,
cannam@154 339 1014416041, 1035116809, 1056132801, 1077467201, 1099123209, 1121104041,
cannam@154 340 1143412929, 1166053121, 1189027881, 1212340489, 1235994241,
cannam@154 341 #endif
cannam@154 342 /*N=6, K=6...96:*/
cannam@154 343 1683, 3653, 7183, 13073, 22363, 36365, 56695, 85305, 124515, 177045, 246047,
cannam@154 344 335137, 448427, 590557, 766727, 982729, 1244979, 1560549, 1937199, 2383409,
cannam@154 345 2908411, 3522221, 4235671, 5060441, 6009091, 7095093, 8332863, 9737793,
cannam@154 346 11326283, 13115773, 15124775, 17372905, 19880915, 22670725, 25765455,
cannam@154 347 29189457, 32968347, 37129037, 41699767, 46710137, 52191139, 58175189,
cannam@154 348 64696159, 71789409, 79491819, 87841821, 96879431, 106646281, 117185651,
cannam@154 349 128542501, 140763503, 153897073, 167993403, 183104493, 199284183, 216588185,
cannam@154 350 235074115, 254801525, 275831935, 298228865, 322057867, 347386557, 374284647,
cannam@154 351 402823977, 433078547, 465124549, 499040399, 534906769, 572806619, 612825229,
cannam@154 352 655050231, 699571641, 746481891, 795875861, 847850911, 902506913, 959946283,
cannam@154 353 1020274013, 1083597703, 1150027593, 1219676595, 1292660325, 1369097135,
cannam@154 354 1449108145, 1532817275, 1620351277, 1711839767, 1807415257, 1907213187,
cannam@154 355 2011371957, 2120032959,
cannam@154 356 #if defined(CUSTOM_MODES)
cannam@154 357 /*...109:*/
cannam@154 358 2233340609U, 2351442379U, 2474488829U, 2602633639U, 2736033641U, 2874848851U,
cannam@154 359 3019242501U, 3169381071U, 3325434321U, 3487575323U, 3655980493U, 3830829623U,
cannam@154 360 4012305913U,
cannam@154 361 #endif
cannam@154 362 /*N=7, K=7...54*/
cannam@154 363 8989, 19825, 40081, 75517, 134245, 227305, 369305, 579125, 880685, 1303777,
cannam@154 364 1884961, 2668525, 3707509, 5064793, 6814249, 9041957, 11847485, 15345233,
cannam@154 365 19665841, 24957661, 31388293, 39146185, 48442297, 59511829, 72616013,
cannam@154 366 88043969, 106114625, 127178701, 151620757, 179861305, 212358985, 249612805,
cannam@154 367 292164445, 340600625, 395555537, 457713341, 527810725, 606639529, 695049433,
cannam@154 368 793950709, 904317037, 1027188385, 1163673953, 1314955181, 1482288821,
cannam@154 369 1667010073, 1870535785, 2094367717,
cannam@154 370 #if defined(CUSTOM_MODES)
cannam@154 371 /*...60:*/
cannam@154 372 2340095869U, 2609401873U, 2904062449U, 3225952925U, 3577050821U, 3959439497U,
cannam@154 373 #endif
cannam@154 374 /*N=8, K=8...37*/
cannam@154 375 48639, 108545, 224143, 433905, 795455, 1392065, 2340495, 3800305, 5984767,
cannam@154 376 9173505, 13726991, 20103025, 28875327, 40754369, 56610575, 77500017,
cannam@154 377 104692735, 139703809, 184327311, 240673265, 311207743, 398796225, 506750351,
cannam@154 378 638878193, 799538175, 993696769, 1226990095, 1505789553, 1837271615,
cannam@154 379 2229491905U,
cannam@154 380 #if defined(CUSTOM_MODES)
cannam@154 381 /*...40:*/
cannam@154 382 2691463695U, 3233240945U, 3866006015U,
cannam@154 383 #endif
cannam@154 384 /*N=9, K=9...28:*/
cannam@154 385 265729, 598417, 1256465, 2485825, 4673345, 8405905, 14546705, 24331777,
cannam@154 386 39490049, 62390545, 96220561, 145198913, 214828609, 312193553, 446304145,
cannam@154 387 628496897, 872893441, 1196924561, 1621925137, 2173806145U,
cannam@154 388 #if defined(CUSTOM_MODES)
cannam@154 389 /*...29:*/
cannam@154 390 2883810113U,
cannam@154 391 #endif
cannam@154 392 /*N=10, K=10...24:*/
cannam@154 393 1462563, 3317445, 7059735, 14218905, 27298155, 50250765, 89129247, 152951073,
cannam@154 394 254831667, 413442773, 654862247, 1014889769, 1541911931, 2300409629U,
cannam@154 395 3375210671U,
cannam@154 396 /*N=11, K=11...19:*/
cannam@154 397 8097453, 18474633, 39753273, 81270333, 158819253, 298199265, 540279585,
cannam@154 398 948062325, 1616336765,
cannam@154 399 #if defined(CUSTOM_MODES)
cannam@154 400 /*...20:*/
cannam@154 401 2684641785U,
cannam@154 402 #endif
cannam@154 403 /*N=12, K=12...18:*/
cannam@154 404 45046719, 103274625, 224298231, 464387817, 921406335, 1759885185,
cannam@154 405 3248227095U,
cannam@154 406 /*N=13, K=13...16:*/
cannam@154 407 251595969, 579168825, 1267854873, 2653649025U,
cannam@154 408 /*N=14, K=14:*/
cannam@154 409 1409933619
cannam@154 410 };
cannam@154 411
cannam@154 412 #if defined(CUSTOM_MODES)
cannam@154 413 static const opus_uint32 *const CELT_PVQ_U_ROW[15]={
cannam@154 414 CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 208,CELT_PVQ_U_DATA+ 415,
cannam@154 415 CELT_PVQ_U_DATA+ 621,CELT_PVQ_U_DATA+ 826,CELT_PVQ_U_DATA+1030,
cannam@154 416 CELT_PVQ_U_DATA+1233,CELT_PVQ_U_DATA+1336,CELT_PVQ_U_DATA+1389,
cannam@154 417 CELT_PVQ_U_DATA+1421,CELT_PVQ_U_DATA+1441,CELT_PVQ_U_DATA+1455,
cannam@154 418 CELT_PVQ_U_DATA+1464,CELT_PVQ_U_DATA+1470,CELT_PVQ_U_DATA+1473
cannam@154 419 };
cannam@154 420 #else
cannam@154 421 static const opus_uint32 *const CELT_PVQ_U_ROW[15]={
cannam@154 422 CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 176,CELT_PVQ_U_DATA+ 351,
cannam@154 423 CELT_PVQ_U_DATA+ 525,CELT_PVQ_U_DATA+ 698,CELT_PVQ_U_DATA+ 870,
cannam@154 424 CELT_PVQ_U_DATA+1041,CELT_PVQ_U_DATA+1131,CELT_PVQ_U_DATA+1178,
cannam@154 425 CELT_PVQ_U_DATA+1207,CELT_PVQ_U_DATA+1226,CELT_PVQ_U_DATA+1240,
cannam@154 426 CELT_PVQ_U_DATA+1248,CELT_PVQ_U_DATA+1254,CELT_PVQ_U_DATA+1257
cannam@154 427 };
cannam@154 428 #endif
cannam@154 429
cannam@154 430 #if defined(CUSTOM_MODES)
cannam@154 431 void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){
cannam@154 432 int k;
cannam@154 433 /*_maxk==0 => there's nothing to do.*/
cannam@154 434 celt_assert(_maxk>0);
cannam@154 435 _bits[0]=0;
cannam@154 436 for(k=1;k<=_maxk;k++)_bits[k]=log2_frac(CELT_PVQ_V(_n,k),_frac);
cannam@154 437 }
cannam@154 438 #endif
cannam@154 439
cannam@154 440 static opus_uint32 icwrs(int _n,const int *_y){
cannam@154 441 opus_uint32 i;
cannam@154 442 int j;
cannam@154 443 int k;
cannam@154 444 celt_assert(_n>=2);
cannam@154 445 j=_n-1;
cannam@154 446 i=_y[j]<0;
cannam@154 447 k=abs(_y[j]);
cannam@154 448 do{
cannam@154 449 j--;
cannam@154 450 i+=CELT_PVQ_U(_n-j,k);
cannam@154 451 k+=abs(_y[j]);
cannam@154 452 if(_y[j]<0)i+=CELT_PVQ_U(_n-j,k+1);
cannam@154 453 }
cannam@154 454 while(j>0);
cannam@154 455 return i;
cannam@154 456 }
cannam@154 457
cannam@154 458 void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){
cannam@154 459 celt_assert(_k>0);
cannam@154 460 ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k));
cannam@154 461 }
cannam@154 462
cannam@154 463 static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y){
cannam@154 464 opus_uint32 p;
cannam@154 465 int s;
cannam@154 466 int k0;
cannam@154 467 opus_int16 val;
cannam@154 468 opus_val32 yy=0;
cannam@154 469 celt_assert(_k>0);
cannam@154 470 celt_assert(_n>1);
cannam@154 471 while(_n>2){
cannam@154 472 opus_uint32 q;
cannam@154 473 /*Lots of pulses case:*/
cannam@154 474 if(_k>=_n){
cannam@154 475 const opus_uint32 *row;
cannam@154 476 row=CELT_PVQ_U_ROW[_n];
cannam@154 477 /*Are the pulses in this dimension negative?*/
cannam@154 478 p=row[_k+1];
cannam@154 479 s=-(_i>=p);
cannam@154 480 _i-=p&s;
cannam@154 481 /*Count how many pulses were placed in this dimension.*/
cannam@154 482 k0=_k;
cannam@154 483 q=row[_n];
cannam@154 484 if(q>_i){
cannam@154 485 celt_sig_assert(p>q);
cannam@154 486 _k=_n;
cannam@154 487 do p=CELT_PVQ_U_ROW[--_k][_n];
cannam@154 488 while(p>_i);
cannam@154 489 }
cannam@154 490 else for(p=row[_k];p>_i;p=row[_k])_k--;
cannam@154 491 _i-=p;
cannam@154 492 val=(k0-_k+s)^s;
cannam@154 493 *_y++=val;
cannam@154 494 yy=MAC16_16(yy,val,val);
cannam@154 495 }
cannam@154 496 /*Lots of dimensions case:*/
cannam@154 497 else{
cannam@154 498 /*Are there any pulses in this dimension at all?*/
cannam@154 499 p=CELT_PVQ_U_ROW[_k][_n];
cannam@154 500 q=CELT_PVQ_U_ROW[_k+1][_n];
cannam@154 501 if(p<=_i&&_i<q){
cannam@154 502 _i-=p;
cannam@154 503 *_y++=0;
cannam@154 504 }
cannam@154 505 else{
cannam@154 506 /*Are the pulses in this dimension negative?*/
cannam@154 507 s=-(_i>=q);
cannam@154 508 _i-=q&s;
cannam@154 509 /*Count how many pulses were placed in this dimension.*/
cannam@154 510 k0=_k;
cannam@154 511 do p=CELT_PVQ_U_ROW[--_k][_n];
cannam@154 512 while(p>_i);
cannam@154 513 _i-=p;
cannam@154 514 val=(k0-_k+s)^s;
cannam@154 515 *_y++=val;
cannam@154 516 yy=MAC16_16(yy,val,val);
cannam@154 517 }
cannam@154 518 }
cannam@154 519 _n--;
cannam@154 520 }
cannam@154 521 /*_n==2*/
cannam@154 522 p=2*_k+1;
cannam@154 523 s=-(_i>=p);
cannam@154 524 _i-=p&s;
cannam@154 525 k0=_k;
cannam@154 526 _k=(_i+1)>>1;
cannam@154 527 if(_k)_i-=2*_k-1;
cannam@154 528 val=(k0-_k+s)^s;
cannam@154 529 *_y++=val;
cannam@154 530 yy=MAC16_16(yy,val,val);
cannam@154 531 /*_n==1*/
cannam@154 532 s=-(int)_i;
cannam@154 533 val=(_k+s)^s;
cannam@154 534 *_y=val;
cannam@154 535 yy=MAC16_16(yy,val,val);
cannam@154 536 return yy;
cannam@154 537 }
cannam@154 538
cannam@154 539 opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){
cannam@154 540 return cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y);
cannam@154 541 }
cannam@154 542
cannam@154 543 #else /* SMALL_FOOTPRINT */
cannam@154 544
cannam@154 545 /*Computes the next row/column of any recurrence that obeys the relation
cannam@154 546 u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1].
cannam@154 547 _ui0 is the base case for the new row/column.*/
cannam@154 548 static OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){
cannam@154 549 opus_uint32 ui1;
cannam@154 550 unsigned j;
cannam@154 551 /*This do-while will overrun the array if we don't have storage for at least
cannam@154 552 2 values.*/
cannam@154 553 j=1; do {
cannam@154 554 ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0);
cannam@154 555 _ui[j-1]=_ui0;
cannam@154 556 _ui0=ui1;
cannam@154 557 } while (++j<_len);
cannam@154 558 _ui[j-1]=_ui0;
cannam@154 559 }
cannam@154 560
cannam@154 561 /*Computes the previous row/column of any recurrence that obeys the relation
cannam@154 562 u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1].
cannam@154 563 _ui0 is the base case for the new row/column.*/
cannam@154 564 static OPUS_INLINE void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){
cannam@154 565 opus_uint32 ui1;
cannam@154 566 unsigned j;
cannam@154 567 /*This do-while will overrun the array if we don't have storage for at least
cannam@154 568 2 values.*/
cannam@154 569 j=1; do {
cannam@154 570 ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0);
cannam@154 571 _ui[j-1]=_ui0;
cannam@154 572 _ui0=ui1;
cannam@154 573 } while (++j<_n);
cannam@154 574 _ui[j-1]=_ui0;
cannam@154 575 }
cannam@154 576
cannam@154 577 /*Compute V(_n,_k), as well as U(_n,0..._k+1).
cannam@154 578 _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/
cannam@154 579 static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){
cannam@154 580 opus_uint32 um2;
cannam@154 581 unsigned len;
cannam@154 582 unsigned k;
cannam@154 583 len=_k+2;
cannam@154 584 /*We require storage at least 3 values (e.g., _k>0).*/
cannam@154 585 celt_assert(len>=3);
cannam@154 586 _u[0]=0;
cannam@154 587 _u[1]=um2=1;
cannam@154 588 /*If _n==0, _u[0] should be 1 and the rest should be 0.*/
cannam@154 589 /*If _n==1, _u[i] should be 1 for i>1.*/
cannam@154 590 celt_assert(_n>=2);
cannam@154 591 /*If _k==0, the following do-while loop will overflow the buffer.*/
cannam@154 592 celt_assert(_k>0);
cannam@154 593 k=2;
cannam@154 594 do _u[k]=(k<<1)-1;
cannam@154 595 while(++k<len);
cannam@154 596 for(k=2;k<_n;k++)unext(_u+1,_k+1,1);
cannam@154 597 return _u[_k]+_u[_k+1];
cannam@154 598 }
cannam@154 599
cannam@154 600 /*Returns the _i'th combination of _k elements chosen from a set of size _n
cannam@154 601 with associated sign bits.
cannam@154 602 _y: Returns the vector of pulses.
cannam@154 603 _u: Must contain entries [0..._k+1] of row _n of U() on input.
cannam@154 604 Its contents will be destructively modified.*/
cannam@154 605 static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){
cannam@154 606 int j;
cannam@154 607 opus_int16 val;
cannam@154 608 opus_val32 yy=0;
cannam@154 609 celt_assert(_n>0);
cannam@154 610 j=0;
cannam@154 611 do{
cannam@154 612 opus_uint32 p;
cannam@154 613 int s;
cannam@154 614 int yj;
cannam@154 615 p=_u[_k+1];
cannam@154 616 s=-(_i>=p);
cannam@154 617 _i-=p&s;
cannam@154 618 yj=_k;
cannam@154 619 p=_u[_k];
cannam@154 620 while(p>_i)p=_u[--_k];
cannam@154 621 _i-=p;
cannam@154 622 yj-=_k;
cannam@154 623 val=(yj+s)^s;
cannam@154 624 _y[j]=val;
cannam@154 625 yy=MAC16_16(yy,val,val);
cannam@154 626 uprev(_u,_k+2,0);
cannam@154 627 }
cannam@154 628 while(++j<_n);
cannam@154 629 return yy;
cannam@154 630 }
cannam@154 631
cannam@154 632 /*Returns the index of the given combination of K elements chosen from a set
cannam@154 633 of size 1 with associated sign bits.
cannam@154 634 _y: The vector of pulses, whose sum of absolute values is K.
cannam@154 635 _k: Returns K.*/
cannam@154 636 static OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){
cannam@154 637 *_k=abs(_y[0]);
cannam@154 638 return _y[0]<0;
cannam@154 639 }
cannam@154 640
cannam@154 641 /*Returns the index of the given combination of K elements chosen from a set
cannam@154 642 of size _n with associated sign bits.
cannam@154 643 _y: The vector of pulses, whose sum of absolute values must be _k.
cannam@154 644 _nc: Returns V(_n,_k).*/
cannam@154 645 static OPUS_INLINE opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y,
cannam@154 646 opus_uint32 *_u){
cannam@154 647 opus_uint32 i;
cannam@154 648 int j;
cannam@154 649 int k;
cannam@154 650 /*We can't unroll the first two iterations of the loop unless _n>=2.*/
cannam@154 651 celt_assert(_n>=2);
cannam@154 652 _u[0]=0;
cannam@154 653 for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1;
cannam@154 654 i=icwrs1(_y+_n-1,&k);
cannam@154 655 j=_n-2;
cannam@154 656 i+=_u[k];
cannam@154 657 k+=abs(_y[j]);
cannam@154 658 if(_y[j]<0)i+=_u[k+1];
cannam@154 659 while(j-->0){
cannam@154 660 unext(_u,_k+2,0);
cannam@154 661 i+=_u[k];
cannam@154 662 k+=abs(_y[j]);
cannam@154 663 if(_y[j]<0)i+=_u[k+1];
cannam@154 664 }
cannam@154 665 *_nc=_u[k]+_u[k+1];
cannam@154 666 return i;
cannam@154 667 }
cannam@154 668
cannam@154 669 #ifdef CUSTOM_MODES
cannam@154 670 void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){
cannam@154 671 int k;
cannam@154 672 /*_maxk==0 => there's nothing to do.*/
cannam@154 673 celt_assert(_maxk>0);
cannam@154 674 _bits[0]=0;
cannam@154 675 if (_n==1)
cannam@154 676 {
cannam@154 677 for (k=1;k<=_maxk;k++)
cannam@154 678 _bits[k] = 1<<_frac;
cannam@154 679 }
cannam@154 680 else {
cannam@154 681 VARDECL(opus_uint32,u);
cannam@154 682 SAVE_STACK;
cannam@154 683 ALLOC(u,_maxk+2U,opus_uint32);
cannam@154 684 ncwrs_urow(_n,_maxk,u);
cannam@154 685 for(k=1;k<=_maxk;k++)
cannam@154 686 _bits[k]=log2_frac(u[k]+u[k+1],_frac);
cannam@154 687 RESTORE_STACK;
cannam@154 688 }
cannam@154 689 }
cannam@154 690 #endif /* CUSTOM_MODES */
cannam@154 691
cannam@154 692 void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){
cannam@154 693 opus_uint32 i;
cannam@154 694 VARDECL(opus_uint32,u);
cannam@154 695 opus_uint32 nc;
cannam@154 696 SAVE_STACK;
cannam@154 697 celt_assert(_k>0);
cannam@154 698 ALLOC(u,_k+2U,opus_uint32);
cannam@154 699 i=icwrs(_n,_k,&nc,_y,u);
cannam@154 700 ec_enc_uint(_enc,i,nc);
cannam@154 701 RESTORE_STACK;
cannam@154 702 }
cannam@154 703
cannam@154 704 opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){
cannam@154 705 VARDECL(opus_uint32,u);
cannam@154 706 int ret;
cannam@154 707 SAVE_STACK;
cannam@154 708 celt_assert(_k>0);
cannam@154 709 ALLOC(u,_k+2U,opus_uint32);
cannam@154 710 ret = cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u);
cannam@154 711 RESTORE_STACK;
cannam@154 712 return ret;
cannam@154 713 }
cannam@154 714
cannam@154 715 #endif /* SMALL_FOOTPRINT */