Browse code

avfilter: move window function generation into separate file

Signed-off-by: Paul B Mahol <onemda@gmail.com>

Paul B Mahol authored on 2015/12/29 02:39:31
Showing 4 changed files
... ...
@@ -284,7 +284,7 @@ OBJS-$(CONFIG_APHASEMETER_FILTER)            += avf_aphasemeter.o
284 284
 OBJS-$(CONFIG_AVECTORSCOPE_FILTER)           += avf_avectorscope.o
285 285
 OBJS-$(CONFIG_CONCAT_FILTER)                 += avf_concat.o
286 286
 OBJS-$(CONFIG_SHOWCQT_FILTER)                += avf_showcqt.o lswsutils.o lavfutils.o
287
-OBJS-$(CONFIG_SHOWFREQS_FILTER)              += avf_showfreqs.o
287
+OBJS-$(CONFIG_SHOWFREQS_FILTER)              += avf_showfreqs.o window_func.o
288 288
 OBJS-$(CONFIG_SHOWSPECTRUM_FILTER)           += avf_showspectrum.o
289 289
 OBJS-$(CONFIG_SHOWVOLUME_FILTER)             += avf_showvolume.o
290 290
 OBJS-$(CONFIG_SHOWWAVES_FILTER)              += avf_showwaves.o
... ...
@@ -32,15 +32,12 @@
32 32
 #include "video.h"
33 33
 #include "avfilter.h"
34 34
 #include "internal.h"
35
+#include "window_func.h"
35 36
 
36 37
 enum DisplayMode    { LINE, BAR, DOT, NB_MODES };
37 38
 enum ChannelMode    { COMBINED, SEPARATE, NB_CMODES };
38 39
 enum FrequencyScale { FS_LINEAR, FS_LOG, FS_RLOG, NB_FSCALES };
39 40
 enum AmplitudeScale { AS_LINEAR, AS_SQRT, AS_CBRT, AS_LOG, NB_ASCALES };
40
-enum WindowFunc     { WFUNC_RECT, WFUNC_HANNING, WFUNC_HAMMING, WFUNC_BLACKMAN,
41
-                      WFUNC_BARTLETT, WFUNC_WELCH, WFUNC_FLATTOP,
42
-                      WFUNC_BHARRIS, WFUNC_BNUTTALL, WFUNC_SINE, WFUNC_NUTTALL,
43
-                      WFUNC_BHANN, WFUNC_LANCZOS, WFUNC_GAUSS, NB_WFUNC };
44 41
 
45 42
 typedef struct ShowFreqsContext {
46 43
     const AVClass *class;
... ...
@@ -156,92 +153,6 @@ static int query_formats(AVFilterContext *ctx)
156 156
     return 0;
157 157
 }
158 158
 
