diff --git a/libcelt/rate.c b/libcelt/rate.c index c7d3a2a323f4e1a443d49d0b416071951eac42b6..62470bda4c1064d2377abd160d3ffc08fc4e237a 100644 --- a/libcelt/rate.c +++ b/libcelt/rate.c @@ -154,13 +154,22 @@ static inline void interp_bits2pulses(const CELTMode *m, int start, int end, int } for (j=start;j<end;j++) { - int N, d; + int N0, N, d; int offset; - - N=M*(m->eBands[j+1]-m->eBands[j]); + int fine_offset; + N0 = m->eBands[j+1]-m->eBands[j]; + N=M*N0; /* Compensate for the extra DoF in stereo */ - d=(C*N+ ((C==2 && N>2) ? 1 : 0))<<BITRES; - offset = FINE_OFFSET - ((m->logN[j] + logM)>>1); + d=(C*N+ ((C==2 && N>2) ? 1 : 0))<<BITRES; + + if (N0==1) + fine_offset = 19; + else if (N0<=4) + fine_offset = 14; + else + fine_offset = 12; + + offset = fine_offset - ((m->logN[j] + logM)>>1); /* Offset for the number of fine bits compared to their "fair share" of total/N */ offset = bits[j]-offset*N*C; /* Compensate for the prediction gain in stereo */ diff --git a/libcelt/rate.h b/libcelt/rate.h index 7312609599f15e7e256ac8bc73fea51533e7fcb7..6466f75f48d2de723653d60d7f47e9e3dfebb0fc 100644 --- a/libcelt/rate.h +++ b/libcelt/rate.h @@ -40,7 +40,6 @@ #define LOG_MAX_PULSES 7 #define BITRES 3 -#define FINE_OFFSET 14 #define QTHETA_OFFSET 6 #define QTHETA_OFFSET_STEREO 4