Remove vestiges of radix-2 FFT
Patch (mostly) by Loren Merritt Originally committed as revision 23957 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@ -320,7 +320,7 @@ function ff_fft_permute_neon, export=1
|
|||||||
push {r4,lr}
|
push {r4,lr}
|
||||||
mov r12, #1
|
mov r12, #1
|
||||||
ldr r2, [r0] @ nbits
|
ldr r2, [r0] @ nbits
|
||||||
ldr r3, [r0, #20] @ tmp_buf
|
ldr r3, [r0, #12] @ tmp_buf
|
||||||
ldr r0, [r0, #8] @ revtab
|
ldr r0, [r0, #8] @ revtab
|
||||||
lsl r12, r12, r2
|
lsl r12, r12, r2
|
||||||
mov r2, r12
|
mov r2, r12
|
||||||
|
@ -31,8 +31,8 @@ function ff_imdct_half_neon, export=1
|
|||||||
push {r4-r8,lr}
|
push {r4-r8,lr}
|
||||||
|
|
||||||
mov r12, #1
|
mov r12, #1
|
||||||
ldr lr, [r0, #28] @ mdct_bits
|
ldr lr, [r0, #20] @ mdct_bits
|
||||||
ldr r4, [r0, #32] @ tcos
|
ldr r4, [r0, #24] @ tcos
|
||||||
ldr r3, [r0, #8] @ revtab
|
ldr r3, [r0, #8] @ revtab
|
||||||
lsl r12, r12, lr @ n = 1 << nbits
|
lsl r12, r12, lr @ n = 1 << nbits
|
||||||
lsr lr, r12, #2 @ n4 = n >> 2
|
lsr lr, r12, #2 @ n4 = n >> 2
|
||||||
@ -76,8 +76,8 @@ function ff_imdct_half_neon, export=1
|
|||||||
bl ff_fft_calc_neon
|
bl ff_fft_calc_neon
|
||||||
|
|
||||||
mov r12, #1
|
mov r12, #1
|
||||||
ldr lr, [r4, #28] @ mdct_bits
|
ldr lr, [r4, #20] @ mdct_bits
|
||||||
ldr r4, [r4, #32] @ tcos
|
ldr r4, [r4, #24] @ tcos
|
||||||
lsl r12, r12, lr @ n = 1 << nbits
|
lsl r12, r12, lr @ n = 1 << nbits
|
||||||
lsr lr, r12, #3 @ n8 = n >> 3
|
lsr lr, r12, #3 @ n8 = n >> 3
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ endfunc
|
|||||||
function ff_imdct_calc_neon, export=1
|
function ff_imdct_calc_neon, export=1
|
||||||
push {r4-r6,lr}
|
push {r4-r6,lr}
|
||||||
|
|
||||||
ldr r3, [r0, #28]
|
ldr r3, [r0, #20]
|
||||||
mov r4, #1
|
mov r4, #1
|
||||||
mov r5, r1
|
mov r5, r1
|
||||||
lsl r4, r4, r3
|
lsl r4, r4, r3
|
||||||
@ -164,8 +164,8 @@ function ff_mdct_calc_neon, export=1
|
|||||||
push {r4-r10,lr}
|
push {r4-r10,lr}
|
||||||
|
|
||||||
mov r12, #1
|
mov r12, #1
|
||||||
ldr lr, [r0, #28] @ mdct_bits
|
ldr lr, [r0, #20] @ mdct_bits
|
||||||
ldr r4, [r0, #32] @ tcos
|
ldr r4, [r0, #24] @ tcos
|
||||||
ldr r3, [r0, #8] @ revtab
|
ldr r3, [r0, #8] @ revtab
|
||||||
lsl lr, r12, lr @ n = 1 << nbits
|
lsl lr, r12, lr @ n = 1 << nbits
|
||||||
add r7, r2, lr @ in4u
|
add r7, r2, lr @ in4u
|
||||||
@ -253,8 +253,8 @@ function ff_mdct_calc_neon, export=1
|
|||||||
bl ff_fft_calc_neon
|
bl ff_fft_calc_neon
|
||||||
|
|
||||||
mov r12, #1
|
mov r12, #1
|
||||||
ldr lr, [r4, #28] @ mdct_bits
|
ldr lr, [r4, #20] @ mdct_bits
|
||||||
ldr r4, [r4, #32] @ tcos
|
ldr r4, [r4, #24] @ tcos
|
||||||
lsl r12, r12, lr @ n = 1 << nbits
|
lsl r12, r12, lr @ n = 1 << nbits
|
||||||
lsr lr, r12, #3 @ n8 = n >> 3
|
lsr lr, r12, #3 @ n8 = n >> 3
|
||||||
|
|
||||||
|
@ -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)
|
av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse)
|
||||||
{
|
{
|
||||||
int i, j, m, n;
|
int i, j, n;
|
||||||
float alpha, c1, s1, s2;
|
|
||||||
int av_unused has_vectors;
|
|
||||||
|
|
||||||
if (nbits < 2 || nbits > 16)
|
if (nbits < 2 || nbits > 16)
|
||||||
goto fail;
|
goto fail;
|
||||||
s->nbits = nbits;
|
s->nbits = nbits;
|
||||||
n = 1 << 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));
|
s->revtab = av_malloc(n * sizeof(uint16_t));
|
||||||
if (!s->revtab)
|
if (!s->revtab)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
s->tmp_buf = av_malloc(n * sizeof(FFTComplex));
|
||||||
|
if (!s->tmp_buf)
|
||||||
|
goto fail;
|
||||||
s->inverse = inverse;
|
s->inverse = inverse;
|
||||||
|
|
||||||
s2 = inverse ? 1.0 : -1.0;
|
|
||||||
|
|
||||||
s->fft_permute = ff_fft_permute_c;
|
s->fft_permute = ff_fft_permute_c;
|
||||||
s->fft_calc = ff_fft_calc_c;
|
s->fft_calc = ff_fft_calc_c;
|
||||||
#if CONFIG_MDCT
|
#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->imdct_half = ff_imdct_half_c;
|
||||||
s->mdct_calc = ff_mdct_calc_c;
|
s->mdct_calc = ff_mdct_calc_c;
|
||||||
#endif
|
#endif
|
||||||
s->exptab1 = NULL;
|
|
||||||
s->split_radix = 1;
|
|
||||||
|
|
||||||
if (ARCH_ARM) ff_fft_init_arm(s);
|
if (ARCH_ARM) ff_fft_init_arm(s);
|
||||||
if (HAVE_ALTIVEC) ff_fft_init_altivec(s);
|
if (HAVE_ALTIVEC) ff_fft_init_altivec(s);
|
||||||
if (HAVE_MMX) ff_fft_init_mmx(s);
|
if (HAVE_MMX) ff_fft_init_mmx(s);
|
||||||
|
|
||||||
if (s->split_radix) {
|
|
||||||
for(j=4; j<=nbits; j++) {
|
for(j=4; j<=nbits; j++) {
|
||||||
ff_init_ff_cos_tabs(j);
|
ff_init_ff_cos_tabs(j);
|
||||||
}
|
}
|
||||||
for(i=0; i<n; i++)
|
for(i=0; i<n; i++)
|
||||||
s->revtab[-split_radix_permutation(i, n, s->inverse) & (n-1)] = 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;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
av_freep(&s->revtab);
|
av_freep(&s->revtab);
|
||||||
av_freep(&s->exptab);
|
|
||||||
av_freep(&s->exptab1);
|
|
||||||
av_freep(&s->tmp_buf);
|
av_freep(&s->tmp_buf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_fft_permute_c(FFTContext *s, FFTComplex *z)
|
void ff_fft_permute_c(FFTContext *s, FFTComplex *z)
|
||||||
{
|
{
|
||||||
int j, k, np;
|
int j, np;
|
||||||
FFTComplex tmp;
|
|
||||||
const uint16_t *revtab = s->revtab;
|
const uint16_t *revtab = s->revtab;
|
||||||
np = 1 << s->nbits;
|
np = 1 << s->nbits;
|
||||||
|
|
||||||
if (s->tmp_buf) {
|
|
||||||
/* TODO: handle split-radix permute in a more optimal way, probably in-place */
|
/* 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];
|
for(j=0;j<np;j++) s->tmp_buf[revtab[j]] = z[j];
|
||||||
memcpy(z, s->tmp_buf, np * sizeof(FFTComplex));
|
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_cold void ff_fft_end(FFTContext *s)
|
||||||
{
|
{
|
||||||
av_freep(&s->revtab);
|
av_freep(&s->revtab);
|
||||||
av_freep(&s->exptab);
|
|
||||||
av_freep(&s->exptab1);
|
|
||||||
av_freep(&s->tmp_buf);
|
av_freep(&s->tmp_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,8 +33,6 @@ struct FFTContext {
|
|||||||
int nbits;
|
int nbits;
|
||||||
int inverse;
|
int inverse;
|
||||||
uint16_t *revtab;
|
uint16_t *revtab;
|
||||||
FFTComplex *exptab;
|
|
||||||
FFTComplex *exptab1; /* only used by SSE code */
|
|
||||||
FFTComplex *tmp_buf;
|
FFTComplex *tmp_buf;
|
||||||
int mdct_size; /* size of MDCT (i.e. number of input data * 2) */
|
int mdct_size; /* size of MDCT (i.e. number of input data * 2) */
|
||||||
int mdct_bits; /* n = 2^nbits */
|
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_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||||
void (*imdct_half)(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);
|
void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||||
int split_radix;
|
|
||||||
int permutation;
|
int permutation;
|
||||||
#define FF_MDCT_PERM_NONE 0
|
#define FF_MDCT_PERM_NONE 0
|
||||||
#define FF_MDCT_PERM_INTERLEAVE 1
|
#define FF_MDCT_PERM_INTERLEAVE 1
|
||||||
|
@ -91,5 +91,4 @@ av_cold void ff_fft_init_altivec(FFTContext *s)
|
|||||||
{
|
{
|
||||||
if (HAVE_GNU_AS)
|
if (HAVE_GNU_AS)
|
||||||
s->fft_calc = ff_fft_calc_altivec;
|
s->fft_calc = ff_fft_calc_altivec;
|
||||||
s->split_radix = 1;
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user