1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "libavutil/mem.h"
20#include "avfft.h"
21#include "fft.h"
22
23/* FFT */
24
25FFTContext *av_fft_init(int nbits, int inverse)
26{
27    FFTContext *s = av_malloc(sizeof(*s));
28
29    if (s)
30        ff_fft_init(s, nbits, inverse);
31
32    return s;
33}
34
35void av_fft_permute(FFTContext *s, FFTComplex *z)
36{
37    s->fft_permute(s, z);
38}
39
40void av_fft_calc(FFTContext *s, FFTComplex *z)
41{
42    s->fft_calc(s, z);
43}
44
45void av_fft_end(FFTContext *s)
46{
47    if (s) {
48        ff_fft_end(s);
49        av_free(s);
50    }
51}
52
53#if CONFIG_MDCT
54
55FFTContext *av_mdct_init(int nbits, int inverse, double scale)
56{
57    FFTContext *s = av_malloc(sizeof(*s));
58
59    if (s)
60        ff_mdct_init(s, nbits, inverse, scale);
61
62    return s;
63}
64
65void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input)
66{
67    s->imdct_calc(s, output, input);
68}
69
70void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input)
71{
72    s->imdct_half(s, output, input);
73}
74
75void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input)
76{
77    s->mdct_calc(s, output, input);
78}
79
80void av_mdct_end(FFTContext *s)
81{
82    if (s) {
83        ff_mdct_end(s);
84        av_free(s);
85    }
86}
87
88#endif /* CONFIG_MDCT */
89
90#if CONFIG_RDFT
91
92RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans)
93{
94    RDFTContext *s = av_malloc(sizeof(*s));
95
96    if (s)
97        ff_rdft_init(s, nbits, trans);
98
99    return s;
100}
101
102void av_rdft_calc(RDFTContext *s, FFTSample *data)
103{
104    ff_rdft_calc(s, data);
105}
106
107void av_rdft_end(RDFTContext *s)
108{
109    if (s) {
110        ff_rdft_end(s);
111        av_free(s);
112    }
113}
114
115#endif /* CONFIG_RDFT */
116
117#if CONFIG_DCT
118
119DCTContext *av_dct_init(int nbits, enum DCTTransformType inverse)
120{
121    DCTContext *s = av_malloc(sizeof(*s));
122
123    if (s)
124        ff_dct_init(s, nbits, inverse);
125
126    return s;
127}
128
129void av_dct_calc(DCTContext *s, FFTSample *data)
130{
131    ff_dct_calc(s, data);
132}
133
134void av_dct_end(DCTContext *s)
135{
136    if (s) {
137        ff_dct_end(s);
138        av_free(s);
139    }
140}
141
142#endif /* CONFIG_DCT */
143