159
-static void generate_window_func(float *lut, int N, int win_func, float *overlap)
160
-{
161
-    int n;
162
-
163
-    switch (win_func) {
164
-    case WFUNC_RECT:
165
-        for (n = 0; n < N; n++)
166
-            lut[n] = 1.;
167
-        *overlap = 0.;
168
-        break;
169
-    case WFUNC_BARTLETT:
170
-        for (n = 0; n < N; n++)
171
-            lut[n] = 1.-fabs((n-(N-1)/2.)/((N-1)/2.));
172
-        *overlap = 0.5;
173
-        break;
174
-    case WFUNC_HANNING:
175
-        for (n = 0; n < N; n++)
176
-            lut[n] = .5*(1-cos(2*M_PI*n/(N-1)));
177
-        *overlap = 0.5;
178
-        break;
179
-    case WFUNC_HAMMING:
180
-        for (n = 0; n < N; n++)
181
-            lut[n] = .54-.46*cos(2*M_PI*n/(N-1));
182
-        *overlap = 0.5;
183
-        break;
184
-    case WFUNC_BLACKMAN:
185
-        for (n = 0; n < N; n++)
186
-            lut[n] = .42659-.49656*cos(2*M_PI*n/(N-1))+.076849*cos(4*M_PI*n/(N-1));
187
-        *overlap = 0.661;
188
-        break;
189
-    case WFUNC_WELCH:
190
-        for (n = 0; n < N; n++)
191
-            lut[n] = 1.-(n-(N-1)/2.)/((N-1)/2.)*(n-(N-1)/2.)/((N-1)/2.);
192
-        *overlap = 0.293;
193
-        break;
194
-    case WFUNC_FLATTOP:
195
-        for (n = 0; n < N; n++)
196
-            lut[n] = 1.-1.985844164102*cos( 2*M_PI*n/(N-1))+1.791176438506*cos( 4*M_PI*n/(N-1))-
197
-                        1.282075284005*cos( 6*M_PI*n/(N-1))+0.667777530266*cos( 8*M_PI*n/(N-1))-
198
-                        0.240160796576*cos(10*M_PI*n/(N-1))+0.056656381764*cos(12*M_PI*n/(N-1))-
199
-                        0.008134974479*cos(14*M_PI*n/(N-1))+0.000624544650*cos(16*M_PI*n/(N-1))-
200
-                        0.000019808998*cos(18*M_PI*n/(N-1))+0.000000132974*cos(20*M_PI*n/(N-1));
201
-        *overlap = 0.841;
202
-        break;
203
-    case WFUNC_BHARRIS:
204
-        for (n = 0; n < N; n++)
205
-            lut[n] = 0.35875-0.48829*cos(2*M_PI*n/(N-1))+0.14128*cos(4*M_PI*n/(N-1))-0.01168*cos(6*M_PI*n/(N-1));
206
-        *overlap = 0.661;
207
-        break;
208
-    case WFUNC_BNUTTALL:
209
-        for (n = 0; n < N; n++)
210
-            lut[n] = 0.3635819-0.4891775*cos(2*M_PI*n/(N-1))+0.1365995*cos(4*M_PI*n/(N-1))-0.0106411*cos(6*M_PI*n/(N-1));
211
-        *overlap = 0.661;
212
-        break;
213
-    case WFUNC_BHANN:
214
-        for (n = 0; n < N; n++)
215
-            lut[n] = 0.62-0.48*fabs(n/(double)(N-1)-.5)-0.38*cos(2*M_PI*n/(N-1));
216
-        *overlap = 0.5;
217
-        break;
218
-    case WFUNC_SINE:
219
-        for (n = 0; n < N; n++)
220
-            lut[n] = sin(M_PI*n/(N-1));
221
-        *overlap = 0.75;
222
-        break;
223
-    case WFUNC_NUTTALL:
224
-        for (n = 0; n < N; n++)
225
-            lut[n] = 0.355768-0.487396*cos(2*M_PI*n/(N-1))+0.144232*cos(4*M_PI*n/(N-1))-0.012604*cos(6*M_PI*n/(N-1));
226
-        *overlap = 0.663;
227
-        break;
228
-    case WFUNC_LANCZOS:
229
-#define SINC(x) (!(x)) ? 1 : sin(M_PI * (x))/(M_PI * (x));
230
-        for (n = 0; n < N; n++)
231
-            lut[n] = SINC((2.*n)/(N-1)-1);
232
-        *overlap = 0.75;
233
-        break;
234
-    case WFUNC_GAUSS:
235
-#define SQR(x) ((x)*(x))
236
-        for (n = 0; n < N; n++)
237
-            lut[n] = exp(-0.5 * SQR((n-(N-1)/2)/(0.4*(N-1)/2.f)));
238
-        *overlap = 0.75;
239
-        break;
240
-    default:
241
-        av_assert0(0);
242
-    }
243
-}
244
-
245 159
 static int config_output(AVFilterLink *outlink)
246 160
 {
247 161
     AVFilterContext *ctx = outlink->src;
... ...
@@ -290,7 +201,7 @@ static int config_output(AVFilterLink *outlink)
290 290
                                       sizeof(*s->window_func_lut));
291 291
     if (!s->window_func_lut)
292 292
         return AVERROR(ENOMEM);
293
-    generate_window_func(s->window_func_lut, s->win_size, s->win_func, &overlap);
293
+    ff_generate_window_func(s->window_func_lut, s->win_size, s->win_func, &overlap);
294 294
     if (s->overlap == 1.)
295 295
         s->overlap = overlap;
296 296
     s->skip_samples = (1. - s->overlap) * s->win_size;
