* @defgroup tables Computed / set up during initialization.
* @{
*/
- MDCTContext mdct;
- MDCTContext mdct_small;
+ FFTContext mdct;
+ FFTContext mdct_small;
DSPContext dsp;
int random_state;
/** @} */
*/
typedef struct AACEncContext {
PutBitContext pb;
- MDCTContext mdct1024; ///< long (1024 samples) frame transform context
- MDCTContext mdct128; ///< short (128 samples) frame transform context
+ FFTContext mdct1024; ///< long (1024 samples) frame transform context
+ FFTContext mdct128; ///< short (128 samples) frame transform context
DSPContext dsp;
DECLARE_ALIGNED_16(FFTSample, output[2048]); ///< temporary buffer for MDCT input coefficients
int16_t* samples; ///< saved preprocessed input
///@defgroup imdct IMDCT
int block_switch[AC3_MAX_CHANNELS]; ///< block switch flags (blksw)
- MDCTContext imdct_512; ///< for 512 sample IMDCT
- MDCTContext imdct_256; ///< for 256 sample IMDCT
+ FFTContext imdct_512; ///< for 512 sample IMDCT
+ FFTContext imdct_256; ///< for 256 sample IMDCT
///@}
///@defgroup opt optimization
void ff_fft_permute_neon(FFTContext *s, FFTComplex *z);
void ff_fft_calc_neon(FFTContext *s, FFTComplex *z);
-void ff_imdct_calc_neon(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_imdct_half_neon(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_mdct_calc_neon(MDCTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_calc_neon(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_half_neon(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_mdct_calc_neon(FFTContext *s, FFTSample *output, const FFTSample *input);
av_cold void ff_fft_init_arm(FFTContext *s)
{
push {r4-r8,lr}
mov r12, #1
- ldr lr, [r0, #4] @ nbits
- ldr r4, [r0, #8] @ tcos
- ldr r5, [r0, #12] @ tsin
- ldr r3, [r0, #24] @ revtab
+ ldr lr, [r0, #28] @ mdct_bits
+ ldr r4, [r0, #32] @ tcos
+ ldr r5, [r0, #36] @ tsin
+ ldr r3, [r0, #8] @ revtab
lsl r12, r12, lr @ n = 1 << nbits
lsr lr, r12, #2 @ n4 = n >> 2
add r7, r2, r12, lsl #1
mov r4, r0
mov r6, r1
- add r0, r0, #16
bl ff_fft_calc_neon
mov r12, #1
- ldr lr, [r4, #4] @ nbits
- ldr r5, [r4, #12] @ tsin
- ldr r4, [r4, #8] @ tcos
+ ldr lr, [r4, #28] @ mdct_bits
+ ldr r5, [r4, #36] @ tsin
+ ldr r4, [r4, #32] @ tcos
lsl r12, r12, lr @ n = 1 << nbits
lsr lr, r12, #3 @ n8 = n >> 3
function ff_imdct_calc_neon, export=1
push {r4-r6,lr}
- ldr r3, [r0, #4]
+ ldr r3, [r0, #28]
mov r4, #1
mov r5, r1
lsl r4, r4, r3
push {r4-r10,lr}
mov r12, #1
- ldr lr, [r0, #4] @ nbits
- ldr r4, [r0, #8] @ tcos
- ldr r5, [r0, #12] @ tsin
- ldr r3, [r0, #24] @ revtab
+ ldr lr, [r0, #28] @ mdct_bits
+ ldr r4, [r0, #32] @ tcos
+ ldr r5, [r0, #36] @ tsin
+ ldr r3, [r0, #8] @ revtab
lsl lr, r12, lr @ n = 1 << nbits
add r7, r2, lr @ in4u
sub r9, r7, #16 @ in4d
vst2.32 {d6[1],d7[1]}, [r10,:64]
mov r12, #1
- ldr lr, [r0, #4] @ nbits
+ ldr lr, [r0, #28] @ mdct_bits
lsl lr, r12, lr @ n = 1 << nbits
sub r8, r2, #16 @ in1d
add r2, r9, #16 @ in0u
mov r4, r0
mov r6, r1
- add r0, r0, #16
bl ff_fft_calc_neon
mov r12, #1
- ldr lr, [r4, #4] @ nbits
- ldr r5, [r4, #12] @ tsin
- ldr r4, [r4, #8] @ tcos
+ ldr lr, [r4, #28] @ mdct_bits
+ ldr r5, [r4, #36] @ tsin
+ ldr r4, [r4, #32] @ tcos
lsl r12, r12, lr @ n = 1 << nbits
lsr lr, r12, #3 @ n8 = n >> 3
DECLARE_ALIGNED_16(float, high[512]);
float* bands[3];
DECLARE_ALIGNED_16(float, out_samples[AT1_MAX_CHANNELS][AT1_SU_SAMPLES]);
- MDCTContext mdct_ctx[3];
+ FFTContext mdct_ctx[3];
int channels;
DSPContext dsp;
} AT1Ctx;
static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits,
int rev_spec)
{
- MDCTContext* mdct_context;
+ FFTContext* mdct_context;
int transf_size = 1 << nbits;
mdct_context = &q->mdct_ctx[nbits - 5 - (nbits > 6)];
static VLC spectral_coeff_tab[7];
static float gain_tab1[16];
static float gain_tab2[31];
-static MDCTContext mdct_ctx;
+static FFTContext mdct_ctx;
static DSPContext dsp;
AVLFG random_state;
/* transform data */
- MDCTContext mdct_ctx;
+ FFTContext mdct_ctx;
float* mlt_window;
/* VLC data */
int debug_flag; ///< used for suppressing repeated error messages output
DSPContext dsp;
- MDCTContext imdct;
+ FFTContext imdct;
} DCAContext;
static const uint16_t dca_vlc_offs[] = {
FFTSample type */
typedef float FFTSample;
-struct MDCTContext;
-
typedef struct FFTComplex {
FFTSample re, im;
} FFTComplex;
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 */
+ /* pre/post rotation tables */
+ FFTSample *tcos;
+ FFTSample *tsin;
void (*fft_permute)(struct FFTContext *s, FFTComplex *z);
void (*fft_calc)(struct FFTContext *s, FFTComplex *z);
- void (*imdct_calc)(struct MDCTContext *s, FFTSample *output, const FFTSample *input);
- void (*imdct_half)(struct MDCTContext *s, FFTSample *output, const FFTSample *input);
- void (*mdct_calc)(struct MDCTContext *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 (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
int split_radix;
} FFTContext;
/* MDCT computation */
-typedef struct MDCTContext {
- int n; /* size of MDCT (i.e. number of input data * 2) */
- int nbits; /* n = 2^nbits */
- /* pre/post rotation tables */
- FFTSample *tcos;
- FFTSample *tsin;
- FFTContext fft;
-} MDCTContext;
-
-static inline void ff_imdct_calc(MDCTContext *s, FFTSample *output, const FFTSample *input)
+static inline void ff_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input)
{
- s->fft.imdct_calc(s, output, input);
+ s->imdct_calc(s, output, input);
}
-static inline void ff_imdct_half(MDCTContext *s, FFTSample *output, const FFTSample *input)
+static inline void ff_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input)
{
- s->fft.imdct_half(s, output, input);
+ s->imdct_half(s, output, input);
}
-static inline void ff_mdct_calc(MDCTContext *s, FFTSample *output,
+static inline void ff_mdct_calc(FFTContext *s, FFTSample *output,
const FFTSample *input)
{
- s->fft.mdct_calc(s, output, input);
+ s->mdct_calc(s, output, input);
}
/**
extern float ff_sine_4096[4096];
extern float * const ff_sine_windows[13];
-int ff_mdct_init(MDCTContext *s, int nbits, int inverse, double scale);
-void ff_imdct_calc_c(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_imdct_half_c(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_mdct_calc_c(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_mdct_end(MDCTContext *s);
+int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale);
+void ff_imdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_half_c(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_mdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_mdct_end(FFTContext *s);
/* Real Discrete Fourier Transform */
int do_mdct = 0;
int do_inverse = 0;
FFTContext s1, *s = &s1;
- MDCTContext m1, *m = &m1;
+ FFTContext m1, *m = &m1;
int fft_nbits, fft_size;
double scale = 1.0;
AVLFG prng;
/**
* init MDCT or IMDCT computation.
*/
-av_cold int ff_mdct_init(MDCTContext *s, int nbits, int inverse, double scale)
+av_cold int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale)
{
int n, n4, i;
double alpha, theta;
memset(s, 0, sizeof(*s));
n = 1 << nbits;
- s->nbits = nbits;
- s->n = n;
+ s->mdct_bits = nbits;
+ s->mdct_size = n;
n4 = n >> 2;
s->tcos = av_malloc(n4 * sizeof(FFTSample));
if (!s->tcos)
s->tcos[i] = -cos(alpha) * scale;
s->tsin[i] = -sin(alpha) * scale;
}
- if (ff_fft_init(&s->fft, s->nbits - 2, inverse) < 0)
+ if (ff_fft_init(s, s->mdct_bits - 2, inverse) < 0)
goto fail;
return 0;
fail:
* @param output N/2 samples
* @param input N/2 samples
*/
-void ff_imdct_half_c(MDCTContext *s, FFTSample *output, const FFTSample *input)
+void ff_imdct_half_c(FFTContext *s, FFTSample *output, const FFTSample *input)
{
int k, n8, n4, n2, n, j;
- const uint16_t *revtab = s->fft.revtab;
+ const uint16_t *revtab = s->revtab;
const FFTSample *tcos = s->tcos;
const FFTSample *tsin = s->tsin;
const FFTSample *in1, *in2;
FFTComplex *z = (FFTComplex *)output;
- n = 1 << s->nbits;
+ n = 1 << s->mdct_bits;
n2 = n >> 1;
n4 = n >> 2;
n8 = n >> 3;
in1 += 2;
in2 -= 2;
}
- ff_fft_calc(&s->fft, z);
+ ff_fft_calc(s, z);
/* post rotation + reordering */
for(k = 0; k < n8; k++) {
* @param output N samples
* @param input N/2 samples
*/
-void ff_imdct_calc_c(MDCTContext *s, FFTSample *output, const FFTSample *input)
+void ff_imdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input)
{
int k;
- int n = 1 << s->nbits;
+ int n = 1 << s->mdct_bits;
int n2 = n >> 1;
int n4 = n >> 2;
* @param input N samples
* @param out N/2 samples
*/
-void ff_mdct_calc_c(MDCTContext *s, FFTSample *out, const FFTSample *input)
+void ff_mdct_calc_c(FFTContext *s, FFTSample *out, const FFTSample *input)
{
int i, j, n, n8, n4, n2, n3;
FFTSample re, im;
- const uint16_t *revtab = s->fft.revtab;
+ const uint16_t *revtab = s->revtab;
const FFTSample *tcos = s->tcos;
const FFTSample *tsin = s->tsin;
FFTComplex *x = (FFTComplex *)out;
- n = 1 << s->nbits;
+ n = 1 << s->mdct_bits;
n2 = n >> 1;
n4 = n >> 2;
n8 = n >> 3;
CMUL(x[j].re, x[j].im, re, im, -tcos[n8 + i], tsin[n8 + i]);
}
- ff_fft_calc(&s->fft, x);
+ ff_fft_calc(s, x);
/* post rotation */
for(i=0;i<n8;i++) {
}
}
-av_cold void ff_mdct_end(MDCTContext *s)
+av_cold void ff_mdct_end(FFTContext *s)
{
av_freep(&s->tcos);
av_freep(&s->tsin);
- ff_fft_end(&s->fft);
+ ff_fft_end(s);
}
int add_bias;
float scale_bias;
DSPContext dsp;
- MDCTContext imdct_ctx;
+ FFTContext imdct_ctx;
DECLARE_ALIGNED_16(float,imdct_out[NELLY_BUF_LEN * 2]);
} NellyMoserDecodeContext;
int bufsel;
int have_saved;
DSPContext dsp;
- MDCTContext mdct_ctx;
+ FFTContext mdct_ctx;
DECLARE_ALIGNED_16(float, mdct_out[NELLY_SAMPLES]);
DECLARE_ALIGNED_16(float, in_buff[NELLY_SAMPLES]);
DECLARE_ALIGNED_16(float, buf[2][3 * NELLY_BUF_LEN]); ///< sample buffer
typedef struct TwinContext {
AVCodecContext *avctx;
DSPContext dsp;
- MDCTContext mdct_ctx[3];
+ FFTContext mdct_ctx[3];
const ModeTab *mtab;
GetBitContext gb;
DSPContext dsp;
- MDCTContext mdct[2];
+ FFTContext mdct[2];
uint_fast8_t first_frame;
uint_fast32_t version;
uint_fast8_t audio_channels;
int channels;
int sample_rate;
int log2_blocksize[2];
- MDCTContext mdct[2];
+ FFTContext mdct[2];
const float * win[2];
int have_saved;
float * saved;
WMACoef coefs1[MAX_CHANNELS][BLOCK_MAX_SIZE];
DECLARE_ALIGNED_16(float, coefs[MAX_CHANNELS][BLOCK_MAX_SIZE]);
DECLARE_ALIGNED_16(FFTSample, output[BLOCK_MAX_SIZE * 2]);
- MDCTContext mdct_ctx[BLOCK_NB_SIZES];
+ FFTContext mdct_ctx[BLOCK_NB_SIZES];
float *windows[BLOCK_NB_SIZES];
/* output buffer for one frame and the last for IMDCT windowing */
DECLARE_ALIGNED_16(float, frame_out[MAX_CHANNELS][BLOCK_MAX_SIZE * 2]);
uint8_t frame_data[MAX_FRAMESIZE +
FF_INPUT_BUFFER_PADDING_SIZE];///< compressed frame data
PutBitContext pb; ///< context for filling the frame_data buffer
- MDCTContext mdct_ctx[WMAPRO_BLOCK_SIZES]; ///< MDCT context per block size
+ FFTContext mdct_ctx[WMAPRO_BLOCK_SIZES]; ///< MDCT context per block size
DECLARE_ALIGNED_16(float, tmp[WMAPRO_BLOCK_MAX_SIZE]); ///< IMDCT output buffer
float* windows[WMAPRO_BLOCK_SIZES]; ///< windows for the different block sizes
void ff_fft_calc_3dn(FFTContext *s, FFTComplex *z);
void ff_fft_calc_3dn2(FFTContext *s, FFTComplex *z);
-void ff_imdct_calc_3dn(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_imdct_half_3dn(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_imdct_calc_3dn2(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_imdct_half_3dn2(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_imdct_calc_sse(MDCTContext *s, FFTSample *output, const FFTSample *input);
-void ff_imdct_half_sse(MDCTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_calc_3dn(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_half_3dn(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_calc_3dn2(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_half_3dn2(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_calc_sse(FFTContext *s, FFTSample *output, const FFTSample *input);
+void ff_imdct_half_sse(FFTContext *s, FFTSample *output, const FFTSample *input);
#endif
FFSWAP(FFTSample, z[i].im, z[i+1].re);
}
-void ff_imdct_half_3dn2(MDCTContext *s, FFTSample *output, const FFTSample *input)
+void ff_imdct_half_3dn2(FFTContext *s, FFTSample *output, const FFTSample *input)
{
x86_reg j, k;
- long n = 1 << s->nbits;
+ long n = 1 << s->mdct_bits;
long n2 = n >> 1;
long n4 = n >> 2;
long n8 = n >> 3;
- const uint16_t *revtab = s->fft.revtab;
+ const uint16_t *revtab = s->revtab;
const FFTSample *tcos = s->tcos;
const FFTSample *tsin = s->tsin;
const FFTSample *in1, *in2;
);
}
- ff_fft_dispatch_3dn2(z, s->fft.nbits);
+ ff_fft_dispatch_3dn2(z, s->nbits);
#define CMUL(j,mm0,mm1)\
"movq (%2,"#j",2), %%mm6 \n"\
__asm__ volatile("femms");
}
-void ff_imdct_calc_3dn2(MDCTContext *s, FFTSample *output, const FFTSample *input)
+void ff_imdct_calc_3dn2(FFTContext *s, FFTSample *output, const FFTSample *input)
{
x86_reg j, k;
- long n = 1 << s->nbits;
+ long n = 1 << s->mdct_bits;
long n4 = n >> 2;
ff_imdct_half_3dn2(s, output+n4, input);
memcpy(z, s->tmp_buf, n*sizeof(FFTComplex));
}
-void ff_imdct_half_sse(MDCTContext *s, FFTSample *output, const FFTSample *input)
+void ff_imdct_half_sse(FFTContext *s, FFTSample *output, const FFTSample *input)
{
av_unused x86_reg i, j, k, l;
- long n = 1 << s->nbits;
+ long n = 1 << s->mdct_bits;
long n2 = n >> 1;
long n4 = n >> 2;
long n8 = n >> 3;
- const uint16_t *revtab = s->fft.revtab + n8;
+ const uint16_t *revtab = s->revtab + n8;
const FFTSample *tcos = s->tcos;
const FFTSample *tsin = s->tsin;
FFTComplex *z = (FFTComplex *)output;
#endif
}
- ff_fft_dispatch_sse(z, s->fft.nbits);
+ ff_fft_dispatch_sse(z, s->nbits);
/* post rotation + reinterleave + reorder */
);
}
-void ff_imdct_calc_sse(MDCTContext *s, FFTSample *output, const FFTSample *input)
+void ff_imdct_calc_sse(FFTContext *s, FFTSample *output, const FFTSample *input)
{
x86_reg j, k;
- long n = 1 << s->nbits;
+ long n = 1 << s->mdct_bits;
long n4 = n >> 2;
ff_imdct_half_sse(s, output+n4, input);