X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Frdft.c;h=f37263b7c2b12dbeb2ec0346b44226e5bd90ffc7;hb=843b5fd0fe07f988252d3b711e142785af26a0eb;hp=5d3a07c14695c2c2eca74464daf9bc9265a4a52e;hpb=4ee726b67097dcba8435f78235953389dac4e06e;p=ffmpeg diff --git a/libavcodec/rdft.c b/libavcodec/rdft.c index 5d3a07c1469..f37263b7c2b 100644 --- a/libavcodec/rdft.c +++ b/libavcodec/rdft.c @@ -18,15 +18,18 @@ * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include -#include "dsputil.h" +#include "libavutil/mathematics.h" +#include "fft.h" /** - * @file libavcodec/rdft.c + * @file * (Inverse) Real Discrete Fourier Transforms. */ /* sin(2*pi*x/n) for 0<=xnbits = nbits; - s->inverse = trans == IRDFT || trans == IRIDFT; - s->sign_convention = trans == RIDFT || trans == IRIDFT ? 1 : -1; - - if (nbits < 4 || nbits > 16) - return -1; - - if (ff_fft_init(&s->fft, nbits-1, trans == IRDFT || trans == RIDFT) < 0) - return -1; - - s->tcos = ff_cos_tabs[nbits-4]; - s->tsin = ff_sin_tabs[nbits-4]+(trans == RDFT || trans == IRIDFT)*(n>>2); - for (i = 0; i < (n>>2); i++) { - s->tsin[i] = sin(i*theta); - } - return 0; -} - /** Map one real FFT into two parallel real even and odd FFTs. Then interleave * the two real FFTs into one complex FFT. Unmangle the results. * ref: http://www.engineeringproductivitytools.com/stuff/T0001/PT10.HTM */ -void ff_rdft_calc_c(RDFTContext* s, FFTSample* data) +static void ff_rdft_calc_c(RDFTContext* s, FFTSample* data) { int i, i1, i2; FFTComplex ev, od; @@ -115,9 +96,35 @@ void ff_rdft_calc_c(RDFTContext* s, FFTSample* data) } } -void ff_rdft_calc(RDFTContext *s, FFTSample *data) +av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans) { - ff_rdft_calc_c(s, data); + int n = 1 << nbits; + int i; + const double theta = (trans == DFT_R2C || trans == DFT_C2R ? -1 : 1)*2*M_PI/n; + + s->nbits = nbits; + s->inverse = trans == IDFT_C2R || trans == DFT_C2R; + s->sign_convention = trans == IDFT_R2C || trans == DFT_C2R ? 1 : -1; + + if (nbits < 4 || nbits > 16) + return -1; + + if (ff_fft_init(&s->fft, nbits-1, trans == IDFT_C2R || trans == IDFT_R2C) < 0) + return -1; + + ff_init_ff_cos_tabs(nbits); + s->tcos = ff_cos_tabs[nbits]; + s->tsin = ff_sin_tabs[nbits]+(trans == DFT_R2C || trans == DFT_C2R)*(n>>2); +#if !CONFIG_HARDCODED_TABLES + for (i = 0; i < (n>>2); i++) { + s->tsin[i] = sin(i*theta); + } +#endif + s->rdft_calc = ff_rdft_calc_c; + + if (ARCH_ARM) ff_rdft_init_arm(s); + + return 0; } av_cold void ff_rdft_end(RDFTContext *s)