xref: /third_party/ffmpeg/libavcodec/fft.h (revision cabdff1a)
1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
3cabdff1aSopenharmony_ci * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#ifndef AVCODEC_FFT_H
23cabdff1aSopenharmony_ci#define AVCODEC_FFT_H
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#ifndef FFT_FLOAT
26cabdff1aSopenharmony_ci#define FFT_FLOAT 1
27cabdff1aSopenharmony_ci#endif
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include <stdint.h>
30cabdff1aSopenharmony_ci#include "config.h"
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci#if FFT_FLOAT
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_ci#include "avfft.h"
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#define FFT_NAME(x) x
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_citypedef float FFTDouble;
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_ci#else
43cabdff1aSopenharmony_ci
44cabdff1aSopenharmony_ci#define Q31(x) (int)((x)*2147483648.0 + 0.5)
45cabdff1aSopenharmony_ci#define FFT_NAME(x) x ## _fixed_32
46cabdff1aSopenharmony_ci
47cabdff1aSopenharmony_citypedef int32_t FFTSample;
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_citypedef struct FFTComplex {
50cabdff1aSopenharmony_ci    FFTSample re, im;
51cabdff1aSopenharmony_ci} FFTComplex;
52cabdff1aSopenharmony_ci
53cabdff1aSopenharmony_citypedef int    FFTDouble;
54cabdff1aSopenharmony_citypedef struct FFTContext FFTContext;
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_ci#endif /* FFT_FLOAT */
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_citypedef struct FFTDComplex {
59cabdff1aSopenharmony_ci    FFTDouble re, im;
60cabdff1aSopenharmony_ci} FFTDComplex;
61cabdff1aSopenharmony_ci
62cabdff1aSopenharmony_ci/* FFT computation */
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_cienum fft_permutation_type {
65cabdff1aSopenharmony_ci    FF_FFT_PERM_DEFAULT,
66cabdff1aSopenharmony_ci    FF_FFT_PERM_SWAP_LSBS,
67cabdff1aSopenharmony_ci    FF_FFT_PERM_AVX,
68cabdff1aSopenharmony_ci};
69cabdff1aSopenharmony_ci
70cabdff1aSopenharmony_cienum mdct_permutation_type {
71cabdff1aSopenharmony_ci    FF_MDCT_PERM_NONE,
72cabdff1aSopenharmony_ci    FF_MDCT_PERM_INTERLEAVE,
73cabdff1aSopenharmony_ci};
74cabdff1aSopenharmony_ci
75cabdff1aSopenharmony_cistruct FFTContext {
76cabdff1aSopenharmony_ci    int nbits;
77cabdff1aSopenharmony_ci    int inverse;
78cabdff1aSopenharmony_ci    uint16_t *revtab;
79cabdff1aSopenharmony_ci    FFTComplex *tmp_buf;
80cabdff1aSopenharmony_ci    int mdct_size; /* size of MDCT (i.e. number of input data * 2) */
81cabdff1aSopenharmony_ci    int mdct_bits; /* n = 2^nbits */
82cabdff1aSopenharmony_ci    /* pre/post rotation tables */
83cabdff1aSopenharmony_ci    FFTSample *tcos;
84cabdff1aSopenharmony_ci    FFTSample *tsin;
85cabdff1aSopenharmony_ci    /**
86cabdff1aSopenharmony_ci     * Do the permutation needed BEFORE calling fft_calc().
87cabdff1aSopenharmony_ci     */
88cabdff1aSopenharmony_ci    void (*fft_permute)(struct FFTContext *s, FFTComplex *z);
89cabdff1aSopenharmony_ci    /**
90cabdff1aSopenharmony_ci     * Do a complex FFT with the parameters defined in ff_fft_init(). The
91cabdff1aSopenharmony_ci     * input data must be permuted before. No 1.0/sqrt(n) normalization is done.
92cabdff1aSopenharmony_ci     */
93cabdff1aSopenharmony_ci    void (*fft_calc)(struct FFTContext *s, FFTComplex *z);
94cabdff1aSopenharmony_ci    void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
95cabdff1aSopenharmony_ci    void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
96cabdff1aSopenharmony_ci    void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
97cabdff1aSopenharmony_ci    enum fft_permutation_type fft_permutation;
98cabdff1aSopenharmony_ci    enum mdct_permutation_type mdct_permutation;
99cabdff1aSopenharmony_ci    uint32_t *revtab32;
100cabdff1aSopenharmony_ci};
101cabdff1aSopenharmony_ci
102cabdff1aSopenharmony_ci#if CONFIG_HARDCODED_TABLES
103cabdff1aSopenharmony_ci#define COSTABLE_CONST const
104cabdff1aSopenharmony_ci#define ff_init_ff_cos_tabs(index)
105cabdff1aSopenharmony_ci#else
106cabdff1aSopenharmony_ci#define COSTABLE_CONST
107cabdff1aSopenharmony_ci#define ff_init_ff_cos_tabs FFT_NAME(ff_init_ff_cos_tabs)
108cabdff1aSopenharmony_ci
109cabdff1aSopenharmony_ci/**
110cabdff1aSopenharmony_ci * Initialize the cosine table in ff_cos_tabs[index]
111cabdff1aSopenharmony_ci * @param index index in ff_cos_tabs array of the table to initialize
112cabdff1aSopenharmony_ci */
113cabdff1aSopenharmony_civoid ff_init_ff_cos_tabs(int index);
114cabdff1aSopenharmony_ci#endif
115cabdff1aSopenharmony_ci
116cabdff1aSopenharmony_ci#define COSTABLE(size) \
117cabdff1aSopenharmony_ci    COSTABLE_CONST DECLARE_ALIGNED(32, FFTSample, FFT_NAME(ff_cos_##size))[size/2]
118cabdff1aSopenharmony_ci
119cabdff1aSopenharmony_ciextern COSTABLE(16);
120cabdff1aSopenharmony_ciextern COSTABLE(32);
121cabdff1aSopenharmony_ciextern COSTABLE(64);
122cabdff1aSopenharmony_ciextern COSTABLE(128);
123cabdff1aSopenharmony_ciextern COSTABLE(256);
124cabdff1aSopenharmony_ciextern COSTABLE(512);
125cabdff1aSopenharmony_ciextern COSTABLE(1024);
126cabdff1aSopenharmony_ciextern COSTABLE(2048);
127cabdff1aSopenharmony_ciextern COSTABLE(4096);
128cabdff1aSopenharmony_ciextern COSTABLE(8192);
129cabdff1aSopenharmony_ciextern COSTABLE(16384);
130cabdff1aSopenharmony_ciextern COSTABLE(32768);
131cabdff1aSopenharmony_ciextern COSTABLE(65536);
132cabdff1aSopenharmony_ciextern COSTABLE(131072);
133cabdff1aSopenharmony_ciextern COSTABLE_CONST FFTSample* const FFT_NAME(ff_cos_tabs)[18];
134cabdff1aSopenharmony_ci
135cabdff1aSopenharmony_ci#define ff_fft_init FFT_NAME(ff_fft_init)
136cabdff1aSopenharmony_ci#define ff_fft_end  FFT_NAME(ff_fft_end)
137cabdff1aSopenharmony_ci
138cabdff1aSopenharmony_ci/**
139cabdff1aSopenharmony_ci * Set up a complex FFT.
140cabdff1aSopenharmony_ci * @param nbits           log2 of the length of the input array
141cabdff1aSopenharmony_ci * @param inverse         if 0 perform the forward transform, if 1 perform the inverse
142cabdff1aSopenharmony_ci */
143cabdff1aSopenharmony_ciint ff_fft_init(FFTContext *s, int nbits, int inverse);
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_civoid ff_fft_init_aarch64(FFTContext *s);
146cabdff1aSopenharmony_civoid ff_fft_init_x86(FFTContext *s);
147cabdff1aSopenharmony_civoid ff_fft_init_arm(FFTContext *s);
148cabdff1aSopenharmony_civoid ff_fft_init_mips(FFTContext *s);
149cabdff1aSopenharmony_civoid ff_fft_init_ppc(FFTContext *s);
150cabdff1aSopenharmony_ci
151cabdff1aSopenharmony_civoid ff_fft_end(FFTContext *s);
152cabdff1aSopenharmony_ci
153cabdff1aSopenharmony_ci#define ff_mdct_init FFT_NAME(ff_mdct_init)
154cabdff1aSopenharmony_ci#define ff_mdct_end  FFT_NAME(ff_mdct_end)
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ciint ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale);
157cabdff1aSopenharmony_civoid ff_mdct_end(FFTContext *s);
158cabdff1aSopenharmony_ci
159cabdff1aSopenharmony_ci#endif /* AVCODEC_FFT_H */
160