Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/celt/rate.c @ 154:4664ac0c1032
Add Opus sources and macOS builds
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
153:84bc3a5ec321 | 154:4664ac0c1032 |
---|---|
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 #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 { | |
253 opus_int32 psum; | |
254 int lo, hi; | |
255 int i, j; | |
256 int logM; | |
257 int stereo; | |
258 int codedBands=-1; | |
259 int alloc_floor; | |
260 opus_int32 left, percoeff; | |
261 int done; | |
262 opus_int32 balance; | |
263 SAVE_STACK; | |
264 | |
265 alloc_floor = C<<BITRES; | |
266 stereo = C>1; | |
267 | |
268 logM = LM<<BITRES; | |
269 lo = 0; | |
270 hi = 1<<ALLOC_STEPS; | |
271 for (i=0;i<ALLOC_STEPS;i++) | |
272 { | |
273 int mid = (lo+hi)>>1; | |
274 psum = 0; | |
275 done = 0; | |
276 for (j=end;j-->start;) | |
277 { | |
278 int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS); | |
279 if (tmp >= thresh[j] || done) | |
280 { | |
281 done = 1; | |
282 /* Don't allocate more than we can actually use */ | |
283 psum += IMIN(tmp, cap[j]); | |
284 } else { | |
285 if (tmp >= alloc_floor) | |
286 psum += alloc_floor; | |
287 } | |
288 } | |
289 if (psum > total) | |
290 hi = mid; | |
291 else | |
292 lo = mid; | |
293 } | |
294 psum = 0; | |
295 /*printf ("interp bisection gave %d\n", lo);*/ | |
296 done = 0; | |
297 for (j=end;j-->start;) | |
298 { | |
299 int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS); | |
300 if (tmp < thresh[j] && !done) | |
301 { | |
302 if (tmp >= alloc_floor) | |
303 tmp = alloc_floor; | |
304 else | |
305 tmp = 0; | |
306 } else | |
307 done = 1; | |
308 /* Don't allocate more than we can actually use */ | |
309 tmp = IMIN(tmp, cap[j]); | |
310 bits[j] = tmp; | |
311 psum += tmp; | |
312 } | |
313 | |
314 /* Decide which bands to skip, working backwards from the end. */ | |
315 for (codedBands=end;;codedBands--) | |
316 { | |
317 int band_width; | |
318 int band_bits; | |
319 int rem; | |
320 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 if (j<=skip_start) | |
328 { | |
329 /* Give the bit we reserved to end skipping back. */ | |
330 total += skip_rsv; | |
331 break; | |
332 } | |
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 left = total-psum; | |
336 percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); | |
337 left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; | |
338 rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0); | |
339 band_width = m->eBands[codedBands]-m->eBands[j]; | |
340 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 if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES))) | |
345 { | |
346 if (encode) | |
347 { | |
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 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 if (codedBands > 17) | |
355 depth_threshold = j<prev ? 7 : 9; | |
356 else | |
357 depth_threshold = 0; | |
358 #ifdef FUZZING | |
359 if ((rand()&0x1) == 0) | |
360 #else | |
361 if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth)) | |
362 #endif | |
363 { | |
364 ec_enc_bit_logp(ec, 1, 1); | |
365 break; | |
366 } | |
367 ec_enc_bit_logp(ec, 0, 1); | |
368 } else if (ec_dec_bit_logp(ec, 1)) { | |
369 break; | |
370 } | |
371 /*We used a bit to skip this band.*/ | |
372 psum += 1<<BITRES; | |
373 band_bits -= 1<<BITRES; | |
374 } | |
375 /*Reclaim the bits originally allocated to this band.*/ | |
376 psum -= bits[j]+intensity_rsv; | |
377 if (intensity_rsv > 0) | |
378 intensity_rsv = LOG2_FRAC_TABLE[j-start]; | |
379 psum += intensity_rsv; | |
380 if (band_bits >= alloc_floor) | |
381 { | |
382 /*If we have enough for a fine energy bit per channel, use it.*/ | |
383 psum += alloc_floor; | |
384 bits[j] = alloc_floor; | |
385 } else { | |
386 /*Otherwise this band gets nothing at all.*/ | |
387 bits[j] = 0; | |
388 } | |
389 } | |
390 | |
391 celt_assert(codedBands > start); | |
392 /* Code the intensity and dual stereo parameters. */ | |
393 if (intensity_rsv > 0) | |
394 { | |
395 if (encode) | |
396 { | |
397 *intensity = IMIN(*intensity, codedBands); | |
398 ec_enc_uint(ec, *intensity-start, codedBands+1-start); | |
399 } | |
400 else | |
401 *intensity = start+ec_dec_uint(ec, codedBands+1-start); | |
402 } | |
403 else | |
404 *intensity = 0; | |
405 if (*intensity <= start) | |
406 { | |
407 total += dual_stereo_rsv; | |
408 dual_stereo_rsv = 0; | |
409 } | |
410 if (dual_stereo_rsv > 0) | |
411 { | |
412 if (encode) | |
413 ec_enc_bit_logp(ec, *dual_stereo, 1); | |
414 else | |
415 *dual_stereo = ec_dec_bit_logp(ec, 1); | |
416 } | |
417 else | |
418 *dual_stereo = 0; | |
419 | |
420 /* Allocate the remaining bits */ | |
421 left = total-psum; | |
422 percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); | |
423 left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; | |
424 for (j=start;j<codedBands;j++) | |
425 bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j])); | |
426 for (j=start;j<codedBands;j++) | |
427 { | |
428 int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]); | |
429 bits[j] += tmp; | |
430 left -= tmp; | |
431 } | |
432 /*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/ | |
433 | |
434 balance = 0; | |
435 for (j=start;j<codedBands;j++) | |
436 { | |
437 int N0, N, den; | |
438 int offset; | |
439 int NClogN; | |
440 opus_int32 excess, bit; | |
441 | |
442 celt_assert(bits[j] >= 0); | |
443 N0 = m->eBands[j+1]-m->eBands[j]; | |
444 N=N0<<LM; | |
445 bit = (opus_int32)bits[j]+balance; | |
446 | |
447 if (N>1) | |
448 { | |
449 excess = MAX32(bit-cap[j],0); | |
450 bits[j] = bit-excess; | |
451 | |
452 /* Compensate for the extra DoF in stereo */ | |
453 den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0)); | |
454 | |
455 NClogN = den*(m->logN[j] + logM); | |
456 | |
457 /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET | |
458 compared to their "fair share" of total/N */ | |
459 offset = (NClogN>>1)-den*FINE_OFFSET; | |
460 | |
461 /* N=2 is the only point that doesn't match the curve */ | |
462 if (N==2) | |
463 offset += den<<BITRES>>2; | |
464 | |
465 /* Changing the offset for allocating the second and third | |
466 fine energy bit */ | |
467 if (bits[j] + offset < den*2<<BITRES) | |
468 offset += NClogN>>2; | |
469 else if (bits[j] + offset < den*3<<BITRES) | |
470 offset += NClogN>>3; | |
471 | |
472 /* Divide with rounding */ | |
473 ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1)))); | |
474 ebits[j] = celt_udiv(ebits[j], den)>>BITRES; | |
475 | |
476 /* Make sure not to bust */ | |
477 if (C*ebits[j] > (bits[j]>>BITRES)) | |
478 ebits[j] = bits[j] >> stereo >> BITRES; | |
479 | |
480 /* More than that is useless because that's about as far as PVQ can go */ | |
481 ebits[j] = IMIN(ebits[j], MAX_FINE_BITS); | |
482 | |
483 /* If we rounded down or capped this band, make it a candidate for the | |
484 final fine energy pass */ | |
485 fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset; | |
486 | |
487 /* Remove the allocated fine bits; the rest are assigned to PVQ */ | |
488 bits[j] -= C*ebits[j]<<BITRES; | |
489 | |
490 } else { | |
491 /* For N=1, all bits go to fine energy except for a single sign bit */ | |
492 excess = MAX32(0,bit-(C<<BITRES)); | |
493 bits[j] = bit-excess; | |
494 ebits[j] = 0; | |
495 fine_priority[j] = 1; | |
496 } | |
497 | |
498 /* Fine energy can't take advantage of the re-balancing in | |
499 quant_all_bands(). | |
500 Instead, do the re-balancing here.*/ | |
501 if(excess > 0) | |
502 { | |
503 int extra_fine; | |
504 int extra_bits; | |
505 extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]); | |
506 ebits[j] += extra_fine; | |
507 extra_bits = extra_fine*C<<BITRES; | |
508 fine_priority[j] = extra_bits >= excess-balance; | |
509 excess -= extra_bits; | |
510 } | |
511 balance = excess; | |
512 | |
513 celt_assert(bits[j] >= 0); | |
514 celt_assert(ebits[j] >= 0); | |
515 } | |
516 /* Save any remaining bits over the cap for the rebalancing in | |
517 quant_all_bands(). */ | |
518 *_balance = balance; | |
519 | |
520 /* The skipped bands use all their bits for fine energy. */ | |
521 for (;j<end;j++) | |
522 { | |
523 ebits[j] = bits[j] >> stereo >> BITRES; | |
524 celt_assert(C*ebits[j]<<BITRES == bits[j]); | |
525 bits[j] = 0; | |
526 fine_priority[j] = ebits[j]<1; | |
527 } | |
528 RESTORE_STACK; | |
529 return codedBands; | |
530 } | |
531 | |
532 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, | |
533 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) | |
534 { | |
535 int lo, hi, len, j; | |
536 int codedBands; | |
537 int skip_start; | |
538 int skip_rsv; | |
539 int intensity_rsv; | |
540 int dual_stereo_rsv; | |
541 VARDECL(int, bits1); | |
542 VARDECL(int, bits2); | |
543 VARDECL(int, thresh); | |
544 VARDECL(int, trim_offset); | |
545 SAVE_STACK; | |
546 | |
547 total = IMAX(total, 0); | |
548 len = m->nbEBands; | |
549 skip_start = start; | |
550 /* Reserve a bit to signal the end of manually skipped bands. */ | |
551 skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0; | |
552 total -= skip_rsv; | |
553 /* Reserve bits for the intensity and dual stereo parameters. */ | |
554 intensity_rsv = dual_stereo_rsv = 0; | |
555 if (C==2) | |
556 { | |
557 intensity_rsv = LOG2_FRAC_TABLE[end-start]; | |
558 if (intensity_rsv>total) | |
559 intensity_rsv = 0; | |
560 else | |
561 { | |
562 total -= intensity_rsv; | |
563 dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0; | |
564 total -= dual_stereo_rsv; | |
565 } | |
566 } | |
567 ALLOC(bits1, len, int); | |
568 ALLOC(bits2, len, int); | |
569 ALLOC(thresh, len, int); | |
570 ALLOC(trim_offset, len, int); | |
571 | |
572 for (j=start;j<end;j++) | |
573 { | |
574 /* Below this threshold, we're sure not to allocate any PVQ bits */ | |
575 thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4); | |
576 /* Tilt of the allocation curve */ | |
577 trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1) | |
578 *(1<<(LM+BITRES))>>6; | |
579 /* Giving less resolution to single-coefficient bands because they get | |
580 more benefit from having one coarse value per coefficient*/ | |
581 if ((m->eBands[j+1]-m->eBands[j])<<LM==1) | |
582 trim_offset[j] -= C<<BITRES; | |
583 } | |
584 lo = 1; | |
585 hi = m->nbAllocVectors - 1; | |
586 do | |
587 { | |
588 int done = 0; | |
589 int psum = 0; | |
590 int mid = (lo+hi) >> 1; | |
591 for (j=end;j-->start;) | |
592 { | |
593 int bitsj; | |
594 int N = m->eBands[j+1]-m->eBands[j]; | |
595 bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2; | |
596 if (bitsj > 0) | |
597 bitsj = IMAX(0, bitsj + trim_offset[j]); | |
598 bitsj += offsets[j]; | |
599 if (bitsj >= thresh[j] || done) | |
600 { | |
601 done = 1; | |
602 /* Don't allocate more than we can actually use */ | |
603 psum += IMIN(bitsj, cap[j]); | |
604 } else { | |
605 if (bitsj >= C<<BITRES) | |
606 psum += C<<BITRES; | |
607 } | |
608 } | |
609 if (psum > total) | |
610 hi = mid - 1; | |
611 else | |
612 lo = mid + 1; | |
613 /*printf ("lo = %d, hi = %d\n", lo, hi);*/ | |
614 } | |
615 while (lo <= hi); | |
616 hi = lo--; | |
617 /*printf ("interp between %d and %d\n", lo, hi);*/ | |
618 for (j=start;j<end;j++) | |
619 { | |
620 int bits1j, bits2j; | |
621 int N = m->eBands[j+1]-m->eBands[j]; | |
622 bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2; | |
623 bits2j = hi>=m->nbAllocVectors ? | |
624 cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2; | |
625 if (bits1j > 0) | |
626 bits1j = IMAX(0, bits1j + trim_offset[j]); | |
627 if (bits2j > 0) | |
628 bits2j = IMAX(0, bits2j + trim_offset[j]); | |
629 if (lo > 0) | |
630 bits1j += offsets[j]; | |
631 bits2j += offsets[j]; | |
632 if (offsets[j]>0) | |
633 skip_start = j; | |
634 bits2j = IMAX(0,bits2j-bits1j); | |
635 bits1[j] = bits1j; | |
636 bits2[j] = bits2j; | |
637 } | |
638 codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap, | |
639 total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, | |
640 pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth); | |
641 RESTORE_STACK; | |
642 return codedBands; | |
643 } | |
644 |