annotate src/opus-1.3/celt/cwrs.c @ 83:ae30d91d2ffe

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