diff options
author | Nils Wallménius <nils@rockbox.org> | 2013-05-20 22:25:57 +0200 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2013-08-31 08:30:51 +0200 |
commit | 580b307fd791c0997a8831bc800bba87797bfb7e (patch) | |
tree | 807846056f06fd944a750ce41217a877910ebd59 /lib/rbcodec/codecs/libopus/celt/cwrs.c | |
parent | 74761b70acd96cecc0d35450dd56a98ad9ee7d3d (diff) | |
download | rockbox-580b307fd791c0997a8831bc800bba87797bfb7e.tar.gz rockbox-580b307fd791c0997a8831bc800bba87797bfb7e.zip |
Sync opus codec to upstream git
Sync opus codec to upstream commit
02fed471a4568852d6618e041c4f2af0d7730ee2 (August 30 2013)
This brings in a lot of optimizations but also makes the diff
between our codec and the upstream much smaller as most of our
optimizations have been upstreamed or supeceded.
Speedups across the board for CELT mode files:
64kbps 128kbps
H300 9.82MHz 15.48MHz
c200 4.86MHz 9.63MHz
fuze v1 10.32MHz 15.92MHz
For the silk mode test file (16kbps) arm targets get a speedup
of about 2MHz while the H300 is 7.8MHz slower, likely because it's
now using the pseudostack more rather than the real stack which
is in iram. Patches to get around that are upcomming.
Change-Id: Ifecf963e461c51ac42e09dac1e91bc4bc3b12fa3
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/cwrs.c')
-rw-r--r-- | lib/rbcodec/codecs/libopus/celt/cwrs.c | 658 |
1 files changed, 354 insertions, 304 deletions
diff --git a/lib/rbcodec/codecs/libopus/celt/cwrs.c b/lib/rbcodec/codecs/libopus/celt/cwrs.c index b8ade96fce..eb8fa1c807 100644 --- a/lib/rbcodec/codecs/libopus/celt/cwrs.c +++ b/lib/rbcodec/codecs/libopus/celt/cwrs.c | |||
@@ -28,14 +28,13 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #ifdef HAVE_CONFIG_H | 30 | #ifdef HAVE_CONFIG_H |
31 | #include "opus_config.h" | 31 | #include "config.h" |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | #include "os_support.h" | 34 | #include "os_support.h" |
35 | #include "cwrs.h" | 35 | #include "cwrs.h" |
36 | #include "mathops.h" | 36 | #include "mathops.h" |
37 | #include "arch.h" | 37 | #include "arch.h" |
38 | #include "rate.h" | ||
39 | 38 | ||
40 | #ifdef CUSTOM_MODES | 39 | #ifdef CUSTOM_MODES |
41 | 40 | ||
@@ -72,64 +71,6 @@ int log2_frac(opus_uint32 val, int frac) | |||
72 | } | 71 | } |
73 | #endif | 72 | #endif |
74 | 73 | ||
75 | #ifndef SMALL_FOOTPRINT | ||
76 | |||
77 | #define MASK32 (0xFFFFFFFF) | ||
78 | |||
79 | /*INV_TABLE[i] holds the multiplicative inverse of (2*i+1) mod 2**32.*/ | ||
80 | static const opus_uint32 INV_TABLE[53]={ | ||
81 | 0x00000001,0xAAAAAAAB,0xCCCCCCCD,0xB6DB6DB7, | ||
82 | 0x38E38E39,0xBA2E8BA3,0xC4EC4EC5,0xEEEEEEEF, | ||
83 | 0xF0F0F0F1,0x286BCA1B,0x3CF3CF3D,0xE9BD37A7, | ||
84 | 0xC28F5C29,0x684BDA13,0x4F72C235,0xBDEF7BDF, | ||
85 | 0x3E0F83E1,0x8AF8AF8B,0x914C1BAD,0x96F96F97, | ||
86 | 0xC18F9C19,0x2FA0BE83,0xA4FA4FA5,0x677D46CF, | ||
87 | 0x1A1F58D1,0xFAFAFAFB,0x8C13521D,0x586FB587, | ||
88 | 0xB823EE09,0xA08AD8F3,0xC10C9715,0xBEFBEFBF, | ||
89 | 0xC0FC0FC1,0x07A44C6B,0xA33F128D,0xE327A977, | ||
90 | 0xC7E3F1F9,0x962FC963,0x3F2B3885,0x613716AF, | ||
91 | 0x781948B1,0x2B2E43DB,0xFCFCFCFD,0x6FD0EB67, | ||
92 | 0xFA3F47E9,0xD2FD2FD3,0x3F4FD3F5,0xD4E25B9F, | ||
93 | 0x5F02A3A1,0xBF5A814B,0x7C32B16D,0xD3431B57, | ||
94 | 0xD8FD8FD9, | ||
95 | }; | ||
96 | |||
97 | /*Computes (_a*_b-_c)/(2*_d+1) when the quotient is known to be exact. | ||
98 | _a, _b, _c, and _d may be arbitrary so long as the arbitrary precision result | ||
99 | fits in 32 bits, but currently the table for multiplicative inverses is only | ||
100 | valid for _d<=52.*/ | ||
101 | static inline opus_uint32 imusdiv32odd(opus_uint32 _a,opus_uint32 _b, | ||
102 | opus_uint32 _c,int _d){ | ||
103 | celt_assert(_d<=52); | ||
104 | return (_a*_b-_c)*INV_TABLE[_d]&MASK32; | ||
105 | } | ||
106 | |||
107 | /*Computes (_a*_b-_c)/_d when the quotient is known to be exact. | ||
108 | _d does not actually have to be even, but imusdiv32odd will be faster when | ||
109 | it's odd, so you should use that instead. | ||
110 | _a and _d are assumed to be small (e.g., _a*_d fits in 32 bits; currently the | ||
111 | table for multiplicative inverses is only valid for _d<=54). | ||
112 | _b and _c may be arbitrary so long as the arbitrary precision reuslt fits in | ||
113 | 32 bits.*/ | ||
114 | static inline opus_uint32 imusdiv32even(opus_uint32 _a,opus_uint32 _b, | ||
115 | opus_uint32 _c,int _d){ | ||
116 | opus_uint32 inv; | ||
117 | int mask; | ||
118 | int shift; | ||
119 | int one; | ||
120 | celt_assert(_d>0); | ||
121 | celt_assert(_d<=54); | ||
122 | shift=EC_ILOG(_d^(_d-1)); | ||
123 | inv=INV_TABLE[(_d-1)>>shift]; | ||
124 | shift--; | ||
125 | one=1<<shift; | ||
126 | mask=one-1; | ||
127 | return (_a*(_b>>shift)-(_c>>shift)+ | ||
128 | ((_a*(_b&mask)+one-(_c&mask))>>shift)-1)*inv&MASK32; | ||
129 | } | ||
130 | |||
131 | #endif /* SMALL_FOOTPRINT */ | ||
132 | |||
133 | /*Although derived separately, the pulse vector coding scheme is equivalent to | 74 | /*Although derived separately, the pulse vector coding scheme is equivalent to |
134 | a Pyramid Vector Quantizer \cite{Fis86}. | 75 | a Pyramid Vector Quantizer \cite{Fis86}. |
135 | Some additional notes about an early version appear at | 76 | Some additional notes about an early version appear at |
@@ -249,46 +190,346 @@ static inline opus_uint32 imusdiv32even(opus_uint32 _a,opus_uint32 _b, | |||
249 | year=1986 | 190 | year=1986 |
250 | }*/ | 191 | }*/ |
251 | 192 | ||
252 | #ifndef SMALL_FOOTPRINT | 193 | #if !defined(SMALL_FOOTPRINT) |
253 | /*Compute U(2,_k). | 194 | |
254 | Note that this may be called with _k=32768 (maxK[2]+1).*/ | 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*/ |
255 | static inline unsigned ucwrs2(unsigned _k){ | 196 | # define CELT_PVQ_U(_n,_k) (CELT_PVQ_U_ROW[IMIN(_n,_k)][IMAX(_n,_k)]) |
256 | celt_assert(_k>0); | 197 | /*V(N,K) := U(N,K)+U(N,K+1) = the number of PVQ codewords for a band of size N |
257 | return _k+(_k-1); | 198 | with K pulses allocated to it.*/ |
258 | } | 199 | # define CELT_PVQ_V(_n,_k) (CELT_PVQ_U(_n,_k)+CELT_PVQ_U(_n,(_k)+1)) |
200 | |||
201 | /*For each V(N,K) supported, we will access element U(min(N,K+1),max(N,K+1)). | ||
202 | Thus, the number of entries in row I is the larger of the maximum number of | ||
203 | pulses we will ever allocate for a given N=I (K=128, or however many fit in | ||
204 | 32 bits, whichever is smaller), plus one, and the maximum N for which | ||
205 | K=I-1 pulses fit in 32 bits. | ||
206 | The largest band size in an Opus Custom mode is 208. | ||
207 | Otherwise, we can limit things to the set of N which can be achieved by | ||
208 | splitting a band from a standard Opus mode: 176, 144, 96, 88, 72, 64, 48, | ||
209 | 44, 36, 32, 24, 22, 18, 16, 8, 4, 2).*/ | ||
210 | #if defined(CUSTOM_MODES) | ||
211 | static const opus_uint32 CELT_PVQ_U_DATA[1488]={ | ||
212 | #else | ||
213 | static const opus_uint32 CELT_PVQ_U_DATA[1272] ICONST_ATTR ={ | ||
214 | #endif | ||
215 | /*N=0, K=0...176:*/ | ||
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, | ||
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, | ||
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, | ||
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, | ||
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, | ||
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, | ||
222 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
223 | #if defined(CUSTOM_MODES) | ||
224 | /*...208:*/ | ||
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, | ||
226 | 0, 0, 0, 0, 0, 0, | ||
227 | #endif | ||
228 | /*N=1, K=1...176:*/ | ||
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, | ||
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, | ||
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, | ||
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, | ||
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, | ||
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, | ||
235 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||
236 | #if defined(CUSTOM_MODES) | ||
237 | /*...208:*/ | ||
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, | ||
239 | 1, 1, 1, 1, 1, 1, | ||
240 | #endif | ||
241 | /*N=2, K=2...176:*/ | ||
242 | 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, | ||
243 | 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, | ||
244 | 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, | ||
245 | 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, | ||
246 | 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, | ||
247 | 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, | ||
248 | 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, | ||
249 | 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, | ||
250 | 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293, | ||
251 | 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 317, 319, 321, 323, | ||
252 | 325, 327, 329, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, | ||
253 | #if defined(CUSTOM_MODES) | ||
254 | /*...208:*/ | ||
255 | 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381, | ||
256 | 383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411, | ||
257 | 413, 415, | ||
258 | #endif | ||
259 | /*N=3, K=3...176:*/ | ||
260 | 13, 25, 41, 61, 85, 113, 145, 181, 221, 265, 313, 365, 421, 481, 545, 613, | ||
261 | 685, 761, 841, 925, 1013, 1105, 1201, 1301, 1405, 1513, 1625, 1741, 1861, | ||
262 | 1985, 2113, 2245, 2381, 2521, 2665, 2813, 2965, 3121, 3281, 3445, 3613, 3785, | ||
263 | 3961, 4141, 4325, 4513, 4705, 4901, 5101, 5305, 5513, 5725, 5941, 6161, 6385, | ||
264 | 6613, 6845, 7081, 7321, 7565, 7813, 8065, 8321, 8581, 8845, 9113, 9385, 9661, | ||
265 | 9941, 10225, 10513, 10805, 11101, 11401, 11705, 12013, 12325, 12641, 12961, | ||
266 | 13285, 13613, 13945, 14281, 14621, 14965, 15313, 15665, 16021, 16381, 16745, | ||
267 | 17113, 17485, 17861, 18241, 18625, 19013, 19405, 19801, 20201, 20605, 21013, | ||
268 | 21425, 21841, 22261, 22685, 23113, 23545, 23981, 24421, 24865, 25313, 25765, | ||
269 | 26221, 26681, 27145, 27613, 28085, 28561, 29041, 29525, 30013, 30505, 31001, | ||
270 | 31501, 32005, 32513, 33025, 33541, 34061, 34585, 35113, 35645, 36181, 36721, | ||
271 | 37265, 37813, 38365, 38921, 39481, 40045, 40613, 41185, 41761, 42341, 42925, | ||
272 | 43513, 44105, 44701, 45301, 45905, 46513, 47125, 47741, 48361, 48985, 49613, | ||
273 | 50245, 50881, 51521, 52165, 52813, 53465, 54121, 54781, 55445, 56113, 56785, | ||
274 | 57461, 58141, 58825, 59513, 60205, 60901, 61601, | ||
275 | #if defined(CUSTOM_MODES) | ||
276 | /*...208:*/ | ||
277 | 62305, 63013, 63725, 64441, 65161, 65885, 66613, 67345, 68081, 68821, 69565, | ||
278 | 70313, 71065, 71821, 72581, 73345, 74113, 74885, 75661, 76441, 77225, 78013, | ||
279 | 78805, 79601, 80401, 81205, 82013, 82825, 83641, 84461, 85285, 86113, | ||
280 | #endif | ||
281 | /*N=4, K=4...176:*/ | ||
282 | 63, 129, 231, 377, 575, 833, 1159, 1561, 2047, 2625, 3303, 4089, 4991, 6017, | ||
283 | 7175, 8473, 9919, 11521, 13287, 15225, 17343, 19649, 22151, 24857, 27775, | ||
284 | 30913, 34279, 37881, 41727, 45825, 50183, 54809, 59711, 64897, 70375, 76153, | ||
285 | 82239, 88641, 95367, 102425, 109823, 117569, 125671, 134137, 142975, 152193, | ||
286 | 161799, 171801, 182207, 193025, 204263, 215929, 228031, 240577, 253575, | ||
287 | 267033, 280959, 295361, 310247, 325625, 341503, 357889, 374791, 392217, | ||
288 | 410175, 428673, 447719, 467321, 487487, 508225, 529543, 551449, 573951, | ||
289 | 597057, 620775, 645113, 670079, 695681, 721927, 748825, 776383, 804609, | ||
290 | 833511, 863097, 893375, 924353, 956039, 988441, 1021567, 1055425, 1090023, | ||
291 | 1125369, 1161471, 1198337, 1235975, 1274393, 1313599, 1353601, 1394407, | ||
292 | 1436025, 1478463, 1521729, 1565831, 1610777, 1656575, 1703233, 1750759, | ||
293 | 1799161, 1848447, 1898625, 1949703, 2001689, 2054591, 2108417, 2163175, | ||
294 | 2218873, 2275519, 2333121, 2391687, 2451225, 2511743, 2573249, 2635751, | ||
295 | 2699257, 2763775, 2829313, 2895879, 2963481, 3032127, 3101825, 3172583, | ||
296 | 3244409, 3317311, 3391297, 3466375, 3542553, 3619839, 3698241, 3777767, | ||
297 | 3858425, 3940223, 4023169, 4107271, 4192537, 4278975, 4366593, 4455399, | ||
298 | 4545401, 4636607, 4729025, 4822663, 4917529, 5013631, 5110977, 5209575, | ||
299 | 5309433, 5410559, 5512961, 5616647, 5721625, 5827903, 5935489, 6044391, | ||
300 | 6154617, 6266175, 6379073, 6493319, 6608921, 6725887, 6844225, 6963943, | ||
301 | 7085049, 7207551, | ||
302 | #if defined(CUSTOM_MODES) | ||
303 | /*...208:*/ | ||
304 | 7331457, 7456775, 7583513, 7711679, 7841281, 7972327, 8104825, 8238783, | ||
305 | 8374209, 8511111, 8649497, 8789375, 8930753, 9073639, 9218041, 9363967, | ||
306 | 9511425, 9660423, 9810969, 9963071, 10116737, 10271975, 10428793, 10587199, | ||
307 | 10747201, 10908807, 11072025, 11236863, 11403329, 11571431, 11741177, | ||
308 | 11912575, | ||
309 | #endif | ||
310 | /*N=5, K=5...176:*/ | ||
311 | 321, 681, 1289, 2241, 3649, 5641, 8361, 11969, 16641, 22569, 29961, 39041, | ||
312 | 50049, 63241, 78889, 97281, 118721, 143529, 172041, 204609, 241601, 283401, | ||
313 | 330409, 383041, 441729, 506921, 579081, 658689, 746241, 842249, 947241, | ||
314 | 1061761, 1186369, 1321641, 1468169, 1626561, 1797441, 1981449, 2179241, | ||
315 | 2391489, 2618881, 2862121, 3121929, 3399041, 3694209, 4008201, 4341801, | ||
316 | 4695809, 5071041, 5468329, 5888521, 6332481, 6801089, 7295241, 7815849, | ||
317 | 8363841, 8940161, 9545769, 10181641, 10848769, 11548161, 12280841, 13047849, | ||
318 | 13850241, 14689089, 15565481, 16480521, 17435329, 18431041, 19468809, | ||
319 | 20549801, 21675201, 22846209, 24064041, 25329929, 26645121, 28010881, | ||
320 | 29428489, 30899241, 32424449, 34005441, 35643561, 37340169, 39096641, | ||
321 | 40914369, 42794761, 44739241, 46749249, 48826241, 50971689, 53187081, | ||
322 | 55473921, 57833729, 60268041, 62778409, 65366401, 68033601, 70781609, | ||
323 | 73612041, 76526529, 79526721, 82614281, 85790889, 89058241, 92418049, | ||
324 | 95872041, 99421961, 103069569, 106816641, 110664969, 114616361, 118672641, | ||
325 | 122835649, 127107241, 131489289, 135983681, 140592321, 145317129, 150160041, | ||
326 | 155123009, 160208001, 165417001, 170752009, 176215041, 181808129, 187533321, | ||
327 | 193392681, 199388289, 205522241, 211796649, 218213641, 224775361, 231483969, | ||
328 | 238341641, 245350569, 252512961, 259831041, 267307049, 274943241, 282741889, | ||
329 | 290705281, 298835721, 307135529, 315607041, 324252609, 333074601, 342075401, | ||
330 | 351257409, 360623041, 370174729, 379914921, 389846081, 399970689, 410291241, | ||
331 | 420810249, 431530241, 442453761, 453583369, 464921641, 476471169, 488234561, | ||
332 | 500214441, 512413449, 524834241, 537479489, 550351881, 563454121, 576788929, | ||
333 | 590359041, 604167209, 618216201, 632508801, | ||
334 | #if defined(CUSTOM_MODES) | ||
335 | /*...208:*/ | ||
336 | 647047809, 661836041, 676876329, 692171521, 707724481, 723538089, 739615241, | ||
337 | 755958849, 772571841, 789457161, 806617769, 824056641, 841776769, 859781161, | ||
338 | 878072841, 896654849, 915530241, 934702089, 954173481, 973947521, 994027329, | ||
339 | 1014416041, 1035116809, 1056132801, 1077467201, 1099123209, 1121104041, | ||
340 | 1143412929, 1166053121, 1189027881, 1212340489, 1235994241, | ||
341 | #endif | ||
342 | /*N=6, K=6...96:*/ | ||
343 | 1683, 3653, 7183, 13073, 22363, 36365, 56695, 85305, 124515, 177045, 246047, | ||
344 | 335137, 448427, 590557, 766727, 982729, 1244979, 1560549, 1937199, 2383409, | ||
345 | 2908411, 3522221, 4235671, 5060441, 6009091, 7095093, 8332863, 9737793, | ||
346 | 11326283, 13115773, 15124775, 17372905, 19880915, 22670725, 25765455, | ||
347 | 29189457, 32968347, 37129037, 41699767, 46710137, 52191139, 58175189, | ||
348 | 64696159, 71789409, 79491819, 87841821, 96879431, 106646281, 117185651, | ||
349 | 128542501, 140763503, 153897073, 167993403, 183104493, 199284183, 216588185, | ||
350 | 235074115, 254801525, 275831935, 298228865, 322057867, 347386557, 374284647, | ||
351 | 402823977, 433078547, 465124549, 499040399, 534906769, 572806619, 612825229, | ||
352 | 655050231, 699571641, 746481891, 795875861, 847850911, 902506913, 959946283, | ||
353 | 1020274013, 1083597703, 1150027593, 1219676595, 1292660325, 1369097135, | ||
354 | 1449108145, 1532817275, 1620351277, 1711839767, 1807415257, 1907213187, | ||
355 | 2011371957, 2120032959, | ||
356 | #if defined(CUSTOM_MODES) | ||
357 | /*...109:*/ | ||
358 | 2233340609U, 2351442379U, 2474488829U, 2602633639U, 2736033641U, 2874848851U, | ||
359 | 3019242501U, 3169381071U, 3325434321U, 3487575323U, 3655980493U, 3830829623U, | ||
360 | 4012305913U, | ||
361 | #endif | ||
362 | /*N=7, K=7...54*/ | ||
363 | 8989, 19825, 40081, 75517, 134245, 227305, 369305, 579125, 880685, 1303777, | ||
364 | 1884961, 2668525, 3707509, 5064793, 6814249, 9041957, 11847485, 15345233, | ||
365 | 19665841, 24957661, 31388293, 39146185, 48442297, 59511829, 72616013, | ||
366 | 88043969, 106114625, 127178701, 151620757, 179861305, 212358985, 249612805, | ||
367 | 292164445, 340600625, 395555537, 457713341, 527810725, 606639529, 695049433, | ||
368 | 793950709, 904317037, 1027188385, 1163673953, 1314955181, 1482288821, | ||
369 | 1667010073, 1870535785, 2094367717, | ||
370 | #if defined(CUSTOM_MODES) | ||
371 | /*...60:*/ | ||
372 | 2340095869U, 2609401873U, 2904062449U, 3225952925U, 3577050821U, 3959439497U, | ||
373 | #endif | ||
374 | /*N=8, K=8...37*/ | ||
375 | 48639, 108545, 224143, 433905, 795455, 1392065, 2340495, 3800305, 5984767, | ||
376 | 9173505, 13726991, 20103025, 28875327, 40754369, 56610575, 77500017, | ||
377 | 104692735, 139703809, 184327311, 240673265, 311207743, 398796225, 506750351, | ||
378 | 638878193, 799538175, 993696769, 1226990095, 1505789553, 1837271615, | ||
379 | 2229491905U, | ||
380 | #if defined(CUSTOM_MODES) | ||
381 | /*...40:*/ | ||
382 | 2691463695U, 3233240945U, 3866006015U, | ||
383 | #endif | ||
384 | /*N=9, K=9...28:*/ | ||
385 | 265729, 598417, 1256465, 2485825, 4673345, 8405905, 14546705, 24331777, | ||
386 | 39490049, 62390545, 96220561, 145198913, 214828609, 312193553, 446304145, | ||
387 | 628496897, 872893441, 1196924561, 1621925137, 2173806145U, | ||
388 | #if defined(CUSTOM_MODES) | ||
389 | /*...29:*/ | ||
390 | 2883810113U, | ||
391 | #endif | ||
392 | /*N=10, K=10...24:*/ | ||
393 | 1462563, 3317445, 7059735, 14218905, 27298155, 50250765, 89129247, 152951073, | ||
394 | 254831667, 413442773, 654862247, 1014889769, 1541911931, 2300409629U, | ||
395 | 3375210671U, | ||
396 | /*N=11, K=11...19:*/ | ||
397 | 8097453, 18474633, 39753273, 81270333, 158819253, 298199265, 540279585, | ||
398 | 948062325, 1616336765, | ||
399 | #if defined(CUSTOM_MODES) | ||
400 | /*...20:*/ | ||
401 | 2684641785U, | ||
402 | #endif | ||
403 | /*N=12, K=12...18:*/ | ||
404 | 45046719, 103274625, 224298231, 464387817, 921406335, 1759885185, | ||
405 | 3248227095U, | ||
406 | /*N=13, K=13...16:*/ | ||
407 | 251595969, 579168825, 1267854873, 2653649025U, | ||
408 | /*N=14, K=14:*/ | ||
409 | 1409933619 | ||
410 | }; | ||
259 | 411 | ||
260 | /*Compute V(2,_k).*/ | 412 | #if defined(CUSTOM_MODES) |
261 | static inline opus_uint32 ncwrs2(int _k){ | 413 | const opus_uint32 *const CELT_PVQ_U_ROW[15]={ |
262 | celt_assert(_k>0); | 414 | CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 208,CELT_PVQ_U_DATA+ 415, |
263 | return 4*(opus_uint32)_k; | 415 | CELT_PVQ_U_DATA+ 621,CELT_PVQ_U_DATA+ 826,CELT_PVQ_U_DATA+1030, |
416 | CELT_PVQ_U_DATA+1233,CELT_PVQ_U_DATA+1336,CELT_PVQ_U_DATA+1389, | ||
417 | CELT_PVQ_U_DATA+1421,CELT_PVQ_U_DATA+1441,CELT_PVQ_U_DATA+1455, | ||
418 | CELT_PVQ_U_DATA+1464,CELT_PVQ_U_DATA+1470,CELT_PVQ_U_DATA+1473 | ||
419 | }; | ||
420 | #else | ||
421 | const opus_uint32 *const CELT_PVQ_U_ROW[15]={ | ||
422 | CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 176,CELT_PVQ_U_DATA+ 351, | ||
423 | CELT_PVQ_U_DATA+ 525,CELT_PVQ_U_DATA+ 698,CELT_PVQ_U_DATA+ 870, | ||
424 | CELT_PVQ_U_DATA+1041,CELT_PVQ_U_DATA+1131,CELT_PVQ_U_DATA+1178, | ||
425 | CELT_PVQ_U_DATA+1207,CELT_PVQ_U_DATA+1226,CELT_PVQ_U_DATA+1240, | ||
426 | CELT_PVQ_U_DATA+1248,CELT_PVQ_U_DATA+1254,CELT_PVQ_U_DATA+1257 | ||
427 | }; | ||
428 | #endif | ||
429 | |||
430 | #if defined(CUSTOM_MODES) | ||
431 | void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ | ||
432 | int k; | ||
433 | /*_maxk==0 => there's nothing to do.*/ | ||
434 | celt_assert(_maxk>0); | ||
435 | _bits[0]=0; | ||
436 | for(k=1;k<=_maxk;k++)_bits[k]=log2_frac(CELT_PVQ_V(_n,k),_frac); | ||
264 | } | 437 | } |
438 | #endif | ||
265 | 439 | ||
266 | /*Compute U(3,_k). | 440 | static opus_uint32 icwrs(int _n,const int *_y){ |
267 | Note that this may be called with _k=32768 (maxK[3]+1).*/ | 441 | opus_uint32 i; |
268 | static inline opus_uint32 ucwrs3(unsigned _k){ | 442 | int j; |
269 | celt_assert(_k>0); | 443 | int k; |
270 | return (2*(opus_uint32)_k-2)*_k+1; | 444 | celt_assert(_n>=2); |
445 | j=_n-1; | ||
446 | i=_y[j]<0; | ||
447 | k=abs(_y[j]); | ||
448 | do{ | ||
449 | j--; | ||
450 | i+=CELT_PVQ_U(_n-j,k); | ||
451 | k+=abs(_y[j]); | ||
452 | if(_y[j]<0)i+=CELT_PVQ_U(_n-j,k+1); | ||
453 | } | ||
454 | while(j>0); | ||
455 | return i; | ||
271 | } | 456 | } |
272 | 457 | ||
273 | /*Compute V(3,_k).*/ | 458 | void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ |
274 | static inline opus_uint32 ncwrs3(int _k){ | ||
275 | celt_assert(_k>0); | 459 | celt_assert(_k>0); |
276 | return 2*(2*(unsigned)_k*(opus_uint32)_k+1); | 460 | ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k)); |
277 | } | 461 | } |
278 | 462 | ||
279 | /*Compute U(4,_k).*/ | 463 | static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ |
280 | static inline opus_uint32 ucwrs4(int _k){ | 464 | opus_uint32 p; |
465 | int s; | ||
466 | int k0; | ||
281 | celt_assert(_k>0); | 467 | celt_assert(_k>0); |
282 | return imusdiv32odd(2*_k,(2*_k-3)*(opus_uint32)_k+4,3,1); | 468 | celt_assert(_n>1); |
469 | while(_n>2){ | ||
470 | opus_uint32 q; | ||
471 | /*Lots of pulses case:*/ | ||
472 | if(_k>=_n){ | ||
473 | const opus_uint32 *row; | ||
474 | row=CELT_PVQ_U_ROW[_n]; | ||
475 | /*Are the pulses in this dimension negative?*/ | ||
476 | p=row[_k+1]; | ||
477 | s=-(_i>=p); | ||
478 | _i-=p&s; | ||
479 | /*Count how many pulses were placed in this dimension.*/ | ||
480 | k0=_k; | ||
481 | q=row[_n]; | ||
482 | if(q>_i){ | ||
483 | celt_assert(p>q); | ||
484 | _k=_n; | ||
485 | do p=CELT_PVQ_U_ROW[--_k][_n]; | ||
486 | while(p>_i); | ||
487 | } | ||
488 | else for(p=row[_k];p>_i;p=row[_k])_k--; | ||
489 | _i-=p; | ||
490 | *_y++=(k0-_k+s)^s; | ||
491 | } | ||
492 | /*Lots of dimensions case:*/ | ||
493 | else{ | ||
494 | /*Are there any pulses in this dimension at all?*/ | ||
495 | p=CELT_PVQ_U_ROW[_k][_n]; | ||
496 | q=CELT_PVQ_U_ROW[_k+1][_n]; | ||
497 | if(p<=_i&&_i<q){ | ||
498 | _i-=p; | ||
499 | *_y++=0; | ||
500 | } | ||
501 | else{ | ||
502 | /*Are the pulses in this dimension negative?*/ | ||
503 | s=-(_i>=q); | ||
504 | _i-=q&s; | ||
505 | /*Count how many pulses were placed in this dimension.*/ | ||
506 | k0=_k; | ||
507 | do p=CELT_PVQ_U_ROW[--_k][_n]; | ||
508 | while(p>_i); | ||
509 | _i-=p; | ||
510 | *_y++=(k0-_k+s)^s; | ||
511 | } | ||
512 | } | ||
513 | _n--; | ||
514 | } | ||
515 | /*_n==2*/ | ||
516 | p=2*_k+1; | ||
517 | s=-(_i>=p); | ||
518 | _i-=p&s; | ||
519 | k0=_k; | ||
520 | _k=(_i+1)>>1; | ||
521 | if(_k)_i-=2*_k-1; | ||
522 | *_y++=(k0-_k+s)^s; | ||
523 | /*_n==1*/ | ||
524 | s=-(int)_i; | ||
525 | *_y=(_k+s)^s; | ||
283 | } | 526 | } |
284 | 527 | ||
285 | /*Compute V(4,_k).*/ | 528 | void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ |
286 | static inline opus_uint32 ncwrs4(int _k){ | 529 | cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y); |
287 | celt_assert(_k>0); | ||
288 | return ((_k*(opus_uint32)_k+2)*_k)/3<<3; | ||
289 | } | 530 | } |
290 | 531 | ||
291 | #endif /* SMALL_FOOTPRINT */ | 532 | #else /* SMALL_FOOTPRINT */ |
292 | 533 | ||
293 | /*Computes the next row/column of any recurrence that obeys the relation | 534 | /*Computes the next row/column of any recurrence that obeys the relation |
294 | u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. | 535 | u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. |
@@ -333,125 +574,18 @@ static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){ | |||
333 | celt_assert(len>=3); | 574 | celt_assert(len>=3); |
334 | _u[0]=0; | 575 | _u[0]=0; |
335 | _u[1]=um2=1; | 576 | _u[1]=um2=1; |
336 | #ifndef SMALL_FOOTPRINT | 577 | /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ |
337 | /*_k>52 doesn't work in the false branch due to the limits of INV_TABLE, | 578 | /*If _n==1, _u[i] should be 1 for i>1.*/ |
338 | but _k isn't tested here because k<=52 for n=7*/ | 579 | celt_assert(_n>=2); |
339 | if(_n<=6) | 580 | /*If _k==0, the following do-while loop will overflow the buffer.*/ |
340 | #endif | 581 | celt_assert(_k>0); |
341 | { | 582 | k=2; |
342 | /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ | 583 | do _u[k]=(k<<1)-1; |
343 | /*If _n==1, _u[i] should be 1 for i>1.*/ | 584 | while(++k<len); |
344 | celt_assert(_n>=2); | 585 | for(k=2;k<_n;k++)unext(_u+1,_k+1,1); |
345 | /*If _k==0, the following do-while loop will overflow the buffer.*/ | ||
346 | celt_assert(_k>0); | ||
347 | k=2; | ||
348 | do _u[k]=(k<<1)-1; | ||
349 | while(++k<len); | ||
350 | for(k=2;k<_n;k++)unext(_u+1,_k+1,1); | ||
351 | } | ||
352 | #ifndef SMALL_FOOTPRINT | ||
353 | else{ | ||
354 | opus_uint32 um1; | ||
355 | opus_uint32 n2m1; | ||
356 | _u[2]=n2m1=um1=(_n<<1)-1; | ||
357 | for(k=3;k<len;k++){ | ||
358 | /*U(N,K) = ((2*N-1)*U(N,K-1)-U(N,K-2))/(K-1) + U(N,K-2)*/ | ||
359 | _u[k]=um2=imusdiv32even(n2m1,um1,um2,k-1)+um2; | ||
360 | if(++k>=len)break; | ||
361 | _u[k]=um1=imusdiv32odd(n2m1,um2,um1,(k-1)>>1)+um1; | ||
362 | } | ||
363 | } | ||
364 | #endif /* SMALL_FOOTPRINT */ | ||
365 | return _u[_k]+_u[_k+1]; | 586 | return _u[_k]+_u[_k+1]; |
366 | } | 587 | } |
367 | 588 | ||
368 | #ifndef SMALL_FOOTPRINT | ||
369 | |||
370 | /*Returns the _i'th combination of _k elements (at most 32767) chosen from a | ||
371 | set of size 1 with associated sign bits. | ||
372 | _y: Returns the vector of pulses.*/ | ||
373 | static inline void cwrsi1(int _k,opus_uint32 _i,int *_y){ | ||
374 | int s; | ||
375 | s=-(int)_i; | ||
376 | _y[0]=(_k+s)^s; | ||
377 | } | ||
378 | |||
379 | /*Returns the _i'th combination of _k elements (at most 32767) chosen from a | ||
380 | set of size 2 with associated sign bits. | ||
381 | _y: Returns the vector of pulses.*/ | ||
382 | static inline void cwrsi2(int _k,opus_uint32 _i,int *_y){ | ||
383 | opus_uint32 p; | ||
384 | int s; | ||
385 | int yj; | ||
386 | p=ucwrs2(_k+1U); | ||
387 | s=-(_i>=p); | ||
388 | _i-=p&s; | ||
389 | yj=_k; | ||
390 | _k=(_i+1)>>1; | ||
391 | p=_k?ucwrs2(_k):0; | ||
392 | _i-=p; | ||
393 | yj-=_k; | ||
394 | _y[0]=(yj+s)^s; | ||
395 | cwrsi1(_k,_i,_y+1); | ||
396 | } | ||
397 | |||
398 | /*Returns the _i'th combination of _k elements (at most 32767) chosen from a | ||
399 | set of size 3 with associated sign bits. | ||
400 | _y: Returns the vector of pulses.*/ | ||
401 | static void cwrsi3(int _k,opus_uint32 _i,int *_y){ | ||
402 | opus_uint32 p; | ||
403 | int s; | ||
404 | int yj; | ||
405 | p=ucwrs3(_k+1U); | ||
406 | s=-(_i>=p); | ||
407 | _i-=p&s; | ||
408 | yj=_k; | ||
409 | /*Finds the maximum _k such that ucwrs3(_k)<=_i (tested for all | ||
410 | _i<2147418113=U(3,32768)).*/ | ||
411 | _k=_i>0?(isqrt32(2*_i-1)+1)>>1:0; | ||
412 | p=_k?ucwrs3(_k):0; | ||
413 | _i-=p; | ||
414 | yj-=_k; | ||
415 | _y[0]=(yj+s)^s; | ||
416 | cwrsi2(_k,_i,_y+1); | ||
417 | } | ||
418 | |||
419 | /*Returns the _i'th combination of _k elements (at most 1172) chosen from a set | ||
420 | of size 4 with associated sign bits. | ||
421 | _y: Returns the vector of pulses.*/ | ||
422 | static void cwrsi4(int _k,opus_uint32 _i,int *_y){ | ||
423 | opus_uint32 p; | ||
424 | int s; | ||
425 | int yj; | ||
426 | int kl; | ||
427 | int kr; | ||
428 | p=ucwrs4(_k+1); | ||
429 | s=-(_i>=p); | ||
430 | _i-=p&s; | ||
431 | yj=_k; | ||
432 | /*We could solve a cubic for k here, but the form of the direct solution does | ||
433 | not lend itself well to exact integer arithmetic. | ||
434 | Instead we do a binary search on U(4,K).*/ | ||
435 | kl=0; | ||
436 | kr=_k; | ||
437 | for(;;){ | ||
438 | _k=(kl+kr)>>1; | ||
439 | p=_k?ucwrs4(_k):0; | ||
440 | if(p<_i){ | ||
441 | if(_k>=kr)break; | ||
442 | kl=_k+1; | ||
443 | } | ||
444 | else if(p>_i)kr=_k-1; | ||
445 | else break; | ||
446 | } | ||
447 | _i-=p; | ||
448 | yj-=_k; | ||
449 | _y[0]=(yj+s)^s; | ||
450 | cwrsi3(_k,_i,_y+1); | ||
451 | } | ||
452 | |||
453 | #endif /* SMALL_FOOTPRINT */ | ||
454 | |||
455 | /*Returns the _i'th combination of _k elements chosen from a set of size _n | 589 | /*Returns the _i'th combination of _k elements chosen from a set of size _n |
456 | with associated sign bits. | 590 | with associated sign bits. |
457 | _y: Returns the vector of pulses. | 591 | _y: Returns the vector of pulses. |
@@ -488,55 +622,6 @@ static inline opus_uint32 icwrs1(const int *_y,int *_k){ | |||
488 | return _y[0]<0; | 622 | return _y[0]<0; |
489 | } | 623 | } |
490 | 624 | ||
491 | #ifndef SMALL_FOOTPRINT | ||
492 | |||
493 | /*Returns the index of the given combination of K elements chosen from a set | ||
494 | of size 2 with associated sign bits. | ||
495 | _y: The vector of pulses, whose sum of absolute values is K. | ||
496 | _k: Returns K.*/ | ||
497 | static inline opus_uint32 icwrs2(const int *_y,int *_k){ | ||
498 | opus_uint32 i; | ||
499 | int k; | ||
500 | i=icwrs1(_y+1,&k); | ||
501 | i+=k?ucwrs2(k):0; | ||
502 | k+=abs(_y[0]); | ||
503 | if(_y[0]<0)i+=ucwrs2(k+1U); | ||
504 | *_k=k; | ||
505 | return i; | ||
506 | } | ||
507 | |||
508 | /*Returns the index of the given combination of K elements chosen from a set | ||
509 | of size 3 with associated sign bits. | ||
510 | _y: The vector of pulses, whose sum of absolute values is K. | ||
511 | _k: Returns K.*/ | ||
512 | static inline opus_uint32 icwrs3(const int *_y,int *_k){ | ||
513 | opus_uint32 i; | ||
514 | int k; | ||
515 | i=icwrs2(_y+1,&k); | ||
516 | i+=k?ucwrs3(k):0; | ||
517 | k+=abs(_y[0]); | ||
518 | if(_y[0]<0)i+=ucwrs3(k+1U); | ||
519 | *_k=k; | ||
520 | return i; | ||
521 | } | ||
522 | |||
523 | /*Returns the index of the given combination of K elements chosen from a set | ||
524 | of size 4 with associated sign bits. | ||
525 | _y: The vector of pulses, whose sum of absolute values is K. | ||
526 | _k: Returns K.*/ | ||
527 | static inline opus_uint32 icwrs4(const int *_y,int *_k){ | ||
528 | opus_uint32 i; | ||
529 | int k; | ||
530 | i=icwrs3(_y+1,&k); | ||
531 | i+=k?ucwrs4(k):0; | ||
532 | k+=abs(_y[0]); | ||
533 | if(_y[0]<0)i+=ucwrs4(k+1); | ||
534 | *_k=k; | ||
535 | return i; | ||
536 | } | ||
537 | |||
538 | #endif /* SMALL_FOOTPRINT */ | ||
539 | |||
540 | /*Returns the index of the given combination of K elements chosen from a set | 625 | /*Returns the index of the given combination of K elements chosen from a set |
541 | of size _n with associated sign bits. | 626 | of size _n with associated sign bits. |
542 | _y: The vector of pulses, whose sum of absolute values must be _k. | 627 | _y: The vector of pulses, whose sum of absolute values must be _k. |
@@ -544,8 +629,8 @@ static inline opus_uint32 icwrs4(const int *_y,int *_k){ | |||
544 | static inline opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y, | 629 | static inline opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y, |
545 | opus_uint32 *_u){ | 630 | opus_uint32 *_u){ |
546 | opus_uint32 i; | 631 | opus_uint32 i; |
547 | int j; | 632 | int j; |
548 | int k; | 633 | int k; |
549 | /*We can't unroll the first two iterations of the loop unless _n>=2.*/ | 634 | /*We can't unroll the first two iterations of the loop unless _n>=2.*/ |
550 | celt_assert(_n>=2); | 635 | celt_assert(_n>=2); |
551 | _u[0]=0; | 636 | _u[0]=0; |
@@ -590,58 +675,23 @@ void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ | |||
590 | 675 | ||
591 | void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ | 676 | void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ |
592 | opus_uint32 i; | 677 | opus_uint32 i; |
678 | VARDECL(opus_uint32,u); | ||
679 | opus_uint32 nc; | ||
680 | SAVE_STACK; | ||
593 | celt_assert(_k>0); | 681 | celt_assert(_k>0); |
594 | #ifndef SMALL_FOOTPRINT | 682 | ALLOC(u,_k+2U,opus_uint32); |
595 | switch(_n){ | 683 | i=icwrs(_n,_k,&nc,_y,u); |
596 | case 2:{ | 684 | ec_enc_uint(_enc,i,nc); |
597 | i=icwrs2(_y,&_k); | 685 | RESTORE_STACK; |
598 | ec_enc_uint(_enc,i,ncwrs2(_k)); | ||
599 | }break; | ||
600 | case 3:{ | ||
601 | i=icwrs3(_y,&_k); | ||
602 | ec_enc_uint(_enc,i,ncwrs3(_k)); | ||
603 | }break; | ||
604 | case 4:{ | ||
605 | i=icwrs4(_y,&_k); | ||
606 | ec_enc_uint(_enc,i,ncwrs4(_k)); | ||
607 | }break; | ||
608 | default: | ||
609 | { | ||
610 | #endif | ||
611 | VARDECL(opus_uint32,u); | ||
612 | opus_uint32 nc; | ||
613 | SAVE_STACK; | ||
614 | ALLOC(u,_k+2U,opus_uint32); | ||
615 | i=icwrs(_n,_k,&nc,_y,u); | ||
616 | ec_enc_uint(_enc,i,nc); | ||
617 | RESTORE_STACK; | ||
618 | #ifndef SMALL_FOOTPRINT | ||
619 | } | ||
620 | break; | ||
621 | } | ||
622 | #endif | ||
623 | } | 686 | } |
624 | 687 | ||
625 | void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec) | 688 | void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ |
626 | { | 689 | VARDECL(opus_uint32,u); |
690 | SAVE_STACK; | ||
627 | celt_assert(_k>0); | 691 | celt_assert(_k>0); |
628 | #ifndef SMALL_FOOTPRINT | 692 | ALLOC(u,_k+2U,opus_uint32); |
629 | switch(_n){ | 693 | cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); |
630 | case 2:cwrsi2(_k,ec_dec_uint(_dec,ncwrs2(_k)),_y);break; | 694 | RESTORE_STACK; |
631 | case 3:cwrsi3(_k,ec_dec_uint(_dec,ncwrs3(_k)),_y);break; | ||
632 | case 4:cwrsi4(_k,ec_dec_uint(_dec,ncwrs4(_k)),_y);break; | ||
633 | default: | ||
634 | { | ||
635 | #endif | ||
636 | /* VARDECL(opus_uint32,u); | ||
637 | SAVE_STACK; | ||
638 | ALLOC(u,_k+2U,opus_uint32); */ | ||
639 | opus_uint32 u[MAX_PULSES+2]; | ||
640 | cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); | ||
641 | /* RESTORE_STACK; */ | ||
642 | #ifndef SMALL_FOOTPRINT | ||
643 | } | ||
644 | break; | ||
645 | } | ||
646 | #endif | ||
647 | } | 695 | } |
696 | |||
697 | #endif /* SMALL_FOOTPRINT */ | ||