297 297
new file mode 100644
... ...
@@ -0,0 +1,110 @@
0
+/*
1
+ * Copyright (c) 2015 Paul B Mahol
2
+ *
3
+ * This file is part of FFmpeg.
4
+ *
5
+ * FFmpeg is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * FFmpeg is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with FFmpeg; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ */
19
+
20
+#include <math.h>
21
+
22
+#include "libavutil/avassert.h"
23
+#include "window_func.h"
24
+
25
+void ff_generate_window_func(float *lut, int N, int win_func, float *overlap)
26
+{
27
+    int n;
28
+
29
+    switch (win_func) {
30
+    case WFUNC_RECT:
31
+        for (n = 0; n < N; n++)
32
+            lut[n] = 1.;
33
+        *overlap = 0.;
34
+        break;
35
+    case WFUNC_BARTLETT:
36
+        for (n = 0; n < N; n++)
37
+            lut[n] = 1.-fabs((n-(N-1)/2.)/((N-1)/2.));
38
+        *overlap = 0.5;
39
+        break;
40
+    case WFUNC_HANNING:
41
+        for (n = 0; n < N; n++)
42
+            lut[n] = .5*(1-cos(2*M_PI*n/(N-1)));
43
+        *overlap = 0.5;
44
+        break;
45
+    case WFUNC_HAMMING:
46
+        for (n = 0; n < N; n++)
47
+            lut[n] = .54-.46*cos(2*M_PI*n/(N-1));
48
+        *overlap = 0.5;
49
+        break;
50
+    case WFUNC_BLACKMAN:
51
+        for (n = 0; n < N; n++)
52
+            lut[n] = .42659-.49656*cos(2*M_PI*n/(N-1))+.076849*cos(4*M_PI*n/(N-1));
53
+        *overlap = 0.661;
54
+        break;
55
+    case WFUNC_WELCH:
56
+        for (n = 0; n < N; n++)
57
+            lut[n] = 1.-(n-(N-1)/2.)/((N-1)/2.)*(n-(N-1)/2.)/((N-1)/2.);
58
+        *overlap = 0.293;
59
+        break;
60
+    case WFUNC_FLATTOP:
61
+        for (n = 0; n < N; n++)
62
+            lut[n] = 1.-1.985844164102*cos( 2*M_PI*n/(N-1))+1.791176438506*cos( 4*M_PI*n/(N-1))-
63
+                        1.282075284005*cos( 6*M_PI*n/(N-1))+0.667777530266*cos( 8*M_PI*n/(N-1))-
64
+                        0.240160796576*cos(10*M_PI*n/(N-1))+0.056656381764*cos(12*M_PI*n/(N-1))-
65
+                        0.008134974479*cos(14*M_PI*n/(N-1))+0.000624544650*cos(16*M_PI*n/(N-1))-
66
+                        0.000019808998*cos(18*M_PI*n/(N-1))+0.000000132974*cos(20*M_PI*n/(N-1));
67
+        *overlap = 0.841;
68
+        break;
69
+    case WFUNC_BHARRIS:
70
+        for (n = 0; n < N; n++)
71
+            lut[n] = 0.35875-0.48829*cos(2*M_PI*n/(N-1))+0.14128*cos(4*M_PI*n/(N-1))-0.01168*cos(6*M_PI*n/(N-1));
72
+        *overlap = 0.661;
73
+        break;
74
+    case WFUNC_BNUTTALL:
75
+        for (n = 0; n < N; n++)
76
+            lut[n] = 0.3635819-0.4891775*cos(2*M_PI*n/(N-1))+0.1365995*cos(4*M_PI*n/(N-1))-0.0106411*cos(6*M_PI*n/(N-1));
77
+        *overlap = 0.661;
78
+        break;
79
+    case WFUNC_BHANN:
80
+        for (n = 0; n < N; n++)
81
+            lut[n] = 0.62-0.48*fabs(n/(double)(N-1)-.5)-0.38*cos(2*M_PI*n/(N-1));
82
+        *overlap = 0.5;
83
+        break;
84
+    case WFUNC_SINE:
85
+        for (n = 0; n < N; n++)
86
+            lut[n] = sin(M_PI*n/(N-1));
87
+        *overlap = 0.75;
88
+        break;
89
+    case WFUNC_NUTTALL:
90
+        for (n = 0; n < N; n++)
91
+            lut[n] = 0.355768-0.487396*cos(2*M_PI*n/(N-1))+0.144232*cos(4*M_PI*n/(N-1))-0.012604*cos(6*M_PI*n/(N-1));
92
+        *overlap = 0.663;
93
+        break;
94
+    case WFUNC_LANCZOS:
95
+#define SINC(x) (!(x)) ? 1 : sin(M_PI * (x))/(M_PI * (x));
96
+        for (n = 0; n < N; n++)
97
+            lut[n] = SINC((2.*n)/(N-1)-1);
98
+        *overlap = 0.75;
99
+        break;
100
+    case WFUNC_GAUSS:
101
+#define SQR(x) ((x)*(x))
102
+        for (n = 0; n < N; n++)
103
+            lut[n] = exp(-0.5 * SQR((n-(N-1)/2)/(0.4*(N-1)/2.f)));
104
+        *overlap = 0.75;
105
+        break;
106
+    default:
107
+        av_assert0(0);
108
+    }
109
+}
0 110
new file mode 100644
... ...
@@ -0,0 +1,32 @@
0
+/*
1
+ * Copyright (c) 2015 Paul B Mahol
2
+ *
3
+ * This file is part of FFmpeg.
4
+ *
5
+ * FFmpeg is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * FFmpeg is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with FFmpeg; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ */
19
+
20
+
21
+#ifndef AVFILTER_WINDOW_FUNC_H
22
+#define AVFILTER_WINDOW_FUNC_H
23
+
24
+enum WindowFunc     { WFUNC_RECT, WFUNC_HANNING, WFUNC_HAMMING, WFUNC_BLACKMAN,
25
+                      WFUNC_BARTLETT, WFUNC_WELCH, WFUNC_FLATTOP,
26
+                      WFUNC_BHARRIS, WFUNC_BNUTTALL, WFUNC_SINE, WFUNC_NUTTALL,
27
+                      WFUNC_BHANN, WFUNC_LANCZOS, WFUNC_GAUSS, NB_WFUNC };
28
+
29
+void ff_generate_window_func(float *lut, int N, int win_func, float *overlap);
30
+
31
+#endif /* AVFILTER_WINDOW_FUNC_H */