From f974b8cc4c029240f8412e95f2779447a9604321 Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 25 Oct 1999 13:12:31 +0000 Subject: [PATCH] Fix an n=4^x bug in the mdct routines. Monty svn path=/trunk/vorbis/; revision=154 --- lib/block.c | 3 +- lib/mdct.c | 252 ++++++++++++++++++++++++++++++------------------------------ lib/modes.h | 4 +- 3 files changed, 128 insertions(+), 131 deletions(-) diff --git a/lib/block.c b/lib/block.c index 57ef7de..47674ce 100644 --- a/lib/block.c +++ b/lib/block.c @@ -376,7 +376,7 @@ int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb){ /* fill in the block. Note that for a short window, lW and nW are *short* regardless of actual settings in the stream */ - fprintf(stderr,"%d",v->W); + if(v->W){ vb->lW=v->lW; vb->W=v->W; @@ -499,6 +499,7 @@ int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ v->time_envelope_bits+=vb->time_envelope_bits; v->spectral_envelope_bits+=vb->spectral_envelope_bits; v->spectral_residue_bits+=vb->spectral_residue_bits; + v->sequence=vb->sequence; { int sizeW=vi->blocksize[v->W]; diff --git a/lib/mdct.c b/lib/mdct.c index 321adc6..7bb9ad7 100644 --- a/lib/mdct.c +++ b/lib/mdct.c @@ -36,6 +36,7 @@ ********************************************************************/ +#include #include #include #include @@ -48,14 +49,14 @@ void mdct_init(mdct_lookup *lookup,int n){ int *bitrev=malloc(sizeof(int)*(n/4)); double *trig=malloc(sizeof(double)*(n+n/4)); double *AE=trig; - double *AO=AE+n/4; - double *BE=AO+n/4; - double *BO=BE+n/4; - double *CE=BO+n/4; - double *CO=CE+n/8; + double *AO=trig+1; + double *BE=AE+n/2; + double *BO=BE+1; + double *CE=BE+n/2; + double *CO=CE+1; int *bitA=bitrev; - int *bitB=bitrev+n/8; + int *bitB=bitrev+1; int i; int log2n=lookup->log2n=rint(log(n)/log(2)); @@ -66,14 +67,14 @@ void mdct_init(mdct_lookup *lookup,int n){ /* trig lookups... */ for(i=0;i>j;j++) if((msb>>j)&i)acc|=1<trig+n4; - double *AO=AE+n4; - - for(i=0;itrig+n2; + + for(i=0;ilog2n-3;i++){ - int k0=n>>(i+1); - int k1=1<<(i+2); - int wbase=n-4; - double *AE=init->trig; - double *AO=AE+n4; + int k0=n>>(i+2); + int k1=1<<(i+3); + int wbase=n2-2; + double *A=init->trig; double *temp; - for(r=0;r<(n4>>i);r+=4){ - int w1=wbase; - int w2=wbase-(k0>>1); - double AEv= *AE,wA; - double AOv= *AO,wB; - wbase-=4; + for(r=0;r<(k0>>2);r++){ + int w1=wbase; + int w2=w1-(k0>>1); + double AEv= A[0],wA; + double AOv= A[1],wB; + wbase-=2; + k0++; for(s=0;s<(2<trig+n; - double *CO=CE+n8; - int *bitA=init->bitrev; - int *bitB=bitA+n8; + double *C=init->trig+n; + int *bit=init->bitrev; double *x1=x; - double *x2=x+n-2; + double *x2=x+n2-1; for(i=0;in; - double *x=alloca(n*sizeof(double)); + double x[n/2]; + double w[n/2]; + double *xx; int n2=n>>1; int n4=n>>2; int n8=n>>3; @@ -214,65 +216,65 @@ void mdct_forward(mdct_lookup *init, double *in, double *out, double *window){ double tempA,tempB; int in1=n2+n4-4; int in2=in1+5; - double *AE=init->trig+n4; - double *AO=AE+n4; + double *A=init->trig+n2; i=0; - - for(i=0;itrig+n2; - double *BO=BE+n4; + double *B=init->trig+n2; double *out2=out+n2; double scale=4./n; for(i=0;in; - double *x=alloca(n*sizeof(double)); + double x[n/2]; + double w[n/2]; + double *xx; int n2=n>>1; int n4=n>>2; int n8=n>>3; @@ -282,56 +284,50 @@ void mdct_backward(mdct_lookup *init, double *in, double *out, double *w){ { double *inO=in+1; double *xO= x; - double *AE=init->trig+n4; - double *AO=AE+n4; + double *A=init->trig+n2; for(i=0;itrig+n2; - double *BO=BE+n4; + double *B=init->trig+n2; int o1=n4,o2=o1-1; int o3=n4+n2,o4=o3-1; for(i=0;i