diff options
author | Guenter Bartsch <guenter@users.sourceforge.net> | 2001-05-26 15:07:18 +0000 |
---|---|---|
committer | Guenter Bartsch <guenter@users.sourceforge.net> | 2001-05-26 15:07:18 +0000 |
commit | 2bb1b8f3a4984075743b17fbe1d00b1af9917254 (patch) | |
tree | 06aa3a03497e938d80a7146013fef96324ef073c /src/libac3/imdct_mlib.c | |
parent | 65480cd3d11b465f0ede5f6c3d1b9f12e06dc98b (diff) | |
download | xine-lib-2bb1b8f3a4984075743b17fbe1d00b1af9917254.tar.gz xine-lib-2bb1b8f3a4984075743b17fbe1d00b1af9917254.tar.bz2 |
switch to walken's libac3 and minor bugfixes
CVS patchset: 83
CVS date: 2001/05/26 15:07:18
Diffstat (limited to 'src/libac3/imdct_mlib.c')
-rw-r--r-- | src/libac3/imdct_mlib.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/libac3/imdct_mlib.c b/src/libac3/imdct_mlib.c new file mode 100644 index 000000000..eca0139ee --- /dev/null +++ b/src/libac3/imdct_mlib.c @@ -0,0 +1,143 @@ +/* + * imdct_mlib.c + * Copyright (C) 2001 Håkan Hjort <d95hjort@dtek.chalmers.se> + * + * This file is part of ac3dec, a free Dolby AC-3 stream decoder. + * + * ac3dec is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * ac3dec is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include "config.h" + +#ifdef LIBAC3_MLIB + +#include <stdlib.h> +#include <stdio.h> +#include <math.h> + +#include <mlib_types.h> +#include <mlib_status.h> +#include <mlib_signal.h> + + +extern float imdct_window[]; + +void +imdct_do_512_mlib(float data[], float delay[]) +{ + float *buf_real; + float *buf_imag; + float *data_ptr; + float *delay_ptr; + float *window_ptr; + float tmp[256] __attribute__ ((__aligned__ (16))); + int i; + + memcpy(tmp, data, 256 * sizeof(float)); + if(mlib_SignalIMDCT_F32(tmp) != MLIB_SUCCESS) { + fprintf(stderr, "mediaLib failure\n"); + exit(-1); + } + + buf_real = tmp; + buf_imag = tmp + 128; + data_ptr = data; + delay_ptr = delay; + window_ptr = imdct_window; + + /* Window and convert to real valued signal */ + for(i=0; i< 64; i++) + { + *data_ptr++ = 2.0f * (-buf_imag[64+i] * *window_ptr++ + *delay_ptr++); + *data_ptr++ = 2.0f * ( buf_real[64-i-1] * *window_ptr++ + *delay_ptr++); + } + + for(i=0; i< 64; i++) + { + *data_ptr++ = 2.0f * (-buf_real[i] * *window_ptr++ + *delay_ptr++); + *data_ptr++ = 2.0f * ( buf_imag[128-i-1] * *window_ptr++ + *delay_ptr++); + } + + /* The trailing edge of the window goes into the delay line */ + delay_ptr = delay; + + for(i=0; i< 64; i++) + { + *delay_ptr++ = -buf_real[64+i] * *--window_ptr; + *delay_ptr++ = buf_imag[64-i-1] * *--window_ptr; + } + + for(i=0; i<64; i++) + { + *delay_ptr++ = buf_imag[i] * *--window_ptr; + *delay_ptr++ = -buf_real[128-i-1] * *--window_ptr; + } +} + +void +imdct_do_256_mlib(float data[], float delay[]) +{ + float *buf1_real, *buf1_imag; + float *buf2_real, *buf2_imag; + float *data_ptr; + float *delay_ptr; + float *window_ptr; + float tmp[256] __attribute__ ((__aligned__ (16))); + int i; + + memcpy(tmp, data, 256 * sizeof(float)); + if(mlib_SignalIMDCT_F32(tmp) != MLIB_SUCCESS) { + fprintf(stderr, "mediaLib failure\n"); + exit(-1); + } + + buf1_real = tmp; + buf1_imag = tmp + 64; + buf2_real = tmp + 128; + buf2_imag = tmp + 128 + 64; + data_ptr = data; + delay_ptr = delay; + window_ptr = imdct_window; + + /* Window and convert to real valued signal */ + for(i=0; i< 64; i++) + { + *data_ptr++ = 2.0f * (-buf1_imag[i] * *window_ptr++ + *delay_ptr++); + *data_ptr++ = 2.0f * ( buf1_real[64-i-1] * *window_ptr++ + *delay_ptr++); + } + + for(i=0; i< 64; i++) + { + *data_ptr++ = 2.0f * (-buf1_real[i] * *window_ptr++ + *delay_ptr++); + *data_ptr++ = 2.0f * ( buf1_imag[64-i-1] * *window_ptr++ + *delay_ptr++); + } + + delay_ptr = delay; + + for(i=0; i< 64; i++) + { + *delay_ptr++ = -buf2_real[i] * *--window_ptr; + *delay_ptr++ = buf2_imag[64-i-1] * *--window_ptr; + } + + for(i=0; i< 64; i++) + { + *delay_ptr++ = buf2_imag[i] * *--window_ptr; + *delay_ptr++ = -buf2_real[64-i-1] * *--window_ptr; + } +} + +#endif |