Move skip coding into interp_bits2pulses().

This allows us to a) not pay a coding cost to avoid skipping bands that are
 stupid to skip (e.g., the first band, or bands that have so few bits that we
 wouldn't redistribute anything) and b) not reserve bits to pay that cost.
This commit is contained in:
Timothy B. Terriberry 2010-12-15 05:12:43 -08:00 committed by Jean-Marc Valin
parent 7cbf168c01
commit b2f59009f6
3 changed files with 26 additions and 41 deletions

View file

@ -752,7 +752,6 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
int intensity=0; int intensity=0;
int dual_stereo=0; int dual_stereo=0;
int effectiveBytes; int effectiveBytes;
int skip;
SAVE_STACK; SAVE_STACK;
if (nbCompressedBytes<0 || pcm==NULL) if (nbCompressedBytes<0 || pcm==NULL)
@ -1120,15 +1119,11 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
ALLOC(pulses, st->mode->nbEBands, int); ALLOC(pulses, st->mode->nbEBands, int);
ALLOC(fine_priority, st->mode->nbEBands, int); ALLOC(fine_priority, st->mode->nbEBands, int);
/* bits = packet size - where we are - safety - skip signalling */ /* bits = packet size - where we are - safety */
bits = nbCompressedBytes*8 - ec_enc_tell(enc, 0) - 1 - (1<<BITRES); bits = nbCompressedBytes*8 - ec_enc_tell(enc, 0) - 1;
skip=-1;
codedBands = compute_allocation(st->mode, st->start, st->end, offsets, codedBands = compute_allocation(st->mode, st->start, st->end, offsets,
alloc_trim, bits, pulses, fine_quant, fine_priority, C, LM, &skip, st->lastCodedBands); alloc_trim, bits, pulses, fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands);
st->lastCodedBands = codedBands; st->lastCodedBands = codedBands;
for (i=0;i<skip;i++)
ec_enc_bit_prob(enc, 0, 32768);
ec_enc_bit_prob(enc, 1, 32768);
quant_fine_energy(st->mode, st->start, st->end, bandE, oldBandE, error, fine_quant, enc, C); quant_fine_energy(st->mode, st->start, st->end, bandE, oldBandE, error, fine_quant, enc, C);
@ -1728,7 +1723,6 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
celt_word16 postfilter_gain; celt_word16 postfilter_gain;
int intensity=0; int intensity=0;
int dual_stereo=0; int dual_stereo=0;
int skip;
SAVE_STACK; SAVE_STACK;
if (pcm==NULL) if (pcm==NULL)
@ -1862,19 +1856,9 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
intensity = ec_dec_uint(dec, 1+st->end-st->start); intensity = ec_dec_uint(dec, 1+st->end-st->start);
} }
bits = len*8 - ec_dec_tell(dec, 0) - 1 - (1<<BITRES); bits = len*8 - ec_dec_tell(dec, 0) - 1;
skip=0;
while (ec_dec_bit_prob(dec, 32768)==0)
{
skip++;
if (skip>21)
{
dec->error = 1;
break;
}
}
codedBands = compute_allocation(st->mode, st->start, st->end, offsets, codedBands = compute_allocation(st->mode, st->start, st->end, offsets,
alloc_trim, bits, pulses, fine_quant, fine_priority, C, LM, &skip, 0); alloc_trim, bits, pulses, fine_quant, fine_priority, C, LM, dec, 0, 0);
unquant_fine_energy(st->mode, st->start, st->end, bandE, oldBandE, fine_quant, dec, C); unquant_fine_energy(st->mode, st->start, st->end, bandE, oldBandE, fine_quant, dec, C);

View file

