FFmpeg
avfft.c
Go to the documentation of this file.
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/attributes.h"
20 #include "libavutil/mem.h"
21 #include "avfft.h"
22 #include "fft.h"
23 #include "rdft.h"
24 #include "dct.h"
25 
26 /* FFT */
27 
28 FFTContext *av_fft_init(int nbits, int inverse)
29 {
30  FFTContext *s = av_mallocz(sizeof(*s));
31 
32  if (s && ff_fft_init(s, nbits, inverse))
33  av_freep(&s);
34 
35  return s;
36 }
37 
39 {
40  s->fft_permute(s, z);
41 }
42 
44 {
45  s->fft_calc(s, z);
46 }
47 
49 {
50  if (s) {
51  ff_fft_end(s);
52  av_free(s);
53  }
54 }
55 
56 #if CONFIG_MDCT
57 
58 FFTContext *av_mdct_init(int nbits, int inverse, double scale)
59 {
60  FFTContext *s = av_malloc(sizeof(*s));
61 
62  if (s && ff_mdct_init(s, nbits, inverse, scale))
63  av_freep(&s);
64 
65  return s;
66 }
67 
69 {
70  s->imdct_calc(s, output, input);
71 }
72 
74 {
75  s->imdct_half(s, output, input);
76 }
77 
79 {
80  s->mdct_calc(s, output, input);
81 }
82 
84 {
85  if (s) {
86  ff_mdct_end(s);
87  av_free(s);
88  }
89 }
90 
91 #endif /* CONFIG_MDCT */
92 
93 #if CONFIG_RDFT
94 
95 RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans)
96 {
97  RDFTContext *s = av_malloc(sizeof(*s));
98 
99  if (s && ff_rdft_init(s, nbits, trans))
100  av_freep(&s);
101 
102  return s;
103 }
104 
106 {
107  s->rdft_calc(s, data);
108 }
109 
111 {
112  if (s) {
113  ff_rdft_end(s);
114  av_free(s);
115  }
116 }
117 
118 #endif /* CONFIG_RDFT */
119 
120 #if CONFIG_DCT
121 
123 {
124  DCTContext *s = av_malloc(sizeof(*s));
125 
126  if (s && ff_dct_init(s, nbits, inverse))
127  av_freep(&s);
128 
129  return s;
130 }
131 
133 {
134  s->dct_calc(s, data);
135 }
136 
138 {
139  if (s) {
140  ff_dct_end(s);
141  av_free(s);
142  }
143 }
144 
145 #endif /* CONFIG_DCT */
ff_fft_init
#define ff_fft_init
Definition: fft.h:136
av_fft_end
av_cold void av_fft_end(FFTContext *s)
Definition: avfft.c:48
av_imdct_calc
void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input)
inverse
inverse
Definition: af_crystalizer.c:122
rdft.h
output
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
Definition: filter_design.txt:225
data
const char data[16]
Definition: mxf.c:146
ff_mdct_init
#define ff_mdct_init
Definition: fft.h:154
av_fft_permute
void av_fft_permute(FFTContext *s, FFTComplex *z)
Do the permutation needed BEFORE calling ff_fft_calc().
Definition: avfft.c:38
av_dct_init
DCTContext * av_dct_init(int nbits, enum DCTTransformType type)
Set up DCT.
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
ff_rdft_end
av_cold void ff_rdft_end(RDFTContext *s)
Definition: rdft.c:117
scale
static av_always_inline float scale(float x, float s)
Definition: vf_v360.c:1389
av_cold
#define av_cold
Definition: attributes.h:90
dct.h
av_dct_end
void av_dct_end(DCTContext *s)
s
#define s(width, name)
Definition: cbs_vp9.c:256
ff_fft_end
#define ff_fft_end
Definition: fft.h:137
av_rdft_calc
void av_rdft_calc(RDFTContext *s, FFTSample *data)
av_dct_calc
void av_dct_calc(DCTContext *s, FFTSample *data)
av_mdct_init
FFTContext * av_mdct_init(int nbits, int inverse, double scale)
av_mdct_end
void av_mdct_end(FFTContext *s)
FFTSample
float FFTSample
Definition: avfft.h:35
avfft.h
av_rdft_init
RDFTContext * av_rdft_init(int nbits, enum RDFTransformType trans)
Set up a real FFT.
ff_mdct_end
#define ff_mdct_end
Definition: fft.h:155
attributes.h
ff_dct_end
av_cold void ff_dct_end(DCTContext *s)
Definition: dct.c:224
input
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some input
Definition: filter_design.txt:172
ff_rdft_init
av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans)
Set up a real FFT.
Definition: rdft.c:89
FFTContext
Definition: fft.h:76
ff_dct_init
av_cold int ff_dct_init(DCTContext *s, int nbits, enum DCTTransformType inverse)
Set up DCT.
Definition: dct.c:179
RDFTContext
Definition: rdft.h:28
RDFTransformType
RDFTransformType
Definition: avfft.h:71
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:254
DCTContext
Definition: dct.h:32
av_fft_init
FFTContext * av_fft_init(int nbits, int inverse)
Set up a complex FFT.
Definition: avfft.c:28
fft.h
mem.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_rdft_end
void av_rdft_end(RDFTContext *s)
av_fft_calc
void av_fft_calc(FFTContext *s, FFTComplex *z)
Do a complex FFT with the parameters defined in av_fft_init().
Definition: avfft.c:43
av_mdct_calc
void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input)
DCTTransformType
DCTTransformType
Definition: avfft.h:93
av_imdct_half
void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input)
FFTComplex
Definition: avfft.h:37