diff -uN ./zita-convolver/README ./zita-convolver-ffmpeg/README --- ./zita-convolver/README 2012-12-06 11:09:33.644204127 +0100 +++ ./zita-convolver-ffmpeg/README 2013-05-05 14:16:32.446644834 +0200 @@ -1,8 +1,3 @@ Files in this directory are from zita-convolver by -Fons Adriaensen - -Please refer to the version official archive -http://kokkinizita.linuxaudio.org/linuxaudio/ - -These files are only included to ease compilation -and installion of Guitarix. Don't modify. +Fons Adriaensen , which changes +to use ffmpeg FFT instead of fftw3. diff -uN ./zita-convolver/zita-convolver.cc ./zita-convolver-ffmpeg/zita-convolver.cc --- ./zita-convolver/zita-convolver.cc 2012-12-06 11:09:33.644204127 +0100 +++ ./zita-convolver-ffmpeg/zita-convolver.cc 2013-05-08 04:35:21.602005621 +0200 @@ -22,9 +22,13 @@ #include #include #include +#include +extern "C" { +#define __STDC_CONSTANT_MACROS // needed for UINT64_C (libavutil 0.8.6) +#include +} #include "zita-convolver.h" - - +#include "gx_compiler.h" int zita_convolver_major_version (void) { @@ -38,7 +42,6 @@ Convproc::Convproc (void) : _state (ST_IDLE), - _options (0), _skipcnt (0), _density (0), _ninp (0), @@ -61,12 +64,6 @@ } -void Convproc::set_options (unsigned int options) -{ - _options = options; -} - - void Convproc::set_density (float density) { _density = density; @@ -147,7 +144,7 @@ if (cfft < d * cmac) npar = nmin; } _convlev [pind] = new Convlevel (); - _convlev [pind]->configure (prio, offs, npar, size, _options); + _convlev [pind]->configure (prio, offs, npar, size); offs += size * npar; if (offs < maxsize) @@ -281,7 +278,7 @@ } -int Convproc::process (bool sync) +int __rt_func Convproc::process (bool sync) { unsigned int k; int f = 0; @@ -303,7 +300,6 @@ { if (++_latecnt >= 5) { - stop_process (); f |= FL_LOAD; } } @@ -354,7 +350,6 @@ } _state = ST_IDLE; - _options = 0; _skipcnt = 0; _density = 0; _ninp = 0; @@ -398,14 +393,11 @@ _stat (ST_IDLE), _npar (0), _parsize (0), - _options (0), _pthr (0), _inp_list (0), _out_list (0), _plan_r2c (0), _plan_c2r (0), - _time_data (0), - _prep_data (0), _freq_data (0) { } @@ -422,36 +414,28 @@ { void *p; - if (posix_memalign (&p, 16, size)) throw (Converror (Converror::MEM_ALLOC)); + p = av_malloc(size); memset (p, 0, size); return p; } - void Convlevel::configure (int prio, unsigned int offs, unsigned int npar, - unsigned int parsize, - unsigned int options) + unsigned int parsize) { - int fftwopt = (options & OPT_FFTW_MEASURE) ? FFTW_MEASURE : FFTW_ESTIMATE; - _prio = prio; _offs = offs; _npar = npar; _parsize = parsize; - _options = options; - _time_data = (float *)(alloc_aligned (2 * _parsize * sizeof (float))); - _prep_data = (float *)(alloc_aligned (2 * _parsize * sizeof (float))); _freq_data = (fftwf_complex *)(alloc_aligned ((_parsize + 1) * sizeof (fftwf_complex))); - _plan_r2c = fftwf_plan_dft_r2c_1d (2 * _parsize, _time_data, _freq_data, fftwopt); - _plan_c2r = fftwf_plan_dft_c2r_1d (2 * _parsize, _freq_data, _time_data, fftwopt); + _plan_r2c = av_rdft_init (int(log2(2 * _parsize)), DFT_R2C); + _plan_c2r = av_rdft_init (int(log2(2 * _parsize)), IDFT_C2R); if (_plan_r2c && _plan_c2r) return; throw (Converror (Converror::MEM_ALLOC)); } - void Convlevel::impdata_create (unsigned int inp, unsigned int out, unsigned int step, @@ -462,7 +446,7 @@ unsigned int k; int j, j0, j1, n; float norm; - fftwf_complex *fftb; + fftwf_complex *fftb; Macnode *M; n = i1 - i0; @@ -477,7 +461,7 @@ memset (M->_fftb, 0, _npar * sizeof (fftwf_complex *)); } - norm = 0.5f / _parsize; + norm = 1.0f / _parsize; for (k = 0; k < _npar; k++) { i1 = i0 + _parsize; @@ -487,14 +471,16 @@ { M->_fftb [k] = (fftwf_complex *)(alloc_aligned ((_parsize + 1) * sizeof (fftwf_complex))); } - memset (_prep_data, 0, 2 * _parsize * sizeof (float)); + float *prepdata = (float*)_freq_data; + memset (prepdata, 0, 2 * (_parsize+1) * sizeof (float)); j0 = (i0 < 0) ? 0 : i0; j1 = (i1 > n) ? n : i1; - for (j = j0; j < j1; j++) _prep_data [j - i0] = norm * data [j * step]; - fftwf_execute_dft_r2c (_plan_r2c, _prep_data, _freq_data); -#ifdef ENABLE_VECTOR_MODE - if (_options & OPT_VECTOR_MODE) fftswap (_freq_data); -#endif + for (j = j0; j < j1; j++) prepdata [j - i0] = norm * data [j * step]; + av_rdft_calc(_plan_r2c, prepdata); + // adjust for packing convention + _freq_data[_parsize][0] = _freq_data[0][1]; + _freq_data[0][1] = 0; + fftswap (_freq_data); fftb = M->_fftb [k]; for (j = 0; j <= (int)_parsize; j++) { @@ -517,7 +503,7 @@ unsigned int k; int j, j0, j1, n; float norm; - fftwf_complex *fftb; + fftwf_complex *fftb; Macnode *M; M = findmacnode (inp, out, false); @@ -528,21 +514,24 @@ i1 = i0 + _npar * _parsize; if ((i0 >= n) || (i1 <= 0)) return; - norm = 0.5f / _parsize; + norm = 1.0f / _parsize; for (k = 0; k < _npar; k++) { i1 = i0 + _parsize; fftb = M->_fftb [k]; if (fftb && (i0 < n) && (i1 > 0)) { - memset (_prep_data, 0, 2 * _parsize * sizeof (float)); + float *prepdata = (float*)fftb; + memset (prepdata, 0, 2 * _parsize * sizeof (float)); j0 = (i0 < 0) ? 0 : i0; j1 = (i1 > n) ? n : i1; - for (j = j0; j < j1; j++) _prep_data [j - i0] = norm * data [j * step]; - fftwf_execute_dft_r2c (_plan_r2c, _prep_data, fftb); -#ifdef ENABLE_VECTOR_MODE - if (_options & OPT_VECTOR_MODE) fftswap (fftb); -#endif + for (j = j0; j < j1; j++) prepdata [j - i0] = norm * data [j * step]; + av_rdft_calc(_plan_r2c, prepdata); + // adjust for packing convention + fftb[_parsize][0] = fftb[0][1]; + fftb[_parsize][1] = 0; + fftb[0][1] = 0; + fftswap (fftb); } i0 = i1; } @@ -690,15 +679,11 @@ } _out_list = 0; - fftwf_destroy_plan (_plan_r2c); - fftwf_destroy_plan (_plan_c2r); - free (_time_data); - free (_prep_data); + av_rdft_end (_plan_r2c); + av_rdft_end (_plan_c2r); free (_freq_data); _plan_r2c = 0; _plan_c2r = 0; - _time_data = 0; - _prep_data = 0; _freq_data = 0; } @@ -710,7 +695,7 @@ } -void Convlevel::main (void) +void __rt_func Convlevel::main (void) { _stat = ST_PROC; while (true) @@ -728,7 +713,7 @@ } -void Convlevel::process (bool skip) +void __rt_func Convlevel::process (bool skip) { unsigned int i, j, k; unsigned int i1, n1, n2, opi1, opi2; @@ -758,13 +743,16 @@ for (X = _inp_list; X; X = X->_next) { inpd = _inpbuff [X->_inp]; - if (n1) memcpy (_time_data, inpd + i1, n1 * sizeof (float)); - if (n2) memcpy (_time_data + n1, inpd, n2 * sizeof (float)); - memset (_time_data + _parsize, 0, _parsize * sizeof (float)); - fftwf_execute_dft_r2c (_plan_r2c, _time_data, X->_ffta [_ptind]); -#ifdef ENABLE_VECTOR_MODE - if (_options & OPT_VECTOR_MODE) fftswap (X->_ffta [_ptind]); -#endif + fftwf_complex *freqdata = X->_ffta [_ptind]; + float *time_data = (float*)freqdata; + if (n1) memcpy (time_data, inpd + i1, n1 * sizeof (float)); + if (n2) memcpy (time_data + n1, inpd, n2 * sizeof (float)); + memset (time_data + _parsize, 0, (_parsize+2) * sizeof (float)); + av_rdft_calc(_plan_r2c, time_data); + // adjust for packing convention + freqdata[_parsize][0] = freqdata[0][1]; + freqdata[0][1] = 0; + fftswap (X->_ffta [_ptind]); } if (skip) @@ -790,46 +778,32 @@ fftb = M->_fftb [j]; if (fftb) { -#ifdef ENABLE_VECTOR_MODE - if (_options & OPT_VECTOR_MODE) - { - FV4 *A = (FV4 *) ffta; - FV4 *B = (FV4 *) fftb; - FV4 *D = (FV4 *) _freq_data; - for (k = 0; k < _parsize; k += 4) - { - D [0] += A [0] * B [0] - A [1] * B [1]; - D [1] += A [0] * B [1] + A [1] * B [0]; - A += 2; - B += 2; - D += 2; - } - _freq_data [_parsize][0] += ffta [_parsize][0] * fftb [_parsize][0]; - _freq_data [_parsize][1] = 0; - } - else -#endif + FV4 *A = (FV4 *) ffta; + FV4 *B = (FV4 *) fftb; + FV4 *D = (FV4 *) _freq_data; + for (k = 0; k < _parsize; k += 4) { - for (k = 0; k <= _parsize; k++) - { - _freq_data [k][0] += ffta [k][0] * fftb [k][0] - ffta [k][1] * fftb [k][1]; - _freq_data [k][1] += ffta [k][0] * fftb [k][1] + ffta [k][1] * fftb [k][0]; - } + D [0] += A [0] * B [0] - A [1] * B [1]; + D [1] += A [0] * B [1] + A [1] * B [0]; + A += 2; + B += 2; + D += 2; } + _freq_data [_parsize][0] += ffta [_parsize][0] * fftb [_parsize][0]; + _freq_data [_parsize][1] = 0; } if (i == 0) i = _npar; i--; } } -#ifdef ENABLE_VECTOR_MODE - if (_options & OPT_VECTOR_MODE) fftswap (_freq_data); -#endif - fftwf_execute_dft_c2r (_plan_c2r, _freq_data, _time_data); + fftswap (_freq_data); + _freq_data[0][1] = _freq_data[_parsize][0]; // adjust for packing convention + av_rdft_calc(_plan_c2r, (float*)_freq_data); outd = Y->_buff [opi1]; - for (k = 0; k < _parsize; k++) outd [k] += _time_data [k]; + for (k = 0; k < _parsize; k++) outd [k] += ((float*)_freq_data) [k]; outd = Y->_buff [opi2]; - memcpy (outd, _time_data + _parsize, _parsize * sizeof (float)); + memcpy (outd, ((float*)_freq_data) + _parsize, _parsize * sizeof (float)); } } @@ -838,7 +812,7 @@ } -int Convlevel::readout (bool sync, unsigned int skipcnt) +int __rt_func Convlevel::readout (bool sync, unsigned int skipcnt) { unsigned int i; float *p, *q; @@ -900,7 +874,7 @@ _inp_list = X; X->_inp = inp; X->_ffta = new fftwf_complex * [_npar]; - memset (X->_ffta, 0, _npar * sizeof (fftw_complex *)); + memset (X->_ffta, 0, _npar * sizeof (fftwf_complex *)); for (i = 0; i < _npar; i++) { X->_ffta [i] = (fftwf_complex *)(alloc_aligned ((_parsize + 1) * sizeof (fftwf_complex))); @@ -942,9 +916,7 @@ } -#ifdef ENABLE_VECTOR_MODE - -void Convlevel::fftswap (fftwf_complex *p) +void __rt_func Convlevel::fftswap (fftwf_complex *p) { unsigned int n = _parsize; float a, b; @@ -961,7 +933,3 @@ n -= 4; } } - -#endif - - diff -uN ./zita-convolver/zita-convolver.h ./zita-convolver-ffmpeg/zita-convolver.h --- ./zita-convolver/zita-convolver.h 2012-12-06 11:09:33.645204107 +0100 +++ ./zita-convolver-ffmpeg/zita-convolver.h 2013-05-05 14:16:32.447644815 +0200 @@ -23,9 +23,11 @@ #include +extern "C" { +#include +} #include - #define ZITA_CONVOLVER_MAJOR_VERSION 3 @@ -236,8 +238,7 @@ void configure (int prio, unsigned int offs, unsigned int npar, - unsigned int parsize, - unsigned int options); + unsigned int parsize); void impdata_create (unsigned int inp, unsigned int out, @@ -292,7 +293,6 @@ unsigned int _outoffs; // offset into output buffer unsigned int _inpsize; // size of shared input buffer unsigned int _inpoffs; // offset into input buffer - unsigned int _options; // various options unsigned int _ptind; // rotating partition index unsigned int _opind; // rotating output buffer index int _bits; // bit identifiying this level @@ -302,10 +302,8 @@ ZCsema _done; // sema used to wait for a cycle Inpnode *_inp_list; // linked list of active inputs Outnode *_out_list; // linked list of active outputs - fftwf_plan _plan_r2c; // FFTW plan, forward FFT - fftwf_plan _plan_c2r; // FFTW plan, inverse FFT - float *_time_data; // workspace - float *_prep_data; // workspace + RDFTContext *_plan_r2c; // FFTW plan, forward FFT + RDFTContext *_plan_c2r; // FFTW plan, inverse FFT fftwf_complex *_freq_data; // workspace float **_inpbuff; // array of shared input buffers float **_outbuff; // array of shared output buffers @@ -371,7 +369,7 @@ void set_density (float density); - void set_options (unsigned int options); + void set_options (unsigned int options) {} void set_skipcnt (unsigned int skipcnt); @@ -425,7 +423,6 @@ float *_outbuff [MAXOUT]; // output buffers unsigned int _inpoffs; // current offset in input buffers unsigned int _outoffs; // current offset in output buffers - unsigned int _options; // option bits unsigned int _skipcnt; // number of frames to skip float _density; // matrix density hint unsigned int _ninp; // number of inputs