@ -142,7 +142,7 @@ void compute_pulse_cache(CELTMode *m, int LM)
static inline int interp_bits2pulses(const CELTMode *m, int start, int end, static inline int interp_bits2pulses(const CELTMode *m, int start, int end,
int *bits1, int *bits2, const int *thresh, int total, int *bits, int *bits1, int *bits2, const int *thresh, int total, int *bits,
int *ebits, int *fine_priority, int len, int _C, int LM, int *skip, int prev) int *ebits, int *fine_priority, int len, int _C, int LM, void *ec, int encode, int prev)
{ {
int psum; int psum;
int lo, hi; int lo, hi;
@ -153,7 +153,6 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end,
int alloc_floor; int alloc_floor;
int left, percoeff; int left, percoeff;
int force_skipping; int force_skipping;
int unforced_skips;
int done; int done;
SAVE_STACK; SAVE_STACK;
@ -206,8 +205,6 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end,
} }
force_skipping = 1; force_skipping = 1;
unforced_skips = *skip;
*skip = 0;
codedBands=end; codedBands=end;
for (j=end;j-->start;) for (j=end;j-->start;)
{ {
@ -227,28 +224,32 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end,
force_skipping = force_skipping && band_bits < thresh[j]; force_skipping = force_skipping && band_bits < thresh[j];
if (!force_skipping) if (!force_skipping)
{ {
if (unforced_skips == -1) /*Never skip the first band: we'd be coding a bit to signal that we're
going to waste all of the other bits.*/
if (j<=start)break;
/*If we have enough for the fine energy, but not more than a full
bit beyond that, or no more than one bit total, then don't bother
skipping this band: there's no extra bits to redistribute.*/
if ((band_bits>=alloc_floor && band_bits<=alloc_floor+(1<<BITRES))
|| band_bits<(1<<BITRES))
break;
if (encode)
{ {
/*This if() block is the only part of the allocation function that /*This if() block is the only part of the allocation function that
is not a mandatory part of the bitstream: any bands we choose to is not a mandatory part of the bitstream: any bands we choose to
skip here must be explicitly signaled.*/ skip here must be explicitly signaled.*/
/*If we have enough for the fine energy, but not more than a full
bit beyond that, or no more than one bit total, then don't bother
skipping this band: there's no extra bits to redistribute.*/
if ((band_bits>=alloc_floor && band_bits<=alloc_floor+(1<<BITRES))
|| band_bits<(1<<BITRES))
break;
/*Never skip the first band: we'd be coding a bit to signal that
we're going to waste all of the other bits.*/
if (j==start)break;
/*Choose a threshold with some hysteresis to keep bands from /*Choose a threshold with some hysteresis to keep bands from
fluctuating in and out.*/ fluctuating in and out.*/
if (band_bits > ((j<prev?7:9)*band_width<<LM<<BITRES)>>4) if (band_bits > ((j<prev?7:9)*band_width<<LM<<BITRES)>>4)
{
ec_enc_bit_prob((ec_enc *)ec, 1, 32768);
break; break;
} else if(unforced_skips--<=0) }
ec_enc_bit_prob((ec_enc *)ec, 0, 32768);
} else if (ec_dec_bit_prob((ec_dec *)ec, 32768)) {
break; break;
(*skip)++; }
/*Use a bit to skip this band.*/ /*We used a bit to skip this band.*/
psum += 1<<BITRES; psum += 1<<BITRES;
band_bits -= 1<<BITRES; band_bits -= 1<<BITRES;
} }
@ -336,7 +337,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end,
} }
int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int alloc_trim, int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int alloc_trim,
int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM, int *skip, int prev) int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM, void *ec, int encode, int prev)
{ {
int lo, hi, len, j; int lo, hi, len, j;
const int C = CHANNELS(_C); const int C = CHANNELS(_C);
@ -404,7 +405,7 @@ int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int
bits1[j] += offsets[j]; bits1[j] += offsets[j];
} }
codedBands = interp_bits2pulses(m, start, end, bits1, bits2, thresh, codedBands = interp_bits2pulses(m, start, end, bits1, bits2, thresh,
total, pulses, ebits, fine_priority, len, C, LM, skip, prev); total, pulses, ebits, fine_priority, len, C, LM, ec, encode, prev);
RESTORE_STACK; RESTORE_STACK;
return codedBands; return codedBands;
} }

View file

@ -103,7 +103,7 @@ celt_int16 **compute_alloc_cache(CELTMode *m, int M);
@return Total number of bits allocated @return Total number of bits allocated
*/ */
int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int alloc_trim, int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int alloc_trim,
int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM, int *skip, int prev); int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM, void *ec, int encode, int prev);
#endif #endif