Allow coarse energy to take almost all the bits. Also, fixed a some issues with

the VBR rate controller.
This commit is contained in:
Jean-Marc Valin 2009-10-21 07:08:27 -04:00
parent 73bf6332ed
commit ab4dcc5c90
2 changed files with 7 additions and 14 deletions

View file

@ -546,7 +546,7 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
int pitch_index; int pitch_index;
int bits; int bits;
int has_fold=1; int has_fold=1;
unsigned coarse_needed; int coarse_needed;
ec_byte_buffer buf; ec_byte_buffer buf;
ec_enc enc; ec_enc enc;
VARDECL(celt_sig, in); VARDECL(celt_sig, in);
@ -766,7 +766,7 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
/* Bit allocation */ /* Bit allocation */
ALLOC(error, C*st->mode->nbEBands, celt_word16); ALLOC(error, C*st->mode->nbEBands, celt_word16);
coarse_needed = quant_coarse_energy(st->mode, bandLogE, st->oldBandE, nbCompressedBytes*8/3, intra_ener, st->mode->prob, error, &enc, C); coarse_needed = quant_coarse_energy(st->mode, bandLogE, st->oldBandE, nbCompressedBytes*8-16, intra_ener, st->mode->prob, error, &enc, C);
coarse_needed = ((coarse_needed*3-1)>>3)+1; coarse_needed = ((coarse_needed*3-1)>>3)+1;
/* Variable bitrate */ /* Variable bitrate */
@ -791,7 +791,6 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
/* In VBR mode the frame size must not be reduced so much that it would result in the coarse energy busting its budget */ /* In VBR mode the frame size must not be reduced so much that it would result in the coarse energy busting its budget */
target=IMAX(coarse_needed,(target+64)/128); target=IMAX(coarse_needed,(target+64)/128);
nbCompressedBytes=IMIN(nbCompressedBytes,target); nbCompressedBytes=IMIN(nbCompressedBytes,target);
/* Make the adaptation coef (alpha) higher at the beginning */ /* Make the adaptation coef (alpha) higher at the beginning */
if (st->vbr_count < 990) if (st->vbr_count < 990)
{ {
@ -820,7 +819,6 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
int adjust = 1+(st->vbr_reservoir-vbr_bound-1)/(8<<BITRES); int adjust = 1+(st->vbr_reservoir-vbr_bound-1)/(8<<BITRES);
nbCompressedBytes -= adjust; nbCompressedBytes -= adjust;
st->vbr_reservoir -= adjust*(8<<BITRES); st->vbr_reservoir -= adjust*(8<<BITRES);
st->vbr_offset -= 8<<BITRES;
/*printf ("-%d\n", adjust);*/ /*printf ("-%d\n", adjust);*/
} else if (st->vbr_reservoir < 0) } else if (st->vbr_reservoir < 0)
{ {
@ -828,7 +826,6 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
int adjust = 1-(st->vbr_reservoir-1)/(8<<BITRES); int adjust = 1-(st->vbr_reservoir-1)/(8<<BITRES);
st->vbr_reservoir += adjust*(8<<BITRES); st->vbr_reservoir += adjust*(8<<BITRES);
nbCompressedBytes += adjust; nbCompressedBytes += adjust;
st->vbr_offset += 8<<BITRES;
/*printf ("+%d\n", adjust);*/ /*printf ("+%d\n", adjust);*/
} }
@ -1376,7 +1373,7 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
ALLOC(fine_quant, st->mode->nbEBands, int); ALLOC(fine_quant, st->mode->nbEBands, int);
/* Get band energies */ /* Get band energies */
unquant_coarse_energy(st->mode, bandE, st->oldBandE, len*8/3, intra_ener, st->mode->prob, &dec, C); unquant_coarse_energy(st->mode, bandE, st->oldBandE, len*8-16, intra_ener, st->mode->prob, &dec, C);
ALLOC(pulses, st->mode->nbEBands, int); ALLOC(pulses, st->mode->nbEBands, int);
ALLOC(offsets, st->mode->nbEBands, int); ALLOC(offsets, st->mode->nbEBands, int);

View file

