OLD | NEW |
1 /* Copyright (c) 2007-2008 CSIRO | 1 /* Copyright (c) 2007-2008 CSIRO |
2 Copyright (c) 2007-2009 Xiph.Org Foundation | 2 Copyright (c) 2007-2009 Xiph.Org Foundation |
3 Copyright (c) 2007-2009 Timothy B. Terriberry | 3 Copyright (c) 2007-2009 Timothy B. Terriberry |
4 Written by Timothy B. Terriberry and Jean-Marc Valin */ | 4 Written by Timothy B. Terriberry and Jean-Marc Valin */ |
5 /* | 5 /* |
6 Redistribution and use in source and binary forms, with or without | 6 Redistribution and use in source and binary forms, with or without |
7 modification, are permitted provided that the following conditions | 7 modification, are permitted provided that the following conditions |
8 are met: | 8 are met: |
9 | 9 |
10 - Redistributions of source code must retain the above copyright | 10 - Redistributions of source code must retain the above copyright |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 } | 64 } |
65 while(frac-->0); | 65 while(frac-->0); |
66 /*If val is not exactly 0x8000, then we have to round up the remainder.*/ | 66 /*If val is not exactly 0x8000, then we have to round up the remainder.*/ |
67 return l+(val>0x8000); | 67 return l+(val>0x8000); |
68 } | 68 } |
69 /*Exact powers of two require no rounding.*/ | 69 /*Exact powers of two require no rounding.*/ |
70 else return (l-1)<<frac; | 70 else return (l-1)<<frac; |
71 } | 71 } |
72 #endif | 72 #endif |
73 | 73 |
74 #ifndef SMALL_FOOTPRINT | |
75 | |
76 #define MASK32 (0xFFFFFFFF) | |
77 | |
78 /*INV_TABLE[i] holds the multiplicative inverse of (2*i+1) mod 2**32.*/ | |
79 static const opus_uint32 INV_TABLE[53]={ | |
80 0x00000001,0xAAAAAAAB,0xCCCCCCCD,0xB6DB6DB7, | |
81 0x38E38E39,0xBA2E8BA3,0xC4EC4EC5,0xEEEEEEEF, | |
82 0xF0F0F0F1,0x286BCA1B,0x3CF3CF3D,0xE9BD37A7, | |
83 0xC28F5C29,0x684BDA13,0x4F72C235,0xBDEF7BDF, | |
84 0x3E0F83E1,0x8AF8AF8B,0x914C1BAD,0x96F96F97, | |
85 0xC18F9C19,0x2FA0BE83,0xA4FA4FA5,0x677D46CF, | |
86 0x1A1F58D1,0xFAFAFAFB,0x8C13521D,0x586FB587, | |
87 0xB823EE09,0xA08AD8F3,0xC10C9715,0xBEFBEFBF, | |
88 0xC0FC0FC1,0x07A44C6B,0xA33F128D,0xE327A977, | |
89 0xC7E3F1F9,0x962FC963,0x3F2B3885,0x613716AF, | |
90 0x781948B1,0x2B2E43DB,0xFCFCFCFD,0x6FD0EB67, | |
91 0xFA3F47E9,0xD2FD2FD3,0x3F4FD3F5,0xD4E25B9F, | |
92 0x5F02A3A1,0xBF5A814B,0x7C32B16D,0xD3431B57, | |
93 0xD8FD8FD9, | |
94 }; | |
95 | |
96 /*Computes (_a*_b-_c)/(2*_d+1) when the quotient is known to be exact. | |
97 _a, _b, _c, and _d may be arbitrary so long as the arbitrary precision result | |
98 fits in 32 bits, but currently the table for multiplicative inverses is only | |
99 valid for _d<=52.*/ | |
100 static inline opus_uint32 imusdiv32odd(opus_uint32 _a,opus_uint32 _b, | |
101 opus_uint32 _c,int _d){ | |
102 celt_assert(_d<=52); | |
103 return (_a*_b-_c)*INV_TABLE[_d]&MASK32; | |
104 } | |
105 | |
106 /*Computes (_a*_b-_c)/_d when the quotient is known to be exact. | |
107 _d does not actually have to be even, but imusdiv32odd will be faster when | |
108 it's odd, so you should use that instead. | |
109 _a and _d are assumed to be small (e.g., _a*_d fits in 32 bits; currently the | |
110 table for multiplicative inverses is only valid for _d<=54). | |
111 _b and _c may be arbitrary so long as the arbitrary precision reuslt fits in | |
112 32 bits.*/ | |
113 static inline opus_uint32 imusdiv32even(opus_uint32 _a,opus_uint32 _b, | |
114 opus_uint32 _c,int _d){ | |
115 opus_uint32 inv; | |
116 int mask; | |
117 int shift; | |
118 int one; | |
119 celt_assert(_d>0); | |
120 celt_assert(_d<=54); | |
121 shift=EC_ILOG(_d^(_d-1)); | |
122 inv=INV_TABLE[(_d-1)>>shift]; | |
123 shift--; | |
124 one=1<<shift; | |
125 mask=one-1; | |
126 return (_a*(_b>>shift)-(_c>>shift)+ | |
127 ((_a*(_b&mask)+one-(_c&mask))>>shift)-1)*inv&MASK32; | |
128 } | |
129 | |
130 #endif /* SMALL_FOOTPRINT */ | |
131 | |
132 /*Although derived separately, the pulse vector coding scheme is equivalent to | 74 /*Although derived separately, the pulse vector coding scheme is equivalent to |
133 a Pyramid Vector Quantizer \cite{Fis86}. | 75 a Pyramid Vector Quantizer \cite{Fis86}. |
134 Some additional notes about an early version appear at | 76 Some additional notes about an early version appear at |
135 http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering | 77 http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering |
136 and the definitions of some terms have evolved since that was written. | 78 and the definitions of some terms have evolved since that was written. |
137 | 79 |
138 The conversion from a pulse vector to an integer index (encoding) and back | 80 The conversion from a pulse vector to an integer index (encoding) and back |
139 (decoding) is governed by two related functions, V(N,K) and U(N,K). | 81 (decoding) is governed by two related functions, V(N,K) and U(N,K). |
140 | 82 |
141 V(N,K) = the number of combinations, with replacement, of N items, taken K | 83 V(N,K) = the number of combinations, with replacement, of N items, taken K |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 author="Thomas R. Fischer", | 183 author="Thomas R. Fischer", |
242 title="A Pyramid Vector Quantizer", | 184 title="A Pyramid Vector Quantizer", |
243 journal="IEEE Transactions on Information Theory", | 185 journal="IEEE Transactions on Information Theory", |
244 volume="IT-32", | 186 volume="IT-32", |
245 number=4, | 187 number=4, |
246 pages="568--583", | 188 pages="568--583", |
247 month=Jul, | 189 month=Jul, |
248 year=1986 | 190 year=1986 |
249 }*/ | 191 }*/ |
250 | 192 |
251 #ifndef SMALL_FOOTPRINT | 193 #if !defined(SMALL_FOOTPRINT) |
252 /*Compute U(2,_k). | 194 |
253 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*/ |
254 static inline unsigned ucwrs2(unsigned _k){ | 196 # define CELT_PVQ_U(_n,_k) (CELT_PVQ_U_ROW[IMIN(_n,_k)][IMAX(_n,_k)]) |
| 197 /*V(N,K) := U(N,K)+U(N,K+1) = the number of PVQ codewords for a band of size N |
| 198 with K pulses allocated to it.*/ |
| 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]={ |
| 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 }; |
| 411 |
| 412 #if defined(CUSTOM_MODES) |
| 413 const opus_uint32 *const CELT_PVQ_U_ROW[15]={ |
| 414 CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 208,CELT_PVQ_U_DATA+ 415, |
| 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); |
| 437 } |
| 438 #endif |
| 439 |
| 440 static opus_uint32 icwrs(int _n,const int *_y){ |
| 441 opus_uint32 i; |
| 442 int j; |
| 443 int k; |
| 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; |
| 456 } |
| 457 |
| 458 void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ |
255 celt_assert(_k>0); | 459 celt_assert(_k>0); |
256 return _k+(_k-1); | 460 ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k)); |
257 } | 461 } |
258 | 462 |
259 /*Compute V(2,_k).*/ | 463 static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ |
260 static inline opus_uint32 ncwrs2(int _k){ | 464 opus_uint32 p; |
| 465 int s; |
| 466 int k0; |
261 celt_assert(_k>0); | 467 celt_assert(_k>0); |
262 return 4*(opus_uint32)_k; | 468 celt_assert(_n>1); |
263 } | 469 while(_n>2){ |
264 | 470 opus_uint32 q; |
265 /*Compute U(3,_k). | 471 /*Lots of pulses case:*/ |
266 Note that this may be called with _k=32768 (maxK[3]+1).*/ | 472 if(_k>=_n){ |
267 static inline opus_uint32 ucwrs3(unsigned _k){ | 473 const opus_uint32 *row; |
268 celt_assert(_k>0); | 474 row=CELT_PVQ_U_ROW[_n]; |
269 return (2*(opus_uint32)_k-2)*_k+1; | 475 /*Are the pulses in this dimension negative?*/ |
270 } | 476 p=row[_k+1]; |
271 | 477 s=-(_i>=p); |
272 /*Compute V(3,_k).*/ | 478 _i-=p&s; |
273 static inline opus_uint32 ncwrs3(int _k){ | 479 /*Count how many pulses were placed in this dimension.*/ |
274 celt_assert(_k>0); | 480 k0=_k; |
275 return 2*(2*(unsigned)_k*(opus_uint32)_k+1); | 481 q=row[_n]; |
276 } | 482 if(q>_i){ |
277 | 483 celt_assert(p>q); |
278 /*Compute U(4,_k).*/ | 484 _k=_n; |
279 static inline opus_uint32 ucwrs4(int _k){ | 485 do p=CELT_PVQ_U_ROW[--_k][_n]; |
280 celt_assert(_k>0); | 486 while(p>_i); |
281 return imusdiv32odd(2*_k,(2*_k-3)*(opus_uint32)_k+4,3,1); | 487 } |
282 } | 488 else for(p=row[_k];p>_i;p=row[_k])_k--; |
283 | 489 _i-=p; |
284 /*Compute V(4,_k).*/ | 490 *_y++=(k0-_k+s)^s; |
285 static inline opus_uint32 ncwrs4(int _k){ | 491 } |
286 celt_assert(_k>0); | 492 /*Lots of dimensions case:*/ |
287 return ((_k*(opus_uint32)_k+2)*_k)/3<<3; | 493 else{ |
288 } | 494 /*Are there any pulses in this dimension at all?*/ |
289 | 495 p=CELT_PVQ_U_ROW[_k][_n]; |
290 #endif /* SMALL_FOOTPRINT */ | 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; |
| 526 } |
| 527 |
| 528 void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ |
| 529 cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y); |
| 530 } |
| 531 |
| 532 #else /* SMALL_FOOTPRINT */ |
291 | 533 |
292 /*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 |
293 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]. |
294 _ui0 is the base case for the new row/column.*/ | 536 _ui0 is the base case for the new row/column.*/ |
295 static inline void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ | 537 static inline void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ |
296 opus_uint32 ui1; | 538 opus_uint32 ui1; |
297 unsigned j; | 539 unsigned j; |
298 /*This do-while will overrun the array if we don't have storage for at least | 540 /*This do-while will overrun the array if we don't have storage for at least |
299 2 values.*/ | 541 2 values.*/ |
300 j=1; do { | 542 j=1; do { |
(...skipping 24 matching lines...) Expand all Loading... |
325 _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ | 567 _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ |
326 static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){ | 568 static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){ |
327 opus_uint32 um2; | 569 opus_uint32 um2; |
328 unsigned len; | 570 unsigned len; |
329 unsigned k; | 571 unsigned k; |
330 len=_k+2; | 572 len=_k+2; |
331 /*We require storage at least 3 values (e.g., _k>0).*/ | 573 /*We require storage at least 3 values (e.g., _k>0).*/ |
332 celt_assert(len>=3); | 574 celt_assert(len>=3); |
333 _u[0]=0; | 575 _u[0]=0; |
334 _u[1]=um2=1; | 576 _u[1]=um2=1; |
335 #ifndef SMALL_FOOTPRINT | 577 /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ |
336 /*_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.*/ |
337 but _k isn't tested here because k<=52 for n=7*/ | 579 celt_assert(_n>=2); |
338 if(_n<=6) | 580 /*If _k==0, the following do-while loop will overflow the buffer.*/ |
339 #endif | 581 celt_assert(_k>0); |
340 { | 582 k=2; |
341 /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ | 583 do _u[k]=(k<<1)-1; |
342 /*If _n==1, _u[i] should be 1 for i>1.*/ | 584 while(++k<len); |
343 celt_assert(_n>=2); | 585 for(k=2;k<_n;k++)unext(_u+1,_k+1,1); |
344 /*If _k==0, the following do-while loop will overflow the buffer.*/ | |
345 celt_assert(_k>0); | |
346 k=2; | |
347 do _u[k]=(k<<1)-1; | |
348 while(++k<len); | |
349 for(k=2;k<_n;k++)unext(_u+1,_k+1,1); | |
350 } | |
351 #ifndef SMALL_FOOTPRINT | |
352 else{ | |
353 opus_uint32 um1; | |
354 opus_uint32 n2m1; | |
355 _u[2]=n2m1=um1=(_n<<1)-1; | |
356 for(k=3;k<len;k++){ | |
357 /*U(N,K) = ((2*N-1)*U(N,K-1)-U(N,K-2))/(K-1) + U(N,K-2)*/ | |
358 _u[k]=um2=imusdiv32even(n2m1,um1,um2,k-1)+um2; | |
359 if(++k>=len)break; | |
360 _u[k]=um1=imusdiv32odd(n2m1,um2,um1,(k-1)>>1)+um1; | |
361 } | |
362 } | |
363 #endif /* SMALL_FOOTPRINT */ | |
364 return _u[_k]+_u[_k+1]; | 586 return _u[_k]+_u[_k+1]; |
365 } | 587 } |
366 | 588 |
367 #ifndef SMALL_FOOTPRINT | |
368 | |
369 /*Returns the _i'th combination of _k elements (at most 32767) chosen from a | |
370 set of size 1 with associated sign bits. | |
371 _y: Returns the vector of pulses.*/ | |
372 static inline void cwrsi1(int _k,opus_uint32 _i,int *_y){ | |
373 int s; | |
374 s=-(int)_i; | |
375 _y[0]=(_k+s)^s; | |
376 } | |
377 | |
378 /*Returns the _i'th combination of _k elements (at most 32767) chosen from a | |
379 set of size 2 with associated sign bits. | |
380 _y: Returns the vector of pulses.*/ | |
381 static inline void cwrsi2(int _k,opus_uint32 _i,int *_y){ | |
382 opus_uint32 p; | |
383 int s; | |
384 int yj; | |
385 p=ucwrs2(_k+1U); | |
386 s=-(_i>=p); | |
387 _i-=p&s; | |
388 yj=_k; | |
389 _k=(_i+1)>>1; | |
390 p=_k?ucwrs2(_k):0; | |
391 _i-=p; | |
392 yj-=_k; | |
393 _y[0]=(yj+s)^s; | |
394 cwrsi1(_k,_i,_y+1); | |
395 } | |
396 | |
397 /*Returns the _i'th combination of _k elements (at most 32767) chosen from a | |
398 set of size 3 with associated sign bits. | |
399 _y: Returns the vector of pulses.*/ | |
400 static void cwrsi3(int _k,opus_uint32 _i,int *_y){ | |
401 opus_uint32 p; | |
402 int s; | |
403 int yj; | |
404 p=ucwrs3(_k+1U); | |
405 s=-(_i>=p); | |
406 _i-=p&s; | |
407 yj=_k; | |
408 /*Finds the maximum _k such that ucwrs3(_k)<=_i (tested for all | |
409 _i<2147418113=U(3,32768)).*/ | |
410 _k=_i>0?(isqrt32(2*_i-1)+1)>>1:0; | |
411 p=_k?ucwrs3(_k):0; | |
412 _i-=p; | |
413 yj-=_k; | |
414 _y[0]=(yj+s)^s; | |
415 cwrsi2(_k,_i,_y+1); | |
416 } | |
417 | |
418 /*Returns the _i'th combination of _k elements (at most 1172) chosen from a set | |
419 of size 4 with associated sign bits. | |
420 _y: Returns the vector of pulses.*/ | |
421 static void cwrsi4(int _k,opus_uint32 _i,int *_y){ | |
422 opus_uint32 p; | |
423 int s; | |
424 int yj; | |
425 int kl; | |
426 int kr; | |
427 p=ucwrs4(_k+1); | |
428 s=-(_i>=p); | |
429 _i-=p&s; | |
430 yj=_k; | |
431 /*We could solve a cubic for k here, but the form of the direct solution does | |
432 not lend itself well to exact integer arithmetic. | |
433 Instead we do a binary search on U(4,K).*/ | |
434 kl=0; | |
435 kr=_k; | |
436 for(;;){ | |
437 _k=(kl+kr)>>1; | |
438 p=_k?ucwrs4(_k):0; | |
439 if(p<_i){ | |
440 if(_k>=kr)break; | |
441 kl=_k+1; | |
442 } | |
443 else if(p>_i)kr=_k-1; | |
444 else break; | |
445 } | |
446 _i-=p; | |
447 yj-=_k; | |
448 _y[0]=(yj+s)^s; | |
449 cwrsi3(_k,_i,_y+1); | |
450 } | |
451 | |
452 #endif /* SMALL_FOOTPRINT */ | |
453 | |
454 /*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 |
455 with associated sign bits. | 590 with associated sign bits. |
456 _y: Returns the vector of pulses. | 591 _y: Returns the vector of pulses. |
457 _u: Must contain entries [0..._k+1] of row _n of U() on input. | 592 _u: Must contain entries [0..._k+1] of row _n of U() on input. |
458 Its contents will be destructively modified.*/ | 593 Its contents will be destructively modified.*/ |
459 static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){ | 594 static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){ |
460 int j; | 595 int j; |
461 celt_assert(_n>0); | 596 celt_assert(_n>0); |
462 j=0; | 597 j=0; |
463 do{ | 598 do{ |
(...skipping 16 matching lines...) Expand all Loading... |
480 | 615 |
481 /*Returns the index of the given combination of K elements chosen from a set | 616 /*Returns the index of the given combination of K elements chosen from a set |
482 of size 1 with associated sign bits. | 617 of size 1 with associated sign bits. |
483 _y: The vector of pulses, whose sum of absolute values is K. | 618 _y: The vector of pulses, whose sum of absolute values is K. |
484 _k: Returns K.*/ | 619 _k: Returns K.*/ |
485 static inline opus_uint32 icwrs1(const int *_y,int *_k){ | 620 static inline opus_uint32 icwrs1(const int *_y,int *_k){ |
486 *_k=abs(_y[0]); | 621 *_k=abs(_y[0]); |
487 return _y[0]<0; | 622 return _y[0]<0; |
488 } | 623 } |
489 | 624 |
490 #ifndef SMALL_FOOTPRINT | |
491 | |
492 /*Returns the index of the given combination of K elements chosen from a set | |
493 of size 2 with associated sign bits. | |
494 _y: The vector of pulses, whose sum of absolute values is K. | |
495 _k: Returns K.*/ | |
496 static inline opus_uint32 icwrs2(const int *_y,int *_k){ | |
497 opus_uint32 i; | |
498 int k; | |
499 i=icwrs1(_y+1,&k); | |
500 i+=k?ucwrs2(k):0; | |
501 k+=abs(_y[0]); | |
502 if(_y[0]<0)i+=ucwrs2(k+1U); | |
503 *_k=k; | |
504 return i; | |
505 } | |
506 | |
507 /*Returns the index of the given combination of K elements chosen from a set | |
508 of size 3 with associated sign bits. | |
509 _y: The vector of pulses, whose sum of absolute values is K. | |
510 _k: Returns K.*/ | |
511 static inline opus_uint32 icwrs3(const int *_y,int *_k){ | |
512 opus_uint32 i; | |
513 int k; | |
514 i=icwrs2(_y+1,&k); | |
515 i+=k?ucwrs3(k):0; | |
516 k+=abs(_y[0]); | |
517 if(_y[0]<0)i+=ucwrs3(k+1U); | |
518 *_k=k; | |
519 return i; | |
520 } | |
521 | |
522 /*Returns the index of the given combination of K elements chosen from a set | |
523 of size 4 with associated sign bits. | |
524 _y: The vector of pulses, whose sum of absolute values is K. | |
525 _k: Returns K.*/ | |
526 static inline opus_uint32 icwrs4(const int *_y,int *_k){ | |
527 opus_uint32 i; | |
528 int k; | |
529 i=icwrs3(_y+1,&k); | |
530 i+=k?ucwrs4(k):0; | |
531 k+=abs(_y[0]); | |
532 if(_y[0]<0)i+=ucwrs4(k+1); | |
533 *_k=k; | |
534 return i; | |
535 } | |
536 | |
537 #endif /* SMALL_FOOTPRINT */ | |
538 | |
539 /*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 |
540 of size _n with associated sign bits. | 626 of size _n with associated sign bits. |
541 _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. |
542 _nc: Returns V(_n,_k).*/ | 628 _nc: Returns V(_n,_k).*/ |
543 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, |
544 opus_uint32 *_u){ | 630 opus_uint32 *_u){ |
545 opus_uint32 i; | 631 opus_uint32 i; |
546 int j; | 632 int j; |
547 int k; | 633 int k; |
548 /*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.*/ |
549 celt_assert(_n>=2); | 635 celt_assert(_n>=2); |
550 _u[0]=0; | 636 _u[0]=0; |
551 for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; | 637 for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; |
552 i=icwrs1(_y+_n-1,&k); | 638 i=icwrs1(_y+_n-1,&k); |
553 j=_n-2; | 639 j=_n-2; |
554 i+=_u[k]; | 640 i+=_u[k]; |
555 k+=abs(_y[j]); | 641 k+=abs(_y[j]); |
556 if(_y[j]<0)i+=_u[k+1]; | 642 if(_y[j]<0)i+=_u[k+1]; |
557 while(j-->0){ | 643 while(j-->0){ |
(...skipping 24 matching lines...) Expand all Loading... |
582 ncwrs_urow(_n,_maxk,u); | 668 ncwrs_urow(_n,_maxk,u); |
583 for(k=1;k<=_maxk;k++) | 669 for(k=1;k<=_maxk;k++) |
584 _bits[k]=log2_frac(u[k]+u[k+1],_frac); | 670 _bits[k]=log2_frac(u[k]+u[k+1],_frac); |
585 RESTORE_STACK; | 671 RESTORE_STACK; |
586 } | 672 } |
587 } | 673 } |
588 #endif /* CUSTOM_MODES */ | 674 #endif /* CUSTOM_MODES */ |
589 | 675 |
590 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){ |
591 opus_uint32 i; | 677 opus_uint32 i; |
| 678 VARDECL(opus_uint32,u); |
| 679 opus_uint32 nc; |
| 680 SAVE_STACK; |
592 celt_assert(_k>0); | 681 celt_assert(_k>0); |
593 #ifndef SMALL_FOOTPRINT | 682 ALLOC(u,_k+2U,opus_uint32); |
594 switch(_n){ | 683 i=icwrs(_n,_k,&nc,_y,u); |
595 case 2:{ | 684 ec_enc_uint(_enc,i,nc); |
596 i=icwrs2(_y,&_k); | 685 RESTORE_STACK; |
597 ec_enc_uint(_enc,i,ncwrs2(_k)); | |
598 }break; | |
599 case 3:{ | |
600 i=icwrs3(_y,&_k); | |
601 ec_enc_uint(_enc,i,ncwrs3(_k)); | |
602 }break; | |
603 case 4:{ | |
604 i=icwrs4(_y,&_k); | |
605 ec_enc_uint(_enc,i,ncwrs4(_k)); | |
606 }break; | |
607 default: | |
608 { | |
609 #endif | |
610 VARDECL(opus_uint32,u); | |
611 opus_uint32 nc; | |
612 SAVE_STACK; | |
613 ALLOC(u,_k+2U,opus_uint32); | |
614 i=icwrs(_n,_k,&nc,_y,u); | |
615 ec_enc_uint(_enc,i,nc); | |
616 RESTORE_STACK; | |
617 #ifndef SMALL_FOOTPRINT | |
618 } | |
619 break; | |
620 } | |
621 #endif | |
622 } | 686 } |
623 | 687 |
624 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){ |
625 { | 689 VARDECL(opus_uint32,u); |
| 690 SAVE_STACK; |
626 celt_assert(_k>0); | 691 celt_assert(_k>0); |
627 #ifndef SMALL_FOOTPRINT | 692 ALLOC(u,_k+2U,opus_uint32); |
628 switch(_n){ | 693 cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); |
629 case 2:cwrsi2(_k,ec_dec_uint(_dec,ncwrs2(_k)),_y);break; | 694 RESTORE_STACK; |
630 case 3:cwrsi3(_k,ec_dec_uint(_dec,ncwrs3(_k)),_y);break; | |
631 case 4:cwrsi4(_k,ec_dec_uint(_dec,ncwrs4(_k)),_y);break; | |
632 default: | |
633 { | |
634 #endif | |
635 VARDECL(opus_uint32,u); | |
636 SAVE_STACK; | |
637 ALLOC(u,_k+2U,opus_uint32); | |
638 cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); | |
639 RESTORE_STACK; | |
640 #ifndef SMALL_FOOTPRINT | |
641 } | |
642 break; | |
643 } | |
644 #endif | |
645 } | 695 } |
| 696 |
| 697 #endif /* SMALL_FOOTPRINT */ |
OLD | NEW |