diff options
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 */ | ||