Line | Count | Source |
1 | | /* Copyright (c) 2007-2008 CSIRO |
2 | | Copyright (c) 2007-2009 Xiph.Org Foundation |
3 | | Written by Jean-Marc Valin */ |
4 | | /* |
5 | | Redistribution and use in source and binary forms, with or without |
6 | | modification, are permitted provided that the following conditions |
7 | | are met: |
8 | | |
9 | | - Redistributions of source code must retain the above copyright |
10 | | notice, this list of conditions and the following disclaimer. |
11 | | |
12 | | - Redistributions in binary form must reproduce the above copyright |
13 | | notice, this list of conditions and the following disclaimer in the |
14 | | documentation and/or other materials provided with the distribution. |
15 | | |
16 | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 | | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 | | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 | | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER |
20 | | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
21 | | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
22 | | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
23 | | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
24 | | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
25 | | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
26 | | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | | */ |
28 | | |
29 | | #ifdef HAVE_CONFIG_H |
30 | | #include "config.h" |
31 | | #endif |
32 | | |
33 | | #include <math.h> |
34 | | #include "modes.h" |
35 | | #include "cwrs.h" |
36 | | #include "arch.h" |
37 | | #include "os_support.h" |
38 | | |
39 | | #include "entcode.h" |
40 | | #include "rate.h" |
41 | | |
42 | | static const unsigned char LOG2_FRAC_TABLE[24]={ |
43 | | 0, |
44 | | 8,13, |
45 | | 16,19,21,23, |
46 | | 24,26,27,28,29,30,31,32, |
47 | | 32,33,34,34,35,36,36,37,37 |
48 | | }; |
49 | | |
50 | | #ifdef CUSTOM_MODES |
51 | | |
52 | | /*Determines if V(N,K) fits in a 32-bit unsigned integer. |
53 | | N and K are themselves limited to 15 bits.*/ |
54 | | static int fits_in32(int _n, int _k) |
55 | | { |
56 | | static const opus_int16 maxN[15] = { |
57 | | 32767, 32767, 32767, 1476, 283, 109, 60, 40, |
58 | | 29, 24, 20, 18, 16, 14, 13}; |
59 | | static const opus_int16 maxK[15] = { |
60 | | 32767, 32767, 32767, 32767, 1172, 238, 95, 53, |
61 | | 36, 27, 22, 18, 16, 15, 13}; |
62 | | if (_n>=14) |
63 | | { |
64 | | if (_k>=14) |
65 | | return 0; |
66 | | else |
67 | | return _n <= maxN[_k]; |
68 | | } else { |
69 | | return _k <= maxK[_n]; |
70 | | } |
71 | | } |
72 | | |
73 | | void compute_pulse_cache(CELTMode *m, int LM) |
74 | | { |
75 | | int C; |
76 | | int i; |
77 | | int j; |
78 | | int curr=0; |
79 | | int nbEntries=0; |
80 | | int entryN[100], entryK[100], entryI[100]; |
81 | | const opus_int16 *eBands = m->eBands; |
82 | | PulseCache *cache = &m->cache; |
83 | | opus_int16 *cindex; |
84 | | unsigned char *bits; |
85 | | unsigned char *cap; |
86 | | |
87 | | cindex = (opus_int16 *)opus_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2)); |
88 | | cache->index = cindex; |
89 | | |
90 | | /* Scan for all unique band sizes */ |
91 | | for (i=0;i<=LM+1;i++) |
92 | | { |
93 | | for (j=0;j<m->nbEBands;j++) |
94 | | { |
95 | | int k; |
96 | | int N = (eBands[j+1]-eBands[j])<<i>>1; |
97 | | cindex[i*m->nbEBands+j] = -1; |
98 | | /* Find other bands that have the same size */ |
99 | | for (k=0;k<=i;k++) |
100 | | { |
101 | | int n; |
102 | | for (n=0;n<m->nbEBands && (k!=i || n<j);n++) |
103 | | { |
104 | | if (N == (eBands[n+1]-eBands[n])<<k>>1) |
105 | | { |
106 | | cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n]; |
107 | | break; |
108 | | } |
109 | | } |
110 | | } |
111 | | if (cache->index[i*m->nbEBands+j] == -1 && N!=0) |
112 | | { |
113 | | int K; |
114 | | entryN[nbEntries] = N; |
115 | | K = 0; |
116 | | while (fits_in32(N,get_pulses(K+1)) && K<MAX_PSEUDO) |
117 | | K++; |
118 | | entryK[nbEntries] = K; |
119 | | cindex[i*m->nbEBands+j] = curr; |
120 | | entryI[nbEntries] = curr; |
121 | | |
122 | | curr += K+1; |
123 | | nbEntries++; |
124 | | } |
125 | | } |
126 | | } |
127 | | bits = (unsigned char *)opus_alloc(sizeof(unsigned char)*curr); |
128 | | cache->bits = bits; |
129 | | cache->size = curr; |
130 | | /* Compute the cache for all unique sizes */ |
131 | | for (i=0;i<nbEntries;i++) |
132 | | { |
133 | | unsigned char *ptr = bits+entryI[i]; |
134 | | opus_int16 tmp[CELT_MAX_PULSES+1]; |
135 | | get_required_bits(tmp, entryN[i], get_pulses(entryK[i]), BITRES); |
136 | | for (j=1;j<=entryK[i];j++) |
137 | | ptr[j] = tmp[get_pulses(j)]-1; |
138 | | ptr[0] = entryK[i]; |
139 | | } |
140 | | |
141 | | /* Compute the maximum rate for each band at which we'll reliably use as |
142 | | many bits as we ask for. */ |
143 | | cache->caps = cap = (unsigned char *)opus_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands); |
144 | | for (i=0;i<=LM;i++) |
145 | | { |
146 | | for (C=1;C<=2;C++) |
147 | | { |
148 | | for (j=0;j<m->nbEBands;j++) |
149 | | { |
150 | | int N0; |
151 | | int max_bits; |
152 | | N0 = m->eBands[j+1]-m->eBands[j]; |
153 | | /* N=1 bands only have a sign bit and fine bits. */ |
154 | | if (N0<<i == 1) |
155 | | max_bits = C*(1+MAX_FINE_BITS)<<BITRES; |
156 | | else |
157 | | { |
158 | | const unsigned char *pcache; |
159 | | opus_int32 num; |
160 | | opus_int32 den; |
161 | | int LM0; |
162 | | int N; |
163 | | int offset; |
164 | | int ndof; |
165 | | int qb; |
166 | | int k; |
167 | | LM0 = 0; |
168 | | /* Even-sized bands bigger than N=2 can be split one more time. |
169 | | As of commit 44203907 all bands >1 are even, including custom modes.*/ |
170 | | if (N0 > 2) |
171 | | { |
172 | | N0>>=1; |
173 | | LM0--; |
174 | | } |
175 | | /* N0=1 bands can't be split down to N<2. */ |
176 | | else if (N0 <= 1) |
177 | | { |
178 | | LM0=IMIN(i,1); |
179 | | N0<<=LM0; |
180 | | } |
181 | | /* Compute the cost for the lowest-level PVQ of a fully split |
182 | | band. */ |
183 | | pcache = bits + cindex[(LM0+1)*m->nbEBands+j]; |
184 | | max_bits = pcache[pcache[0]]+1; |
185 | | /* Add in the cost of coding regular splits. */ |
186 | | N = N0; |
187 | | for(k=0;k<i-LM0;k++){ |
188 | | max_bits <<= 1; |
189 | | /* Offset the number of qtheta bits by log2(N)/2 |
190 | | + QTHETA_OFFSET compared to their "fair share" of |
191 | | total/N */ |
192 | | offset = ((m->logN[j]+((LM0+k)<<BITRES))>>1)-QTHETA_OFFSET; |
193 | | /* The number of qtheta bits we'll allocate if the remainder |
194 | | is to be max_bits. |
195 | | The average measured cost for theta is 0.89701 times qb, |
196 | | approximated here as 459/512. */ |
197 | | num=459*(opus_int32)((2*N-1)*offset+max_bits); |
198 | | den=((opus_int32)(2*N-1)<<9)-459; |
199 | | qb = IMIN((num+(den>>1))/den, 57); |
200 | | celt_assert(qb >= 0); |
201 | | max_bits += qb; |
202 | | N <<= 1; |
203 | | } |
204 | | /* Add in the cost of a stereo split, if necessary. */ |
205 | | if (C==2) |
206 | | { |
207 | | max_bits <<= 1; |
208 | | offset = ((m->logN[j]+(i<<BITRES))>>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET); |
209 | | ndof = 2*N-1-(N==2); |
210 | | /* The average measured cost for theta with the step PDF is |
211 | | 0.95164 times qb, approximated here as 487/512. */ |
212 | | num = (N==2?512:487)*(opus_int32)(max_bits+ndof*offset); |
213 | | den = ((opus_int32)ndof<<9)-(N==2?512:487); |
214 | | qb = IMIN((num+(den>>1))/den, (N==2?64:61)); |
215 | | celt_assert(qb >= 0); |
216 | | max_bits += qb; |
217 | | } |
218 | | /* Add the fine bits we'll use. */ |
219 | | /* Compensate for the extra DoF in stereo */ |
220 | | ndof = C*N + ((C==2 && N>2) ? 1 : 0); |
221 | | /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET |
222 | | compared to their "fair share" of total/N */ |
223 | | offset = ((m->logN[j] + (i<<BITRES))>>1)-FINE_OFFSET; |
224 | | /* N=2 is the only point that doesn't match the curve */ |
225 | | if (N==2) |
226 | | offset += 1<<BITRES>>2; |
227 | | /* The number of fine bits we'll allocate if the remainder is |
228 | | to be max_bits. */ |
229 | | num = max_bits+ndof*offset; |
230 | | den = (ndof-1)<<BITRES; |
231 | | qb = IMIN((num+(den>>1))/den, MAX_FINE_BITS); |
232 | | celt_assert(qb >= 0); |
233 | | max_bits += C*qb<<BITRES; |
234 | | } |
235 | | max_bits = (4*max_bits/(C*((m->eBands[j+1]-m->eBands[j])<<i)))-64; |
236 | | celt_assert(max_bits >= 0); |
237 | | celt_assert(max_bits < 256); |
238 | | *cap++ = (unsigned char)max_bits; |
239 | | } |
240 | | } |
241 | | } |
242 | | } |
243 | | |
244 | | #endif /* CUSTOM_MODES */ |
245 | | |
246 | 5.28G | #define ALLOC_STEPS 6 |
247 | | |
248 | | static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start, |
249 | | const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance, |
250 | | int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits, |
251 | | int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) |
252 | 45.6M | { |
253 | 45.6M | opus_int32 psum; |
254 | 45.6M | int lo, hi; |
255 | 45.6M | int i, j; |
256 | 45.6M | int logM; |
257 | 45.6M | int stereo; |
258 | 45.6M | int codedBands=-1; |
259 | 45.6M | int alloc_floor; |
260 | 45.6M | opus_int32 left, percoeff; |
261 | 45.6M | int done; |
262 | 45.6M | opus_int32 balance; |
263 | 45.6M | SAVE_STACK; |
264 | | |
265 | 45.6M | alloc_floor = C<<BITRES; |
266 | 45.6M | stereo = C>1; |
267 | | |
268 | 45.6M | logM = LM<<BITRES; |
269 | 45.6M | lo = 0; |
270 | 45.6M | hi = 1<<ALLOC_STEPS; |
271 | 319M | for (i=0;i<ALLOC_STEPS;i++) |
272 | 273M | { |
273 | 273M | int mid = (lo+hi)>>1; |
274 | 273M | psum = 0; |
275 | 273M | done = 0; |
276 | 4.48G | for (j=end;j-->start;) |
277 | 4.21G | { |
278 | 4.21G | int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS); |
279 | 4.21G | if (tmp >= thresh[j] || done) |
280 | 1.27G | { |
281 | 1.27G | done = 1; |
282 | | /* Don't allocate more than we can actually use */ |
283 | 1.27G | psum += IMIN(tmp, cap[j]); |
284 | 2.93G | } else { |
285 | 2.93G | if (tmp >= alloc_floor) |
286 | 57.3M | psum += alloc_floor; |
287 | 2.93G | } |
288 | 4.21G | } |
289 | 273M | if (psum > total) |
290 | 125M | hi = mid; |
291 | 148M | else |
292 | 148M | lo = mid; |
293 | 273M | } |
294 | 45.6M | psum = 0; |
295 | | /*printf ("interp bisection gave %d\n", lo);*/ |
296 | 45.6M | done = 0; |
297 | 747M | for (j=end;j-->start;) |
298 | 702M | { |
299 | 702M | int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS); |
300 | 702M | if (tmp < thresh[j] && !done) |
301 | 622M | { |
302 | 622M | if (tmp >= alloc_floor) |
303 | 728k | tmp = alloc_floor; |
304 | 622M | else |
305 | 622M | tmp = 0; |
306 | 622M | } else |
307 | 79.5M | done = 1; |
308 | | /* Don't allocate more than we can actually use */ |
309 | 702M | tmp = IMIN(tmp, cap[j]); |
310 | 702M | bits[j] = tmp; |
311 | 702M | psum += tmp; |
312 | 702M | } |
313 | | |
314 | | /* Decide which bands to skip, working backwards from the end. */ |
315 | 584M | for (codedBands=end;;codedBands--) |
316 | 629M | { |
317 | 629M | int band_width; |
318 | 629M | int band_bits; |
319 | 629M | int rem; |
320 | 629M | j = codedBands-1; |
321 | | /* Never skip the first band, nor a band that has been boosted by |
322 | | dynalloc. |
323 | | In the first case, we'd be coding a bit to signal we're going to waste |
324 | | all the other bits. |
325 | | In the second case, we'd be coding a bit to redistribute all the bits |
326 | | we just signaled should be cocentrated in this band. */ |
327 | 629M | if (j<=skip_start) |
328 | 39.9M | { |
329 | | /* Give the bit we reserved to end skipping back. */ |
330 | 39.9M | total += skip_rsv; |
331 | 39.9M | break; |
332 | 39.9M | } |
333 | | /*Figure out how many left-over bits we would be adding to this band. |
334 | | This can include bits we've stolen back from higher, skipped bands.*/ |
335 | 589M | left = total-psum; |
336 | 589M | percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); |
337 | 589M | left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; |
338 | 589M | rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0); |
339 | 589M | band_width = m->eBands[codedBands]-m->eBands[j]; |
340 | 589M | band_bits = (int)(bits[j] + percoeff*band_width + rem); |
341 | | /*Only code a skip decision if we're above the threshold for this band. |
342 | | Otherwise it is force-skipped. |
343 | | This ensures that we have enough bits to code the skip flag.*/ |
344 | 589M | if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES))) |
345 | 6.03M | { |
346 | 6.03M | if (encode) |
347 | 5.92M | { |
348 | | /*This if() block is the only part of the allocation function that |
349 | | is not a mandatory part of the bitstream: any bands we choose to |
350 | | skip here must be explicitly signaled.*/ |
351 | 5.92M | int depth_threshold; |
352 | | /*We choose a threshold with some hysteresis to keep bands from |
353 | | fluctuating in and out, but we try not to fold below a certain point. */ |
354 | 5.92M | if (codedBands > 17) |
355 | 2.57M | depth_threshold = j<prev ? 7 : 9; |
356 | 3.35M | else |
357 | 3.35M | depth_threshold = 0; |
358 | | #ifdef FUZZING |
359 | | (void)signalBandwidth; |
360 | | (void)depth_threshold; |
361 | | if ((rand()&0x1) == 0) |
362 | | #else |
363 | 5.92M | if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth)) |
364 | 5.62M | #endif |
365 | 5.62M | { |
366 | 5.62M | ec_enc_bit_logp(ec, 1, 1); |
367 | 5.62M | break; |
368 | 5.62M | } |
369 | 302k | ec_enc_bit_logp(ec, 0, 1); |
370 | 302k | } else if (ec_dec_bit_logp(ec, 1)) { |
371 | 36.3k | break; |
372 | 36.3k | } |
373 | | /*We used a bit to skip this band.*/ |
374 | 374k | psum += 1<<BITRES; |
375 | 374k | band_bits -= 1<<BITRES; |
376 | 374k | } |
377 | | /*Reclaim the bits originally allocated to this band.*/ |
378 | 584M | psum -= bits[j]+intensity_rsv; |
379 | 584M | if (intensity_rsv > 0) |
380 | 1.91M | intensity_rsv = LOG2_FRAC_TABLE[j-start]; |
381 | 584M | psum += intensity_rsv; |
382 | 584M | if (band_bits >= alloc_floor) |
383 | 1.65M | { |
384 | | /*If we have enough for a fine energy bit per channel, use it.*/ |
385 | 1.65M | psum += alloc_floor; |
386 | 1.65M | bits[j] = alloc_floor; |
387 | 582M | } else { |
388 | | /*Otherwise this band gets nothing at all.*/ |
389 | 582M | bits[j] = 0; |
390 | 582M | } |
391 | 584M | } |
392 | | |
393 | 45.6M | celt_assert(codedBands > start); |
394 | | /* Code the intensity and dual stereo parameters. */ |
395 | 45.6M | if (intensity_rsv > 0) |
396 | 1.63M | { |
397 | 1.63M | if (encode) |
398 | 1.61M | { |
399 | 1.61M | *intensity = IMIN(*intensity, codedBands); |
400 | 1.61M | ec_enc_uint(ec, *intensity-start, codedBands+1-start); |
401 | 1.61M | } |
402 | 15.0k | else |
403 | 15.0k | *intensity = start+ec_dec_uint(ec, codedBands+1-start); |
404 | 1.63M | } |
405 | 44.0M | else |
406 | 44.0M | *intensity = 0; |
407 | 45.6M | if (*intensity <= start) |
408 | 44.1M | { |
409 | 44.1M | total += dual_stereo_rsv; |
410 | 44.1M | dual_stereo_rsv = 0; |
411 | 44.1M | } |
412 | 45.6M | if (dual_stereo_rsv > 0) |
413 | 1.47M | { |
414 | 1.47M | if (encode) |
415 | 1.46M | ec_enc_bit_logp(ec, *dual_stereo, 1); |
416 | 13.1k | else |
417 | 13.1k | *dual_stereo = ec_dec_bit_logp(ec, 1); |
418 | 1.47M | } |
419 | 44.1M | else |
420 | 44.1M | *dual_stereo = 0; |
421 | | |
422 | | /* Allocate the remaining bits */ |
423 | 45.6M | left = total-psum; |
424 | 45.6M | percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); |
425 | 45.6M | left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; |
426 | 163M | for (j=start;j<codedBands;j++) |
427 | 118M | bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j])); |
428 | 163M | for (j=start;j<codedBands;j++) |
429 | 118M | { |
430 | 118M | int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]); |
431 | 118M | bits[j] += tmp; |
432 | 118M | left -= tmp; |
433 | 118M | } |
434 | | /*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/ |
435 | | |
436 | 45.6M | balance = 0; |
437 | 163M | for (j=start;j<codedBands;j++) |
438 | 118M | { |
439 | 118M | int N0, N, den; |
440 | 118M | int offset; |
441 | 118M | int NClogN; |
442 | 118M | opus_int32 excess, bit; |
443 | | |
444 | 118M | celt_assert(bits[j] >= 0); |
445 | 118M | N0 = m->eBands[j+1]-m->eBands[j]; |
446 | 118M | N=N0<<LM; |
447 | 118M | bit = (opus_int32)bits[j]+balance; |
448 | | |
449 | 118M | if (N>1) |
450 | 76.9M | { |
451 | 76.9M | excess = MAX32(bit-cap[j],0); |
452 | 76.9M | bits[j] = bit-excess; |
453 | | |
454 | | /* Compensate for the extra DoF in stereo */ |
455 | 76.9M | den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0)); |
456 | | |
457 | 76.9M | NClogN = den*(m->logN[j] + logM); |
458 | | |
459 | | /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET |
460 | | compared to their "fair share" of total/N */ |
461 | 76.9M | offset = (NClogN>>1)-den*FINE_OFFSET; |
462 | | |
463 | | /* N=2 is the only point that doesn't match the curve */ |
464 | 76.9M | if (N==2) |
465 | 29.2M | offset += den<<BITRES>>2; |
466 | | |
467 | | /* Changing the offset for allocating the second and third |
468 | | fine energy bit */ |
469 | 76.9M | if (bits[j] + offset < den*2<<BITRES) |
470 | 51.2M | offset += NClogN>>2; |
471 | 25.7M | else if (bits[j] + offset < den*3<<BITRES) |
472 | 9.29M | offset += NClogN>>3; |
473 | | |
474 | | /* Divide with rounding */ |
475 | 76.9M | ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1)))); |
476 | 76.9M | ebits[j] = celt_udiv(ebits[j], den)>>BITRES; |
477 | | |
478 | | /* Make sure not to bust */ |
479 | 76.9M | if (C*ebits[j] > (bits[j]>>BITRES)) |
480 | 19.3k | ebits[j] = bits[j] >> stereo >> BITRES; |
481 | | |
482 | | /* More than that is useless because that's about as far as PVQ can go */ |
483 | 76.9M | ebits[j] = IMIN(ebits[j], MAX_FINE_BITS); |
484 | | |
485 | | /* If we rounded down or capped this band, make it a candidate for the |
486 | | final fine energy pass */ |
487 | 76.9M | fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset; |
488 | | |
489 | | /* Remove the allocated fine bits; the rest are assigned to PVQ */ |
490 | 76.9M | bits[j] -= C*ebits[j]<<BITRES; |
491 | | |
492 | 76.9M | } else { |
493 | | /* For N=1, all bits go to fine energy except for a single sign bit */ |
494 | 41.2M | excess = MAX32(0,bit-(C<<BITRES)); |
495 | 41.2M | bits[j] = bit-excess; |
496 | 41.2M | ebits[j] = 0; |
497 | 41.2M | fine_priority[j] = 1; |
498 | 41.2M | } |
499 | | |
500 | | /* Fine energy can't take advantage of the re-balancing in |
501 | | quant_all_bands(). |
502 | | Instead, do the re-balancing here.*/ |
503 | 118M | if(excess > 0) |
504 | 17.5M | { |
505 | 17.5M | int extra_fine; |
506 | 17.5M | int extra_bits; |
507 | 17.5M | extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]); |
508 | 17.5M | ebits[j] += extra_fine; |
509 | 17.5M | extra_bits = extra_fine*C<<BITRES; |
510 | 17.5M | fine_priority[j] = extra_bits >= excess-balance; |
511 | 17.5M | excess -= extra_bits; |
512 | 17.5M | } |
513 | 118M | balance = excess; |
514 | | |
515 | 118M | celt_assert(bits[j] >= 0); |
516 | 118M | celt_assert(ebits[j] >= 0); |
517 | 118M | } |
518 | | /* Save any remaining bits over the cap for the rebalancing in |
519 | | quant_all_bands(). */ |
520 | 45.6M | *_balance = balance; |
521 | | |
522 | | /* The skipped bands use all their bits for fine energy. */ |
523 | 629M | for (;j<end;j++) |
524 | 584M | { |
525 | 584M | ebits[j] = bits[j] >> stereo >> BITRES; |
526 | 584M | celt_assert(C*ebits[j]<<BITRES == bits[j]); |
527 | 584M | bits[j] = 0; |
528 | 584M | fine_priority[j] = ebits[j]<1; |
529 | 584M | } |
530 | 45.6M | RESTORE_STACK; |
531 | 45.6M | return codedBands; |
532 | 45.6M | } |
533 | | |
534 | | int clt_compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, |
535 | | opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) |
536 | 45.6M | { |
537 | 45.6M | int lo, hi, len, j; |
538 | 45.6M | int codedBands; |
539 | 45.6M | int skip_start; |
540 | 45.6M | int skip_rsv; |
541 | 45.6M | int intensity_rsv; |
542 | 45.6M | int dual_stereo_rsv; |
543 | 45.6M | VARDECL(int, bits1); |
544 | 45.6M | VARDECL(int, bits2); |
545 | 45.6M | VARDECL(int, thresh); |
546 | 45.6M | VARDECL(int, trim_offset); |
547 | 45.6M | SAVE_STACK; |
548 | | |
549 | 45.6M | total = IMAX(total, 0); |
550 | 45.6M | len = m->nbEBands; |
551 | 45.6M | skip_start = start; |
552 | | /* Reserve a bit to signal the end of manually skipped bands. */ |
553 | 45.6M | skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0; |
554 | 45.6M | total -= skip_rsv; |
555 | | /* Reserve bits for the intensity and dual stereo parameters. */ |
556 | 45.6M | intensity_rsv = dual_stereo_rsv = 0; |
557 | 45.6M | if (C==2) |
558 | 18.9M | { |
559 | 18.9M | intensity_rsv = LOG2_FRAC_TABLE[end-start]; |
560 | 18.9M | if (intensity_rsv>total) |
561 | 17.2M | intensity_rsv = 0; |
562 | 1.63M | else |
563 | 1.63M | { |
564 | 1.63M | total -= intensity_rsv; |
565 | 1.63M | dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0; |
566 | 1.63M | total -= dual_stereo_rsv; |
567 | 1.63M | } |
568 | 18.9M | } |
569 | 45.6M | ALLOC(bits1, len, int); |
570 | 45.6M | ALLOC(bits2, len, int); |
571 | 45.6M | ALLOC(thresh, len, int); |
572 | 45.6M | ALLOC(trim_offset, len, int); |
573 | | |
574 | 747M | for (j=start;j<end;j++) |
575 | 702M | { |
576 | | /* Below this threshold, we're sure not to allocate any PVQ bits */ |
577 | 702M | thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4); |
578 | | /* Tilt of the allocation curve */ |
579 | 702M | trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1) |
580 | 702M | *(1<<(LM+BITRES))>>6; |
581 | | /* Giving less resolution to single-coefficient bands because they get |
582 | | more benefit from having one coarse value per coefficient*/ |
583 | 702M | if ((m->eBands[j+1]-m->eBands[j])<<LM==1) |
584 | 214M | trim_offset[j] -= C<<BITRES; |
585 | 702M | } |
586 | 45.6M | lo = 1; |
587 | 45.6M | hi = m->nbAllocVectors - 1; |
588 | 45.6M | do |
589 | 141M | { |
590 | 141M | int done = 0; |
591 | 141M | int psum = 0; |
592 | 141M | int mid = (lo+hi) >> 1; |
593 | 2.31G | for (j=end;j-->start;) |
594 | 2.16G | { |
595 | 2.16G | int bitsj; |
596 | 2.16G | int N = m->eBands[j+1]-m->eBands[j]; |
597 | 2.16G | bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2; |
598 | 2.16G | if (bitsj > 0) |
599 | 1.99G | bitsj = IMAX(0, bitsj + trim_offset[j]); |
600 | 2.16G | bitsj += offsets[j]; |
601 | 2.16G | if (bitsj >= thresh[j] || done) |
602 | 1.98G | { |
603 | 1.98G | done = 1; |
604 | | /* Don't allocate more than we can actually use */ |
605 | 1.98G | psum += IMIN(bitsj, cap[j]); |
606 | 1.98G | } else { |
607 | 182M | if (bitsj >= C<<BITRES) |
608 | 7.58M | psum += C<<BITRES; |
609 | 182M | } |
610 | 2.16G | } |
611 | 141M | if (psum > total) |
612 | 126M | hi = mid - 1; |
613 | 15.3M | else |
614 | 15.3M | lo = mid + 1; |
615 | | /*printf ("lo = %d, hi = %d\n", lo, hi);*/ |
616 | 141M | } |
617 | 141M | while (lo <= hi); |
618 | 45.6M | hi = lo--; |
619 | | /*printf ("interp between %d and %d\n", lo, hi);*/ |
620 | 747M | for (j=start;j<end;j++) |
621 | 702M | { |
622 | 702M | int bits1j, bits2j; |
623 | 702M | int N = m->eBands[j+1]-m->eBands[j]; |
624 | 702M | bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2; |
625 | 702M | bits2j = hi>=m->nbAllocVectors ? |
626 | 688M | cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2; |
627 | 702M | if (bits1j > 0) |
628 | 78.5M | bits1j = IMAX(0, bits1j + trim_offset[j]); |
629 | 702M | if (bits2j > 0) |
630 | 598M | bits2j = IMAX(0, bits2j + trim_offset[j]); |
631 | 702M | if (lo > 0) |
632 | 79.8M | bits1j += offsets[j]; |
633 | 702M | bits2j += offsets[j]; |
634 | 702M | if (offsets[j]>0) |
635 | 1.36M | skip_start = j; |
636 | 702M | bits2j = IMAX(0,bits2j-bits1j); |
637 | 702M | bits1[j] = bits1j; |
638 | 702M | bits2[j] = bits2j; |
639 | 702M | } |
640 | 45.6M | codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap, |
641 | 45.6M | total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, |
642 | 45.6M | pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth); |
643 | 45.6M | RESTORE_STACK; |
644 | 45.6M | return codedBands; |
645 | 45.6M | } |
646 | | |