diff --git a/libcelt/celt.c b/libcelt/celt.c index 56055a5d8d3d1adaeb1d68cca8d02bf0fa0afeb5..26dff1916770d18364a3265fec3c4805a462a1b2 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -166,6 +166,27 @@ static void compute_mdcts(mdct_lookup *mdct_lookup, float *window, float *in, fl } +static void compute_inv_mdcts(mdct_lookup *mdct_lookup, float *window, float *X, float *out_mem, float *mdct_overlap, int N, int B) +{ + int i; + for (i=0;i<B;i++) + { + int j; + float x[2*N]; + float tmp[N]; + /* De-interleaving the sub-frames */ + for (j=0;j<N;j++) + tmp[j] = X[B*j+i]; + mdct_backward(mdct_lookup, tmp, x); + for (j=0;j<2*N;j++) + x[j] = window[j]*x[j]; + for (j=0;j<N;j++) + out_mem[MAX_PERIOD+(i-B)*N+j] = x[j]+mdct_overlap[j]; + for (j=0;j<N;j++) + mdct_overlap[j] = x[N+j]; + } +} + int celt_encode(CELTEncoder *st, short *pcm) { int i, N, B; @@ -261,22 +282,11 @@ int celt_encode(CELTEncoder *st, short *pcm) CELT_MOVE(st->out_mem, st->out_mem+B*N, MAX_PERIOD-B*N); /* Compute inverse MDCTs */ + compute_inv_mdcts(&st->mdct_lookup, st->window, X, st->out_mem, st->mdct_overlap, N, B); + for (i=0;i<B;i++) { int j; - float x[2*N]; - float tmp[N]; - /* De-interleaving the sub-frames */ - for (j=0;j<N;j++) - tmp[j] = X[B*j+i]; - mdct_backward(&st->mdct_lookup, tmp, x); - for (j=0;j<2*N;j++) - x[j] = st->window[j]*x[j]; - for (j=0;j<N;j++) - st->out_mem[MAX_PERIOD+(i-B)*N+j] = x[j]+st->mdct_overlap[j]; - for (j=0;j<N;j++) - st->mdct_overlap[j] = x[N+j]; - for (j=0;j<N;j++) { float tmp = st->out_mem[MAX_PERIOD+(i-B)*N+j] + st->preemph*st->preemph_memD; @@ -394,27 +404,16 @@ int celt_decode_lost(CELTDecoder *st, short *pcm) pitch_index = st->last_pitch_index; - /* Pitch MDCT */ + /* Use the pitch MDCT as the "guessed" signal */ compute_mdcts(&st->mdct_lookup, st->window, st->out_mem+pitch_index, X, N, B); CELT_MOVE(st->out_mem, st->out_mem+B*N, MAX_PERIOD-B*N); /* Compute inverse MDCTs */ + compute_inv_mdcts(&st->mdct_lookup, st->window, X, st->out_mem, st->mdct_overlap, N, B); + for (i=0;i<B;i++) { int j; - float x[2*N]; - float tmp[N]; - /* De-interleaving the sub-frames */ - for (j=0;j<N;j++) - tmp[j] = X[B*j+i]; - mdct_backward(&st->mdct_lookup, tmp, x); - for (j=0;j<2*N;j++) - x[j] = st->window[j]*x[j]; - for (j=0;j<N;j++) - st->out_mem[MAX_PERIOD+(i-B)*N+j] = x[j]+st->mdct_overlap[j]; - for (j=0;j<N;j++) - st->mdct_overlap[j] = x[N+j]; - for (j=0;j<N;j++) { float tmp = st->out_mem[MAX_PERIOD+(i-B)*N+j] + st->preemph*st->preemph_memD; @@ -482,22 +481,10 @@ int celt_decode(CELTDecoder *st, char *data, int len, short *pcm) CELT_MOVE(st->out_mem, st->out_mem+B*N, MAX_PERIOD-B*N); /* Compute inverse MDCTs */ + compute_inv_mdcts(&st->mdct_lookup, st->window, X, st->out_mem, st->mdct_overlap, N, B); for (i=0;i<B;i++) { int j; - float x[2*N]; - float tmp[N]; - /* De-interleaving the sub-frames */ - for (j=0;j<N;j++) - tmp[j] = X[B*j+i]; - mdct_backward(&st->mdct_lookup, tmp, x); - for (j=0;j<2*N;j++) - x[j] = st->window[j]*x[j]; - for (j=0;j<N;j++) - st->out_mem[MAX_PERIOD+(i-B)*N+j] = x[j]+st->mdct_overlap[j]; - for (j=0;j<N;j++) - st->mdct_overlap[j] = x[N+j]; - for (j=0;j<N;j++) { float tmp = st->out_mem[MAX_PERIOD+(i-B)*N+j] + st->preemph*st->preemph_memD;