annotate fft-test.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 77dfabe0d66f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3699
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
1 /*
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
2 * (c) 2002 Fabrice Bellard
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
3 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3699
diff changeset
4 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3699
diff changeset
5 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3699
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
3699
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
8 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3699
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
3699
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
10 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3699
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
3699
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
14 * Lesser General Public License for more details.
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
15 *
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3699
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
3699
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
19 */
c537a97eec66 Add official LGPL license headers to the files that were missing them.
diego
parents: 2967
diff changeset
20
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
21 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11583
diff changeset
22 * @file
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
23 * FFT and MDCT tests.
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
24 */
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
25
11390
4a8900c06c67 Update include directives in fft-test.c
mru
parents: 10944
diff changeset
26 #include "libavutil/mathematics.h"
9199
ea0e5e9a520f Replace random() usage in test programs by av_lfg_*().
diego
parents: 8718
diff changeset
27 #include "libavutil/lfg.h"
11390
4a8900c06c67 Update include directives in fft-test.c
mru
parents: 10944
diff changeset
28 #include "libavutil/log.h"
4a8900c06c67 Update include directives in fft-test.c
mru
parents: 10944
diff changeset
29 #include "fft.h"
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
30 #include <math.h>
980
0c32f81b42b2 suppressed getopt.h
bellard
parents: 969
diff changeset
31 #include <unistd.h>
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
32 #include <sys/time.h>
5118
3b190bc34546 Add some #includes to allow compilation without HAVE_AV_CONFIG_H.
diego
parents: 4760
diff changeset
33 #include <stdlib.h>
3b190bc34546 Add some #includes to allow compilation without HAVE_AV_CONFIG_H.
diego
parents: 4760
diff changeset
34 #include <string.h>
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
35
4760
e82ceaa9c386 Add '#undef exit', the function is now forbidden.
diego
parents: 3947
diff changeset
36 #undef exit
e82ceaa9c386 Add '#undef exit', the function is now forbidden.
diego
parents: 3947
diff changeset
37
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
38 /* reference fft */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
39
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
40 #define MUL16(a,b) ((a) * (b))
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
41
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
42 #define CMAC(pre, pim, are, aim, bre, bim) \
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
43 {\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
44 pre += (MUL16(are, bre) - MUL16(aim, bim));\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
45 pim += (MUL16(are, bim) + MUL16(bre, aim));\
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
46 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
47
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
48 FFTComplex *exptab;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
49
9295
b225f51903af Mark non-exported functions in test and example programs as static.
diego
parents: 9199
diff changeset
50 static void fft_ref_init(int nbits, int inverse)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
51 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
52 int n, i;
5418
95234f2e0bdd make the reference code use double instead of float where it is easy
michael
parents: 5417
diff changeset
53 double c1, s1, alpha;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
54
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
55 n = 1 << nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
56 exptab = av_malloc((n / 2) * sizeof(FFTComplex));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
57
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
58 for (i = 0; i < (n/2); i++) {
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
59 alpha = 2 * M_PI * (float)i / (float)n;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
60 c1 = cos(alpha);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
61 s1 = sin(alpha);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
62 if (!inverse)
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
63 s1 = -s1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
64 exptab[i].re = c1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
65 exptab[i].im = s1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
66 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
67 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
68
9295
b225f51903af Mark non-exported functions in test and example programs as static.
diego
parents: 9199
diff changeset
69 static void fft_ref(FFTComplex *tabr, FFTComplex *tab, int nbits)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
70 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
71 int n, i, j, k, n2;
5418
95234f2e0bdd make the reference code use double instead of float where it is easy
michael
parents: 5417
diff changeset
72 double tmp_re, tmp_im, s, c;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
73 FFTComplex *q;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
74
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
75 n = 1 << nbits;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
76 n2 = n >> 1;
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
77 for (i = 0; i < n; i++) {
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
78 tmp_re = 0;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
79 tmp_im = 0;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
80 q = tab;
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
81 for (j = 0; j < n; j++) {
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
82 k = (i * j) & (n - 1);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
83 if (k >= n2) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
84 c = -exptab[k - n2].re;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
85 s = -exptab[k - n2].im;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
86 } else {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
87 c = exptab[k].re;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
88 s = exptab[k].im;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
89 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
90 CMAC(tmp_re, tmp_im, c, s, q->re, q->im);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
91 q++;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
92 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
93 tabr[i].re = tmp_re;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
94 tabr[i].im = tmp_im;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
95 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
96 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
97
9295
b225f51903af Mark non-exported functions in test and example programs as static.
diego
parents: 9199
diff changeset
98 static void imdct_ref(float *out, float *in, int nbits)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
99 {
5442
f5d2349dccd7 making reference models have the same API
mhoffman
parents: 5418
diff changeset
100 int n = 1<<nbits;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
101 int k, i, a;
5418
95234f2e0bdd make the reference code use double instead of float where it is easy
michael
parents: 5417
diff changeset
102 double sum, f;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
103
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
104 for (i = 0; i < n; i++) {
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
105 sum = 0;
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
106 for (k = 0; k < n/2; k++) {
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
107 a = (2 * i + 1 + (n / 2)) * (2 * k + 1);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
108 f = cos(M_PI * a / (double)(2 * n));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
109 sum += f * in[k];
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
110 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
111 out[i] = -sum;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
112 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
113 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
114
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
115 /* NOTE: no normalisation by 1 / N is done */
9295
b225f51903af Mark non-exported functions in test and example programs as static.
diego
parents: 9199
diff changeset
116 static void mdct_ref(float *output, float *input, int nbits)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
117 {
5442
f5d2349dccd7 making reference models have the same API
mhoffman
parents: 5418
diff changeset
118 int n = 1<<nbits;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
119 int k, i;
5418
95234f2e0bdd make the reference code use double instead of float where it is easy
michael
parents: 5417
diff changeset
120 double a, s;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
121
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
122 /* do it by hand */
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
123 for (k = 0; k < n/2; k++) {
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
124 s = 0;
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
125 for (i = 0; i < n; i++) {
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
126 a = (2*M_PI*(2*i+1+n/2)*(2*k+1) / (4 * n));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
127 s += input[i] * cos(a);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
128 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
129 output[k] = s;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
130 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
131 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
132
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
133 static void idct_ref(float *output, float *input, int nbits)
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
134 {
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
135 int n = 1<<nbits;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
136 int k, i;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
137 double a, s;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
138
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
139 /* do it by hand */
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
140 for (i = 0; i < n; i++) {
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
141 s = 0.5 * input[0];
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
142 for (k = 1; k < n; k++) {
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
143 a = M_PI*k*(i+0.5) / n;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
144 s += input[k] * cos(a);
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
145 }
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
146 output[i] = 2 * s / n;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
147 }
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
148 }
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
149 static void dct_ref(float *output, float *input, int nbits)
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
150 {
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
151 int n = 1<<nbits;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
152 int k, i;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
153 double a, s;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
154
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
155 /* do it by hand */
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
156 for (k = 0; k < n; k++) {
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
157 s = 0;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
158 for (i = 0; i < n; i++) {
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
159 a = M_PI*k*(i+0.5) / n;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
160 s += input[i] * cos(a);
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
161 }
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
162 output[k] = s;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
163 }
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
164 }
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
165
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
166
10074
c4a83f3a5c9f bring back some randomness in fft-test. (regression in r18070)
lorenm
parents: 9674
diff changeset
167 static float frandom(AVLFG *prng)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
168 {
10074
c4a83f3a5c9f bring back some randomness in fft-test. (regression in r18070)
lorenm
parents: 9674
diff changeset
169 return (int16_t)av_lfg_get(prng) / 32768.0;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
170 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
171
9295
b225f51903af Mark non-exported functions in test and example programs as static.
diego
parents: 9199
diff changeset
172 static int64_t gettime(void)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
173 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
174 struct timeval tv;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
175 gettimeofday(&tv,NULL);
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
176 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
177 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
178
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
179 static int check_diff(float *tab1, float *tab2, int n, double scale)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
180 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
181 int i;
5417
3eca9008175b print max and mse
michael
parents: 5379
diff changeset
182 double max= 0;
3eca9008175b print max and mse
michael
parents: 5379
diff changeset
183 double error= 0;
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
184 int err = 0;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
185
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
186 for (i = 0; i < n; i++) {
9674
dac20d8df581 Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents: 9658
diff changeset
187 double e= fabsf(tab1[i] - (tab2[i] / scale));
5417
3eca9008175b print max and mse
michael
parents: 5379
diff changeset
188 if (e >= 1e-3) {
12389
77dfabe0d66f fft-test: format error output more readably
mru
parents: 12370
diff changeset
189 av_log(NULL, AV_LOG_ERROR, "ERROR %5d: %10.6f %10.6f\n",
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
190 i, tab1[i], tab2[i]);
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
191 err = 1;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
192 }
5417
3eca9008175b print max and mse
michael
parents: 5379
diff changeset
193 error+= e*e;
3eca9008175b print max and mse
michael
parents: 5379
diff changeset
194 if(e>max) max= e;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
195 }
5417
3eca9008175b print max and mse
michael
parents: 5379
diff changeset
196 av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error)/n);
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
197 return err;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
198 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
199
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
200
9295
b225f51903af Mark non-exported functions in test and example programs as static.
diego
parents: 9199
diff changeset
201 static void help(void)
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
202 {
2593
786ccf72ccd5 printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents: 1879
diff changeset
203 av_log(NULL, AV_LOG_INFO,"usage: fft-test [-h] [-s] [-i] [-n b]\n"
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
204 "-h print this help\n"
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
205 "-s speed test\n"
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
206 "-m (I)MDCT test\n"
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
207 "-d (I)DCT test\n"
11583
0bb7e9003dea Add help for (I)RDFT test in fft-test
vitor
parents: 11582
diff changeset
208 "-r (I)RDFT test\n"
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
209 "-i inverse transform test\n"
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
210 "-n b set the transform size to 2^b\n"
9674
dac20d8df581 Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents: 9658
diff changeset
211 "-f x set scale factor for output data of (I)MDCT to x\n"
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
212 );
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
213 exit(1);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
214 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
215
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
216 enum tf_transform {
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
217 TRANSFORM_FFT,
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
218 TRANSFORM_MDCT,
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
219 TRANSFORM_RDFT,
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
220 TRANSFORM_DCT,
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
221 };
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
222
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
223 int main(int argc, char **argv)
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
224 {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
225 FFTComplex *tab, *tab1, *tab_ref;
7546
97383e012cb9 remove mdct tmp buffer
lorenm
parents: 7141
diff changeset
226 FFTSample *tab2;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
227 int it, i, c;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
228 int do_speed = 0;
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
229 int err = 1;
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
230 enum tf_transform transform = TRANSFORM_FFT;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
231 int do_inverse = 0;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
232 FFTContext s1, *s = &s1;
10199
38ab367d4231 Merge FFTContext and MDCTContext
mru
parents: 10074
diff changeset
233 FFTContext m1, *m = &m1;
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
234 RDFTContext r1, *r = &r1;
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
235 DCTContext d1, *d = &d1;
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
236 int fft_nbits, fft_size, fft_size_2;
9674
dac20d8df581 Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents: 9658
diff changeset
237 double scale = 1.0;
10074
c4a83f3a5c9f bring back some randomness in fft-test. (regression in r18070)
lorenm
parents: 9674
diff changeset
238 AVLFG prng;
c4a83f3a5c9f bring back some randomness in fft-test. (regression in r18070)
lorenm
parents: 9674
diff changeset
239 av_lfg_init(&prng, 1);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
240
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
241 fft_nbits = 9;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
242 for(;;) {
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
243 c = getopt(argc, argv, "hsimrdn:f:");
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
244 if (c == -1)
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
245 break;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
246 switch(c) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
247 case 'h':
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
248 help();
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
249 break;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
250 case 's':
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
251 do_speed = 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
252 break;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
253 case 'i':
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
254 do_inverse = 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
255 break;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
256 case 'm':
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
257 transform = TRANSFORM_MDCT;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
258 break;
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
259 case 'r':
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
260 transform = TRANSFORM_RDFT;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
261 break;
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
262 case 'd':
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
263 transform = TRANSFORM_DCT;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
264 break;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
265 case 'n':
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
266 fft_nbits = atoi(optarg);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
267 break;
9674
dac20d8df581 Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents: 9658
diff changeset
268 case 'f':
dac20d8df581 Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents: 9658
diff changeset
269 scale = atof(optarg);
dac20d8df581 Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents: 9658
diff changeset
270 break;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
271 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
272 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
273
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
274 fft_size = 1 << fft_nbits;
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
275 fft_size_2 = fft_size >> 1;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
276 tab = av_malloc(fft_size * sizeof(FFTComplex));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
277 tab1 = av_malloc(fft_size * sizeof(FFTComplex));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
278 tab_ref = av_malloc(fft_size * sizeof(FFTComplex));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
279 tab2 = av_malloc(fft_size * sizeof(FFTSample));
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
280
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
281 switch (transform) {
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
282 case TRANSFORM_MDCT:
9674
dac20d8df581 Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents: 9658
diff changeset
283 av_log(NULL, AV_LOG_INFO,"Scale factor is set to %f\n", scale);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
284 if (do_inverse)
2593
786ccf72ccd5 printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents: 1879
diff changeset
285 av_log(NULL, AV_LOG_INFO,"IMDCT");
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
286 else
2593
786ccf72ccd5 printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents: 1879
diff changeset
287 av_log(NULL, AV_LOG_INFO,"MDCT");
9674
dac20d8df581 Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents: 9658
diff changeset
288 ff_mdct_init(m, fft_nbits, do_inverse, scale);
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
289 break;
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
290 case TRANSFORM_FFT:
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
291 if (do_inverse)
2593
786ccf72ccd5 printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents: 1879
diff changeset
292 av_log(NULL, AV_LOG_INFO,"IFFT");
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
293 else
2593
786ccf72ccd5 printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents: 1879
diff changeset
294 av_log(NULL, AV_LOG_INFO,"FFT");
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
295 ff_fft_init(s, fft_nbits, do_inverse);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
296 fft_ref_init(fft_nbits, do_inverse);
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
297 break;
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
298 case TRANSFORM_RDFT:
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
299 if (do_inverse)
11391
4c7afa50df6f Give RDFT types more meaningful names
mru
parents: 11390
diff changeset
300 av_log(NULL, AV_LOG_INFO,"IDFT_C2R");
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
301 else
11391
4c7afa50df6f Give RDFT types more meaningful names
mru
parents: 11390
diff changeset
302 av_log(NULL, AV_LOG_INFO,"DFT_R2C");
4c7afa50df6f Give RDFT types more meaningful names
mru
parents: 11390
diff changeset
303 ff_rdft_init(r, fft_nbits, do_inverse ? IDFT_C2R : DFT_R2C);
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
304 fft_ref_init(fft_nbits, do_inverse);
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
305 break;
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
306 case TRANSFORM_DCT:
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
307 if (do_inverse)
11582
23cad4157bfb Make code using 1d-DCT consistent with the API change
vitor
parents: 11391
diff changeset
308 av_log(NULL, AV_LOG_INFO,"DCT_III");
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
309 else
11582
23cad4157bfb Make code using 1d-DCT consistent with the API change
vitor
parents: 11391
diff changeset
310 av_log(NULL, AV_LOG_INFO,"DCT_II");
23cad4157bfb Make code using 1d-DCT consistent with the API change
vitor
parents: 11391
diff changeset
311 ff_dct_init(d, fft_nbits, do_inverse ? DCT_III : DCT_II);
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
312 break;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
313 }
2593
786ccf72ccd5 printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents: 1879
diff changeset
314 av_log(NULL, AV_LOG_INFO," %d test\n", fft_size);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
315
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
316 /* generate random data */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
317
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
318 for (i = 0; i < fft_size; i++) {
10074
c4a83f3a5c9f bring back some randomness in fft-test. (regression in r18070)
lorenm
parents: 9674
diff changeset
319 tab1[i].re = frandom(&prng);
c4a83f3a5c9f bring back some randomness in fft-test. (regression in r18070)
lorenm
parents: 9674
diff changeset
320 tab1[i].im = frandom(&prng);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
321 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
322
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
323 /* checking result */
2593
786ccf72ccd5 printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents: 1879
diff changeset
324 av_log(NULL, AV_LOG_INFO,"Checking...\n");
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
325
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
326 switch (transform) {
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
327 case TRANSFORM_MDCT:
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
328 if (do_inverse) {
5442
f5d2349dccd7 making reference models have the same API
mhoffman
parents: 5418
diff changeset
329 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits);
7546
97383e012cb9 remove mdct tmp buffer
lorenm
parents: 7141
diff changeset
330 ff_imdct_calc(m, tab2, (float *)tab1);
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
331 err = check_diff((float *)tab_ref, tab2, fft_size, scale);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
332 } else {
5442
f5d2349dccd7 making reference models have the same API
mhoffman
parents: 5418
diff changeset
333 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2593
diff changeset
334
7546
97383e012cb9 remove mdct tmp buffer
lorenm
parents: 7141
diff changeset
335 ff_mdct_calc(m, tab2, (float *)tab1);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
336
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
337 err = check_diff((float *)tab_ref, tab2, fft_size / 2, scale);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
338 }
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
339 break;
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
340 case TRANSFORM_FFT:
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
341 memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
342 ff_fft_permute(s, tab);
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
343 ff_fft_calc(s, tab);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2593
diff changeset
344
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
345 fft_ref(tab_ref, tab1, fft_nbits);
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
346 err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0);
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
347 break;
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
348 case TRANSFORM_RDFT:
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
349 if (do_inverse) {
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
350 tab1[ 0].im = 0;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
351 tab1[fft_size_2].im = 0;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
352 for (i = 1; i < fft_size_2; i++) {
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
353 tab1[fft_size_2+i].re = tab1[fft_size_2-i].re;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
354 tab1[fft_size_2+i].im = -tab1[fft_size_2-i].im;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
355 }
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
356
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
357 memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
358 tab2[1] = tab1[fft_size_2].re;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
359
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
360 ff_rdft_calc(r, tab2);
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
361 fft_ref(tab_ref, tab1, fft_nbits);
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
362 for (i = 0; i < fft_size; i++) {
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
363 tab[i].re = tab2[i];
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
364 tab[i].im = 0;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
365 }
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
366 err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 0.5);
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
367 } else {
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
368 for (i = 0; i < fft_size; i++) {
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
369 tab2[i] = tab1[i].re;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
370 tab1[i].im = 0;
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
371 }
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
372 ff_rdft_calc(r, tab2);
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
373 fft_ref(tab_ref, tab1, fft_nbits);
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
374 tab_ref[0].im = tab_ref[fft_size_2].re;
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
375 err = check_diff((float *)tab_ref, (float *)tab2, fft_size, 1.0);
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
376 }
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
377 break;
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
378 case TRANSFORM_DCT:
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
379 memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
380 ff_dct_calc(d, tab);
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
381 if (do_inverse) {
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
382 idct_ref(tab_ref, tab1, fft_nbits);
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
383 } else {
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
384 dct_ref(tab_ref, tab1, fft_nbits);
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
385 }
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
386 err = check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0);
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
387 break;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
388 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
389
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
390 /* do a speed test */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
391
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
392 if (do_speed) {
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 980
diff changeset
393 int64_t time_start, duration;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
394 int nb_its;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
395
2593
786ccf72ccd5 printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents: 1879
diff changeset
396 av_log(NULL, AV_LOG_INFO,"Speed test...\n");
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
397 /* we measure during about 1 seconds */
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
398 nb_its = 1;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
399 for(;;) {
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
400 time_start = gettime();
10807
4578f774a775 fft-test: whitespace cosmetics
alexc
parents: 10199
diff changeset
401 for (it = 0; it < nb_its; it++) {
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
402 switch (transform) {
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
403 case TRANSFORM_MDCT:
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
404 if (do_inverse) {
7546
97383e012cb9 remove mdct tmp buffer
lorenm
parents: 7141
diff changeset
405 ff_imdct_calc(m, (float *)tab, (float *)tab1);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
406 } else {
7546
97383e012cb9 remove mdct tmp buffer
lorenm
parents: 7141
diff changeset
407 ff_mdct_calc(m, (float *)tab, (float *)tab1);
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
408 }
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
409 break;
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
410 case TRANSFORM_FFT:
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
411 memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
412 ff_fft_calc(s, tab);
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
413 break;
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
414 case TRANSFORM_RDFT:
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
415 memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
416 ff_rdft_calc(r, tab2);
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
417 break;
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
418 case TRANSFORM_DCT:
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
419 memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
420 ff_dct_calc(d, tab2);
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
421 break;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
422 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
423 }
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
424 duration = gettime() - time_start;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
425 if (duration >= 1000000)
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
426 break;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
427 nb_its *= 2;
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
428 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2593
diff changeset
429 av_log(NULL, AV_LOG_INFO,"time: %0.1f us/transform [total time=%0.2f s its=%d]\n",
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2593
diff changeset
430 (double)duration / nb_its,
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
431 (double)duration / 1000000.0,
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
432 nb_its);
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
433 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2593
diff changeset
434
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
435 switch (transform) {
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
436 case TRANSFORM_MDCT:
969
d12d0c93d1e2 compile fixes
bellard
parents: 781
diff changeset
437 ff_mdct_end(m);
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
438 break;
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
439 case TRANSFORM_FFT:
1879
dd63cb7e5080 fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 1106
diff changeset
440 ff_fft_end(s);
10846
8dbceaa5fa2f fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents: 10807
diff changeset
441 break;
10847
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
442 case TRANSFORM_RDFT:
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
443 ff_rdft_end(r);
177ebc61c3d6 fft-test: Add RDFT/IRDFT support.
alexc
parents: 10846
diff changeset
444 break;
10944
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
445 case TRANSFORM_DCT:
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
446 ff_dct_end(d);
0985f1f7ab72 Floating point discrete cosine transform
vitor
parents: 10847
diff changeset
447 break;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
448 }
12370
71b2c440157d fft-test: free buffers before exiting
mru
parents: 12364
diff changeset
449
71b2c440157d fft-test: free buffers before exiting
mru
parents: 12364
diff changeset
450 av_free(tab);
71b2c440157d fft-test: free buffers before exiting
mru
parents: 12364
diff changeset
451 av_free(tab1);
71b2c440157d fft-test: free buffers before exiting
mru
parents: 12364
diff changeset
452 av_free(tab2);
71b2c440157d fft-test: free buffers before exiting
mru
parents: 12364
diff changeset
453 av_free(tab_ref);
71b2c440157d fft-test: free buffers before exiting
mru
parents: 12364
diff changeset
454 av_free(exptab);
71b2c440157d fft-test: free buffers before exiting
mru
parents: 12364
diff changeset
455
12364
2e96cab6ecde fft-test: exit with non-zero status if test failed
mru
parents: 11644
diff changeset
456 return err;
781
6f5e87957bcb new generic FFT/MDCT code for audio codecs
bellard
parents:
diff changeset
457 }