diff options
author | Måns Rullgård <mans@mansr.com> | 2010-07-01 23:21:42 +0000 |
---|---|---|
committer | Måns Rullgård <mans@mansr.com> | 2010-07-01 23:21:42 +0000 |
commit | 588d28ac0866c8e9acb436c1c752de4c6de0d21e (patch) | |
tree | 2a8e9098ec7f4ea499d9498c6bcc24004aea92ac /libavcodec | |
parent | bf7ba153729e2ea645cd6cc1150514137037923c (diff) | |
download | ffmpeg-588d28ac0866c8e9acb436c1c752de4c6de0d21e.tar.gz |
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')
-rw-r--r-- | libavcodec/arm/fft_neon.S | 2 | ||||
-rw-r--r-- | libavcodec/arm/mdct_neon.S | 18 | ||||
-rw-r--r-- | libavcodec/fft.c | 82 | ||||
-rw-r--r-- | libavcodec/fft.h | 3 | ||||
-rw-r--r-- | libavcodec/ppc/fft_altivec.c | 1 |
5 files changed, 15 insertions, 91 deletions
diff --git a/libavcodec/arm/fft_neon.S b/libavcodec/arm/fft_neon.S index 08589db096..c90333466d 100644 --- a/libavcodec/arm/fft_neon.S +++ b/libavcodec/arm/fft_neon.S @@ -320,7 +320,7 @@ function ff_fft_permute_neon, export=1 push {r4,lr} mov r12, #1 ldr r2, [r0] @ nbits - ldr r3, [r0, #20] @ tmp_buf + ldr r3, [r0, #12] @ tmp_buf ldr r0, [r0, #8] @ revtab lsl r12, r12, r2 mov r2, r12 diff --git a/libavcodec/arm/mdct_neon.S b/libavcodec/arm/mdct_neon.S index fac75be8e7..fcf802275f 100644 --- a/libavcodec/arm/mdct_neon.S +++ b/libavcodec/arm/mdct_neon.S @@ -31,8 +31,8 @@ function ff_imdct_half_neon, export=1 push {r4-r8,lr} mov r12, #1 - ldr lr, [r0, #28] @ mdct_bits - ldr r4, [r0, #32] @ tcos + ldr lr, [r0, #20] @ mdct_bits + ldr r4, [r0, #24] @ tcos ldr r3, [r0, #8] @ revtab lsl r12, r12, lr @ n = 1 << nbits lsr lr, r12, #2 @ n4 = n >> 2 @@ -76,8 +76,8 @@ function ff_imdct_half_neon, export=1 bl ff_fft_calc_neon mov r12, #1 - ldr lr, [r4, #28] @ mdct_bits - ldr r4, [r4, #32] @ tcos + ldr lr, [r4, #20] @ mdct_bits + ldr r4, [r4, #24] @ tcos lsl r12, r12, lr @ n = 1 << nbits lsr lr, r12, #3 @ n8 = n >> 3 @@ -127,7 +127,7 @@ endfunc function ff_imdct_calc_neon, export=1 push {r4-r6,lr} - ldr r3, [r0, #28] + ldr r3, [r0, #20] mov r4, #1 mov r5, r1 lsl r4, r4, r3 @@ -164,8 +164,8 @@ function ff_mdct_calc_neon, export=1 push {r4-r10,lr} mov r12, #1 - ldr lr, [r0, #28] @ mdct_bits - ldr r4, [r0, #32] @ tcos + ldr lr, [r0, #20] @ mdct_bits + ldr r4, [r0, #24] @ tcos ldr r3, [r0, #8] @ revtab lsl lr, r12, lr @ n = 1 << nbits add r7, r2, lr @ in4u @@ -253,8 +253,8 @@ function ff_mdct_calc_neon, export=1 bl ff_fft_calc_neon mov r12, #1 - ldr lr, [r4, #28] @ mdct_bits - ldr r4, [r4, #32] @ tcos + ldr lr, [r4, #20] @ mdct_bits + ldr r4, [r4, #24] @ tcos lsl r12, r12, lr @ n = 1 << nbits lsr lr, r12, #3 @ n8 = n >> 3 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); } diff --git a/libavcodec/fft.h b/libavcodec/fft.h index 227f07c7b1..8930c93ec7 100644 --- a/libavcodec/fft.h +++ b/libavcodec/fft.h @@ -33,8 +33,6 @@ struct FFTContext { int nbits; int inverse; uint16_t *revtab; - FFTComplex *exptab; - FFTComplex *exptab1; /* only used by SSE code */ FFTComplex *tmp_buf; int mdct_size; /* size of MDCT (i.e. number of input data * 2) */ int mdct_bits; /* n = 2^nbits */ @@ -46,7 +44,6 @@ struct FFTContext { void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input); void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input); - int split_radix; int permutation; #define FF_MDCT_PERM_NONE 0 #define FF_MDCT_PERM_INTERLEAVE 1 diff --git a/libavcodec/ppc/fft_altivec.c b/libavcodec/ppc/fft_altivec.c index 3f622c3aba..fa3f7a0041 100644 --- a/libavcodec/ppc/fft_altivec.c +++ b/libavcodec/ppc/fft_altivec.c @@ -91,5 +91,4 @@ av_cold void ff_fft_init_altivec(FFTContext *s) { if (HAVE_GNU_AS) s->fft_calc = ff_fft_calc_altivec; - s->split_radix = 1; } |