aboutsummaryrefslogtreecommitdiff
path: root/audio/decoders
diff options
context:
space:
mode:
authorD G Turner2012-04-12 19:30:01 +0100
committerD G Turner2012-04-13 07:37:31 +0100
commit8a5b08341ebd4153295e012723411461c492a38b (patch)
tree5c92ee6d1b47f6d6ae4cd55dc29930a1598d090a /audio/decoders
parent7f930dfae33ded8d762c773bc8b3dca742607542 (diff)
downloadscummvm-rg350-8a5b08341ebd4153295e012723411461c492a38b.tar.gz
scummvm-rg350-8a5b08341ebd4153295e012723411461c492a38b.tar.bz2
scummvm-rg350-8a5b08341ebd4153295e012723411461c492a38b.zip
AUDIO: Remove now unused Sin/Cos table and FFT code from QDM2 Codec.
This was only used by the RDFT code, now replaced by Common::RDFT.
Diffstat (limited to 'audio/decoders')
-rw-r--r--audio/decoders/qdm2.cpp449
1 files changed, 0 insertions, 449 deletions
diff --git a/audio/decoders/qdm2.cpp b/audio/decoders/qdm2.cpp
index 7476ae389e..31405d3ab1 100644
--- a/audio/decoders/qdm2.cpp
+++ b/audio/decoders/qdm2.cpp
@@ -101,35 +101,6 @@ struct QDM2FFT {
} PACKED_STRUCT;
#include "common/pack-end.h"
-struct FFTComplex {
- float re, im;
-};
-
-struct FFTContext {
- int nbits;
- int inverse;
- uint16 *revtab;
- FFTComplex *exptab;
- FFTComplex *tmpBuf;
- int mdctSize; // size of MDCT (i.e. number of input data * 2)
- int mdctBits; // n = 2^nbits
- // pre/post rotation tables
- float *tcos;
- float *tsin;
- void (*fftPermute)(struct FFTContext *s, FFTComplex *z);
- void (*fftCalc)(struct FFTContext *s, FFTComplex *z);
- void (*imdctCalc)(struct FFTContext *s, float *output, const float *input);
- void (*imdctHalf)(struct FFTContext *s, float *output, const float *input);
- void (*mdctCalc)(struct FFTContext *s, float *output, const float *input);
- int splitRadix;
- int permutation;
-};
-
-enum {
- FF_MDCT_PERM_NONE = 0,
- FF_MDCT_PERM_INTERLEAVE = 1
-};
-
class QDM2Stream : public Codec {
public:
QDM2Stream(Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData);
@@ -285,426 +256,6 @@ typedef signed long long int int64_t;
#define SB_DITHERING_NOISE(sb, noiseIdx) (_noiseTable[(noiseIdx)++] * sb_noise_attenuation[(sb)])
-static int splitRadixPermutation(int i, int n, int inverse) {
- if (n <= 2)
- return i & 1;
-
- int m = n >> 1;
-
- if(!(i & m))
- return splitRadixPermutation(i, m, inverse) * 2;
-
- m >>= 1;
-
- if (inverse == !(i & m))
- return splitRadixPermutation(i, m, inverse) * 4 + 1;
-
- return splitRadixPermutation(i, m, inverse) * 4 - 1;
-}
-
-// sin(2*pi*x/n) for 0<=x<n/4, followed by n/2<=x<3n/4
-float ff_sin_16[8];
-float ff_sin_32[16];
-float ff_sin_64[32];
-float ff_sin_128[64];
-float ff_sin_256[128];
-float ff_sin_512[256];
-float ff_sin_1024[512];
-float ff_sin_2048[1024];
-float ff_sin_4096[2048];
-float ff_sin_8192[4096];
-float ff_sin_16384[8192];
-float ff_sin_32768[16384];
-float ff_sin_65536[32768];
-
-float *ff_sin_tabs[] = {
- NULL, NULL, NULL, NULL,
- ff_sin_16, ff_sin_32, ff_sin_64, ff_sin_128, ff_sin_256, ff_sin_512, ff_sin_1024,
- ff_sin_2048, ff_sin_4096, ff_sin_8192, ff_sin_16384, ff_sin_32768, ff_sin_65536,
-};
-
-// cos(2*pi*x/n) for 0<=x<=n/4, followed by its reverse
-float ff_cos_16[8];
-float ff_cos_32[16];
-float ff_cos_64[32];
-float ff_cos_128[64];
-float ff_cos_256[128];
-float ff_cos_512[256];
-float ff_cos_1024[512];
-float ff_cos_2048[1024];
-float ff_cos_4096[2048];
-float ff_cos_8192[4096];
-float ff_cos_16384[8192];
-float ff_cos_32768[16384];
-float ff_cos_65536[32768];
-
-float *ff_cos_tabs[] = {
- NULL, NULL, NULL, NULL,
- ff_cos_16, ff_cos_32, ff_cos_64, ff_cos_128, ff_cos_256, ff_cos_512, ff_cos_1024,
- ff_cos_2048, ff_cos_4096, ff_cos_8192, ff_cos_16384, ff_cos_32768, ff_cos_65536,
-};
-
-void initCosineTables(int index) {
- int m = 1 << index;
- double freq = 2 * M_PI / m;
- float *tab = ff_cos_tabs[index];
-
- for (int i = 0; i <= m / 4; i++)
- tab[i] = cos(i * freq);
-
- for (int i = 1; i < m / 4; i++)
- tab[m / 2 - i] = tab[i];
-}
-
-void fftPermute(FFTContext *s, FFTComplex *z) {
- const uint16 *revtab = s->revtab;
- int np = 1 << s->nbits;
-
- if (s->tmpBuf) {
- // TODO: handle split-radix permute in a more optimal way, probably in-place
- for (int j = 0; j < np; j++)
- s->tmpBuf[revtab[j]] = z[j];
- memcpy(z, s->tmpBuf, np * sizeof(FFTComplex));
- return;
- }
-
- // reverse
- for (int j = 0; j < np; j++) {
- int k = revtab[j];
- if (k < j) {
- FFTComplex tmp = z[k];
- z[k] = z[j];
- z[j] = tmp;
- }
- }
-}
-
-#define DECL_FFT(n,n2,n4) \
-static void fft##n(FFTComplex *z) { \
- fft##n2(z); \
- fft##n4(z + n4 * 2); \
- fft##n4(z + n4 * 3); \
- pass(z, ff_cos_##n, n4 / 2); \
-}
-
-#ifndef M_SQRT1_2
-#define M_SQRT1_2 7.0710678118654752440E-1
-#endif
-
-#define sqrthalf (float)M_SQRT1_2
-
-#define BF(x,y,a,b) { \
- x = a - b; \
- y = a + b; \
-}
-
-#define BUTTERFLIES(a0, a1, a2, a3) { \
- BF(t3, t5, t5, t1); \
- BF(a2.re, a0.re, a0.re, t5); \
- BF(a3.im, a1.im, a1.im, t3); \
- BF(t4, t6, t2, t6); \
- BF(a3.re, a1.re, a1.re, t4); \
- BF(a2.im, a0.im, a0.im, t6); \
-}
-
-// force loading all the inputs before storing any.
-// this is slightly slower for small data, but avoids store->load aliasing
-// for addresses separated by large powers of 2.
-#define BUTTERFLIES_BIG(a0, a1, a2, a3) { \
- float r0 = a0.re, i0 = a0.im, r1 = a1.re, i1 = a1.im; \
- BF(t3, t5, t5, t1); \
- BF(a2.re, a0.re, r0, t5); \
- BF(a3.im, a1.im, i1, t3); \
- BF(t4, t6, t2, t6); \
- BF(a3.re, a1.re, r1, t4); \
- BF(a2.im, a0.im, i0, t6); \
-}
-
-#define TRANSFORM(a0, a1, a2, a3, wre, wim) { \
- t1 = a2.re * wre + a2.im * wim; \
- t2 = a2.im * wre - a2.re * wim; \
- t5 = a3.re * wre - a3.im * wim; \
- t6 = a3.im * wre + a3.re * wim; \
- BUTTERFLIES(a0, a1, a2, a3) \
-}
-
-#define TRANSFORM_ZERO(a0, a1, a2, a3) { \
- t1 = a2.re; \
- t2 = a2.im; \
- t5 = a3.re; \
- t6 = a3.im; \
- BUTTERFLIES(a0, a1, a2, a3) \
-}
-
-// z[0...8n-1], w[1...2n-1]
-#define PASS(name) \
-static void name(FFTComplex *z, const float *wre, unsigned int n) { \
- float t1, t2, t3, t4, t5, t6; \
- int o1 = 2 * n; \
- int o2 = 4 * n; \
- int o3 = 6 * n; \
- const float *wim = wre + o1; \
- n--; \
- \
- TRANSFORM_ZERO(z[0], z[o1], z[o2], z[o3]); \
- TRANSFORM(z[1], z[o1 + 1], z[o2 + 1], z[o3 + 1], wre[1], wim[-1]); \
- \
- do { \
- z += 2; \
- wre += 2; \
- wim -= 2; \
- TRANSFORM(z[0], z[o1], z[o2], z[o3], wre[0], wim[0]); \
- TRANSFORM(z[1], z[o1 + 1],z[o2 + 1], z[o3 + 1], wre[1], wim[-1]); \
- } while(--n); \
-}
-
-PASS(pass)
-#undef BUTTERFLIES
-#define BUTTERFLIES BUTTERFLIES_BIG
-PASS(pass_big)
-
-static void fft4(FFTComplex *z) {
- float t1, t2, t3, t4, t5, t6, t7, t8;
-
- BF(t3, t1, z[0].re, z[1].re);
- BF(t8, t6, z[3].re, z[2].re);
- BF(z[2].re, z[0].re, t1, t6);
- BF(t4, t2, z[0].im, z[1].im);
- BF(t7, t5, z[2].im, z[3].im);
- BF(z[3].im, z[1].im, t4, t8);
- BF(z[3].re, z[1].re, t3, t7);
- BF(z[2].im, z[0].im, t2, t5);
-}
-
-static void fft8(FFTComplex *z) {
- float t1, t2, t3, t4, t5, t6, t7, t8;
-
- fft4(z);
-
- BF(t1, z[5].re, z[4].re, -z[5].re);
- BF(t2, z[5].im, z[4].im, -z[5].im);
- BF(t3, z[7].re, z[6].re, -z[7].re);
- BF(t4, z[7].im, z[6].im, -z[7].im);
- BF(t8, t1, t3, t1);
- BF(t7, t2, t2, t4);
- BF(z[4].re, z[0].re, z[0].re, t1);
- BF(z[4].im, z[0].im, z[0].im, t2);
- BF(z[6].re, z[2].re, z[2].re, t7);
- BF(z[6].im, z[2].im, z[2].im, t8);
-
- TRANSFORM(z[1], z[3], z[5], z[7], sqrthalf, sqrthalf);
-}
-
-#undef BF
-
-DECL_FFT(16,8,4)
-DECL_FFT(32,16,8)
-DECL_FFT(64,32,16)
-DECL_FFT(128,64,32)
-DECL_FFT(256,128,64)
-DECL_FFT(512,256,128)
-#define pass pass_big
-DECL_FFT(1024,512,256)
-DECL_FFT(2048,1024,512)
-DECL_FFT(4096,2048,1024)
-DECL_FFT(8192,4096,2048)
-DECL_FFT(16384,8192,4096)
-DECL_FFT(32768,16384,8192)
-DECL_FFT(65536,32768,16384)
-
-void fftCalc(FFTContext *s, FFTComplex *z) {
- static void (* const fftDispatch[])(FFTComplex *) = {
- fft4, fft8, fft16, fft32, fft64, fft128, fft256, fft512, fft1024,
- fft2048, fft4096, fft8192, fft16384, fft32768, fft65536,
- };
-
- fftDispatch[s->nbits - 2](z);
-}
-
-// complex multiplication: p = a * b
-#define CMUL(pre, pim, are, aim, bre, bim) \
-{\
- float _are = (are); \
- float _aim = (aim); \
- float _bre = (bre); \
- float _bim = (bim); \
- (pre) = _are * _bre - _aim * _bim; \
- (pim) = _are * _bim + _aim * _bre; \
-}
-
-/**
- * Compute the middle half of the inverse MDCT of size N = 2^nbits,
- * thus excluding the parts that can be derived by symmetry
- * @param output N/2 samples
- * @param input N/2 samples
- */
-void imdctHalfC(FFTContext *s, float *output, const float *input) {
- const uint16 *revtab = s->revtab;
- const float *tcos = s->tcos;
- const float *tsin = s->tsin;
- FFTComplex *z = (FFTComplex *)output;
-
- int n = 1 << s->mdctBits;
- int n2 = n >> 1;
- int n4 = n >> 2;
- int n8 = n >> 3;
-
- // pre rotation
- const float *in1 = input;
- const float *in2 = input + n2 - 1;
- for (int k = 0; k < n4; k++) {
- int j = revtab[k];
- CMUL(z[j].re, z[j].im, *in2, *in1, tcos[k], tsin[k]);
- in1 += 2;
- in2 -= 2;
- }
-
- fftCalc(s, z);
-
- // post rotation + reordering
- for (int k = 0; k < n8; k++) {
- float r0, i0, r1, i1;
- CMUL(r0, i1, z[n8 - k - 1].im, z[n8 - k - 1].re, tsin[n8 - k - 1], tcos[n8 - k - 1]);
- CMUL(r1, i0, z[n8 + k].im, z[n8 + k].re, tsin[n8 + k], tcos[n8 + k]);
- z[n8 - k - 1].re = r0;
- z[n8 - k - 1].im = i0;
- z[n8 + k].re = r1;
- z[n8 + k].im = i1;
- }
-}
-
-/**
- * Compute inverse MDCT of size N = 2^nbits
- * @param output N samples
- * @param input N/2 samples
- */
-void imdctCalcC(FFTContext *s, float *output, const float *input) {
- int n = 1 << s->mdctBits;
- int n2 = n >> 1;
- int n4 = n >> 2;
-
- imdctHalfC(s, output + n4, input);
-
- for (int k = 0; k < n4; k++) {
- output[k] = -output[n2 - k - 1];
- output[n - k - 1] = output[n2 + k];
- }
-}
-
-/**
- * Compute MDCT of size N = 2^nbits
- * @param input N samples
- * @param out N/2 samples
- */
-void mdctCalcC(FFTContext *s, float *out, const float *input) {
- const uint16 *revtab = s->revtab;
- const float *tcos = s->tcos;
- const float *tsin = s->tsin;
- FFTComplex *x = (FFTComplex *)out;
-
- int n = 1 << s->mdctBits;
- int n2 = n >> 1;
- int n4 = n >> 2;
- int n8 = n >> 3;
- int n3 = 3 * n4;
-
- // pre rotation
- for (int i = 0; i < n8; i++) {
- float re = -input[2 * i + 3 * n4] - input[n3 - 1 - 2 * i];
- float im = -input[n4 + 2 * i] + input[n4 - 1 - 2 * i];
- int j = revtab[i];
- CMUL(x[j].re, x[j].im, re, im, -tcos[i], tsin[i]);
-
- re = input[2 * i] - input[n2 - 1 - 2 * i];
- im = -(input[n2 + 2 * i] + input[n - 1 - 2 * i]);
- j = revtab[n8 + i];
- CMUL(x[j].re, x[j].im, re, im, -tcos[n8 + i], tsin[n8 + i]);
- }
-
- fftCalc(s, x);
-
- // post rotation
- for (int i = 0; i < n8; i++) {
- float r0, i0, r1, i1;
- CMUL(i1, r0, x[n8 - i - 1].re, x[n8 - i - 1].im, -tsin[n8 - i - 1], -tcos[n8 - i - 1]);
- CMUL(i0, r1, x[n8 + i].re, x[n8 + i].im, -tsin[n8 + i], -tcos[n8 + i]);
- x[n8 - i - 1].re = r0;
- x[n8 - i - 1].im = i0;
- x[n8 + i].re = r1;
- x[n8 + i].im = i1;
- }
-}
-
-int fftInit(FFTContext *s, int nbits, int inverse) {
- int i, j, m, n;
- float alpha, c1, s1, s2;
-
- if (nbits < 2 || nbits > 16)
- goto fail;
-
- s->nbits = nbits;
- n = 1 << nbits;
- s->tmpBuf = NULL;
-
- s->exptab = (FFTComplex *)malloc((n / 2) * sizeof(FFTComplex));
- if (!s->exptab)
- goto fail;
-
- s->revtab = (uint16 *)malloc(n * sizeof(uint16));
- if (!s->revtab)
- goto fail;
- s->inverse = inverse;
-
- s2 = inverse ? 1.0 : -1.0;
-
- s->fftPermute = fftPermute;
- s->fftCalc = fftCalc;
- s->imdctCalc = imdctCalcC;
- s->imdctHalf = imdctHalfC;
- s->mdctCalc = mdctCalcC;
- s->splitRadix = 1;
-
- if (s->splitRadix) {
- for (j = 4; j <= nbits; j++)
- initCosineTables(j);
-
- for (i = 0; i < n; i++)
- s->revtab[-splitRadixPermutation(i, n, s->inverse) & (n - 1)] = i;
-
- s->tmpBuf = (FFTComplex *)malloc(n * sizeof(FFTComplex));
- } else {
- for (i = 0; i < n / 2; i++) {
- alpha = 2 * M_PI * (float)i / (float)n;
- c1 = cos(alpha);
- s1 = sin(alpha) * s2;
- s->exptab[i].re = c1;
- s->exptab[i].im = s1;
- }
-
- //int np = 1 << nbits;
- //int nblocks = np >> 3;
- //int np2 = np >> 1;
-
- // compute bit reverse table
- for (i = 0; i < n; i++) {
- m = 0;
-
- for (j = 0; j < nbits; j++)
- m |= ((i >> j) & 1) << (nbits - j - 1);
-
- s->revtab[i] = m;
- }
- }
-
- return 0;
-
- fail:
- free(&s->revtab);
- free(&s->exptab);
- free(&s->tmpBuf);
- return -1;
-}
-
// half mpeg encoding window (full precision)
const int32 ff_mpa_enwindow[257] = {
0, -1, -1, -1, -1, -1, -1, -2,