Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: celt/cwrs.c

Issue 28553003: Updating Opus to a pre-release of 1.1 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/opus
Patch Set: Removing failing file Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « celt/cpu_support.h ('k') | celt/dump_modes/Makefile » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 */
OLDNEW
« no previous file with comments | « celt/cpu_support.h ('k') | celt/dump_modes/Makefile » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698