Line data Source code
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 0 : 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 0 : int codedBands=-1;
259 : int alloc_floor;
260 : opus_int32 left, percoeff;
261 : int done;
262 : opus_int32 balance;
263 : SAVE_STACK;
264 :
265 0 : alloc_floor = C<<BITRES;
266 0 : stereo = C>1;
267 :
268 0 : logM = LM<<BITRES;
269 0 : lo = 0;
270 0 : hi = 1<<ALLOC_STEPS;
271 0 : for (i=0;i<ALLOC_STEPS;i++)
272 : {
273 0 : int mid = (lo+hi)>>1;
274 0 : psum = 0;
275 0 : done = 0;
276 0 : for (j=end;j-->start;)
277 : {
278 0 : int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS);
279 0 : if (tmp >= thresh[j] || done)
280 : {
281 0 : done = 1;
282 : /* Don't allocate more than we can actually use */
283 0 : psum += IMIN(tmp, cap[j]);
284 : } else {
285 0 : if (tmp >= alloc_floor)
286 0 : psum += alloc_floor;
287 : }
288 : }
289 0 : if (psum > total)
290 0 : hi = mid;
291 : else
292 0 : lo = mid;
293 : }
294 0 : psum = 0;
295 : /*printf ("interp bisection gave %d\n", lo);*/
296 0 : done = 0;
297 0 : for (j=end;j-->start;)
298 : {
299 0 : int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS);
300 0 : if (tmp < thresh[j] && !done)
301 : {
302 0 : if (tmp >= alloc_floor)
303 0 : tmp = alloc_floor;
304 : else
305 0 : tmp = 0;
306 : } else
307 0 : done = 1;
308 : /* Don't allocate more than we can actually use */
309 0 : tmp = IMIN(tmp, cap[j]);
310 0 : bits[j] = tmp;
311 0 : psum += tmp;
312 : }
313 :
314 : /* Decide which bands to skip, working backwards from the end. */
315 0 : for (codedBands=end;;codedBands--)
316 0 : {
317 : int band_width;
318 : int band_bits;
319 : int rem;
320 0 : 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 0 : if (j<=skip_start)
328 : {
329 : /* Give the bit we reserved to end skipping back. */
330 0 : total += skip_rsv;
331 0 : 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 0 : left = total-psum;
336 0 : percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
337 0 : left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
338 0 : rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0);
339 0 : band_width = m->eBands[codedBands]-m->eBands[j];
340 0 : 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 0 : if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES)))
345 : {
346 0 : 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 0 : if (codedBands > 17)
355 0 : depth_threshold = j<prev ? 7 : 9;
356 : else
357 0 : depth_threshold = 0;
358 : #ifdef FUZZING
359 : if ((rand()&0x1) == 0)
360 : #else
361 0 : if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth))
362 : #endif
363 : {
364 0 : ec_enc_bit_logp(ec, 1, 1);
365 0 : break;
366 : }
367 0 : ec_enc_bit_logp(ec, 0, 1);
368 0 : } else if (ec_dec_bit_logp(ec, 1)) {
369 0 : break;
370 : }
371 : /*We used a bit to skip this band.*/
372 0 : psum += 1<<BITRES;
373 0 : band_bits -= 1<<BITRES;
374 : }
375 : /*Reclaim the bits originally allocated to this band.*/
376 0 : psum -= bits[j]+intensity_rsv;
377 0 : if (intensity_rsv > 0)
378 0 : intensity_rsv = LOG2_FRAC_TABLE[j-start];
379 0 : psum += intensity_rsv;
380 0 : if (band_bits >= alloc_floor)
381 : {
382 : /*If we have enough for a fine energy bit per channel, use it.*/
383 0 : psum += alloc_floor;
384 0 : bits[j] = alloc_floor;
385 : } else {
386 : /*Otherwise this band gets nothing at all.*/
387 0 : bits[j] = 0;
388 : }
389 : }
390 :
391 0 : celt_assert(codedBands > start);
392 : /* Code the intensity and dual stereo parameters. */
393 0 : if (intensity_rsv > 0)
394 : {
395 0 : if (encode)
396 : {
397 0 : *intensity = IMIN(*intensity, codedBands);
398 0 : ec_enc_uint(ec, *intensity-start, codedBands+1-start);
399 : }
400 : else
401 0 : *intensity = start+ec_dec_uint(ec, codedBands+1-start);
402 : }
403 : else
404 0 : *intensity = 0;
405 0 : if (*intensity <= start)
406 : {
407 0 : total += dual_stereo_rsv;
408 0 : dual_stereo_rsv = 0;
409 : }
410 0 : if (dual_stereo_rsv > 0)
411 : {
412 0 : if (encode)
413 0 : ec_enc_bit_logp(ec, *dual_stereo, 1);
414 : else
415 0 : *dual_stereo = ec_dec_bit_logp(ec, 1);
416 : }
417 : else
418 0 : *dual_stereo = 0;
419 :
420 : /* Allocate the remaining bits */
421 0 : left = total-psum;
422 0 : percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]);
423 0 : left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
424 0 : for (j=start;j<codedBands;j++)
425 0 : bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j]));
426 0 : for (j=start;j<codedBands;j++)
427 : {
428 0 : int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]);
429 0 : bits[j] += tmp;
430 0 : left -= tmp;
431 : }
432 : /*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/
433 :
434 0 : balance = 0;
435 0 : 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 0 : celt_assert(bits[j] >= 0);
443 0 : N0 = m->eBands[j+1]-m->eBands[j];
444 0 : N=N0<<LM;
445 0 : bit = (opus_int32)bits[j]+balance;
446 :
447 0 : if (N>1)
448 : {
449 0 : excess = MAX32(bit-cap[j],0);
450 0 : bits[j] = bit-excess;
451 :
452 : /* Compensate for the extra DoF in stereo */
453 0 : den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0));
454 :
455 0 : 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 0 : offset = (NClogN>>1)-den*FINE_OFFSET;
460 :
461 : /* N=2 is the only point that doesn't match the curve */
462 0 : if (N==2)
463 0 : offset += den<<BITRES>>2;
464 :
465 : /* Changing the offset for allocating the second and third
466 : fine energy bit */
467 0 : if (bits[j] + offset < den*2<<BITRES)
468 0 : offset += NClogN>>2;
469 0 : else if (bits[j] + offset < den*3<<BITRES)
470 0 : offset += NClogN>>3;
471 :
472 : /* Divide with rounding */
473 0 : ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))));
474 0 : ebits[j] = celt_udiv(ebits[j], den)>>BITRES;
475 :
476 : /* Make sure not to bust */
477 0 : if (C*ebits[j] > (bits[j]>>BITRES))
478 0 : ebits[j] = bits[j] >> stereo >> BITRES;
479 :
480 : /* More than that is useless because that's about as far as PVQ can go */
481 0 : 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 0 : fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset;
486 :
487 : /* Remove the allocated fine bits; the rest are assigned to PVQ */
488 0 : 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 0 : excess = MAX32(0,bit-(C<<BITRES));
493 0 : bits[j] = bit-excess;
494 0 : ebits[j] = 0;
495 0 : 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 0 : if(excess > 0)
502 : {
503 : int extra_fine;
504 : int extra_bits;
505 0 : extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]);
506 0 : ebits[j] += extra_fine;
507 0 : extra_bits = extra_fine*C<<BITRES;
508 0 : fine_priority[j] = extra_bits >= excess-balance;
509 0 : excess -= extra_bits;
510 : }
511 0 : balance = excess;
512 :
513 0 : celt_assert(bits[j] >= 0);
514 0 : celt_assert(ebits[j] >= 0);
515 : }
516 : /* Save any remaining bits over the cap for the rebalancing in
517 : quant_all_bands(). */
518 0 : *_balance = balance;
519 :
520 : /* The skipped bands use all their bits for fine energy. */
521 0 : for (;j<end;j++)
522 : {
523 0 : ebits[j] = bits[j] >> stereo >> BITRES;
524 0 : celt_assert(C*ebits[j]<<BITRES == bits[j]);
525 0 : bits[j] = 0;
526 0 : fine_priority[j] = ebits[j]<1;
527 : }
528 : RESTORE_STACK;
529 0 : return codedBands;
530 : }
531 :
532 0 : int 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 0 : total = IMAX(total, 0);
548 0 : len = m->nbEBands;
549 0 : skip_start = start;
550 : /* Reserve a bit to signal the end of manually skipped bands. */
551 0 : skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0;
552 0 : total -= skip_rsv;
553 : /* Reserve bits for the intensity and dual stereo parameters. */
554 0 : intensity_rsv = dual_stereo_rsv = 0;
555 0 : if (C==2)
556 : {
557 0 : intensity_rsv = LOG2_FRAC_TABLE[end-start];
558 0 : if (intensity_rsv>total)
559 0 : intensity_rsv = 0;
560 : else
561 : {
562 0 : total -= intensity_rsv;
563 0 : dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0;
564 0 : total -= dual_stereo_rsv;
565 : }
566 : }
567 0 : ALLOC(bits1, len, int);
568 0 : ALLOC(bits2, len, int);
569 0 : ALLOC(thresh, len, int);
570 0 : ALLOC(trim_offset, len, int);
571 :
572 0 : for (j=start;j<end;j++)
573 : {
574 : /* Below this threshold, we're sure not to allocate any PVQ bits */
575 0 : thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4);
576 : /* Tilt of the allocation curve */
577 0 : trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1)
578 0 : *(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 0 : if ((m->eBands[j+1]-m->eBands[j])<<LM==1)
582 0 : trim_offset[j] -= C<<BITRES;
583 : }
584 0 : lo = 1;
585 0 : hi = m->nbAllocVectors - 1;
586 : do
587 : {
588 0 : int done = 0;
589 0 : int psum = 0;
590 0 : int mid = (lo+hi) >> 1;
591 0 : for (j=end;j-->start;)
592 : {
593 : int bitsj;
594 0 : int N = m->eBands[j+1]-m->eBands[j];
595 0 : bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2;
596 0 : if (bitsj > 0)
597 0 : bitsj = IMAX(0, bitsj + trim_offset[j]);
598 0 : bitsj += offsets[j];
599 0 : if (bitsj >= thresh[j] || done)
600 : {
601 0 : done = 1;
602 : /* Don't allocate more than we can actually use */
603 0 : psum += IMIN(bitsj, cap[j]);
604 : } else {
605 0 : if (bitsj >= C<<BITRES)
606 0 : psum += C<<BITRES;
607 : }
608 : }
609 0 : if (psum > total)
610 0 : hi = mid - 1;
611 : else
612 0 : lo = mid + 1;
613 : /*printf ("lo = %d, hi = %d\n", lo, hi);*/
614 : }
615 0 : while (lo <= hi);
616 0 : hi = lo--;
617 : /*printf ("interp between %d and %d\n", lo, hi);*/
618 0 : for (j=start;j<end;j++)
619 : {
620 : int bits1j, bits2j;
621 0 : int N = m->eBands[j+1]-m->eBands[j];
622 0 : bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2;
623 0 : bits2j = hi>=m->nbAllocVectors ?
624 0 : cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2;
625 0 : if (bits1j > 0)
626 0 : bits1j = IMAX(0, bits1j + trim_offset[j]);
627 0 : if (bits2j > 0)
628 0 : bits2j = IMAX(0, bits2j + trim_offset[j]);
629 0 : if (lo > 0)
630 0 : bits1j += offsets[j];
631 0 : bits2j += offsets[j];
632 0 : if (offsets[j]>0)
633 0 : skip_start = j;
634 0 : bits2j = IMAX(0,bits2j-bits1j);
635 0 : bits1[j] = bits1j;
636 0 : bits2[j] = bits2j;
637 : }
638 0 : 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 0 : return codedBands;
643 : }
644 :
|