This fixes a budget overrun and segfault for unreasonably low bitrates.

This commit is contained in:
Gregory Maxwell 2009-02-03 14:35:13 -05:00
parent 1f84c80144
commit 0b2c46dc24

View file

@ -386,37 +386,38 @@ void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, ce
q = bits2pulses(m, BPbits[i], pulses[i]+curr_balance); q = bits2pulses(m, BPbits[i], pulses[i]+curr_balance);
curr_bits = BPbits[i][q]; curr_bits = BPbits[i][q];
remaining_bits -= curr_bits; remaining_bits -= curr_bits;
if (remaining_bits < 0) while (remaining_bits < 0 && q > 0)
{ {
remaining_bits += curr_bits; remaining_bits += curr_bits;
if (q>0) {
q--; q--;
curr_bits = BPbits[i][q]; curr_bits = BPbits[i][q];
remaining_bits -= curr_bits; remaining_bits -= curr_bits;
} }
}
balance += pulses[i] + tell; balance += pulses[i] + tell;
n = SHL16(celt_sqrt(C*(eBands[i+1]-eBands[i])),11); n = SHL16(celt_sqrt(C*(eBands[i+1]-eBands[i])),11);
/* If pitch isn't available, use intra-frame prediction */ /* If pitch is in use and this eBand begins a pitch band, encode the pitch gain flag */
if ((eBands[i] >= m->pitchEnd && fold) || q<=0) if (pitch_used && eBands[i]< m->pitchEnd && eBands[i] == pBands[pband+1])
{ {
intra_fold(m, X+C*eBands[i], eBands[i+1]-eBands[i], q, norm, P+C*eBands[i], eBands[i], B); int enabled = 1;
} else if (pitch_used && eBands[i] < m->pitchEnd)
{
if (eBands[i] == pBands[pband+1])
{
int enabled = 0;
pband++; pband++;
if (pgains[pband] > QCONST16(.5,15)) if (remaining_bits >= 1<<BITRES) {
enabled = 1; enabled = pgains[pband] > QCONST16(.5,15);
ec_enc_bits(enc, enabled, 1); ec_enc_bits(enc, enabled, 1);
balance += 1<<BITRES;
}
if (enabled) if (enabled)
pgains[pband] = QCONST16(.9,15); pgains[pband] = QCONST16(.9,15);
else else
pgains[pband] = 0; pgains[pband] = 0;
} }
/* If pitch isn't available, use intra-frame prediction */
if ((eBands[i] >= m->pitchEnd && fold) || q<=0)
{
intra_fold(m, X+C*eBands[i], eBands[i+1]-eBands[i], q, norm, P+C*eBands[i], eBands[i], B);
} else if (pitch_used && eBands[i] < m->pitchEnd) {
for (j=C*eBands[i];j<C*eBands[i+1];j++) for (j=C*eBands[i];j<C*eBands[i+1];j++)
P[j] = MULT16_16_Q15(pgains[pband], P[j]); P[j] = MULT16_16_Q15(pgains[pband], P[j]);
} else { } else {
@ -490,35 +491,37 @@ void unquant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P,
q = bits2pulses(m, BPbits[i], pulses[i]+curr_balance); q = bits2pulses(m, BPbits[i], pulses[i]+curr_balance);
curr_bits = BPbits[i][q]; curr_bits = BPbits[i][q];
remaining_bits -= curr_bits; remaining_bits -= curr_bits;
if (remaining_bits < 0) while (remaining_bits < 0 && q > 0)
{ {
remaining_bits += curr_bits; remaining_bits += curr_bits;
if (q>0) {
q--; q--;
curr_bits = BPbits[i][q]; curr_bits = BPbits[i][q];
remaining_bits -= curr_bits; remaining_bits -= curr_bits;
} }
}
balance += pulses[i] + tell; balance += pulses[i] + tell;
n = SHL16(celt_sqrt(C*(eBands[i+1]-eBands[i])),11); n = SHL16(celt_sqrt(C*(eBands[i+1]-eBands[i])),11);
/* If pitch isn't available, use intra-frame prediction */ /* If pitch is in use and this eBand begins a pitch band, encode the pitch gain flag */
if ((eBands[i] >= m->pitchEnd && fold) || q<=0) if (pitch_used && eBands[i] < m->pitchEnd && eBands[i] == pBands[pband+1])
{ {
intra_fold(m, X+C*eBands[i], eBands[i+1]-eBands[i], q, norm, P+C*eBands[i], eBands[i], B); int enabled = 1;
} else if (pitch_used && eBands[i] < m->pitchEnd)
{
if (eBands[i] == pBands[pband+1])
{
int enabled = 0;
pband++; pband++;
if (remaining_bits >= 1<<BITRES) {
enabled = ec_dec_bits(dec, 1); enabled = ec_dec_bits(dec, 1);
balance += 1<<BITRES;
}
if (enabled) if (enabled)
pgains[pband] = QCONST16(.9,15); pgains[pband] = QCONST16(.9,15);
else else
pgains[pband] = 0; pgains[pband] = 0;
} }
/* If pitch isn't available, use intra-frame prediction */
if ((eBands[i] >= m->pitchEnd && fold) || q<=0)
{
intra_fold(m, X+C*eBands[i], eBands[i+1]-eBands[i], q, norm, P+C*eBands[i], eBands[i], B);
} else if (pitch_used && eBands[i] < m->pitchEnd) {
for (j=C*eBands[i];j<C*eBands[i+1];j++) for (j=C*eBands[i];j<C*eBands[i+1];j++)
P[j] = MULT16_16_Q15(pgains[pband], P[j]); P[j] = MULT16_16_Q15(pgains[pband], P[j]);
} else { } else {