Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 1 | /* Copyright (c) 2007-2008 CSIRO |
| 2 | Copyright (c) 2007-2009 Xiph.Org Foundation |
| 3 | Copyright (c) 2007-2009 Timothy B. Terriberry |
| 4 | Written by Timothy B. Terriberry and Jean-Marc Valin */ |
| 5 | /* |
| 6 | Redistribution and use in source and binary forms, with or without |
| 7 | modification, are permitted provided that the following conditions |
| 8 | are met: |
| 9 | |
| 10 | - Redistributions of source code must retain the above copyright |
| 11 | notice, this list of conditions and the following disclaimer. |
| 12 | |
| 13 | - Redistributions in binary form must reproduce the above copyright |
| 14 | notice, this list of conditions and the following disclaimer in the |
| 15 | documentation and/or other materials provided with the distribution. |
| 16 | |
| 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 18 | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 19 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 20 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER |
| 21 | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 22 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 23 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 24 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| 25 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| 26 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 | */ |
| 29 | |
| 30 | #ifdef HAVE_CONFIG_H |
| 31 | #include "config.h" |
| 32 | #endif |
| 33 | |
| 34 | #include "os_support.h" |
| 35 | #include "cwrs.h" |
| 36 | #include "mathops.h" |
| 37 | #include "arch.h" |
| 38 | |
| 39 | #ifdef CUSTOM_MODES |
| 40 | |
| 41 | /*Guaranteed to return a conservatively large estimate of the binary logarithm |
| 42 | with frac bits of fractional precision. |
| 43 | Tested for all possible 32-bit inputs with frac=4, where the maximum |
| 44 | overestimation is 0.06254243 bits.*/ |
| 45 | int log2_frac(opus_uint32 val, int frac) |
| 46 | { |
| 47 | int l; |
| 48 | l=EC_ILOG(val); |
| 49 | if(val&(val-1)){ |
| 50 | /*This is (val>>l-16), but guaranteed to round up, even if adding a bias |
| 51 | before the shift would cause overflow (e.g., for 0xFFFFxxxx). |
| 52 | Doesn't work for val=0, but that case fails the test above.*/ |
| 53 | if(l>16)val=((val-1)>>(l-16))+1; |
| 54 | else val<<=16-l; |
| 55 | l=(l-1)<<frac; |
| 56 | /*Note that we always need one iteration, since the rounding up above means |
| 57 | that we might need to adjust the integer part of the logarithm.*/ |
| 58 | do{ |
| 59 | int b; |
| 60 | b=(int)(val>>16); |
| 61 | l+=b<<frac; |
| 62 | val=(val+b)>>b; |
| 63 | val=(val*val+0x7FFF)>>15; |
| 64 | } |
| 65 | while(frac-->0); |
| 66 | /*If val is not exactly 0x8000, then we have to round up the remainder.*/ |
| 67 | return l+(val>0x8000); |
| 68 | } |
| 69 | /*Exact powers of two require no rounding.*/ |
| 70 | else return (l-1)<<frac; |
| 71 | } |
| 72 | #endif |
| 73 | |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 74 | /*Although derived separately, the pulse vector coding scheme is equivalent to |
| 75 | a Pyramid Vector Quantizer \cite{Fis86}. |
| 76 | Some additional notes about an early version appear at |
| 77 | http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering |
| 78 | and the definitions of some terms have evolved since that was written. |
| 79 | |
| 80 | The conversion from a pulse vector to an integer index (encoding) and back |
| 81 | (decoding) is governed by two related functions, V(N,K) and U(N,K). |
| 82 | |
| 83 | V(N,K) = the number of combinations, with replacement, of N items, taken K |
| 84 | at a time, when a sign bit is added to each item taken at least once (i.e., |
| 85 | the number of N-dimensional unit pulse vectors with K pulses). |
| 86 | One way to compute this is via |
| 87 | V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1, |
| 88 | where choose() is the binomial function. |
| 89 | A table of values for N<10 and K<10 looks like: |
| 90 | V[10][10] = { |
| 91 | {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| 92 | {1, 2, 2, 2, 2, 2, 2, 2, 2, 2}, |
| 93 | {1, 4, 8, 12, 16, 20, 24, 28, 32, 36}, |
| 94 | {1, 6, 18, 38, 66, 102, 146, 198, 258, 326}, |
| 95 | {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, |
| 96 | {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, |
| 97 | {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, |
| 98 | {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, |
| 99 | {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, |
| 100 | {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146} |
| 101 | }; |
| 102 | |
| 103 | U(N,K) = the number of such combinations wherein N-1 objects are taken at |
| 104 | most K-1 at a time. |
| 105 | This is given by |
| 106 | U(N,K) = sum(k=0...K-1,V(N-1,k)) |
| 107 | = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0. |
| 108 | The latter expression also makes clear that U(N,K) is half the number of such |
| 109 | combinations wherein the first object is taken at least once. |
| 110 | Although it may not be clear from either of these definitions, U(N,K) is the |
| 111 | natural function to work with when enumerating the pulse vector codebooks, |
| 112 | not V(N,K). |
| 113 | U(N,K) is not well-defined for N=0, but with the extension |
| 114 | U(0,K) = K>0 ? 0 : 1, |
| 115 | the function becomes symmetric: U(N,K) = U(K,N), with a similar table: |
| 116 | U[10][10] = { |
| 117 | {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| 118 | {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, |
| 119 | {0, 1, 3, 5, 7, 9, 11, 13, 15, 17}, |
| 120 | {0, 1, 5, 13, 25, 41, 61, 85, 113, 145}, |
| 121 | {0, 1, 7, 25, 63, 129, 231, 377, 575, 833}, |
| 122 | {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649}, |
| 123 | {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073}, |
| 124 | {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081}, |
| 125 | {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545}, |
| 126 | {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729} |
| 127 | }; |
| 128 | |
| 129 | With this extension, V(N,K) may be written in terms of U(N,K): |
| 130 | V(N,K) = U(N,K) + U(N,K+1) |
| 131 | for all N>=0, K>=0. |
| 132 | Thus U(N,K+1) represents the number of combinations where the first element |
| 133 | is positive or zero, and U(N,K) represents the number of combinations where |
| 134 | it is negative. |
| 135 | With a large enough table of U(N,K) values, we could write O(N) encoding |
| 136 | and O(min(N*log(K),N+K)) decoding routines, but such a table would be |
| 137 | prohibitively large for small embedded devices (K may be as large as 32767 |
| 138 | for small N, and N may be as large as 200). |
| 139 | |
| 140 | Both functions obey the same recurrence relation: |
| 141 | V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), |
| 142 | U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1), |
| 143 | for all N>0, K>0, with different initial conditions at N=0 or K=0. |
| 144 | This allows us to construct a row of one of the tables above given the |
| 145 | previous row or the next row. |
| 146 | Thus we can derive O(NK) encoding and decoding routines with O(K) memory |
| 147 | using only addition and subtraction. |
| 148 | |
| 149 | When encoding, we build up from the U(2,K) row and work our way forwards. |
| 150 | When decoding, we need to start at the U(N,K) row and work our way backwards, |
| 151 | which requires a means of computing U(N,K). |
| 152 | U(N,K) may be computed from two previous values with the same N: |
| 153 | U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2) |
| 154 | for all N>1, and since U(N,K) is symmetric, a similar relation holds for two |
| 155 | previous values with the same K: |
| 156 | U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K) |
| 157 | for all K>1. |
| 158 | This allows us to construct an arbitrary row of the U(N,K) table by starting |
| 159 | with the first two values, which are constants. |
| 160 | This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K) |
| 161 | multiplications. |
| 162 | Similar relations can be derived for V(N,K), but are not used here. |
| 163 | |
| 164 | For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree |
| 165 | polynomial for fixed N. |
| 166 | The first few are |
| 167 | U(1,K) = 1, |
| 168 | U(2,K) = 2*K-1, |
| 169 | U(3,K) = (2*K-2)*K+1, |
| 170 | U(4,K) = (((4*K-6)*K+8)*K-3)/3, |
| 171 | U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3, |
| 172 | and |
| 173 | V(1,K) = 2, |
| 174 | V(2,K) = 4*K, |
| 175 | V(3,K) = 4*K*K+2, |
| 176 | V(4,K) = 8*(K*K+2)*K/3, |
| 177 | V(5,K) = ((4*K*K+20)*K*K+6)/3, |
| 178 | for all K>0. |
| 179 | This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for |
| 180 | small N (and indeed decoding is also O(N) for N<3). |
| 181 | |
| 182 | @ARTICLE{Fis86, |
| 183 | author="Thomas R. Fischer", |
| 184 | title="A Pyramid Vector Quantizer", |
| 185 | journal="IEEE Transactions on Information Theory", |
| 186 | volume="IT-32", |
| 187 | number=4, |
| 188 | pages="568--583", |
| 189 | month=Jul, |
| 190 | year=1986 |
| 191 | }*/ |
| 192 | |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 193 | #if !defined(SMALL_FOOTPRINT) |
| 194 | |
| 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*/ |
| 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 | static 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 | static 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; |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 456 | } |
| 457 | |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 458 | void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 459 | celt_assert(_k>0); |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 460 | ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k)); |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 461 | } |
| 462 | |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 463 | static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ |
| 464 | opus_uint32 p; |
| 465 | int s; |
| 466 | int k0; |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 467 | celt_assert(_k>0); |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 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; |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 526 | } |
| 527 | |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 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); |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 530 | } |
| 531 | |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 532 | #else /* SMALL_FOOTPRINT */ |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 533 | |
| 534 | /*Computes the next row/column of any recurrence that obeys the relation |
| 535 | u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. |
| 536 | _ui0 is the base case for the new row/column.*/ |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 537 | static OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 538 | opus_uint32 ui1; |
| 539 | unsigned j; |
| 540 | /*This do-while will overrun the array if we don't have storage for at least |
| 541 | 2 values.*/ |
| 542 | j=1; do { |
| 543 | ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0); |
| 544 | _ui[j-1]=_ui0; |
| 545 | _ui0=ui1; |
| 546 | } while (++j<_len); |
| 547 | _ui[j-1]=_ui0; |
| 548 | } |
| 549 | |
| 550 | /*Computes the previous row/column of any recurrence that obeys the relation |
| 551 | u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1]. |
| 552 | _ui0 is the base case for the new row/column.*/ |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 553 | static OPUS_INLINE void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){ |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 554 | opus_uint32 ui1; |
| 555 | unsigned j; |
| 556 | /*This do-while will overrun the array if we don't have storage for at least |
| 557 | 2 values.*/ |
| 558 | j=1; do { |
| 559 | ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0); |
| 560 | _ui[j-1]=_ui0; |
| 561 | _ui0=ui1; |
| 562 | } while (++j<_n); |
| 563 | _ui[j-1]=_ui0; |
| 564 | } |
| 565 | |
| 566 | /*Compute V(_n,_k), as well as U(_n,0..._k+1). |
| 567 | _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ |
| 568 | static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){ |
| 569 | opus_uint32 um2; |
| 570 | unsigned len; |
| 571 | unsigned k; |
| 572 | len=_k+2; |
| 573 | /*We require storage at least 3 values (e.g., _k>0).*/ |
| 574 | celt_assert(len>=3); |
| 575 | _u[0]=0; |
| 576 | _u[1]=um2=1; |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 577 | /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ |
| 578 | /*If _n==1, _u[i] should be 1 for i>1.*/ |
| 579 | celt_assert(_n>=2); |
| 580 | /*If _k==0, the following do-while loop will overflow the buffer.*/ |
| 581 | celt_assert(_k>0); |
| 582 | k=2; |
| 583 | do _u[k]=(k<<1)-1; |
| 584 | while(++k<len); |
| 585 | for(k=2;k<_n;k++)unext(_u+1,_k+1,1); |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 586 | return _u[_k]+_u[_k+1]; |
| 587 | } |
| 588 | |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 589 | /*Returns the _i'th combination of _k elements chosen from a set of size _n |
| 590 | with associated sign bits. |
| 591 | _y: Returns the vector of pulses. |
| 592 | _u: Must contain entries [0..._k+1] of row _n of U() on input. |
| 593 | Its contents will be destructively modified.*/ |
| 594 | static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){ |
| 595 | int j; |
| 596 | celt_assert(_n>0); |
| 597 | j=0; |
| 598 | do{ |
| 599 | opus_uint32 p; |
| 600 | int s; |
| 601 | int yj; |
| 602 | p=_u[_k+1]; |
| 603 | s=-(_i>=p); |
| 604 | _i-=p&s; |
| 605 | yj=_k; |
| 606 | p=_u[_k]; |
| 607 | while(p>_i)p=_u[--_k]; |
| 608 | _i-=p; |
| 609 | yj-=_k; |
| 610 | _y[j]=(yj+s)^s; |
| 611 | uprev(_u,_k+2,0); |
| 612 | } |
| 613 | while(++j<_n); |
| 614 | } |
| 615 | |
| 616 | /*Returns the index of the given combination of K elements chosen from a set |
| 617 | of size 1 with associated sign bits. |
| 618 | _y: The vector of pulses, whose sum of absolute values is K. |
| 619 | _k: Returns K.*/ |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 620 | static OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){ |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 621 | *_k=abs(_y[0]); |
| 622 | return _y[0]<0; |
| 623 | } |
| 624 | |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 625 | /*Returns the index of the given combination of K elements chosen from a set |
| 626 | of size _n with associated sign bits. |
| 627 | _y: The vector of pulses, whose sum of absolute values must be _k. |
| 628 | _nc: Returns V(_n,_k).*/ |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 629 | static OPUS_INLINE opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y, |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 630 | opus_uint32 *_u){ |
| 631 | opus_uint32 i; |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 632 | int j; |
| 633 | int k; |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 634 | /*We can't unroll the first two iterations of the loop unless _n>=2.*/ |
| 635 | celt_assert(_n>=2); |
| 636 | _u[0]=0; |
| 637 | for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; |
| 638 | i=icwrs1(_y+_n-1,&k); |
| 639 | j=_n-2; |
| 640 | i+=_u[k]; |
| 641 | k+=abs(_y[j]); |
| 642 | if(_y[j]<0)i+=_u[k+1]; |
| 643 | while(j-->0){ |
| 644 | unext(_u,_k+2,0); |
| 645 | i+=_u[k]; |
| 646 | k+=abs(_y[j]); |
| 647 | if(_y[j]<0)i+=_u[k+1]; |
| 648 | } |
| 649 | *_nc=_u[k]+_u[k+1]; |
| 650 | return i; |
| 651 | } |
| 652 | |
| 653 | #ifdef CUSTOM_MODES |
| 654 | void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ |
| 655 | int k; |
| 656 | /*_maxk==0 => there's nothing to do.*/ |
| 657 | celt_assert(_maxk>0); |
| 658 | _bits[0]=0; |
| 659 | if (_n==1) |
| 660 | { |
| 661 | for (k=1;k<=_maxk;k++) |
| 662 | _bits[k] = 1<<_frac; |
| 663 | } |
| 664 | else { |
| 665 | VARDECL(opus_uint32,u); |
| 666 | SAVE_STACK; |
| 667 | ALLOC(u,_maxk+2U,opus_uint32); |
| 668 | ncwrs_urow(_n,_maxk,u); |
| 669 | for(k=1;k<=_maxk;k++) |
| 670 | _bits[k]=log2_frac(u[k]+u[k+1],_frac); |
| 671 | RESTORE_STACK; |
| 672 | } |
| 673 | } |
| 674 | #endif /* CUSTOM_MODES */ |
| 675 | |
| 676 | void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ |
| 677 | opus_uint32 i; |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 678 | VARDECL(opus_uint32,u); |
| 679 | opus_uint32 nc; |
| 680 | SAVE_STACK; |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 681 | celt_assert(_k>0); |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 682 | ALLOC(u,_k+2U,opus_uint32); |
| 683 | i=icwrs(_n,_k,&nc,_y,u); |
| 684 | ec_enc_uint(_enc,i,nc); |
| 685 | RESTORE_STACK; |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 686 | } |
| 687 | |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 688 | void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ |
| 689 | VARDECL(opus_uint32,u); |
| 690 | SAVE_STACK; |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 691 | celt_assert(_k>0); |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 692 | ALLOC(u,_k+2U,opus_uint32); |
| 693 | cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); |
| 694 | RESTORE_STACK; |
Alexandre Lision | 744f742 | 2013-09-25 11:39:37 -0400 | [diff] [blame] | 695 | } |
Alexandre Lision | 8538238 | 2014-01-27 15:54:16 -0500 | [diff] [blame] | 696 | |
| 697 | #endif /* SMALL_FOOTPRINT */ |