@ -89,7 +89,6 @@ void quant_prob_free(int *freq)
unsigned quant_coarse_energy(const CELTMode *m, celt_word16 *eBands, celt_word16 *oldEBands, int budget, int intra, int *prob, celt_word16 *error, ec_enc *enc, int _C) unsigned quant_coarse_energy(const CELTMode *m, celt_word16 *eBands, celt_word16 *oldEBands, int budget, int intra, int *prob, celt_word16 *error, ec_enc *enc, int _C)
{ {
int i, c; int i, c;
unsigned bits;
unsigned bits_used = 0; unsigned bits_used = 0;
celt_word16 prev[2] = {0,0}; celt_word16 prev[2] = {0,0};
celt_word16 coef = m->ePredCoef; celt_word16 coef = m->ePredCoef;
@ -104,7 +103,6 @@ unsigned quant_coarse_energy(const CELTMode *m, celt_word16 *eBands, celt_word16
/* The .8 is a heuristic */ /* The .8 is a heuristic */
beta = MULT16_16_Q15(QCONST16(.8f,15),coef); beta = MULT16_16_Q15(QCONST16(.8f,15),coef);
bits = ec_enc_tell(enc, 0);
/* Encode at a fixed coarse resolution */ /* Encode at a fixed coarse resolution */
for (i=0;i<m->nbEBands;i++) for (i=0;i<m->nbEBands;i++)
{ {
@ -127,7 +125,7 @@ unsigned quant_coarse_energy(const CELTMode *m, celt_word16 *eBands, celt_word16
#endif #endif
/* If we don't have enough bits to encode all the energy, just assume something safe. /* If we don't have enough bits to encode all the energy, just assume something safe.
We allow slightly busting the budget here */ We allow slightly busting the budget here */
bits_used=ec_enc_tell(enc, 0) - bits; bits_used=ec_enc_tell(enc, 0);
if (bits_used > budget) if (bits_used > budget)
{ {
qi = -1; qi = -1;
@ -223,7 +221,6 @@ void quant_energy_finalise(const CELTMode *m, celt_ener *eBands, celt_word16 *ol
void unquant_coarse_energy(const CELTMode *m, celt_ener *eBands, celt_word16 *oldEBands, int budget, int intra, int *prob, ec_dec *dec, int _C) void unquant_coarse_energy(const CELTMode *m, celt_ener *eBands, celt_word16 *oldEBands, int budget, int intra, int *prob, ec_dec *dec, int _C)
{ {
int i, c; int i, c;
unsigned bits;
celt_word16 prev[2] = {0, 0}; celt_word16 prev[2] = {0, 0};
celt_word16 coef = m->ePredCoef; celt_word16 coef = m->ePredCoef;
celt_word16 beta; celt_word16 beta;
@ -237,7 +234,6 @@ void unquant_coarse_energy(const CELTMode *m, celt_ener *eBands, celt_word16 *ol
/* The .8 is a heuristic */ /* The .8 is a heuristic */
beta = MULT16_16_Q15(QCONST16(.8f,15),coef); beta = MULT16_16_Q15(QCONST16(.8f,15),coef);
bits = ec_dec_tell(dec, 0);
/* Decode at a fixed coarse resolution */ /* Decode at a fixed coarse resolution */
for (i=0;i<m->nbEBands;i++) for (i=0;i<m->nbEBands;i++)
{ {
@ -248,7 +244,7 @@ void unquant_coarse_energy(const CELTMode *m, celt_ener *eBands, celt_word16 *ol
celt_word16 mean = MULT16_16_Q15(Q15ONE-coef,eMeans[i]); celt_word16 mean = MULT16_16_Q15(Q15ONE-coef,eMeans[i]);
/* If we didn't have enough bits to encode all the energy, just assume something safe. /* If we didn't have enough bits to encode all the energy, just assume something safe.
We allow slightly busting the budget here */ We allow slightly busting the budget here */
if (ec_dec_tell(dec, 0) - bits > budget) if (ec_dec_tell(dec, 0) > budget)
qi = -1; qi = -1;
else else
qi = ec_laplace_decode_start(dec, prob[2*i], prob[2*i+1]); qi = ec_laplace_decode_start(dec, prob[2*i], prob[2*i+1]);