X-Git-Url: http://git.xiph.org/?p=opus.git;a=blobdiff_plain;f=libcelt%2Frate.c;h=24037c01b9e0c0359da2d1146f164b3aebb7f614;hp=58c863e474c3f1597648aa0db5387c9b027e37d2;hb=58ecb1ac15cadec832fc5e539c250b0a6b1a0b90;hpb=665da0ba4ddad2b35a9be0e00e70e318a1d98fdb diff --git a/libcelt/rate.c b/libcelt/rate.c index 58c863e4..24037c01 100644 --- a/libcelt/rate.c +++ b/libcelt/rate.c @@ -13,10 +13,6 @@ notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - Neither the name of the Xiph.org Foundation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR @@ -150,18 +146,14 @@ void compute_pulse_cache(CELTMode *m, int LM) { for (C=1;C<=2;C++) { - int shift; - shift = C+i+BITRES-2; for (j=0;jnbEBands;j++) { int N0; int max_bits; - int rmask; N0 = m->eBands[j+1]-m->eBands[j]; - rmask = N0==1 ? (1< 4 && !(N0&1)) + /* Even-sized bands bigger than N=2 can be split one more + time. */ + if (N0 > 2 && !(N0&1)) { N0>>=1; LM0--; } - /* N0=1 and N0=2 bands can't be split down to N=2. */ - else if (N0 <= 2) + /* N0=1 bands can't be split down to N<2. */ + else if (N0 <= 1) { - LM0=IMIN(i,3-N0); + LM0=IMIN(i,1); N0<<=LM0; } /* Compute the cost for the lowest-level PVQ of a fully split @@ -202,29 +192,29 @@ void compute_pulse_cache(CELTMode *m, int LM) total/N */ offset = (m->logN[j]+(LM0+k<>1)-QTHETA_OFFSET; /* The number of qtheta bits we'll allocate if the remainder - is to be max_bits. */ - num=(celt_int32)((2*N-1)*offset+max_bits)<<9; - den=((celt_int32)(2*N-1)<<9)-495; - qb = IMIN((num+(den>>1))/den, 8<>1))/den, 57); celt_assert(qb >= 0); - /* The average cost for theta when qn==256 is - 7.73246 bits for the triangular PDF. */ - max_bits += qb*495+256>>9; + max_bits += qb; N <<= 1; } /* Add in the cost of a stereo split, if necessary. */ if (C==2) { max_bits <<= 1; - offset = (m->logN[j]+(i<>1)-QTHETA_OFFSET_STEREO; + offset = (m->logN[j]+(i<>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET); ndof = 2*N-1-(N==2); - num = (celt_int32)(max_bits+ndof*offset)<<7; - den = ((celt_int32)ndof<<7)-(N==2?128:125); - qb = IMIN((num+(den>>1))/den, 8<>1))/den, (N==2?64:61)); celt_assert(qb >= 0); - /* The average cost for theta when qn==256, N>2 is - 7.8174 bits for the step PDF. */ - max_bits += N==2 ? qb : (qb*125+64>>7); + max_bits += qb; } /* Add the fine bits we'll use. */ /* Compensate for the extra DoF in stereo */ @@ -243,24 +233,26 @@ void compute_pulse_cache(CELTMode *m, int LM) celt_assert(qb >= 0); max_bits += C*qb<>shift < 256); - *cap++ = (unsigned char)(max_bits+rmask>>shift); + max_bits = (4*max_bits/(C*(m->eBands[j+1]-m->eBands[j]<= 0); + celt_assert(max_bits < 256); + *cap++ = (unsigned char)max_bits; } } } } -#endif /* !CUSTOM_MODES */ +#endif /* CUSTOM_MODES */ #define ALLOC_STEPS 6 static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start, - const int *bits1, const int *bits2, const int *thresh, const int *cap, int total, int skip_rsv, - int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits, - int *ebits, int *fine_priority, int _C, int LM, void *ec, int encode, int prev) + const int *bits1, const int *bits2, const int *thresh, const int *cap, celt_int32 total, celt_int32 *_balance, + int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits, + int *ebits, int *fine_priority, int _C, int LM, ec_ctx *ec, int encode, int prev) { - int psum; + celt_int32 psum; int lo, hi; int i, j; int logM; @@ -268,7 +260,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int int stereo; int codedBands=-1; int alloc_floor; - int left, percoeff; + celt_int32 left, percoeff; int done; int balance; SAVE_STACK; @@ -286,7 +278,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int done = 0; for (j=end;j-->start;) { - int tmp = bits1[j] + (mid*bits2[j]>>ALLOC_STEPS); + int tmp = bits1[j] + (mid*(celt_int32)bits2[j]>>ALLOC_STEPS); if (tmp >= thresh[j] || done) { done = 1; @@ -348,7 +340,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0); band_width = m->eBands[codedBands]-m->eBands[j]; - band_bits = bits[j] + percoeff*band_width + rem; + band_bits = (int)(bits[j] + percoeff*band_width + rem); /*Only code a skip decision if we're above the threshold for this band. Otherwise it is force-skipped. This ensures that we have enough bits to code the skip flag.*/ @@ -363,11 +355,11 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int fluctuating in and out.*/ if (band_bits > ((j>4) { - ec_enc_bit_logp((ec_enc *)ec, 1, 1); + ec_enc_bit_logp(ec, 1, 1); break; } - ec_enc_bit_logp((ec_enc *)ec, 0, 1); - } else if (ec_dec_bit_logp((ec_dec *)ec, 1)) { + ec_enc_bit_logp(ec, 0, 1); + } else if (ec_dec_bit_logp(ec, 1)) { break; } /*We used a bit to skip this band.*/ @@ -397,10 +389,10 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int if (encode) { *intensity = IMIN(*intensity, codedBands); - ec_enc_uint((ec_enc *)ec, *intensity-start, codedBands+1-start); + ec_enc_uint(ec, *intensity-start, codedBands+1-start); } else - *intensity = start+ec_dec_uint((ec_dec *)ec, codedBands+1-start); + *intensity = start+ec_dec_uint(ec, codedBands+1-start); } else *intensity = 0; @@ -412,9 +404,9 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int if (dual_stereo_rsv > 0) { if (encode) - ec_enc_bit_logp((ec_enc *)ec, *dual_stereo, 1); + ec_enc_bit_logp(ec, *dual_stereo, 1); else - *dual_stereo = ec_dec_bit_logp((ec_dec *)ec, 1); + *dual_stereo = ec_dec_bit_logp(ec, 1); } else *dual_stereo = 0; @@ -424,10 +416,10 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int percoeff = left/(m->eBands[codedBands]-m->eBands[start]); left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; for (j=start;jeBands[j+1]-m->eBands[j]); + bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j])); for (j=start;jeBands[j+1]-m->eBands[j]); + int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]); bits[j] += tmp; left -= tmp; } @@ -439,15 +431,20 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int int N0, N, den; int offset; int NClogN; + int excess; celt_assert(bits[j] >= 0); N0 = m->eBands[j+1]-m->eBands[j]; N=N0<1) { + excess = IMAX(bits[j]-cap[j],0); + bits[j] -= excess; + /* Compensate for the extra DoF in stereo */ - den=(C*N+ ((C==2 && N>2) ? 1 : 0)); + den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0)); NClogN = den*(m->logN[j] + logM); @@ -480,35 +477,39 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int final fine energy pass */ fine_priority[j] = ebits[j]*(den<= bits[j]+offset; + /* Remove the allocated fine bits; the rest are assigned to PVQ */ + bits[j] -= C*ebits[j]<> stereo >> BITRES)-1),MAX_FINE_BITS); - fine_priority[j] = (ebits[j]+1)*C<= (bits[j]-balance); - /* N=1 bands can't take advantage of the re-balancing in - quant_all_bands() because they don't have shape, only fine energy. - Instead, do the re-balancing here.*/ - balance = IMAX(0,bits[j] - ((ebits[j]+1)*C< 0) { - int tmp = IMAX(bits[j]-cap[j],0); - bits[j] -= tmp; - bits[start] += tmp; + int extra_fine; + int extra_bits; + extra_fine = IMIN(excess >> stereo+BITRES, MAX_FINE_BITS-ebits[j]); + ebits[j] += extra_fine; + extra_bits = extra_fine*C<= excess-balance; + excess -= extra_bits; } + balance = excess; - /* Remove the allocated fine bits; the other bits are assigned to PVQ */ - bits[j] -= C*ebits[j]<= 0); celt_assert(ebits[j] >= 0); } + /* Save any remaining bits over the cap for the rebalancing in + quant_all_bands(). */ + *_balance = balance; + /* The skipped bands use all their bits for fine energy. */ for (;jeBands[j+1]-m->eBands[j])<>4); /* Tilt of the allocation curve */ - trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(m->nbEBands-j-1) + trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1) <<(LM+BITRES)>>6; /* Giving less resolution to single-coefficient bands because they get more benefit from having one coarse value per coefficient*/ @@ -575,7 +576,7 @@ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets trim_offset[j] -= C<nbAllocVectors - 2; + hi = m->nbAllocVectors - 1; do { int done = 0; @@ -583,18 +584,19 @@ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets int mid = (lo+hi) >> 1; for (j=end;j-->start;) { + int bitsj; int N = m->eBands[j+1]-m->eBands[j]; - bits1[j] = C*N*m->allocVectors[mid*len+j]<>2; - if (bits1[j] > 0) - bits1[j] = IMAX(0, bits1[j] + trim_offset[j]); - bits1[j] += offsets[j]; - if (bits1[j] >= thresh[j] || done) + bitsj = C*N*m->allocVectors[mid*len+j]<>2; + if (bitsj > 0) + bitsj = IMAX(0, bitsj + trim_offset[j]); + bitsj += offsets[j]; + if (bitsj >= thresh[j] || done) { done = 1; /* Don't allocate more than we can actually use */ - psum += IMIN(bits1[j], cap[j]); + psum += IMIN(bitsj, cap[j]); } else { - if (bits1[j] >= C<= C<eBands[j+1]-m->eBands[j]; - bits1[j] = C*N*m->allocVectors[lo*len+j]<>2; - bits2[j] = C*N*m->allocVectors[hi*len+j]<>2; - if (bits1[j] > 0) - bits1[j] = IMAX(0, bits1[j] + trim_offset[j]); - if (bits2[j] > 0) - bits2[j] = IMAX(0, bits2[j] + trim_offset[j]); + bits1j = C*N*m->allocVectors[lo*len+j]<>2; + bits2j = hi>=m->nbAllocVectors ? + cap[j] : C*N*m->allocVectors[hi*len+j]<>2; + if (bits1j > 0) + bits1j = IMAX(0, bits1j + trim_offset[j]); + if (bits2j > 0) + bits2j = IMAX(0, bits2j + trim_offset[j]); if (lo > 0) - bits1[j] += offsets[j]; - bits2[j] += offsets[j]; + bits1j += offsets[j]; + bits2j += offsets[j]; if (offsets[j]>0) skip_start = j; - bits2[j] -= bits1[j]; + bits2j = IMAX(0,bits2j-bits1j); + bits1[j] = bits1j; + bits2[j] = bits2j; } codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap, - total, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, + total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, pulses, ebits, fine_priority, C, LM, ec, encode, prev); RESTORE_STACK; return codedBands;