X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=imdct.c;h=ac085bbc519dcd5dfa8b359f96475270ef2e1a48;hb=ed699ae871534d3e16f0be4cbabcea9c12af0848;hp=73600cbebf2d269a946f929e3088fc26e538ac9d;hpb=509972da450f90a330fe290b62cd3e3d02de6e67;p=paraslash.git diff --git a/imdct.c b/imdct.c index 73600cbe..ac085bbc 100644 --- a/imdct.c +++ b/imdct.c @@ -36,17 +36,18 @@ struct fft_complex { struct fft_context { int nbits; uint16_t *revtab; - struct fft_complex *exptab; }; struct mdct_context { - /** Size of MDCT (i.e. number of input data * 2). */ + /** Size of MDCT (number of input data * 2). */ int n; /** n = 2^n bits. */ int nbits; - /** pre/post rotation tables */ + /** Cosine table for pre/post rotation. */ fftsample_t *tcos; + /** Sine table for pre/post rotation. */ fftsample_t *tsin; + /** The context for the underlying fast Fourier transform. */ struct fft_context fft; }; @@ -86,7 +87,8 @@ static int split_radix_permutation(int i, int n) return split_radix_permutation(i, m) * 4 - 1; } -#define SQRTHALF (float)0.70710678118654752440 /* 1/sqrt(2) */ +/** 1 / sqrt(2). */ +#define SQRTHALF (float)0.70710678118654752440 #define BF(x,y,a,b) {\ x = a - b;\ @@ -298,19 +300,22 @@ static void imdct_half(struct mdct_context *s, fftsample_t *output, } /** - * Compute the inverse MDCT of size N = 2^nbits. + * Compute the inverse MDCT. * + * \param ctx The initialized context structure. * \param output N samples. * \param input N/2 samples. + * + * \sa \ref imdct_init(). */ -void imdct(struct mdct_context *s, float *output, const float *input) +void imdct(struct mdct_context *ctx, float *output, const float *input) { int k; - int n = 1 << s->nbits; + int n = 1 << ctx->nbits; int n2 = n >> 1; int n4 = n >> 2; - imdct_half(s, output + n4, input); + imdct_half(ctx, output + n4, input); for (k = 0; k < n4; k++) { output[k] = -output[n2 - k - 1]; @@ -327,7 +332,6 @@ static int fft_init(struct fft_context *s, int nbits) s->nbits = nbits; n = 1 << nbits; - s->exptab = para_malloc((n / 2) * sizeof(struct fft_complex)); s->revtab = para_malloc(n * sizeof(uint16_t)); for (j = 4; j <= nbits; j++) { int k = 1 << j; @@ -343,14 +347,14 @@ static int fft_init(struct fft_context *s, int nbits) return 0; } -static void fft_end(struct fft_context *ctx) -{ - freep(&ctx->revtab); - freep(&ctx->exptab); -} - /** * Initialize the inverse modified cosine transform. + * + * \param nbits The number of bits to use (4 <= \a nbits <= 18). + * + * \param result Opaque structure that must be passed to \ref imdct(). + * + * \return Standard. */ int imdct_init(int nbits, struct mdct_context **result) { @@ -383,10 +387,15 @@ fail: return ret; } +/** + * Deallocate imdct resources. + * + * \param ctx The pointer obtained by imdct_init(). + */ void imdct_end(struct mdct_context *ctx) { - freep(&ctx->tcos); - freep(&ctx->tsin); - fft_end(&ctx->fft); + free(ctx->tcos); + free(ctx->tsin); + free(ctx->fft.revtab); free(ctx); }