summaryrefslogtreecommitdiff
path: root/libavcodec/fft.c
diff options
context:
space:
mode:
authorMåns Rullgård <mans@mansr.com>2010-07-01 23:21:42 +0000
committerMåns Rullgård <mans@mansr.com>2010-07-01 23:21:42 +0000
commit588d28ac0866c8e9acb436c1c752de4c6de0d21e (patch)
tree2a8e9098ec7f4ea499d9498c6bcc24004aea92ac /libavcodec/fft.c
parentbf7ba153729e2ea645cd6cc1150514137037923c (diff)
Remove vestiges of radix-2 FFT
Patch (mostly) by Loren Merritt Originally committed as revision 23957 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/fft.c')
-rw-r--r--libavcodec/fft.c82
1 files changed, 5 insertions, 77 deletions
diff --git a/libavcodec/fft.c b/libavcodec/fft.c
index bf240bf5c1..821665b08d 100644
--- a/libavcodec/fft.c
+++ b/libavcodec/fft.c
@@ -80,26 +80,21 @@ av_cold void ff_init_ff_cos_tabs(int index)
av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse)
{
- int i, j, m, n;
- float alpha, c1, s1, s2;
- int av_unused has_vectors;
+ int i, j, n;
if (nbits < 2 || nbits > 16)
goto fail;
s->nbits = nbits;
n = 1 << nbits;
- s->tmp_buf = NULL;
- s->exptab = av_malloc((n / 2) * sizeof(FFTComplex));
- if (!s->exptab)
- goto fail;
s->revtab = av_malloc(n * sizeof(uint16_t));
if (!s->revtab)
goto fail;
+ s->tmp_buf = av_malloc(n * sizeof(FFTComplex));
+ if (!s->tmp_buf)
+ goto fail;
s->inverse = inverse;
- s2 = inverse ? 1.0 : -1.0;
-
s->fft_permute = ff_fft_permute_c;
s->fft_calc = ff_fft_calc_c;
#if CONFIG_MDCT
@@ -107,104 +102,37 @@ av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse)
s->imdct_half = ff_imdct_half_c;
s->mdct_calc = ff_mdct_calc_c;
#endif
- s->exptab1 = NULL;
- s->split_radix = 1;
if (ARCH_ARM) ff_fft_init_arm(s);
if (HAVE_ALTIVEC) ff_fft_init_altivec(s);
if (HAVE_MMX) ff_fft_init_mmx(s);
- if (s->split_radix) {
for(j=4; j<=nbits; j++) {
ff_init_ff_cos_tabs(j);
}
for(i=0; i<n; i++)
s->revtab[-split_radix_permutation(i, n, s->inverse) & (n-1)] = i;
- s->tmp_buf = av_malloc(n * sizeof(FFTComplex));
- } else {
- int np, nblocks, np2, l;
- FFTComplex *q;
-
- 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;
- }
-
- np = 1 << nbits;
- nblocks = np >> 3;
- np2 = np >> 1;
- s->exptab1 = av_malloc(np * 2 * sizeof(FFTComplex));
- if (!s->exptab1)
- goto fail;
- q = s->exptab1;
- do {
- for(l = 0; l < np2; l += 2 * nblocks) {
- *q++ = s->exptab[l];
- *q++ = s->exptab[l + nblocks];
-
- q->re = -s->exptab[l].im;
- q->im = s->exptab[l].re;
- q++;
- q->re = -s->exptab[l + nblocks].im;
- q->im = s->exptab[l + nblocks].re;
- q++;
- }
- nblocks = nblocks >> 1;
- } while (nblocks != 0);
- av_freep(&s->exptab);
-
- /* 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:
av_freep(&s->revtab);
- av_freep(&s->exptab);
- av_freep(&s->exptab1);
av_freep(&s->tmp_buf);
return -1;
}
void ff_fft_permute_c(FFTContext *s, FFTComplex *z)
{
- int j, k, np;
- FFTComplex tmp;
+ int j, np;
const uint16_t *revtab = s->revtab;
np = 1 << s->nbits;
-
- if (s->tmp_buf) {
/* TODO: handle split-radix permute in a more optimal way, probably in-place */
for(j=0;j<np;j++) s->tmp_buf[revtab[j]] = z[j];
memcpy(z, s->tmp_buf, np * sizeof(FFTComplex));
- return;
- }
-
- /* reverse */
- for(j=0;j<np;j++) {
- k = revtab[j];
- if (k < j) {
- tmp = z[k];
- z[k] = z[j];
- z[j] = tmp;
- }
- }
}
av_cold void ff_fft_end(FFTContext *s)
{
av_freep(&s->revtab);
- av_freep(&s->exptab);
- av_freep(&s->exptab1);
av_freep(&s->tmp_buf);
}