Coverage Report

Created: 2026-07-25 07:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavutil/tx_template.c
Line
Count
Source
1
/*
2
 * Copyright (c) Lynne
3
 *
4
 * Power of two FFT:
5
 * Copyright (c) Lynne
6
 * Copyright (c) 2008 Loren Merritt
7
 * Copyright (c) 2002 Fabrice Bellard
8
 * Partly based on libdjbfft by D. J. Bernstein
9
 *
10
 * This file is part of FFmpeg.
11
 *
12
 * FFmpeg is free software; you can redistribute it and/or
13
 * modify it under the terms of the GNU Lesser General Public
14
 * License as published by the Free Software Foundation; either
15
 * version 2.1 of the License, or (at your option) any later version.
16
 *
17
 * FFmpeg is distributed in the hope that it will be useful,
18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
 * Lesser General Public License for more details.
21
 *
22
 * You should have received a copy of the GNU Lesser General Public
23
 * License along with FFmpeg; if not, write to the Free Software
24
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25
 */
26
27
#include "mem.h"
28
29
#define TABLE_DEF(name, size) \
30
    DECLARE_ALIGNED(32, TXSample, TX_TAB(ff_tx_tab_ ##name))[size]
31
32
#define SR_POW2_TABLES \
33
    SR_TABLE(8)        \
34
    SR_TABLE(16)       \
35
    SR_TABLE(32)       \
36
    SR_TABLE(64)       \
37
    SR_TABLE(128)      \
38
    SR_TABLE(256)      \
39
    SR_TABLE(512)      \
40
    SR_TABLE(1024)     \
41
    SR_TABLE(2048)     \
42
    SR_TABLE(4096)     \
43
    SR_TABLE(8192)     \
44
    SR_TABLE(16384)    \
45
    SR_TABLE(32768)    \
46
    SR_TABLE(65536)    \
47
    SR_TABLE(131072)   \
48
49
#define SR_TABLE(len) \
50
    TABLE_DEF(len, len/4 + 1);
51
/* Power of two tables */
52
SR_POW2_TABLES
53
#undef SR_TABLE
54
55
/* Other factors' tables */
56
TABLE_DEF(53, 12);
57
TABLE_DEF( 7,  6);
58
TABLE_DEF( 9,  8);
59
60
typedef struct FFTabInitData {
61
    void (*func)(void);
62
    int factors[TX_MAX_SUB]; /* Must be sorted high -> low */
63
} FFTabInitData;
64
65
#define SR_TABLE(len)                                              \
66
221
static av_cold void TX_TAB(ff_tx_init_tab_ ##len)(void)            \
67
221
{                                                                  \
68
221
    double freq = 2*M_PI/len;                                      \
69
221
    TXSample *tab = TX_TAB(ff_tx_tab_ ##len);                      \
70
221
                                                                   \
71
13.6k
    for (int i = 0; i < len/4; i++)                                \
72
13.4k
        *tab++ = RESCALE(cos(i*freq));                             \
73
221
                                                                   \
74
221
    *tab = 0;                                                      \
75
221
}
76
853
SR_POW2_TABLES
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_8_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_16_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_32_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_64_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_128_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_256_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_512_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_1024_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_2048_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_4096_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_8192_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_16384_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_32768_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_65536_double
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_131072_double
tx_float.c:ff_tx_init_tab_8_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_16_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_32_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_64_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_128_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_256_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_512_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_1024_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_2048_float
Line
Count
Source
76
SR_POW2_TABLES
tx_float.c:ff_tx_init_tab_4096_float
Line
Count
Source
76
SR_POW2_TABLES
Unexecuted instantiation: tx_float.c:ff_tx_init_tab_8192_float
Unexecuted instantiation: tx_float.c:ff_tx_init_tab_16384_float
Unexecuted instantiation: tx_float.c:ff_tx_init_tab_32768_float
Unexecuted instantiation: tx_float.c:ff_tx_init_tab_65536_float
Unexecuted instantiation: tx_float.c:ff_tx_init_tab_131072_float
tx_int32.c:ff_tx_init_tab_8_int32
Line
Count
Source
76
SR_POW2_TABLES
tx_int32.c:ff_tx_init_tab_16_int32
Line
Count
Source
76
SR_POW2_TABLES
tx_int32.c:ff_tx_init_tab_32_int32
Line
Count
Source
76
SR_POW2_TABLES
tx_int32.c:ff_tx_init_tab_64_int32
Line
Count
Source
76
SR_POW2_TABLES
tx_int32.c:ff_tx_init_tab_128_int32
Line
Count
Source
76
SR_POW2_TABLES
tx_int32.c:ff_tx_init_tab_256_int32
Line
Count
Source
76
SR_POW2_TABLES
tx_int32.c:ff_tx_init_tab_512_int32
Line
Count
Source
76
SR_POW2_TABLES
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_1024_int32
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_2048_int32
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_4096_int32
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_8192_int32
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_16384_int32
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_32768_int32
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_65536_int32
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_131072_int32
77
853
#undef SR_TABLE
78
853
79
853
static void (*const sr_tabs_init_funcs[])(void) = {
80
853
#define SR_TABLE(len) TX_TAB(ff_tx_init_tab_ ##len),
81
853
    SR_POW2_TABLES
82
853
#undef SR_TABLE
83
853
};
84
853
85
853
static AVOnce sr_tabs_init_once[] = {
86
853
#define SR_TABLE(len) AV_ONCE_INIT,
87
853
    SR_POW2_TABLES
88
853
#undef SR_TABLE
89
853
};
90
853
91
853
static av_cold void TX_TAB(ff_tx_init_tab_53)(void)
92
853
{
93
    /* 5pt, doubled to eliminate AVX lane shuffles */
94
7
    TX_TAB(ff_tx_tab_53)[0] = RESCALE(cos(2 * M_PI /  5));
95
7
    TX_TAB(ff_tx_tab_53)[1] = RESCALE(cos(2 * M_PI /  5));
96
7
    TX_TAB(ff_tx_tab_53)[2] = RESCALE(cos(2 * M_PI / 10));
97
7
    TX_TAB(ff_tx_tab_53)[3] = RESCALE(cos(2 * M_PI / 10));
98
7
    TX_TAB(ff_tx_tab_53)[4] = RESCALE(sin(2 * M_PI /  5));
99
7
    TX_TAB(ff_tx_tab_53)[5] = RESCALE(sin(2 * M_PI /  5));
100
7
    TX_TAB(ff_tx_tab_53)[6] = RESCALE(sin(2 * M_PI / 10));
101
7
    TX_TAB(ff_tx_tab_53)[7] = RESCALE(sin(2 * M_PI / 10));
102
103
    /* 3pt */
104
7
    TX_TAB(ff_tx_tab_53)[ 8] = RESCALE(cos(2 * M_PI / 12));
105
7
    TX_TAB(ff_tx_tab_53)[ 9] = RESCALE(cos(2 * M_PI / 12));
106
7
    TX_TAB(ff_tx_tab_53)[10] = RESCALE(cos(2 * M_PI /  6));
107
7
    TX_TAB(ff_tx_tab_53)[11] = RESCALE(cos(8 * M_PI /  6));
108
7
}
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_53_double
tx_float.c:ff_tx_init_tab_53_float
Line
Count
Source
92
6
{
93
    /* 5pt, doubled to eliminate AVX lane shuffles */
94
6
    TX_TAB(ff_tx_tab_53)[0] = RESCALE(cos(2 * M_PI /  5));
95
6
    TX_TAB(ff_tx_tab_53)[1] = RESCALE(cos(2 * M_PI /  5));
96
6
    TX_TAB(ff_tx_tab_53)[2] = RESCALE(cos(2 * M_PI / 10));
97
6
    TX_TAB(ff_tx_tab_53)[3] = RESCALE(cos(2 * M_PI / 10));
98
6
    TX_TAB(ff_tx_tab_53)[4] = RESCALE(sin(2 * M_PI /  5));
99
6
    TX_TAB(ff_tx_tab_53)[5] = RESCALE(sin(2 * M_PI /  5));
100
6
    TX_TAB(ff_tx_tab_53)[6] = RESCALE(sin(2 * M_PI / 10));
101
6
    TX_TAB(ff_tx_tab_53)[7] = RESCALE(sin(2 * M_PI / 10));
102
103
    /* 3pt */
104
6
    TX_TAB(ff_tx_tab_53)[ 8] = RESCALE(cos(2 * M_PI / 12));
105
6
    TX_TAB(ff_tx_tab_53)[ 9] = RESCALE(cos(2 * M_PI / 12));
106
6
    TX_TAB(ff_tx_tab_53)[10] = RESCALE(cos(2 * M_PI /  6));
107
6
    TX_TAB(ff_tx_tab_53)[11] = RESCALE(cos(8 * M_PI /  6));
108
6
}
tx_int32.c:ff_tx_init_tab_53_int32
Line
Count
Source
92
1
{
93
    /* 5pt, doubled to eliminate AVX lane shuffles */
94
1
    TX_TAB(ff_tx_tab_53)[0] = RESCALE(cos(2 * M_PI /  5));
95
1
    TX_TAB(ff_tx_tab_53)[1] = RESCALE(cos(2 * M_PI /  5));
96
1
    TX_TAB(ff_tx_tab_53)[2] = RESCALE(cos(2 * M_PI / 10));
97
1
    TX_TAB(ff_tx_tab_53)[3] = RESCALE(cos(2 * M_PI / 10));
98
1
    TX_TAB(ff_tx_tab_53)[4] = RESCALE(sin(2 * M_PI /  5));
99
1
    TX_TAB(ff_tx_tab_53)[5] = RESCALE(sin(2 * M_PI /  5));
100
1
    TX_TAB(ff_tx_tab_53)[6] = RESCALE(sin(2 * M_PI / 10));
101
1
    TX_TAB(ff_tx_tab_53)[7] = RESCALE(sin(2 * M_PI / 10));
102
103
    /* 3pt */
104
1
    TX_TAB(ff_tx_tab_53)[ 8] = RESCALE(cos(2 * M_PI / 12));
105
1
    TX_TAB(ff_tx_tab_53)[ 9] = RESCALE(cos(2 * M_PI / 12));
106
1
    TX_TAB(ff_tx_tab_53)[10] = RESCALE(cos(2 * M_PI /  6));
107
1
    TX_TAB(ff_tx_tab_53)[11] = RESCALE(cos(8 * M_PI /  6));
108
1
}
109
110
static av_cold void TX_TAB(ff_tx_init_tab_7)(void)
111
1
{
112
1
    TX_TAB(ff_tx_tab_7)[0] = RESCALE(cos(2 * M_PI /  7));
113
1
    TX_TAB(ff_tx_tab_7)[1] = RESCALE(sin(2 * M_PI /  7));
114
1
    TX_TAB(ff_tx_tab_7)[2] = RESCALE(sin(2 * M_PI / 28));
115
1
    TX_TAB(ff_tx_tab_7)[3] = RESCALE(cos(2 * M_PI / 28));
116
1
    TX_TAB(ff_tx_tab_7)[4] = RESCALE(cos(2 * M_PI / 14));
117
1
    TX_TAB(ff_tx_tab_7)[5] = RESCALE(sin(2 * M_PI / 14));
118
1
}
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_7_double
tx_float.c:ff_tx_init_tab_7_float
Line
Count
Source
111
1
{
112
1
    TX_TAB(ff_tx_tab_7)[0] = RESCALE(cos(2 * M_PI /  7));
113
1
    TX_TAB(ff_tx_tab_7)[1] = RESCALE(sin(2 * M_PI /  7));
114
1
    TX_TAB(ff_tx_tab_7)[2] = RESCALE(sin(2 * M_PI / 28));
115
1
    TX_TAB(ff_tx_tab_7)[3] = RESCALE(cos(2 * M_PI / 28));
116
1
    TX_TAB(ff_tx_tab_7)[4] = RESCALE(cos(2 * M_PI / 14));
117
1
    TX_TAB(ff_tx_tab_7)[5] = RESCALE(sin(2 * M_PI / 14));
118
1
}
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_7_int32
119
120
static av_cold void TX_TAB(ff_tx_init_tab_9)(void)
121
1
{
122
1
    TX_TAB(ff_tx_tab_9)[0] = RESCALE(cos(2 * M_PI /  3));
123
1
    TX_TAB(ff_tx_tab_9)[1] = RESCALE(sin(2 * M_PI /  3));
124
1
    TX_TAB(ff_tx_tab_9)[2] = RESCALE(cos(2 * M_PI /  9));
125
1
    TX_TAB(ff_tx_tab_9)[3] = RESCALE(sin(2 * M_PI /  9));
126
1
    TX_TAB(ff_tx_tab_9)[4] = RESCALE(cos(2 * M_PI / 36));
127
1
    TX_TAB(ff_tx_tab_9)[5] = RESCALE(sin(2 * M_PI / 36));
128
1
    TX_TAB(ff_tx_tab_9)[6] = TX_TAB(ff_tx_tab_9)[2] + TX_TAB(ff_tx_tab_9)[5];
129
1
    TX_TAB(ff_tx_tab_9)[7] = TX_TAB(ff_tx_tab_9)[3] - TX_TAB(ff_tx_tab_9)[4];
130
1
}
Unexecuted instantiation: tx_double.c:ff_tx_init_tab_9_double
tx_float.c:ff_tx_init_tab_9_float
Line
Count
Source
121
1
{
122
1
    TX_TAB(ff_tx_tab_9)[0] = RESCALE(cos(2 * M_PI /  3));
123
1
    TX_TAB(ff_tx_tab_9)[1] = RESCALE(sin(2 * M_PI /  3));
124
1
    TX_TAB(ff_tx_tab_9)[2] = RESCALE(cos(2 * M_PI /  9));
125
1
    TX_TAB(ff_tx_tab_9)[3] = RESCALE(sin(2 * M_PI /  9));
126
1
    TX_TAB(ff_tx_tab_9)[4] = RESCALE(cos(2 * M_PI / 36));
127
1
    TX_TAB(ff_tx_tab_9)[5] = RESCALE(sin(2 * M_PI / 36));
128
1
    TX_TAB(ff_tx_tab_9)[6] = TX_TAB(ff_tx_tab_9)[2] + TX_TAB(ff_tx_tab_9)[5];
129
1
    TX_TAB(ff_tx_tab_9)[7] = TX_TAB(ff_tx_tab_9)[3] - TX_TAB(ff_tx_tab_9)[4];
130
1
}
Unexecuted instantiation: tx_int32.c:ff_tx_init_tab_9_int32
131
132
static const FFTabInitData nptwo_tabs_init_data[] = {
133
    { TX_TAB(ff_tx_init_tab_53),      { 15, 5, 3 } },
134
    { TX_TAB(ff_tx_init_tab_9),       {  9 }       },
135
    { TX_TAB(ff_tx_init_tab_7),       {  7 }       },
136
};
137
138
static AVOnce nptwo_tabs_init_once[] = {
139
    AV_ONCE_INIT,
140
    AV_ONCE_INIT,
141
    AV_ONCE_INIT,
142
};
143
144
av_cold void TX_TAB(ff_tx_init_tabs)(int len)
145
1.61M
{
146
1.61M
    int factor_2 = ff_ctz(len);
147
1.61M
    if (factor_2) {
148
1.18M
        int idx = factor_2 - 3;
149
5.10M
        for (int i = 0; i <= idx; i++)
150
3.91M
            ff_thread_once(&sr_tabs_init_once[i],
151
1.18M
                            sr_tabs_init_funcs[i]);
152
1.18M
        len >>= factor_2;
153
1.18M
    }
154
155
2.05M
    for (int i = 0; i < FF_ARRAY_ELEMS(nptwo_tabs_init_data); i++) {
156
2.05M
        int f, f_idx = 0;
157
158
2.05M
        if (len <= 1)
159
1.61M
            return;
160
161
441k
        while ((f = nptwo_tabs_init_data[i].factors[f_idx++])) {
162
439k
            if (f % len)
163
4.90k
                continue;
164
165
434k
            ff_thread_once(&nptwo_tabs_init_once[i],
166
434k
                            nptwo_tabs_init_data[i].func);
167
434k
            len /= f;
168
434k
            break;
169
439k
        }
170
436k
    }
171
1.61M
}
Unexecuted instantiation: ff_tx_init_tabs_double
ff_tx_init_tabs_float
Line
Count
Source
145
1.32M
{
146
1.32M
    int factor_2 = ff_ctz(len);
147
1.32M
    if (factor_2) {
148
953k
        int idx = factor_2 - 3;
149
4.04M
        for (int i = 0; i <= idx; i++)
150
3.09M
            ff_thread_once(&sr_tabs_init_once[i],
151
953k
                            sr_tabs_init_funcs[i]);
152
953k
        len >>= factor_2;
153
953k
    }
154
155
1.70M
    for (int i = 0; i < FF_ARRAY_ELEMS(nptwo_tabs_init_data); i++) {
156
1.70M
        int f, f_idx = 0;
157
158
1.70M
        if (len <= 1)
159
1.32M
            return;
160
161
382k
        while ((f = nptwo_tabs_init_data[i].factors[f_idx++])) {
162
380k
            if (f % len)
163
4.90k
                continue;
164
165
375k
            ff_thread_once(&nptwo_tabs_init_once[i],
166
375k
                            nptwo_tabs_init_data[i].func);
167
375k
            len /= f;
168
375k
            break;
169
380k
        }
170
377k
    }
171
1.32M
}
ff_tx_init_tabs_int32
Line
Count
Source
145
290k
{
146
290k
    int factor_2 = ff_ctz(len);
147
290k
    if (factor_2) {
148
231k
        int idx = factor_2 - 3;
149
1.05M
        for (int i = 0; i <= idx; i++)
150
820k
            ff_thread_once(&sr_tabs_init_once[i],
151
231k
                            sr_tabs_init_funcs[i]);
152
231k
        len >>= factor_2;
153
231k
    }
154
155
350k
    for (int i = 0; i < FF_ARRAY_ELEMS(nptwo_tabs_init_data); i++) {
156
350k
        int f, f_idx = 0;
157
158
350k
        if (len <= 1)
159
290k
            return;
160
161
59.4k
        while ((f = nptwo_tabs_init_data[i].factors[f_idx++])) {
162
59.4k
            if (f % len)
163
0
                continue;
164
165
59.4k
            ff_thread_once(&nptwo_tabs_init_once[i],
166
59.4k
                            nptwo_tabs_init_data[i].func);
167
59.4k
            len /= f;
168
59.4k
            break;
169
59.4k
        }
170
59.4k
    }
171
290k
}
172
173
static av_always_inline void fft3(TXComplex *out, TXComplex *in,
174
                                  ptrdiff_t stride)
175
88.3M
{
176
88.3M
    TXComplex tmp[3];
177
88.3M
    const TXSample *tab = TX_TAB(ff_tx_tab_53);
178
#ifdef TX_INT32
179
    int64_t mtmp[4];
180
#endif
181
182
88.3M
    tmp[0] = in[0];
183
88.3M
    BF(tmp[1].re, tmp[2].im, in[1].im, in[2].im);
184
88.3M
    BF(tmp[1].im, tmp[2].re, in[1].re, in[2].re);
185
186
#ifdef TX_INT32
187
    out[0*stride].re = (int64_t)tmp[0].re + tmp[2].re;
188
    out[0*stride].im = (int64_t)tmp[0].im + tmp[2].im;
189
    mtmp[0] = (int64_t)tab[ 8] * tmp[1].re;
190
    mtmp[1] = (int64_t)tab[ 9] * tmp[1].im;
191
    mtmp[2] = (int64_t)tab[10] * tmp[2].re;
192
    mtmp[3] = (int64_t)tab[10] * tmp[2].im;
193
    out[1*stride].re = tmp[0].re - (mtmp[2] + mtmp[0] + 0x40000000 >> 31);
194
    out[1*stride].im = tmp[0].im - (mtmp[3] - mtmp[1] + 0x40000000 >> 31);
195
    out[2*stride].re = tmp[0].re - (mtmp[2] - mtmp[0] + 0x40000000 >> 31);
196
    out[2*stride].im = tmp[0].im - (mtmp[3] + mtmp[1] + 0x40000000 >> 31);
197
#else
198
    out[0*stride].re = tmp[0].re + tmp[2].re;
199
    out[0*stride].im = tmp[0].im + tmp[2].im;
200
    tmp[1].re = tab[ 8] * tmp[1].re;
201
    tmp[1].im = tab[ 9] * tmp[1].im;
202
    tmp[2].re = tab[10] * tmp[2].re;
203
    tmp[2].im = tab[10] * tmp[2].im;
204
    out[1*stride].re = tmp[0].re - tmp[2].re + tmp[1].re;
205
    out[1*stride].im = tmp[0].im - tmp[2].im - tmp[1].im;
206
    out[2*stride].re = tmp[0].re - tmp[2].re - tmp[1].re;
207
    out[2*stride].im = tmp[0].im - tmp[2].im + tmp[1].im;
208
#endif
209
88.3M
}
Unexecuted instantiation: tx_double.c:fft3
tx_float.c:fft3
Line
Count
Source
175
87.2M
{
176
87.2M
    TXComplex tmp[3];
177
87.2M
    const TXSample *tab = TX_TAB(ff_tx_tab_53);
178
#ifdef TX_INT32
179
    int64_t mtmp[4];
180
#endif
181
182
87.2M
    tmp[0] = in[0];
183
87.2M
    BF(tmp[1].re, tmp[2].im, in[1].im, in[2].im);
184
87.2M
    BF(tmp[1].im, tmp[2].re, in[1].re, in[2].re);
185
186
#ifdef TX_INT32
187
    out[0*stride].re = (int64_t)tmp[0].re + tmp[2].re;
188
    out[0*stride].im = (int64_t)tmp[0].im + tmp[2].im;
189
    mtmp[0] = (int64_t)tab[ 8] * tmp[1].re;
190
    mtmp[1] = (int64_t)tab[ 9] * tmp[1].im;
191
    mtmp[2] = (int64_t)tab[10] * tmp[2].re;
192
    mtmp[3] = (int64_t)tab[10] * tmp[2].im;
193
    out[1*stride].re = tmp[0].re - (mtmp[2] + mtmp[0] + 0x40000000 >> 31);
194
    out[1*stride].im = tmp[0].im - (mtmp[3] - mtmp[1] + 0x40000000 >> 31);
195
    out[2*stride].re = tmp[0].re - (mtmp[2] - mtmp[0] + 0x40000000 >> 31);
196
    out[2*stride].im = tmp[0].im - (mtmp[3] + mtmp[1] + 0x40000000 >> 31);
197
#else
198
87.2M
    out[0*stride].re = tmp[0].re + tmp[2].re;
199
87.2M
    out[0*stride].im = tmp[0].im + tmp[2].im;
200
87.2M
    tmp[1].re = tab[ 8] * tmp[1].re;
201
87.2M
    tmp[1].im = tab[ 9] * tmp[1].im;
202
87.2M
    tmp[2].re = tab[10] * tmp[2].re;
203
87.2M
    tmp[2].im = tab[10] * tmp[2].im;
204
87.2M
    out[1*stride].re = tmp[0].re - tmp[2].re + tmp[1].re;
205
87.2M
    out[1*stride].im = tmp[0].im - tmp[2].im - tmp[1].im;
206
87.2M
    out[2*stride].re = tmp[0].re - tmp[2].re - tmp[1].re;
207
87.2M
    out[2*stride].im = tmp[0].im - tmp[2].im + tmp[1].im;
208
87.2M
#endif
209
87.2M
}
tx_int32.c:fft3
Line
Count
Source
175
1.11M
{
176
1.11M
    TXComplex tmp[3];
177
1.11M
    const TXSample *tab = TX_TAB(ff_tx_tab_53);
178
1.11M
#ifdef TX_INT32
179
1.11M
    int64_t mtmp[4];
180
1.11M
#endif
181
182
1.11M
    tmp[0] = in[0];
183
1.11M
    BF(tmp[1].re, tmp[2].im, in[1].im, in[2].im);
184
1.11M
    BF(tmp[1].im, tmp[2].re, in[1].re, in[2].re);
185
186
1.11M
#ifdef TX_INT32
187
1.11M
    out[0*stride].re = (int64_t)tmp[0].re + tmp[2].re;
188
1.11M
    out[0*stride].im = (int64_t)tmp[0].im + tmp[2].im;
189
1.11M
    mtmp[0] = (int64_t)tab[ 8] * tmp[1].re;
190
1.11M
    mtmp[1] = (int64_t)tab[ 9] * tmp[1].im;
191
1.11M
    mtmp[2] = (int64_t)tab[10] * tmp[2].re;
192
1.11M
    mtmp[3] = (int64_t)tab[10] * tmp[2].im;
193
1.11M
    out[1*stride].re = tmp[0].re - (mtmp[2] + mtmp[0] + 0x40000000 >> 31);
194
1.11M
    out[1*stride].im = tmp[0].im - (mtmp[3] - mtmp[1] + 0x40000000 >> 31);
195
1.11M
    out[2*stride].re = tmp[0].re - (mtmp[2] - mtmp[0] + 0x40000000 >> 31);
196
1.11M
    out[2*stride].im = tmp[0].im - (mtmp[3] + mtmp[1] + 0x40000000 >> 31);
197
#else
198
    out[0*stride].re = tmp[0].re + tmp[2].re;
199
    out[0*stride].im = tmp[0].im + tmp[2].im;
200
    tmp[1].re = tab[ 8] * tmp[1].re;
201
    tmp[1].im = tab[ 9] * tmp[1].im;
202
    tmp[2].re = tab[10] * tmp[2].re;
203
    tmp[2].im = tab[10] * tmp[2].im;
204
    out[1*stride].re = tmp[0].re - tmp[2].re + tmp[1].re;
205
    out[1*stride].im = tmp[0].im - tmp[2].im - tmp[1].im;
206
    out[2*stride].re = tmp[0].re - tmp[2].re - tmp[1].re;
207
    out[2*stride].im = tmp[0].im - tmp[2].im + tmp[1].im;
208
#endif
209
1.11M
}
210
211
#define DECL_FFT5(NAME, D0, D1, D2, D3, D4)                         \
212
static av_always_inline void NAME(TXComplex *out, TXComplex *in,    \
213
44.3M
                                  ptrdiff_t stride)                 \
214
44.3M
{                                                                   \
215
44.3M
    TXComplex dc, z0[4], t[6];                                      \
216
44.3M
    const TXSample *tab = TX_TAB(ff_tx_tab_53);                     \
217
44.3M
                                                                    \
218
44.3M
    dc = in[0];                                                     \
219
44.3M
    BF(t[1].im, t[0].re, in[1].re, in[4].re);                       \
220
44.3M
    BF(t[1].re, t[0].im, in[1].im, in[4].im);                       \
221
44.3M
    BF(t[3].im, t[2].re, in[2].re, in[3].re);                       \
222
44.3M
    BF(t[3].re, t[2].im, in[2].im, in[3].im);                       \
223
44.3M
                                                                    \
224
44.3M
    out[D0*stride].re = dc.re + (TXUSample)t[0].re + t[2].re;        \
225
44.3M
    out[D0*stride].im = dc.im + (TXUSample)t[0].im + t[2].im;        \
226
44.3M
                                                                    \
227
44.3M
    SMUL(t[4].re, t[0].re, tab[0], tab[2], t[2].re, t[0].re);       \
228
44.3M
    SMUL(t[4].im, t[0].im, tab[0], tab[2], t[2].im, t[0].im);       \
229
44.3M
    CMUL(t[5].re, t[1].re, tab[4], tab[6], t[3].re, t[1].re);       \
230
44.3M
    CMUL(t[5].im, t[1].im, tab[4], tab[6], t[3].im, t[1].im);       \
231
44.3M
                                                                    \
232
44.3M
    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                       \
233
44.3M
    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                       \
234
44.3M
    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                       \
235
44.3M
    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                       \
236
44.3M
                                                                    \
237
44.3M
    out[D1*stride].re = dc.re + (TXUSample)z0[3].re;                 \
238
44.3M
    out[D1*stride].im = dc.im + (TXUSample)z0[0].im;                 \
239
44.3M
    out[D2*stride].re = dc.re + (TXUSample)z0[2].re;                 \
240
44.3M
    out[D2*stride].im = dc.im + (TXUSample)z0[1].im;                 \
241
44.3M
    out[D3*stride].re = dc.re + (TXUSample)z0[1].re;                 \
242
44.3M
    out[D3*stride].im = dc.im + (TXUSample)z0[2].im;                 \
243
44.3M
    out[D4*stride].re = dc.re + (TXUSample)z0[0].re;                 \
244
44.3M
    out[D4*stride].im = dc.im + (TXUSample)z0[3].im;                 \
245
44.3M
}
Unexecuted instantiation: tx_double.c:fft5
Unexecuted instantiation: tx_double.c:fft5_m1
Unexecuted instantiation: tx_double.c:fft5_m2
Unexecuted instantiation: tx_double.c:fft5_m3
tx_float.c:fft5
Line
Count
Source
213
29.6M
                                  ptrdiff_t stride)                 \
214
29.6M
{                                                                   \
215
29.6M
    TXComplex dc, z0[4], t[6];                                      \
216
29.6M
    const TXSample *tab = TX_TAB(ff_tx_tab_53);                     \
217
29.6M
                                                                    \
218
29.6M
    dc = in[0];                                                     \
219
29.6M
    BF(t[1].im, t[0].re, in[1].re, in[4].re);                       \
220
29.6M
    BF(t[1].re, t[0].im, in[1].im, in[4].im);                       \
221
29.6M
    BF(t[3].im, t[2].re, in[2].re, in[3].re);                       \
222
29.6M
    BF(t[3].re, t[2].im, in[2].im, in[3].im);                       \
223
29.6M
                                                                    \
224
29.6M
    out[D0*stride].re = dc.re + (TXUSample)t[0].re + t[2].re;        \
225
29.6M
    out[D0*stride].im = dc.im + (TXUSample)t[0].im + t[2].im;        \
226
29.6M
                                                                    \
227
29.6M
    SMUL(t[4].re, t[0].re, tab[0], tab[2], t[2].re, t[0].re);       \
228
29.6M
    SMUL(t[4].im, t[0].im, tab[0], tab[2], t[2].im, t[0].im);       \
229
29.6M
    CMUL(t[5].re, t[1].re, tab[4], tab[6], t[3].re, t[1].re);       \
230
29.6M
    CMUL(t[5].im, t[1].im, tab[4], tab[6], t[3].im, t[1].im);       \
231
29.6M
                                                                    \
232
29.6M
    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                       \
233
29.6M
    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                       \
234
29.6M
    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                       \
235
29.6M
    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                       \
236
29.6M
                                                                    \
237
29.6M
    out[D1*stride].re = dc.re + (TXUSample)z0[3].re;                 \
238
29.6M
    out[D1*stride].im = dc.im + (TXUSample)z0[0].im;                 \
239
29.6M
    out[D2*stride].re = dc.re + (TXUSample)z0[2].re;                 \
240
29.6M
    out[D2*stride].im = dc.im + (TXUSample)z0[1].im;                 \
241
29.6M
    out[D3*stride].re = dc.re + (TXUSample)z0[1].re;                 \
242
29.6M
    out[D3*stride].im = dc.im + (TXUSample)z0[2].im;                 \
243
29.6M
    out[D4*stride].re = dc.re + (TXUSample)z0[0].re;                 \
244
29.6M
    out[D4*stride].im = dc.im + (TXUSample)z0[3].im;                 \
245
29.6M
}
tx_float.c:fft5_m1
Line
Count
Source
213
4.68M
                                  ptrdiff_t stride)                 \
214
4.68M
{                                                                   \
215
4.68M
    TXComplex dc, z0[4], t[6];                                      \
216
4.68M
    const TXSample *tab = TX_TAB(ff_tx_tab_53);                     \
217
4.68M
                                                                    \
218
4.68M
    dc = in[0];                                                     \
219
4.68M
    BF(t[1].im, t[0].re, in[1].re, in[4].re);                       \
220
4.68M
    BF(t[1].re, t[0].im, in[1].im, in[4].im);                       \
221
4.68M
    BF(t[3].im, t[2].re, in[2].re, in[3].re);                       \
222
4.68M
    BF(t[3].re, t[2].im, in[2].im, in[3].im);                       \
223
4.68M
                                                                    \
224
4.68M
    out[D0*stride].re = dc.re + (TXUSample)t[0].re + t[2].re;        \
225
4.68M
    out[D0*stride].im = dc.im + (TXUSample)t[0].im + t[2].im;        \
226
4.68M
                                                                    \
227
4.68M
    SMUL(t[4].re, t[0].re, tab[0], tab[2], t[2].re, t[0].re);       \
228
4.68M
    SMUL(t[4].im, t[0].im, tab[0], tab[2], t[2].im, t[0].im);       \
229
4.68M
    CMUL(t[5].re, t[1].re, tab[4], tab[6], t[3].re, t[1].re);       \
230
4.68M
    CMUL(t[5].im, t[1].im, tab[4], tab[6], t[3].im, t[1].im);       \
231
4.68M
                                                                    \
232
4.68M
    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                       \
233
4.68M
    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                       \
234
4.68M
    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                       \
235
4.68M
    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                       \
236
4.68M
                                                                    \
237
4.68M
    out[D1*stride].re = dc.re + (TXUSample)z0[3].re;                 \
238
4.68M
    out[D1*stride].im = dc.im + (TXUSample)z0[0].im;                 \
239
4.68M
    out[D2*stride].re = dc.re + (TXUSample)z0[2].re;                 \
240
4.68M
    out[D2*stride].im = dc.im + (TXUSample)z0[1].im;                 \
241
4.68M
    out[D3*stride].re = dc.re + (TXUSample)z0[1].re;                 \
242
4.68M
    out[D3*stride].im = dc.im + (TXUSample)z0[2].im;                 \
243
4.68M
    out[D4*stride].re = dc.re + (TXUSample)z0[0].re;                 \
244
4.68M
    out[D4*stride].im = dc.im + (TXUSample)z0[3].im;                 \
245
4.68M
}
tx_float.c:fft5_m2
Line
Count
Source
213
4.68M
                                  ptrdiff_t stride)                 \
214
4.68M
{                                                                   \
215
4.68M
    TXComplex dc, z0[4], t[6];                                      \
216
4.68M
    const TXSample *tab = TX_TAB(ff_tx_tab_53);                     \
217
4.68M
                                                                    \
218
4.68M
    dc = in[0];                                                     \
219
4.68M
    BF(t[1].im, t[0].re, in[1].re, in[4].re);                       \
220
4.68M
    BF(t[1].re, t[0].im, in[1].im, in[4].im);                       \
221
4.68M
    BF(t[3].im, t[2].re, in[2].re, in[3].re);                       \
222
4.68M
    BF(t[3].re, t[2].im, in[2].im, in[3].im);                       \
223
4.68M
                                                                    \
224
4.68M
    out[D0*stride].re = dc.re + (TXUSample)t[0].re + t[2].re;        \
225
4.68M
    out[D0*stride].im = dc.im + (TXUSample)t[0].im + t[2].im;        \
226
4.68M
                                                                    \
227
4.68M
    SMUL(t[4].re, t[0].re, tab[0], tab[2], t[2].re, t[0].re);       \
228
4.68M
    SMUL(t[4].im, t[0].im, tab[0], tab[2], t[2].im, t[0].im);       \
229
4.68M
    CMUL(t[5].re, t[1].re, tab[4], tab[6], t[3].re, t[1].re);       \
230
4.68M
    CMUL(t[5].im, t[1].im, tab[4], tab[6], t[3].im, t[1].im);       \
231
4.68M
                                                                    \
232
4.68M
    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                       \
233
4.68M
    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                       \
234
4.68M
    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                       \
235
4.68M
    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                       \
236
4.68M
                                                                    \
237
4.68M
    out[D1*stride].re = dc.re + (TXUSample)z0[3].re;                 \
238
4.68M
    out[D1*stride].im = dc.im + (TXUSample)z0[0].im;                 \
239
4.68M
    out[D2*stride].re = dc.re + (TXUSample)z0[2].re;                 \
240
4.68M
    out[D2*stride].im = dc.im + (TXUSample)z0[1].im;                 \
241
4.68M
    out[D3*stride].re = dc.re + (TXUSample)z0[1].re;                 \
242
4.68M
    out[D3*stride].im = dc.im + (TXUSample)z0[2].im;                 \
243
4.68M
    out[D4*stride].re = dc.re + (TXUSample)z0[0].re;                 \
244
4.68M
    out[D4*stride].im = dc.im + (TXUSample)z0[3].im;                 \
245
4.68M
}
tx_float.c:fft5_m3
Line
Count
Source
213
4.68M
                                  ptrdiff_t stride)                 \
214
4.68M
{                                                                   \
215
4.68M
    TXComplex dc, z0[4], t[6];                                      \
216
4.68M
    const TXSample *tab = TX_TAB(ff_tx_tab_53);                     \
217
4.68M
                                                                    \
218
4.68M
    dc = in[0];                                                     \
219
4.68M
    BF(t[1].im, t[0].re, in[1].re, in[4].re);                       \
220
4.68M
    BF(t[1].re, t[0].im, in[1].im, in[4].im);                       \
221
4.68M
    BF(t[3].im, t[2].re, in[2].re, in[3].re);                       \
222
4.68M
    BF(t[3].re, t[2].im, in[2].im, in[3].im);                       \
223
4.68M
                                                                    \
224
4.68M
    out[D0*stride].re = dc.re + (TXUSample)t[0].re + t[2].re;        \
225
4.68M
    out[D0*stride].im = dc.im + (TXUSample)t[0].im + t[2].im;        \
226
4.68M
                                                                    \
227
4.68M
    SMUL(t[4].re, t[0].re, tab[0], tab[2], t[2].re, t[0].re);       \
228
4.68M
    SMUL(t[4].im, t[0].im, tab[0], tab[2], t[2].im, t[0].im);       \
229
4.68M
    CMUL(t[5].re, t[1].re, tab[4], tab[6], t[3].re, t[1].re);       \
230
4.68M
    CMUL(t[5].im, t[1].im, tab[4], tab[6], t[3].im, t[1].im);       \
231
4.68M
                                                                    \
232
4.68M
    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                       \
233
4.68M
    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                       \
234
4.68M
    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                       \
235
4.68M
    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                       \
236
4.68M
                                                                    \
237
4.68M
    out[D1*stride].re = dc.re + (TXUSample)z0[3].re;                 \
238
4.68M
    out[D1*stride].im = dc.im + (TXUSample)z0[0].im;                 \
239
4.68M
    out[D2*stride].re = dc.re + (TXUSample)z0[2].re;                 \
240
4.68M
    out[D2*stride].im = dc.im + (TXUSample)z0[1].im;                 \
241
4.68M
    out[D3*stride].re = dc.re + (TXUSample)z0[1].re;                 \
242
4.68M
    out[D3*stride].im = dc.im + (TXUSample)z0[2].im;                 \
243
4.68M
    out[D4*stride].re = dc.re + (TXUSample)z0[0].re;                 \
244
4.68M
    out[D4*stride].im = dc.im + (TXUSample)z0[3].im;                 \
245
4.68M
}
Unexecuted instantiation: tx_int32.c:fft5
tx_int32.c:fft5_m1
Line
Count
Source
213
223k
                                  ptrdiff_t stride)                 \
214
223k
{                                                                   \
215
223k
    TXComplex dc, z0[4], t[6];                                      \
216
223k
    const TXSample *tab = TX_TAB(ff_tx_tab_53);                     \
217
223k
                                                                    \
218
223k
    dc = in[0];                                                     \
219
223k
    BF(t[1].im, t[0].re, in[1].re, in[4].re);                       \
220
223k
    BF(t[1].re, t[0].im, in[1].im, in[4].im);                       \
221
223k
    BF(t[3].im, t[2].re, in[2].re, in[3].re);                       \
222
223k
    BF(t[3].re, t[2].im, in[2].im, in[3].im);                       \
223
223k
                                                                    \
224
223k
    out[D0*stride].re = dc.re + (TXUSample)t[0].re + t[2].re;        \
225
223k
    out[D0*stride].im = dc.im + (TXUSample)t[0].im + t[2].im;        \
226
223k
                                                                    \
227
223k
    SMUL(t[4].re, t[0].re, tab[0], tab[2], t[2].re, t[0].re);       \
228
223k
    SMUL(t[4].im, t[0].im, tab[0], tab[2], t[2].im, t[0].im);       \
229
223k
    CMUL(t[5].re, t[1].re, tab[4], tab[6], t[3].re, t[1].re);       \
230
223k
    CMUL(t[5].im, t[1].im, tab[4], tab[6], t[3].im, t[1].im);       \
231
223k
                                                                    \
232
223k
    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                       \
233
223k
    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                       \
234
223k
    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                       \
235
223k
    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                       \
236
223k
                                                                    \
237
223k
    out[D1*stride].re = dc.re + (TXUSample)z0[3].re;                 \
238
223k
    out[D1*stride].im = dc.im + (TXUSample)z0[0].im;                 \
239
223k
    out[D2*stride].re = dc.re + (TXUSample)z0[2].re;                 \
240
223k
    out[D2*stride].im = dc.im + (TXUSample)z0[1].im;                 \
241
223k
    out[D3*stride].re = dc.re + (TXUSample)z0[1].re;                 \
242
223k
    out[D3*stride].im = dc.im + (TXUSample)z0[2].im;                 \
243
223k
    out[D4*stride].re = dc.re + (TXUSample)z0[0].re;                 \
244
223k
    out[D4*stride].im = dc.im + (TXUSample)z0[3].im;                 \
245
223k
}
tx_int32.c:fft5_m2
Line
Count
Source
213
223k
                                  ptrdiff_t stride)                 \
214
223k
{                                                                   \
215
223k
    TXComplex dc, z0[4], t[6];                                      \
216
223k
    const TXSample *tab = TX_TAB(ff_tx_tab_53);                     \
217
223k
                                                                    \
218
223k
    dc = in[0];                                                     \
219
223k
    BF(t[1].im, t[0].re, in[1].re, in[4].re);                       \
220
223k
    BF(t[1].re, t[0].im, in[1].im, in[4].im);                       \
221
223k
    BF(t[3].im, t[2].re, in[2].re, in[3].re);                       \
222
223k
    BF(t[3].re, t[2].im, in[2].im, in[3].im);                       \
223
223k
                                                                    \
224
223k
    out[D0*stride].re = dc.re + (TXUSample)t[0].re + t[2].re;        \
225
223k
    out[D0*stride].im = dc.im + (TXUSample)t[0].im + t[2].im;        \
226
223k
                                                                    \
227
223k
    SMUL(t[4].re, t[0].re, tab[0], tab[2], t[2].re, t[0].re);       \
228
223k
    SMUL(t[4].im, t[0].im, tab[0], tab[2], t[2].im, t[0].im);       \
229
223k
    CMUL(t[5].re, t[1].re, tab[4], tab[6], t[3].re, t[1].re);       \
230
223k
    CMUL(t[5].im, t[1].im, tab[4], tab[6], t[3].im, t[1].im);       \
231
223k
                                                                    \
232
223k
    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                       \
233
223k
    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                       \
234
223k
    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                       \
235
223k
    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                       \
236
223k
                                                                    \
237
223k
    out[D1*stride].re = dc.re + (TXUSample)z0[3].re;                 \
238
223k
    out[D1*stride].im = dc.im + (TXUSample)z0[0].im;                 \
239
223k
    out[D2*stride].re = dc.re + (TXUSample)z0[2].re;                 \
240
223k
    out[D2*stride].im = dc.im + (TXUSample)z0[1].im;                 \
241
223k
    out[D3*stride].re = dc.re + (TXUSample)z0[1].re;                 \
242
223k
    out[D3*stride].im = dc.im + (TXUSample)z0[2].im;                 \
243
223k
    out[D4*stride].re = dc.re + (TXUSample)z0[0].re;                 \
244
223k
    out[D4*stride].im = dc.im + (TXUSample)z0[3].im;                 \
245
223k
}
tx_int32.c:fft5_m3
Line
Count
Source
213
223k
                                  ptrdiff_t stride)                 \
214
223k
{                                                                   \
215
223k
    TXComplex dc, z0[4], t[6];                                      \
216
223k
    const TXSample *tab = TX_TAB(ff_tx_tab_53);                     \
217
223k
                                                                    \
218
223k
    dc = in[0];                                                     \
219
223k
    BF(t[1].im, t[0].re, in[1].re, in[4].re);                       \
220
223k
    BF(t[1].re, t[0].im, in[1].im, in[4].im);                       \
221
223k
    BF(t[3].im, t[2].re, in[2].re, in[3].re);                       \
222
223k
    BF(t[3].re, t[2].im, in[2].im, in[3].im);                       \
223
223k
                                                                    \
224
223k
    out[D0*stride].re = dc.re + (TXUSample)t[0].re + t[2].re;        \
225
223k
    out[D0*stride].im = dc.im + (TXUSample)t[0].im + t[2].im;        \
226
223k
                                                                    \
227
223k
    SMUL(t[4].re, t[0].re, tab[0], tab[2], t[2].re, t[0].re);       \
228
223k
    SMUL(t[4].im, t[0].im, tab[0], tab[2], t[2].im, t[0].im);       \
229
223k
    CMUL(t[5].re, t[1].re, tab[4], tab[6], t[3].re, t[1].re);       \
230
223k
    CMUL(t[5].im, t[1].im, tab[4], tab[6], t[3].im, t[1].im);       \
231
223k
                                                                    \
232
223k
    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                       \
233
223k
    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                       \
234
223k
    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                       \
235
223k
    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                       \
236
223k
                                                                    \
237
223k
    out[D1*stride].re = dc.re + (TXUSample)z0[3].re;                 \
238
223k
    out[D1*stride].im = dc.im + (TXUSample)z0[0].im;                 \
239
223k
    out[D2*stride].re = dc.re + (TXUSample)z0[2].re;                 \
240
223k
    out[D2*stride].im = dc.im + (TXUSample)z0[1].im;                 \
241
223k
    out[D3*stride].re = dc.re + (TXUSample)z0[1].re;                 \
242
223k
    out[D3*stride].im = dc.im + (TXUSample)z0[2].im;                 \
243
223k
    out[D4*stride].re = dc.re + (TXUSample)z0[0].re;                 \
244
223k
    out[D4*stride].im = dc.im + (TXUSample)z0[3].im;                 \
245
223k
}
246
247
DECL_FFT5(fft5,     0,  1,  2,  3,  4)
248
DECL_FFT5(fft5_m1,  0,  6, 12,  3,  9)
249
DECL_FFT5(fft5_m2, 10,  1,  7, 13,  4)
250
DECL_FFT5(fft5_m3,  5, 11,  2,  8, 14)
251
252
static av_always_inline void fft7(TXComplex *out, TXComplex *in,
253
                                  ptrdiff_t stride)
254
2.35M
{
255
2.35M
    TXComplex dc, t[6], z[3];
256
2.35M
    const TXComplex *tab = (const TXComplex *)TX_TAB(ff_tx_tab_7);
257
#ifdef TX_INT32
258
    int64_t mtmp[12];
259
#endif
260
261
2.35M
    dc = in[0];
262
2.35M
    BF(t[1].re, t[0].re, in[1].re, in[6].re);
263
2.35M
    BF(t[1].im, t[0].im, in[1].im, in[6].im);
264
2.35M
    BF(t[3].re, t[2].re, in[2].re, in[5].re);
265
2.35M
    BF(t[3].im, t[2].im, in[2].im, in[5].im);
266
2.35M
    BF(t[5].re, t[4].re, in[3].re, in[4].re);
267
2.35M
    BF(t[5].im, t[4].im, in[3].im, in[4].im);
268
269
2.35M
    out[0*stride].re = dc.re + t[0].re + t[2].re + t[4].re;
270
2.35M
    out[0*stride].im = dc.im + t[0].im + t[2].im + t[4].im;
271
272
#ifdef TX_INT32 /* NOTE: it's possible to do this with 16 mults but 72 adds */
273
    mtmp[ 0] = ((int64_t)tab[0].re)*t[0].re - ((int64_t)tab[2].re)*t[4].re;
274
    mtmp[ 1] = ((int64_t)tab[0].re)*t[4].re - ((int64_t)tab[1].re)*t[0].re;
275
    mtmp[ 2] = ((int64_t)tab[0].re)*t[2].re - ((int64_t)tab[2].re)*t[0].re;
276
    mtmp[ 3] = ((int64_t)tab[0].re)*t[0].im - ((int64_t)tab[1].re)*t[2].im;
277
    mtmp[ 4] = ((int64_t)tab[0].re)*t[4].im - ((int64_t)tab[1].re)*t[0].im;
278
    mtmp[ 5] = ((int64_t)tab[0].re)*t[2].im - ((int64_t)tab[2].re)*t[0].im;
279
280
    mtmp[ 6] = ((int64_t)tab[2].im)*t[1].im + ((int64_t)tab[1].im)*t[5].im;
281
    mtmp[ 7] = ((int64_t)tab[0].im)*t[5].im + ((int64_t)tab[2].im)*t[3].im;
282
    mtmp[ 8] = ((int64_t)tab[2].im)*t[5].im + ((int64_t)tab[1].im)*t[3].im;
283
    mtmp[ 9] = ((int64_t)tab[0].im)*t[1].re + ((int64_t)tab[1].im)*t[3].re;
284
    mtmp[10] = ((int64_t)tab[2].im)*t[3].re + ((int64_t)tab[0].im)*t[5].re;
285
    mtmp[11] = ((int64_t)tab[2].im)*t[1].re + ((int64_t)tab[1].im)*t[5].re;
286
287
    z[0].re = (int32_t)(mtmp[ 0] - ((int64_t)tab[1].re)*t[2].re + 0x40000000 >> 31);
288
    z[1].re = (int32_t)(mtmp[ 1] - ((int64_t)tab[2].re)*t[2].re + 0x40000000 >> 31);
289
    z[2].re = (int32_t)(mtmp[ 2] - ((int64_t)tab[1].re)*t[4].re + 0x40000000 >> 31);
290
    z[0].im = (int32_t)(mtmp[ 3] - ((int64_t)tab[2].re)*t[4].im + 0x40000000 >> 31);
291
    z[1].im = (int32_t)(mtmp[ 4] - ((int64_t)tab[2].re)*t[2].im + 0x40000000 >> 31);
292
    z[2].im = (int32_t)(mtmp[ 5] - ((int64_t)tab[1].re)*t[4].im + 0x40000000 >> 31);
293
294
    t[0].re = (int32_t)(mtmp[ 6] - ((int64_t)tab[0].im)*t[3].im + 0x40000000 >> 31);
295
    t[2].re = (int32_t)(mtmp[ 7] - ((int64_t)tab[1].im)*t[1].im + 0x40000000 >> 31);
296
    t[4].re = (int32_t)(mtmp[ 8] + ((int64_t)tab[0].im)*t[1].im + 0x40000000 >> 31);
297
    t[0].im = (int32_t)(mtmp[ 9] + ((int64_t)tab[2].im)*t[5].re + 0x40000000 >> 31);
298
    t[2].im = (int32_t)(mtmp[10] - ((int64_t)tab[1].im)*t[1].re + 0x40000000 >> 31);
299
    t[4].im = (int32_t)(mtmp[11] - ((int64_t)tab[0].im)*t[3].re + 0x40000000 >> 31);
300
#else
301
    z[0].re = tab[0].re*t[0].re - tab[2].re*t[4].re - tab[1].re*t[2].re;
302
    z[1].re = tab[0].re*t[4].re - tab[1].re*t[0].re - tab[2].re*t[2].re;
303
    z[2].re = tab[0].re*t[2].re - tab[2].re*t[0].re - tab[1].re*t[4].re;
304
    z[0].im = tab[0].re*t[0].im - tab[1].re*t[2].im - tab[2].re*t[4].im;
305
    z[1].im = tab[0].re*t[4].im - tab[1].re*t[0].im - tab[2].re*t[2].im;
306
    z[2].im = tab[0].re*t[2].im - tab[2].re*t[0].im - tab[1].re*t[4].im;
307
308
    /* It's possible to do t[4].re and t[0].im with 2 multiplies only by
309
     * multiplying the sum of all with the average of the twiddles */
310
311
    t[0].re = tab[2].im*t[1].im + tab[1].im*t[5].im - tab[0].im*t[3].im;
312
    t[2].re = tab[0].im*t[5].im + tab[2].im*t[3].im - tab[1].im*t[1].im;
313
    t[4].re = tab[2].im*t[5].im + tab[1].im*t[3].im + tab[0].im*t[1].im;
314
    t[0].im = tab[0].im*t[1].re + tab[1].im*t[3].re + tab[2].im*t[5].re;
315
    t[2].im = tab[2].im*t[3].re + tab[0].im*t[5].re - tab[1].im*t[1].re;
316
    t[4].im = tab[2].im*t[1].re + tab[1].im*t[5].re - tab[0].im*t[3].re;
317
#endif
318
319
2.35M
    BF(t[1].re, z[0].re, z[0].re, t[4].re);
320
2.35M
    BF(t[3].re, z[1].re, z[1].re, t[2].re);
321
2.35M
    BF(t[5].re, z[2].re, z[2].re, t[0].re);
322
2.35M
    BF(t[1].im, z[0].im, z[0].im, t[0].im);
323
2.35M
    BF(t[3].im, z[1].im, z[1].im, t[2].im);
324
2.35M
    BF(t[5].im, z[2].im, z[2].im, t[4].im);
325
326
2.35M
    out[1*stride].re = dc.re + z[0].re;
327
2.35M
    out[1*stride].im = dc.im + t[1].im;
328
2.35M
    out[2*stride].re = dc.re + t[3].re;
329
2.35M
    out[2*stride].im = dc.im + z[1].im;
330
2.35M
    out[3*stride].re = dc.re + z[2].re;
331
2.35M
    out[3*stride].im = dc.im + t[5].im;
332
2.35M
    out[4*stride].re = dc.re + t[5].re;
333
2.35M
    out[4*stride].im = dc.im + z[2].im;
334
2.35M
    out[5*stride].re = dc.re + z[1].re;
335
2.35M
    out[5*stride].im = dc.im + t[3].im;
336
2.35M
    out[6*stride].re = dc.re + t[1].re;
337
2.35M
    out[6*stride].im = dc.im + z[0].im;
338
2.35M
}
Unexecuted instantiation: tx_double.c:fft7
tx_float.c:fft7
Line
Count
Source
254
2.35M
{
255
2.35M
    TXComplex dc, t[6], z[3];
256
2.35M
    const TXComplex *tab = (const TXComplex *)TX_TAB(ff_tx_tab_7);
257
#ifdef TX_INT32
258
    int64_t mtmp[12];
259
#endif
260
261
2.35M
    dc = in[0];
262
2.35M
    BF(t[1].re, t[0].re, in[1].re, in[6].re);
263
2.35M
    BF(t[1].im, t[0].im, in[1].im, in[6].im);
264
2.35M
    BF(t[3].re, t[2].re, in[2].re, in[5].re);
265
2.35M
    BF(t[3].im, t[2].im, in[2].im, in[5].im);
266
2.35M
    BF(t[5].re, t[4].re, in[3].re, in[4].re);
267
2.35M
    BF(t[5].im, t[4].im, in[3].im, in[4].im);
268
269
2.35M
    out[0*stride].re = dc.re + t[0].re + t[2].re + t[4].re;
270
2.35M
    out[0*stride].im = dc.im + t[0].im + t[2].im + t[4].im;
271
272
#ifdef TX_INT32 /* NOTE: it's possible to do this with 16 mults but 72 adds */
273
    mtmp[ 0] = ((int64_t)tab[0].re)*t[0].re - ((int64_t)tab[2].re)*t[4].re;
274
    mtmp[ 1] = ((int64_t)tab[0].re)*t[4].re - ((int64_t)tab[1].re)*t[0].re;
275
    mtmp[ 2] = ((int64_t)tab[0].re)*t[2].re - ((int64_t)tab[2].re)*t[0].re;
276
    mtmp[ 3] = ((int64_t)tab[0].re)*t[0].im - ((int64_t)tab[1].re)*t[2].im;
277
    mtmp[ 4] = ((int64_t)tab[0].re)*t[4].im - ((int64_t)tab[1].re)*t[0].im;
278
    mtmp[ 5] = ((int64_t)tab[0].re)*t[2].im - ((int64_t)tab[2].re)*t[0].im;
279
280
    mtmp[ 6] = ((int64_t)tab[2].im)*t[1].im + ((int64_t)tab[1].im)*t[5].im;
281
    mtmp[ 7] = ((int64_t)tab[0].im)*t[5].im + ((int64_t)tab[2].im)*t[3].im;
282
    mtmp[ 8] = ((int64_t)tab[2].im)*t[5].im + ((int64_t)tab[1].im)*t[3].im;
283
    mtmp[ 9] = ((int64_t)tab[0].im)*t[1].re + ((int64_t)tab[1].im)*t[3].re;
284
    mtmp[10] = ((int64_t)tab[2].im)*t[3].re + ((int64_t)tab[0].im)*t[5].re;
285
    mtmp[11] = ((int64_t)tab[2].im)*t[1].re + ((int64_t)tab[1].im)*t[5].re;
286
287
    z[0].re = (int32_t)(mtmp[ 0] - ((int64_t)tab[1].re)*t[2].re + 0x40000000 >> 31);
288
    z[1].re = (int32_t)(mtmp[ 1] - ((int64_t)tab[2].re)*t[2].re + 0x40000000 >> 31);
289
    z[2].re = (int32_t)(mtmp[ 2] - ((int64_t)tab[1].re)*t[4].re + 0x40000000 >> 31);
290
    z[0].im = (int32_t)(mtmp[ 3] - ((int64_t)tab[2].re)*t[4].im + 0x40000000 >> 31);
291
    z[1].im = (int32_t)(mtmp[ 4] - ((int64_t)tab[2].re)*t[2].im + 0x40000000 >> 31);
292
    z[2].im = (int32_t)(mtmp[ 5] - ((int64_t)tab[1].re)*t[4].im + 0x40000000 >> 31);
293
294
    t[0].re = (int32_t)(mtmp[ 6] - ((int64_t)tab[0].im)*t[3].im + 0x40000000 >> 31);
295
    t[2].re = (int32_t)(mtmp[ 7] - ((int64_t)tab[1].im)*t[1].im + 0x40000000 >> 31);
296
    t[4].re = (int32_t)(mtmp[ 8] + ((int64_t)tab[0].im)*t[1].im + 0x40000000 >> 31);
297
    t[0].im = (int32_t)(mtmp[ 9] + ((int64_t)tab[2].im)*t[5].re + 0x40000000 >> 31);
298
    t[2].im = (int32_t)(mtmp[10] - ((int64_t)tab[1].im)*t[1].re + 0x40000000 >> 31);
299
    t[4].im = (int32_t)(mtmp[11] - ((int64_t)tab[0].im)*t[3].re + 0x40000000 >> 31);
300
#else
301
2.35M
    z[0].re = tab[0].re*t[0].re - tab[2].re*t[4].re - tab[1].re*t[2].re;
302
2.35M
    z[1].re = tab[0].re*t[4].re - tab[1].re*t[0].re - tab[2].re*t[2].re;
303
2.35M
    z[2].re = tab[0].re*t[2].re - tab[2].re*t[0].re - tab[1].re*t[4].re;
304
2.35M
    z[0].im = tab[0].re*t[0].im - tab[1].re*t[2].im - tab[2].re*t[4].im;
305
2.35M
    z[1].im = tab[0].re*t[4].im - tab[1].re*t[0].im - tab[2].re*t[2].im;
306
2.35M
    z[2].im = tab[0].re*t[2].im - tab[2].re*t[0].im - tab[1].re*t[4].im;
307
308
    /* It's possible to do t[4].re and t[0].im with 2 multiplies only by
309
     * multiplying the sum of all with the average of the twiddles */
310
311
2.35M
    t[0].re = tab[2].im*t[1].im + tab[1].im*t[5].im - tab[0].im*t[3].im;
312
2.35M
    t[2].re = tab[0].im*t[5].im + tab[2].im*t[3].im - tab[1].im*t[1].im;
313
2.35M
    t[4].re = tab[2].im*t[5].im + tab[1].im*t[3].im + tab[0].im*t[1].im;
314
2.35M
    t[0].im = tab[0].im*t[1].re + tab[1].im*t[3].re + tab[2].im*t[5].re;
315
2.35M
    t[2].im = tab[2].im*t[3].re + tab[0].im*t[5].re - tab[1].im*t[1].re;
316
2.35M
    t[4].im = tab[2].im*t[1].re + tab[1].im*t[5].re - tab[0].im*t[3].re;
317
2.35M
#endif
318
319
2.35M
    BF(t[1].re, z[0].re, z[0].re, t[4].re);
320
2.35M
    BF(t[3].re, z[1].re, z[1].re, t[2].re);
321
2.35M
    BF(t[5].re, z[2].re, z[2].re, t[0].re);
322
2.35M
    BF(t[1].im, z[0].im, z[0].im, t[0].im);
323
2.35M
    BF(t[3].im, z[1].im, z[1].im, t[2].im);
324
2.35M
    BF(t[5].im, z[2].im, z[2].im, t[4].im);
325
326
2.35M
    out[1*stride].re = dc.re + z[0].re;
327
2.35M
    out[1*stride].im = dc.im + t[1].im;
328
2.35M
    out[2*stride].re = dc.re + t[3].re;
329
2.35M
    out[2*stride].im = dc.im + z[1].im;
330
2.35M
    out[3*stride].re = dc.re + z[2].re;
331
2.35M
    out[3*stride].im = dc.im + t[5].im;
332
2.35M
    out[4*stride].re = dc.re + t[5].re;
333
2.35M
    out[4*stride].im = dc.im + z[2].im;
334
2.35M
    out[5*stride].re = dc.re + z[1].re;
335
2.35M
    out[5*stride].im = dc.im + t[3].im;
336
2.35M
    out[6*stride].re = dc.re + t[1].re;
337
2.35M
    out[6*stride].im = dc.im + z[0].im;
338
2.35M
}
Unexecuted instantiation: tx_int32.c:fft7
339
340
static av_always_inline void fft9(TXComplex *out, TXComplex *in,
341
                                  ptrdiff_t stride)
342
1.83M
{
343
1.83M
    const TXComplex *tab = (const TXComplex *)TX_TAB(ff_tx_tab_9);
344
1.83M
    TXComplex dc, t[16], w[4], x[5], y[5], z[2];
345
#ifdef TX_INT32
346
    int64_t mtmp[12];
347
#endif
348
349
1.83M
    dc = in[0];
350
1.83M
    BF(t[1].re, t[0].re, in[1].re, in[8].re);
351
1.83M
    BF(t[1].im, t[0].im, in[1].im, in[8].im);
352
1.83M
    BF(t[3].re, t[2].re, in[2].re, in[7].re);
353
1.83M
    BF(t[3].im, t[2].im, in[2].im, in[7].im);
354
1.83M
    BF(t[5].re, t[4].re, in[3].re, in[6].re);
355
1.83M
    BF(t[5].im, t[4].im, in[3].im, in[6].im);
356
1.83M
    BF(t[7].re, t[6].re, in[4].re, in[5].re);
357
1.83M
    BF(t[7].im, t[6].im, in[4].im, in[5].im);
358
359
1.83M
    w[0].re = t[0].re - t[6].re;
360
1.83M
    w[0].im = t[0].im - t[6].im;
361
1.83M
    w[1].re = t[2].re - t[6].re;
362
1.83M
    w[1].im = t[2].im - t[6].im;
363
1.83M
    w[2].re = t[1].re - t[7].re;
364
1.83M
    w[2].im = t[1].im - t[7].im;
365
1.83M
    w[3].re = t[3].re + t[7].re;
366
1.83M
    w[3].im = t[3].im + t[7].im;
367
368
1.83M
    z[0].re = dc.re + t[4].re;
369
1.83M
    z[0].im = dc.im + t[4].im;
370
371
1.83M
    z[1].re = t[0].re + t[2].re + t[6].re;
372
1.83M
    z[1].im = t[0].im + t[2].im + t[6].im;
373
374
1.83M
    out[0*stride].re = z[0].re + z[1].re;
375
1.83M
    out[0*stride].im = z[0].im + z[1].im;
376
377
#ifdef TX_INT32
378
    mtmp[0] = t[1].re - t[3].re + t[7].re;
379
    mtmp[1] = t[1].im - t[3].im + t[7].im;
380
381
    y[3].re = (int32_t)(((int64_t)tab[0].im)*mtmp[0] + 0x40000000 >> 31);
382
    y[3].im = (int32_t)(((int64_t)tab[0].im)*mtmp[1] + 0x40000000 >> 31);
383
384
    mtmp[0] = (int32_t)(((int64_t)tab[0].re)*z[1].re + 0x40000000 >> 31);
385
    mtmp[1] = (int32_t)(((int64_t)tab[0].re)*z[1].im + 0x40000000 >> 31);
386
    mtmp[2] = (int32_t)(((int64_t)tab[0].re)*t[4].re + 0x40000000 >> 31);
387
    mtmp[3] = (int32_t)(((int64_t)tab[0].re)*t[4].im + 0x40000000 >> 31);
388
389
    x[3].re = z[0].re  + (int32_t)mtmp[0];
390
    x[3].im = z[0].im  + (int32_t)mtmp[1];
391
    z[0].re = in[0].re + (int32_t)mtmp[2];
392
    z[0].im = in[0].im + (int32_t)mtmp[3];
393
394
    mtmp[0] = ((int64_t)tab[1].re)*w[0].re;
395
    mtmp[1] = ((int64_t)tab[1].re)*w[0].im;
396
    mtmp[2] = ((int64_t)tab[2].im)*w[0].re;
397
    mtmp[3] = ((int64_t)tab[2].im)*w[0].im;
398
    mtmp[4] = ((int64_t)tab[1].im)*w[2].re;
399
    mtmp[5] = ((int64_t)tab[1].im)*w[2].im;
400
    mtmp[6] = ((int64_t)tab[2].re)*w[2].re;
401
    mtmp[7] = ((int64_t)tab[2].re)*w[2].im;
402
403
    x[1].re = (int32_t)(mtmp[0] + ((int64_t)tab[2].im)*w[1].re + 0x40000000 >> 31);
404
    x[1].im = (int32_t)(mtmp[1] + ((int64_t)tab[2].im)*w[1].im + 0x40000000 >> 31);
405
    x[2].re = (int32_t)(mtmp[2] - ((int64_t)tab[3].re)*w[1].re + 0x40000000 >> 31);
406
    x[2].im = (int32_t)(mtmp[3] - ((int64_t)tab[3].re)*w[1].im + 0x40000000 >> 31);
407
    y[1].re = (int32_t)(mtmp[4] + ((int64_t)tab[2].re)*w[3].re + 0x40000000 >> 31);
408
    y[1].im = (int32_t)(mtmp[5] + ((int64_t)tab[2].re)*w[3].im + 0x40000000 >> 31);
409
    y[2].re = (int32_t)(mtmp[6] - ((int64_t)tab[3].im)*w[3].re + 0x40000000 >> 31);
410
    y[2].im = (int32_t)(mtmp[7] - ((int64_t)tab[3].im)*w[3].im + 0x40000000 >> 31);
411
412
    y[0].re = (int32_t)(((int64_t)tab[0].im)*t[5].re + 0x40000000 >> 31);
413
    y[0].im = (int32_t)(((int64_t)tab[0].im)*t[5].im + 0x40000000 >> 31);
414
415
#else
416
    y[3].re = tab[0].im*(t[1].re - t[3].re + t[7].re);
417
    y[3].im = tab[0].im*(t[1].im - t[3].im + t[7].im);
418
419
    x[3].re = z[0].re  + tab[0].re*z[1].re;
420
    x[3].im = z[0].im  + tab[0].re*z[1].im;
421
    z[0].re = dc.re + tab[0].re*t[4].re;
422
    z[0].im = dc.im + tab[0].re*t[4].im;
423
424
    x[1].re = tab[1].re*w[0].re + tab[2].im*w[1].re;
425
    x[1].im = tab[1].re*w[0].im + tab[2].im*w[1].im;
426
    x[2].re = tab[2].im*w[0].re - tab[3].re*w[1].re;
427
    x[2].im = tab[2].im*w[0].im - tab[3].re*w[1].im;
428
    y[1].re = tab[1].im*w[2].re + tab[2].re*w[3].re;
429
    y[1].im = tab[1].im*w[2].im + tab[2].re*w[3].im;
430
    y[2].re = tab[2].re*w[2].re - tab[3].im*w[3].re;
431
    y[2].im = tab[2].re*w[2].im - tab[3].im*w[3].im;
432
433
    y[0].re = tab[0].im*t[5].re;
434
    y[0].im = tab[0].im*t[5].im;
435
#endif
436
437
1.83M
    x[4].re = x[1].re + x[2].re;
438
1.83M
    x[4].im = x[1].im + x[2].im;
439
440
1.83M
    y[4].re = y[1].re - y[2].re;
441
1.83M
    y[4].im = y[1].im - y[2].im;
442
1.83M
    x[1].re = z[0].re + x[1].re;
443
1.83M
    x[1].im = z[0].im + x[1].im;
444
1.83M
    y[1].re = y[0].re + y[1].re;
445
1.83M
    y[1].im = y[0].im + y[1].im;
446
1.83M
    x[2].re = z[0].re + x[2].re;
447
1.83M
    x[2].im = z[0].im + x[2].im;
448
1.83M
    y[2].re = y[2].re - y[0].re;
449
1.83M
    y[2].im = y[2].im - y[0].im;
450
1.83M
    x[4].re = z[0].re - x[4].re;
451
1.83M
    x[4].im = z[0].im - x[4].im;
452
1.83M
    y[4].re = y[0].re - y[4].re;
453
1.83M
    y[4].im = y[0].im - y[4].im;
454
455
1.83M
    out[1*stride] = (TXComplex){ x[1].re + y[1].im, x[1].im - y[1].re };
456
1.83M
    out[2*stride] = (TXComplex){ x[2].re + y[2].im, x[2].im - y[2].re };
457
1.83M
    out[3*stride] = (TXComplex){ x[3].re + y[3].im, x[3].im - y[3].re };
458
1.83M
    out[4*stride] = (TXComplex){ x[4].re + y[4].im, x[4].im - y[4].re };
459
1.83M
    out[5*stride] = (TXComplex){ x[4].re - y[4].im, x[4].im + y[4].re };
460
1.83M
    out[6*stride] = (TXComplex){ x[3].re - y[3].im, x[3].im + y[3].re };
461
1.83M
    out[7*stride] = (TXComplex){ x[2].re - y[2].im, x[2].im + y[2].re };
462
1.83M
    out[8*stride] = (TXComplex){ x[1].re - y[1].im, x[1].im + y[1].re };
463
1.83M
}
Unexecuted instantiation: tx_double.c:fft9
tx_float.c:fft9
Line
Count
Source
342
1.83M
{
343
1.83M
    const TXComplex *tab = (const TXComplex *)TX_TAB(ff_tx_tab_9);
344
1.83M
    TXComplex dc, t[16], w[4], x[5], y[5], z[2];
345
#ifdef TX_INT32
346
    int64_t mtmp[12];
347
#endif
348
349
1.83M
    dc = in[0];
350
1.83M
    BF(t[1].re, t[0].re, in[1].re, in[8].re);
351
1.83M
    BF(t[1].im, t[0].im, in[1].im, in[8].im);
352
1.83M
    BF(t[3].re, t[2].re, in[2].re, in[7].re);
353
1.83M
    BF(t[3].im, t[2].im, in[2].im, in[7].im);
354
1.83M
    BF(t[5].re, t[4].re, in[3].re, in[6].re);
355
1.83M
    BF(t[5].im, t[4].im, in[3].im, in[6].im);
356
1.83M
    BF(t[7].re, t[6].re, in[4].re, in[5].re);
357
1.83M
    BF(t[7].im, t[6].im, in[4].im, in[5].im);
358
359
1.83M
    w[0].re = t[0].re - t[6].re;
360
1.83M
    w[0].im = t[0].im - t[6].im;
361
1.83M
    w[1].re = t[2].re - t[6].re;
362
1.83M
    w[1].im = t[2].im - t[6].im;
363
1.83M
    w[2].re = t[1].re - t[7].re;
364
1.83M
    w[2].im = t[1].im - t[7].im;
365
1.83M
    w[3].re = t[3].re + t[7].re;
366
1.83M
    w[3].im = t[3].im + t[7].im;
367
368
1.83M
    z[0].re = dc.re + t[4].re;
369
1.83M
    z[0].im = dc.im + t[4].im;
370
371
1.83M
    z[1].re = t[0].re + t[2].re + t[6].re;
372
1.83M
    z[1].im = t[0].im + t[2].im + t[6].im;
373
374
1.83M
    out[0*stride].re = z[0].re + z[1].re;
375
1.83M
    out[0*stride].im = z[0].im + z[1].im;
376
377
#ifdef TX_INT32
378
    mtmp[0] = t[1].re - t[3].re + t[7].re;
379
    mtmp[1] = t[1].im - t[3].im + t[7].im;
380
381
    y[3].re = (int32_t)(((int64_t)tab[0].im)*mtmp[0] + 0x40000000 >> 31);
382
    y[3].im = (int32_t)(((int64_t)tab[0].im)*mtmp[1] + 0x40000000 >> 31);
383
384
    mtmp[0] = (int32_t)(((int64_t)tab[0].re)*z[1].re + 0x40000000 >> 31);
385
    mtmp[1] = (int32_t)(((int64_t)tab[0].re)*z[1].im + 0x40000000 >> 31);
386
    mtmp[2] = (int32_t)(((int64_t)tab[0].re)*t[4].re + 0x40000000 >> 31);
387
    mtmp[3] = (int32_t)(((int64_t)tab[0].re)*t[4].im + 0x40000000 >> 31);
388
389
    x[3].re = z[0].re  + (int32_t)mtmp[0];
390
    x[3].im = z[0].im  + (int32_t)mtmp[1];
391
    z[0].re = in[0].re + (int32_t)mtmp[2];
392
    z[0].im = in[0].im + (int32_t)mtmp[3];
393
394
    mtmp[0] = ((int64_t)tab[1].re)*w[0].re;
395
    mtmp[1] = ((int64_t)tab[1].re)*w[0].im;
396
    mtmp[2] = ((int64_t)tab[2].im)*w[0].re;
397
    mtmp[3] = ((int64_t)tab[2].im)*w[0].im;
398
    mtmp[4] = ((int64_t)tab[1].im)*w[2].re;
399
    mtmp[5] = ((int64_t)tab[1].im)*w[2].im;
400
    mtmp[6] = ((int64_t)tab[2].re)*w[2].re;
401
    mtmp[7] = ((int64_t)tab[2].re)*w[2].im;
402
403
    x[1].re = (int32_t)(mtmp[0] + ((int64_t)tab[2].im)*w[1].re + 0x40000000 >> 31);
404
    x[1].im = (int32_t)(mtmp[1] + ((int64_t)tab[2].im)*w[1].im + 0x40000000 >> 31);
405
    x[2].re = (int32_t)(mtmp[2] - ((int64_t)tab[3].re)*w[1].re + 0x40000000 >> 31);
406
    x[2].im = (int32_t)(mtmp[3] - ((int64_t)tab[3].re)*w[1].im + 0x40000000 >> 31);
407
    y[1].re = (int32_t)(mtmp[4] + ((int64_t)tab[2].re)*w[3].re + 0x40000000 >> 31);
408
    y[1].im = (int32_t)(mtmp[5] + ((int64_t)tab[2].re)*w[3].im + 0x40000000 >> 31);
409
    y[2].re = (int32_t)(mtmp[6] - ((int64_t)tab[3].im)*w[3].re + 0x40000000 >> 31);
410
    y[2].im = (int32_t)(mtmp[7] - ((int64_t)tab[3].im)*w[3].im + 0x40000000 >> 31);
411
412
    y[0].re = (int32_t)(((int64_t)tab[0].im)*t[5].re + 0x40000000 >> 31);
413
    y[0].im = (int32_t)(((int64_t)tab[0].im)*t[5].im + 0x40000000 >> 31);
414
415
#else
416
1.83M
    y[3].re = tab[0].im*(t[1].re - t[3].re + t[7].re);
417
1.83M
    y[3].im = tab[0].im*(t[1].im - t[3].im + t[7].im);
418
419
1.83M
    x[3].re = z[0].re  + tab[0].re*z[1].re;
420
1.83M
    x[3].im = z[0].im  + tab[0].re*z[1].im;
421
1.83M
    z[0].re = dc.re + tab[0].re*t[4].re;
422
1.83M
    z[0].im = dc.im + tab[0].re*t[4].im;
423
424
1.83M
    x[1].re = tab[1].re*w[0].re + tab[2].im*w[1].re;
425
1.83M
    x[1].im = tab[1].re*w[0].im + tab[2].im*w[1].im;
426
1.83M
    x[2].re = tab[2].im*w[0].re - tab[3].re*w[1].re;
427
1.83M
    x[2].im = tab[2].im*w[0].im - tab[3].re*w[1].im;
428
1.83M
    y[1].re = tab[1].im*w[2].re + tab[2].re*w[3].re;
429
1.83M
    y[1].im = tab[1].im*w[2].im + tab[2].re*w[3].im;
430
1.83M
    y[2].re = tab[2].re*w[2].re - tab[3].im*w[3].re;
431
1.83M
    y[2].im = tab[2].re*w[2].im - tab[3].im*w[3].im;
432
433
1.83M
    y[0].re = tab[0].im*t[5].re;
434
1.83M
    y[0].im = tab[0].im*t[5].im;
435
1.83M
#endif
436
437
1.83M
    x[4].re = x[1].re + x[2].re;
438
1.83M
    x[4].im = x[1].im + x[2].im;
439
440
1.83M
    y[4].re = y[1].re - y[2].re;
441
1.83M
    y[4].im = y[1].im - y[2].im;
442
1.83M
    x[1].re = z[0].re + x[1].re;
443
1.83M
    x[1].im = z[0].im + x[1].im;
444
1.83M
    y[1].re = y[0].re + y[1].re;
445
1.83M
    y[1].im = y[0].im + y[1].im;
446
1.83M
    x[2].re = z[0].re + x[2].re;
447
1.83M
    x[2].im = z[0].im + x[2].im;
448
1.83M
    y[2].re = y[2].re - y[0].re;
449
1.83M
    y[2].im = y[2].im - y[0].im;
450
1.83M
    x[4].re = z[0].re - x[4].re;
451
1.83M
    x[4].im = z[0].im - x[4].im;
452
1.83M
    y[4].re = y[0].re - y[4].re;
453
1.83M
    y[4].im = y[0].im - y[4].im;
454
455
1.83M
    out[1*stride] = (TXComplex){ x[1].re + y[1].im, x[1].im - y[1].re };
456
1.83M
    out[2*stride] = (TXComplex){ x[2].re + y[2].im, x[2].im - y[2].re };
457
1.83M
    out[3*stride] = (TXComplex){ x[3].re + y[3].im, x[3].im - y[3].re };
458
1.83M
    out[4*stride] = (TXComplex){ x[4].re + y[4].im, x[4].im - y[4].re };
459
1.83M
    out[5*stride] = (TXComplex){ x[4].re - y[4].im, x[4].im + y[4].re };
460
1.83M
    out[6*stride] = (TXComplex){ x[3].re - y[3].im, x[3].im + y[3].re };
461
1.83M
    out[7*stride] = (TXComplex){ x[2].re - y[2].im, x[2].im + y[2].re };
462
1.83M
    out[8*stride] = (TXComplex){ x[1].re - y[1].im, x[1].im + y[1].re };
463
1.83M
}
Unexecuted instantiation: tx_int32.c:fft9
464
465
static av_always_inline void fft15(TXComplex *out, TXComplex *in,
466
                                   ptrdiff_t stride)
467
4.91M
{
468
4.91M
    TXComplex tmp[15];
469
470
29.4M
    for (int i = 0; i < 5; i++)
471
24.5M
        fft3(tmp + i, in + i*3, 5);
472
473
4.91M
    fft5_m1(out, tmp +  0, stride);
474
4.91M
    fft5_m2(out, tmp +  5, stride);
475
4.91M
    fft5_m3(out, tmp + 10, stride);
476
4.91M
}
Unexecuted instantiation: tx_double.c:fft15
tx_float.c:fft15
Line
Count
Source
467
4.68M
{
468
4.68M
    TXComplex tmp[15];
469
470
28.1M
    for (int i = 0; i < 5; i++)
471
23.4M
        fft3(tmp + i, in + i*3, 5);
472
473
4.68M
    fft5_m1(out, tmp +  0, stride);
474
4.68M
    fft5_m2(out, tmp +  5, stride);
475
4.68M
    fft5_m3(out, tmp + 10, stride);
476
4.68M
}
tx_int32.c:fft15
Line
Count
Source
467
223k
{
468
223k
    TXComplex tmp[15];
469
470
1.33M
    for (int i = 0; i < 5; i++)
471
1.11M
        fft3(tmp + i, in + i*3, 5);
472
473
223k
    fft5_m1(out, tmp +  0, stride);
474
223k
    fft5_m2(out, tmp +  5, stride);
475
223k
    fft5_m3(out, tmp + 10, stride);
476
223k
}
477
478
static av_cold int TX_NAME(ff_tx_fft_factor_init)(AVTXContext *s,
479
                                                  const FFTXCodelet *cd,
480
                                                  uint64_t flags,
481
                                                  FFTXCodeletOptions *opts,
482
                                                  int len, int inv,
483
                                                  const void *scale)
484
2.10k
{
485
2.10k
    int ret = 0;
486
2.10k
    TX_TAB(ff_tx_init_tabs)(len);
487
488
2.10k
    if (len == 15)
489
0
        ret = ff_tx_gen_pfa_input_map(s, opts, 3, 5);
490
2.10k
    else if (flags & FF_TX_PRESHUFFLE)
491
2.10k
        ret = ff_tx_gen_default_map(s, opts);
492
493
2.10k
    return ret;
494
2.10k
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_factor_init_double_c
tx_float.c:ff_tx_fft_factor_init_float_c
Line
Count
Source
484
2.10k
{
485
2.10k
    int ret = 0;
486
2.10k
    TX_TAB(ff_tx_init_tabs)(len);
487
488
2.10k
    if (len == 15)
489
0
        ret = ff_tx_gen_pfa_input_map(s, opts, 3, 5);
490
2.10k
    else if (flags & FF_TX_PRESHUFFLE)
491
2.10k
        ret = ff_tx_gen_default_map(s, opts);
492
493
2.10k
    return ret;
494
2.10k
}
Unexecuted instantiation: tx_int32.c:ff_tx_fft_factor_init_int32_c
495
496
#define DECL_FACTOR_S(n)                                                       \
497
static void TX_NAME(ff_tx_fft##n)(AVTXContext *s, void *dst,                   \
498
7.59M
                                  void *src, ptrdiff_t stride)                 \
499
7.59M
{                                                                              \
500
7.59M
    fft##n((TXComplex *)dst, (TXComplex *)src, stride / sizeof(TXComplex));    \
501
7.59M
}                                                                              \
Unexecuted instantiation: tx_double.c:ff_tx_fft3_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft5_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft7_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft9_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft15_double_c
Unexecuted instantiation: tx_float.c:ff_tx_fft3_float_c
tx_float.c:ff_tx_fft5_float_c
Line
Count
Source
498
3.40M
                                  void *src, ptrdiff_t stride)                 \
499
3.40M
{                                                                              \
500
3.40M
    fft##n((TXComplex *)dst, (TXComplex *)src, stride / sizeof(TXComplex));    \
501
3.40M
}                                                                              \
tx_float.c:ff_tx_fft7_float_c
Line
Count
Source
498
2.35M
                                  void *src, ptrdiff_t stride)                 \
499
2.35M
{                                                                              \
500
2.35M
    fft##n((TXComplex *)dst, (TXComplex *)src, stride / sizeof(TXComplex));    \
501
2.35M
}                                                                              \
tx_float.c:ff_tx_fft9_float_c
Line
Count
Source
498
1.83M
                                  void *src, ptrdiff_t stride)                 \
499
1.83M
{                                                                              \
500
1.83M
    fft##n((TXComplex *)dst, (TXComplex *)src, stride / sizeof(TXComplex));    \
501
1.83M
}                                                                              \
Unexecuted instantiation: tx_float.c:ff_tx_fft15_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft3_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft5_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft7_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft9_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft15_int32_c
502
static const FFTXCodelet TX_NAME(ff_tx_fft##n##_ns_def) = {                    \
503
    .name       = TX_NAME_STR("fft" #n "_ns"),                                 \
504
    .function   = TX_NAME(ff_tx_fft##n),                                       \
505
    .type       = TX_TYPE(FFT),                                                \
506
    .flags      = AV_TX_INPLACE | FF_TX_OUT_OF_PLACE |                         \
507
                  AV_TX_UNALIGNED | FF_TX_PRESHUFFLE,                          \
508
    .factors[0] = n,                                                           \
509
    .nb_factors = 1,                                                           \
510
    .min_len    = n,                                                           \
511
    .max_len    = n,                                                           \
512
    .init       = TX_NAME(ff_tx_fft_factor_init),                              \
513
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,                                         \
514
    .prio       = FF_TX_PRIO_BASE,                                             \
515
};
516
517
#define DECL_FACTOR_F(n)                                                       \
518
DECL_FACTOR_S(n)                                                               \
519
static const FFTXCodelet TX_NAME(ff_tx_fft##n##_fwd_def) = {                   \
520
    .name       = TX_NAME_STR("fft" #n "_fwd"),                                \
521
    .function   = TX_NAME(ff_tx_fft##n),                                       \
522
    .type       = TX_TYPE(FFT),                                                \
523
    .flags      = AV_TX_INPLACE | FF_TX_OUT_OF_PLACE |                         \
524
                  AV_TX_UNALIGNED | FF_TX_FORWARD_ONLY,                        \
525
    .factors[0] = n,                                                           \
526
    .nb_factors = 1,                                                           \
527
    .min_len    = n,                                                           \
528
    .max_len    = n,                                                           \
529
    .init       = TX_NAME(ff_tx_fft_factor_init),                              \
530
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,                                         \
531
    .prio       = FF_TX_PRIO_BASE,                                             \
532
};
533
534
DECL_FACTOR_F(3)
535
DECL_FACTOR_F(5)
536
DECL_FACTOR_F(7)
537
DECL_FACTOR_F(9)
538
DECL_FACTOR_S(15)
539
540
#define BUTTERFLIES(a0, a1, a2, a3)            \
541
8.03G
    do {                                       \
542
8.03G
        r0=a0.re;                              \
543
8.03G
        i0=a0.im;                              \
544
8.03G
        r1=a1.re;                              \
545
8.03G
        i1=a1.im;                              \
546
8.03G
        BF(t3, t5, t5, t1);                    \
547
8.03G
        BF(a2.re, a0.re, r0, t5);              \
548
8.03G
        BF(a3.im, a1.im, i1, t3);              \
549
8.03G
        BF(t4, t6, t2, t6);                    \
550
8.03G
        BF(a3.re, a1.re, r1, t4);              \
551
8.03G
        BF(a2.im, a0.im, i0, t6);              \
552
8.03G
    } while (0)
553
554
#define TRANSFORM(a0, a1, a2, a3, wre, wim)    \
555
6.62G
    do {                                       \
556
6.62G
        CMUL(t1, t2, a2.re, a2.im, wre, -wim); \
557
6.62G
        CMUL(t5, t6, a3.re, a3.im, wre,  wim); \
558
6.62G
        BUTTERFLIES(a0, a1, a2, a3);           \
559
6.62G
    } while (0)
560
561
/* z[0...8n-1], w[1...2n-1] */
562
static inline void TX_NAME(ff_tx_fft_sr_combine)(TXComplex *z,
563
                                                 const TXSample *cos, int len)
564
364M
{
565
364M
    int o1 = 2*len;
566
364M
    int o2 = 4*len;
567
364M
    int o3 = 6*len;
568
364M
    const TXSample *wim = cos + o1 - 7;
569
364M
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
570
571
917M
    for (int i = 0; i < len; i += 4) {
572
553M
        TRANSFORM(z[0], z[o1 + 0], z[o2 + 0], z[o3 + 0], cos[0], wim[7]);
573
553M
        TRANSFORM(z[2], z[o1 + 2], z[o2 + 2], z[o3 + 2], cos[2], wim[5]);
574
553M
        TRANSFORM(z[4], z[o1 + 4], z[o2 + 4], z[o3 + 4], cos[4], wim[3]);
575
553M
        TRANSFORM(z[6], z[o1 + 6], z[o2 + 6], z[o3 + 6], cos[6], wim[1]);
576
577
553M
        TRANSFORM(z[1], z[o1 + 1], z[o2 + 1], z[o3 + 1], cos[1], wim[6]);
578
553M
        TRANSFORM(z[3], z[o1 + 3], z[o2 + 3], z[o3 + 3], cos[3], wim[4]);
579
553M
        TRANSFORM(z[5], z[o1 + 5], z[o2 + 5], z[o3 + 5], cos[5], wim[2]);
580
553M
        TRANSFORM(z[7], z[o1 + 7], z[o2 + 7], z[o3 + 7], cos[7], wim[0]);
581
582
553M
        z   += 2*4;
583
553M
        cos += 2*4;
584
553M
        wim -= 2*4;
585
553M
    }
586
364M
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_sr_combine_double_c
tx_float.c:ff_tx_fft_sr_combine_float_c
Line
Count
Source
564
304M
{
565
304M
    int o1 = 2*len;
566
304M
    int o2 = 4*len;
567
304M
    int o3 = 6*len;
568
304M
    const TXSample *wim = cos + o1 - 7;
569
304M
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
570
571
769M
    for (int i = 0; i < len; i += 4) {
572
465M
        TRANSFORM(z[0], z[o1 + 0], z[o2 + 0], z[o3 + 0], cos[0], wim[7]);
573
465M
        TRANSFORM(z[2], z[o1 + 2], z[o2 + 2], z[o3 + 2], cos[2], wim[5]);
574
465M
        TRANSFORM(z[4], z[o1 + 4], z[o2 + 4], z[o3 + 4], cos[4], wim[3]);
575
465M
        TRANSFORM(z[6], z[o1 + 6], z[o2 + 6], z[o3 + 6], cos[6], wim[1]);
576
577
465M
        TRANSFORM(z[1], z[o1 + 1], z[o2 + 1], z[o3 + 1], cos[1], wim[6]);
578
465M
        TRANSFORM(z[3], z[o1 + 3], z[o2 + 3], z[o3 + 3], cos[3], wim[4]);
579
465M
        TRANSFORM(z[5], z[o1 + 5], z[o2 + 5], z[o3 + 5], cos[5], wim[2]);
580
465M
        TRANSFORM(z[7], z[o1 + 7], z[o2 + 7], z[o3 + 7], cos[7], wim[0]);
581
582
465M
        z   += 2*4;
583
465M
        cos += 2*4;
584
465M
        wim -= 2*4;
585
465M
    }
586
304M
}
tx_int32.c:ff_tx_fft_sr_combine_int32_c
Line
Count
Source
564
60.1M
{
565
60.1M
    int o1 = 2*len;
566
60.1M
    int o2 = 4*len;
567
60.1M
    int o3 = 6*len;
568
60.1M
    const TXSample *wim = cos + o1 - 7;
569
60.1M
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
570
571
148M
    for (int i = 0; i < len; i += 4) {
572
88.2M
        TRANSFORM(z[0], z[o1 + 0], z[o2 + 0], z[o3 + 0], cos[0], wim[7]);
573
88.2M
        TRANSFORM(z[2], z[o1 + 2], z[o2 + 2], z[o3 + 2], cos[2], wim[5]);
574
88.2M
        TRANSFORM(z[4], z[o1 + 4], z[o2 + 4], z[o3 + 4], cos[4], wim[3]);
575
88.2M
        TRANSFORM(z[6], z[o1 + 6], z[o2 + 6], z[o3 + 6], cos[6], wim[1]);
576
577
88.2M
        TRANSFORM(z[1], z[o1 + 1], z[o2 + 1], z[o3 + 1], cos[1], wim[6]);
578
88.2M
        TRANSFORM(z[3], z[o1 + 3], z[o2 + 3], z[o3 + 3], cos[3], wim[4]);
579
88.2M
        TRANSFORM(z[5], z[o1 + 5], z[o2 + 5], z[o3 + 5], cos[5], wim[2]);
580
88.2M
        TRANSFORM(z[7], z[o1 + 7], z[o2 + 7], z[o3 + 7], cos[7], wim[0]);
581
582
88.2M
        z   += 2*4;
583
88.2M
        cos += 2*4;
584
88.2M
        wim -= 2*4;
585
88.2M
    }
586
60.1M
}
587
588
static av_cold int TX_NAME(ff_tx_fft_sr_codelet_init)(AVTXContext *s,
589
                                                      const FFTXCodelet *cd,
590
                                                      uint64_t flags,
591
                                                      FFTXCodeletOptions *opts,
592
                                                      int len, int inv,
593
                                                      const void *scale)
594
1.18M
{
595
1.18M
    TX_TAB(ff_tx_init_tabs)(len);
596
1.18M
    return ff_tx_gen_ptwo_revtab(s, opts);
597
1.18M
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_sr_codelet_init_double_c
tx_float.c:ff_tx_fft_sr_codelet_init_float_c
Line
Count
Source
594
953k
{
595
953k
    TX_TAB(ff_tx_init_tabs)(len);
596
953k
    return ff_tx_gen_ptwo_revtab(s, opts);
597
953k
}
tx_int32.c:ff_tx_fft_sr_codelet_init_int32_c
Line
Count
Source
594
231k
{
595
231k
    TX_TAB(ff_tx_init_tabs)(len);
596
231k
    return ff_tx_gen_ptwo_revtab(s, opts);
597
231k
}
598
599
#define DECL_SR_CODELET_DEF(n)                              \
600
static const FFTXCodelet TX_NAME(ff_tx_fft##n##_ns_def) = { \
601
    .name       = TX_NAME_STR("fft" #n "_ns"),              \
602
    .function   = TX_NAME(ff_tx_fft##n##_ns),               \
603
    .type       = TX_TYPE(FFT),                             \
604
    .flags      = FF_TX_OUT_OF_PLACE | AV_TX_INPLACE |      \
605
                  AV_TX_UNALIGNED | FF_TX_PRESHUFFLE,       \
606
    .factors[0] = 2,                                        \
607
    .nb_factors = 1,                                        \
608
    .min_len    = n,                                        \
609
    .max_len    = n,                                        \
610
    .init       = TX_NAME(ff_tx_fft_sr_codelet_init),       \
611
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,                      \
612
    .prio       = FF_TX_PRIO_BASE,                          \
613
};
614
615
#define DECL_SR_CODELET(n, n2, n4)                                    \
616
static void TX_NAME(ff_tx_fft##n##_ns)(AVTXContext *s, void *_dst,    \
617
364M
                                        void *_src, ptrdiff_t stride) \
618
364M
{                                                                     \
619
364M
    TXComplex *src = _src;                                            \
620
364M
    TXComplex *dst = _dst;                                            \
621
364M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
364M
                                                                      \
623
364M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
364M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
364M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
364M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
364M
}                                                                     \
Unexecuted instantiation: tx_double.c:ff_tx_fft32_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft64_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft128_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft256_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft512_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft1024_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft2048_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft4096_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft8192_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft16384_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft32768_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft65536_ns_double_c
Unexecuted instantiation: tx_double.c:ff_tx_fft131072_ns_double_c
tx_float.c:ff_tx_fft32_ns_float_c
Line
Count
Source
617
247M
                                        void *_src, ptrdiff_t stride) \
618
247M
{                                                                     \
619
247M
    TXComplex *src = _src;                                            \
620
247M
    TXComplex *dst = _dst;                                            \
621
247M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
247M
                                                                      \
623
247M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
247M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
247M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
247M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
247M
}                                                                     \
tx_float.c:ff_tx_fft64_ns_float_c
Line
Count
Source
617
33.3M
                                        void *_src, ptrdiff_t stride) \
618
33.3M
{                                                                     \
619
33.3M
    TXComplex *src = _src;                                            \
620
33.3M
    TXComplex *dst = _dst;                                            \
621
33.3M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
33.3M
                                                                      \
623
33.3M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
33.3M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
33.3M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
33.3M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
33.3M
}                                                                     \
tx_float.c:ff_tx_fft128_ns_float_c
Line
Count
Source
617
16.5M
                                        void *_src, ptrdiff_t stride) \
618
16.5M
{                                                                     \
619
16.5M
    TXComplex *src = _src;                                            \
620
16.5M
    TXComplex *dst = _dst;                                            \
621
16.5M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
16.5M
                                                                      \
623
16.5M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
16.5M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
16.5M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
16.5M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
16.5M
}                                                                     \
tx_float.c:ff_tx_fft256_ns_float_c
Line
Count
Source
617
4.39M
                                        void *_src, ptrdiff_t stride) \
618
4.39M
{                                                                     \
619
4.39M
    TXComplex *src = _src;                                            \
620
4.39M
    TXComplex *dst = _dst;                                            \
621
4.39M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
4.39M
                                                                      \
623
4.39M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
4.39M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
4.39M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
4.39M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
4.39M
}                                                                     \
tx_float.c:ff_tx_fft512_ns_float_c
Line
Count
Source
617
2.07M
                                        void *_src, ptrdiff_t stride) \
618
2.07M
{                                                                     \
619
2.07M
    TXComplex *src = _src;                                            \
620
2.07M
    TXComplex *dst = _dst;                                            \
621
2.07M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
2.07M
                                                                      \
623
2.07M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
2.07M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
2.07M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
2.07M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
2.07M
}                                                                     \
tx_float.c:ff_tx_fft1024_ns_float_c
Line
Count
Source
617
345k
                                        void *_src, ptrdiff_t stride) \
618
345k
{                                                                     \
619
345k
    TXComplex *src = _src;                                            \
620
345k
    TXComplex *dst = _dst;                                            \
621
345k
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
345k
                                                                      \
623
345k
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
345k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
345k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
345k
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
345k
}                                                                     \
tx_float.c:ff_tx_fft2048_ns_float_c
Line
Count
Source
617
40.1k
                                        void *_src, ptrdiff_t stride) \
618
40.1k
{                                                                     \
619
40.1k
    TXComplex *src = _src;                                            \
620
40.1k
    TXComplex *dst = _dst;                                            \
621
40.1k
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
40.1k
                                                                      \
623
40.1k
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
40.1k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
40.1k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
40.1k
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
40.1k
}                                                                     \
tx_float.c:ff_tx_fft4096_ns_float_c
Line
Count
Source
617
24.4k
                                        void *_src, ptrdiff_t stride) \
618
24.4k
{                                                                     \
619
24.4k
    TXComplex *src = _src;                                            \
620
24.4k
    TXComplex *dst = _dst;                                            \
621
24.4k
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
24.4k
                                                                      \
623
24.4k
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
24.4k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
24.4k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
24.4k
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
24.4k
}                                                                     \
Unexecuted instantiation: tx_float.c:ff_tx_fft8192_ns_float_c
Unexecuted instantiation: tx_float.c:ff_tx_fft16384_ns_float_c
Unexecuted instantiation: tx_float.c:ff_tx_fft32768_ns_float_c
Unexecuted instantiation: tx_float.c:ff_tx_fft65536_ns_float_c
Unexecuted instantiation: tx_float.c:ff_tx_fft131072_ns_float_c
tx_int32.c:ff_tx_fft32_ns_int32_c
Line
Count
Source
617
49.1M
                                        void *_src, ptrdiff_t stride) \
618
49.1M
{                                                                     \
619
49.1M
    TXComplex *src = _src;                                            \
620
49.1M
    TXComplex *dst = _dst;                                            \
621
49.1M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
49.1M
                                                                      \
623
49.1M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
49.1M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
49.1M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
49.1M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
49.1M
}                                                                     \
tx_int32.c:ff_tx_fft64_ns_int32_c
Line
Count
Source
617
6.18M
                                        void *_src, ptrdiff_t stride) \
618
6.18M
{                                                                     \
619
6.18M
    TXComplex *src = _src;                                            \
620
6.18M
    TXComplex *dst = _dst;                                            \
621
6.18M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
6.18M
                                                                      \
623
6.18M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
6.18M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
6.18M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
6.18M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
6.18M
}                                                                     \
tx_int32.c:ff_tx_fft128_ns_int32_c
Line
Count
Source
617
3.84M
                                        void *_src, ptrdiff_t stride) \
618
3.84M
{                                                                     \
619
3.84M
    TXComplex *src = _src;                                            \
620
3.84M
    TXComplex *dst = _dst;                                            \
621
3.84M
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
3.84M
                                                                      \
623
3.84M
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
3.84M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
3.84M
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
3.84M
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
3.84M
}                                                                     \
tx_int32.c:ff_tx_fft256_ns_int32_c
Line
Count
Source
617
495k
                                        void *_src, ptrdiff_t stride) \
618
495k
{                                                                     \
619
495k
    TXComplex *src = _src;                                            \
620
495k
    TXComplex *dst = _dst;                                            \
621
495k
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
495k
                                                                      \
623
495k
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
495k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
495k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
495k
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
495k
}                                                                     \
tx_int32.c:ff_tx_fft512_ns_int32_c
Line
Count
Source
617
464k
                                        void *_src, ptrdiff_t stride) \
618
464k
{                                                                     \
619
464k
    TXComplex *src = _src;                                            \
620
464k
    TXComplex *dst = _dst;                                            \
621
464k
    const TXSample *cos = TX_TAB(ff_tx_tab_##n);                      \
622
464k
                                                                      \
623
464k
    TX_NAME(ff_tx_fft##n2##_ns)(s, dst,        src,        stride);   \
624
464k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*2, src + n4*2, stride);   \
625
464k
    TX_NAME(ff_tx_fft##n4##_ns)(s, dst + n4*3, src + n4*3, stride);   \
626
464k
    TX_NAME(ff_tx_fft_sr_combine)(dst, cos, n4 >> 1);                 \
627
464k
}                                                                     \
Unexecuted instantiation: tx_int32.c:ff_tx_fft1024_ns_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft2048_ns_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft4096_ns_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft8192_ns_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft16384_ns_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft32768_ns_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft65536_ns_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft131072_ns_int32_c
628
                                                                      \
629
DECL_SR_CODELET_DEF(n)
630
631
static void TX_NAME(ff_tx_fft2_ns)(AVTXContext *s, void *_dst,
632
                                   void *_src, ptrdiff_t stride)
633
0
{
634
0
    TXComplex *src = _src;
635
0
    TXComplex *dst = _dst;
636
0
    TXComplex tmp;
637
638
0
    BF(tmp.re, dst[0].re, src[0].re, src[1].re);
639
0
    BF(tmp.im, dst[0].im, src[0].im, src[1].im);
640
0
    dst[1] = tmp;
641
0
}
Unexecuted instantiation: tx_double.c:ff_tx_fft2_ns_double_c
Unexecuted instantiation: tx_float.c:ff_tx_fft2_ns_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft2_ns_int32_c
642
643
static void TX_NAME(ff_tx_fft4_ns)(AVTXContext *s, void *_dst,
644
                                   void *_src, ptrdiff_t stride)
645
1.80G
{
646
1.80G
    TXComplex *src = _src;
647
1.80G
    TXComplex *dst = _dst;
648
1.80G
    TXSample t1, t2, t3, t4, t5, t6, t7, t8;
649
650
1.80G
    BF(t3, t1, src[0].re, src[1].re);
651
1.80G
    BF(t8, t6, src[3].re, src[2].re);
652
1.80G
    BF(dst[2].re, dst[0].re, t1, t6);
653
1.80G
    BF(t4, t2, src[0].im, src[1].im);
654
1.80G
    BF(t7, t5, src[2].im, src[3].im);
655
1.80G
    BF(dst[3].im, dst[1].im, t4, t8);
656
1.80G
    BF(dst[3].re, dst[1].re, t3, t7);
657
1.80G
    BF(dst[2].im, dst[0].im, t2, t5);
658
1.80G
}
Unexecuted instantiation: tx_double.c:ff_tx_fft4_ns_double_c
tx_float.c:ff_tx_fft4_ns_float_c
Line
Count
Source
645
1.52G
{
646
1.52G
    TXComplex *src = _src;
647
1.52G
    TXComplex *dst = _dst;
648
1.52G
    TXSample t1, t2, t3, t4, t5, t6, t7, t8;
649
650
1.52G
    BF(t3, t1, src[0].re, src[1].re);
651
1.52G
    BF(t8, t6, src[3].re, src[2].re);
652
1.52G
    BF(dst[2].re, dst[0].re, t1, t6);
653
1.52G
    BF(t4, t2, src[0].im, src[1].im);
654
1.52G
    BF(t7, t5, src[2].im, src[3].im);
655
1.52G
    BF(dst[3].im, dst[1].im, t4, t8);
656
1.52G
    BF(dst[3].re, dst[1].re, t3, t7);
657
1.52G
    BF(dst[2].im, dst[0].im, t2, t5);
658
1.52G
}
tx_int32.c:ff_tx_fft4_ns_int32_c
Line
Count
Source
645
282M
{
646
282M
    TXComplex *src = _src;
647
282M
    TXComplex *dst = _dst;
648
282M
    TXSample t1, t2, t3, t4, t5, t6, t7, t8;
649
650
282M
    BF(t3, t1, src[0].re, src[1].re);
651
282M
    BF(t8, t6, src[3].re, src[2].re);
652
282M
    BF(dst[2].re, dst[0].re, t1, t6);
653
282M
    BF(t4, t2, src[0].im, src[1].im);
654
282M
    BF(t7, t5, src[2].im, src[3].im);
655
282M
    BF(dst[3].im, dst[1].im, t4, t8);
656
282M
    BF(dst[3].re, dst[1].re, t3, t7);
657
282M
    BF(dst[2].im, dst[0].im, t2, t5);
658
282M
}
659
660
static void TX_NAME(ff_tx_fft8_ns)(AVTXContext *s, void *_dst,
661
                                   void *_src, ptrdiff_t stride)
662
1.02G
{
663
1.02G
    TXComplex *src = _src;
664
1.02G
    TXComplex *dst = _dst;
665
1.02G
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
666
1.02G
    const TXSample cos = TX_TAB(ff_tx_tab_8)[1];
667
668
1.02G
    TX_NAME(ff_tx_fft4_ns)(s, dst, src, stride);
669
670
1.02G
    BF(t1, dst[5].re, src[4].re, -src[5].re);
671
1.02G
    BF(t2, dst[5].im, src[4].im, -src[5].im);
672
1.02G
    BF(t5, dst[7].re, src[6].re, -src[7].re);
673
1.02G
    BF(t6, dst[7].im, src[6].im, -src[7].im);
674
675
1.02G
    BUTTERFLIES(dst[0], dst[2], dst[4], dst[6]);
676
1.02G
    TRANSFORM(dst[1], dst[3], dst[5], dst[7], cos, cos);
677
1.02G
}
Unexecuted instantiation: tx_double.c:ff_tx_fft8_ns_double_c
tx_float.c:ff_tx_fft8_ns_float_c
Line
Count
Source
662
864M
{
663
864M
    TXComplex *src = _src;
664
864M
    TXComplex *dst = _dst;
665
864M
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
666
864M
    const TXSample cos = TX_TAB(ff_tx_tab_8)[1];
667
668
864M
    TX_NAME(ff_tx_fft4_ns)(s, dst, src, stride);
669
670
864M
    BF(t1, dst[5].re, src[4].re, -src[5].re);
671
864M
    BF(t2, dst[5].im, src[4].im, -src[5].im);
672
864M
    BF(t5, dst[7].re, src[6].re, -src[7].re);
673
864M
    BF(t6, dst[7].im, src[6].im, -src[7].im);
674
675
864M
    BUTTERFLIES(dst[0], dst[2], dst[4], dst[6]);
676
864M
    TRANSFORM(dst[1], dst[3], dst[5], dst[7], cos, cos);
677
864M
}
tx_int32.c:ff_tx_fft8_ns_int32_c
Line
Count
Source
662
159M
{
663
159M
    TXComplex *src = _src;
664
159M
    TXComplex *dst = _dst;
665
159M
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
666
159M
    const TXSample cos = TX_TAB(ff_tx_tab_8)[1];
667
668
159M
    TX_NAME(ff_tx_fft4_ns)(s, dst, src, stride);
669
670
159M
    BF(t1, dst[5].re, src[4].re, -src[5].re);
671
159M
    BF(t2, dst[5].im, src[4].im, -src[5].im);
672
159M
    BF(t5, dst[7].re, src[6].re, -src[7].re);
673
159M
    BF(t6, dst[7].im, src[6].im, -src[7].im);
674
675
159M
    BUTTERFLIES(dst[0], dst[2], dst[4], dst[6]);
676
159M
    TRANSFORM(dst[1], dst[3], dst[5], dst[7], cos, cos);
677
159M
}
678
679
static void TX_NAME(ff_tx_fft16_ns)(AVTXContext *s, void *_dst,
680
                                    void *_src, ptrdiff_t stride)
681
389M
{
682
389M
    TXComplex *src = _src;
683
389M
    TXComplex *dst = _dst;
684
389M
    const TXSample *cos = TX_TAB(ff_tx_tab_16);
685
686
389M
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
687
389M
    TXSample cos_16_1 = cos[1];
688
389M
    TXSample cos_16_2 = cos[2];
689
389M
    TXSample cos_16_3 = cos[3];
690
691
389M
    TX_NAME(ff_tx_fft8_ns)(s, dst +  0, src +  0, stride);
692
389M
    TX_NAME(ff_tx_fft4_ns)(s, dst +  8, src +  8, stride);
693
389M
    TX_NAME(ff_tx_fft4_ns)(s, dst + 12, src + 12, stride);
694
695
389M
    t1 = dst[ 8].re;
696
389M
    t2 = dst[ 8].im;
697
389M
    t5 = dst[12].re;
698
389M
    t6 = dst[12].im;
699
389M
    BUTTERFLIES(dst[0], dst[4], dst[8], dst[12]);
700
701
389M
    TRANSFORM(dst[ 2], dst[ 6], dst[10], dst[14], cos_16_2, cos_16_2);
702
389M
    TRANSFORM(dst[ 1], dst[ 5], dst[ 9], dst[13], cos_16_1, cos_16_3);
703
389M
    TRANSFORM(dst[ 3], dst[ 7], dst[11], dst[15], cos_16_3, cos_16_1);
704
389M
}
Unexecuted instantiation: tx_double.c:ff_tx_fft16_ns_double_c
tx_float.c:ff_tx_fft16_ns_float_c
Line
Count
Source
681
327M
{
682
327M
    TXComplex *src = _src;
683
327M
    TXComplex *dst = _dst;
684
327M
    const TXSample *cos = TX_TAB(ff_tx_tab_16);
685
686
327M
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
687
327M
    TXSample cos_16_1 = cos[1];
688
327M
    TXSample cos_16_2 = cos[2];
689
327M
    TXSample cos_16_3 = cos[3];
690
691
327M
    TX_NAME(ff_tx_fft8_ns)(s, dst +  0, src +  0, stride);
692
327M
    TX_NAME(ff_tx_fft4_ns)(s, dst +  8, src +  8, stride);
693
327M
    TX_NAME(ff_tx_fft4_ns)(s, dst + 12, src + 12, stride);
694
695
327M
    t1 = dst[ 8].re;
696
327M
    t2 = dst[ 8].im;
697
327M
    t5 = dst[12].re;
698
327M
    t6 = dst[12].im;
699
327M
    BUTTERFLIES(dst[0], dst[4], dst[8], dst[12]);
700
701
327M
    TRANSFORM(dst[ 2], dst[ 6], dst[10], dst[14], cos_16_2, cos_16_2);
702
327M
    TRANSFORM(dst[ 1], dst[ 5], dst[ 9], dst[13], cos_16_1, cos_16_3);
703
327M
    TRANSFORM(dst[ 3], dst[ 7], dst[11], dst[15], cos_16_3, cos_16_1);
704
327M
}
tx_int32.c:ff_tx_fft16_ns_int32_c
Line
Count
Source
681
61.5M
{
682
61.5M
    TXComplex *src = _src;
683
61.5M
    TXComplex *dst = _dst;
684
61.5M
    const TXSample *cos = TX_TAB(ff_tx_tab_16);
685
686
61.5M
    TXUSample t1, t2, t3, t4, t5, t6, r0, i0, r1, i1;
687
61.5M
    TXSample cos_16_1 = cos[1];
688
61.5M
    TXSample cos_16_2 = cos[2];
689
61.5M
    TXSample cos_16_3 = cos[3];
690
691
61.5M
    TX_NAME(ff_tx_fft8_ns)(s, dst +  0, src +  0, stride);
692
61.5M
    TX_NAME(ff_tx_fft4_ns)(s, dst +  8, src +  8, stride);
693
61.5M
    TX_NAME(ff_tx_fft4_ns)(s, dst + 12, src + 12, stride);
694
695
61.5M
    t1 = dst[ 8].re;
696
61.5M
    t2 = dst[ 8].im;
697
61.5M
    t5 = dst[12].re;
698
61.5M
    t6 = dst[12].im;
699
61.5M
    BUTTERFLIES(dst[0], dst[4], dst[8], dst[12]);
700
701
61.5M
    TRANSFORM(dst[ 2], dst[ 6], dst[10], dst[14], cos_16_2, cos_16_2);
702
61.5M
    TRANSFORM(dst[ 1], dst[ 5], dst[ 9], dst[13], cos_16_1, cos_16_3);
703
61.5M
    TRANSFORM(dst[ 3], dst[ 7], dst[11], dst[15], cos_16_3, cos_16_1);
704
61.5M
}
705
706
DECL_SR_CODELET_DEF(2)
707
DECL_SR_CODELET_DEF(4)
708
DECL_SR_CODELET_DEF(8)
709
DECL_SR_CODELET_DEF(16)
710
DECL_SR_CODELET(32,16,8)
711
DECL_SR_CODELET(64,32,16)
712
DECL_SR_CODELET(128,64,32)
713
DECL_SR_CODELET(256,128,64)
714
DECL_SR_CODELET(512,256,128)
715
DECL_SR_CODELET(1024,512,256)
716
DECL_SR_CODELET(2048,1024,512)
717
DECL_SR_CODELET(4096,2048,1024)
718
DECL_SR_CODELET(8192,4096,2048)
719
DECL_SR_CODELET(16384,8192,4096)
720
DECL_SR_CODELET(32768,16384,8192)
721
DECL_SR_CODELET(65536,32768,16384)
722
DECL_SR_CODELET(131072,65536,32768)
723
724
static av_cold int TX_NAME(ff_tx_fft_init)(AVTXContext *s,
725
                                           const FFTXCodelet *cd,
726
                                           uint64_t flags,
727
                                           FFTXCodeletOptions *opts,
728
                                           int len, int inv,
729
                                           const void *scale)
730
10.3k
{
731
10.3k
    int ret;
732
10.3k
    int is_inplace = !!(flags & AV_TX_INPLACE);
733
10.3k
    FFTXCodeletOptions sub_opts = {
734
10.3k
        .map_dir = is_inplace ? FF_TX_MAP_SCATTER : FF_TX_MAP_GATHER,
735
10.3k
    };
736
737
10.3k
    flags &= ~FF_TX_OUT_OF_PLACE; /* We want the subtransform to be */
738
10.3k
    flags |=  AV_TX_INPLACE;      /* in-place */
739
10.3k
    flags |=  FF_TX_PRESHUFFLE;   /* This function handles the permute step */
740
741
10.3k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts, len, inv, scale)))
742
2.10k
        return ret;
743
744
8.24k
    if (is_inplace && (ret = ff_tx_gen_inplace_map(s, len)))
745
0
        return ret;
746
747
8.24k
    return 0;
748
8.24k
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_init_double_c
tx_float.c:ff_tx_fft_init_float_c
Line
Count
Source
730
10.3k
{
731
10.3k
    int ret;
732
10.3k
    int is_inplace = !!(flags & AV_TX_INPLACE);
733
10.3k
    FFTXCodeletOptions sub_opts = {
734
10.3k
        .map_dir = is_inplace ? FF_TX_MAP_SCATTER : FF_TX_MAP_GATHER,
735
10.3k
    };
736
737
10.3k
    flags &= ~FF_TX_OUT_OF_PLACE; /* We want the subtransform to be */
738
10.3k
    flags |=  AV_TX_INPLACE;      /* in-place */
739
10.3k
    flags |=  FF_TX_PRESHUFFLE;   /* This function handles the permute step */
740
741
10.3k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts, len, inv, scale)))
742
2.10k
        return ret;
743
744
8.24k
    if (is_inplace && (ret = ff_tx_gen_inplace_map(s, len)))
745
0
        return ret;
746
747
8.24k
    return 0;
748
8.24k
}
Unexecuted instantiation: tx_int32.c:ff_tx_fft_init_int32_c
749
750
static av_cold int TX_NAME(ff_tx_fft_inplace_small_init)(AVTXContext *s,
751
                                                         const FFTXCodelet *cd,
752
                                                         uint64_t flags,
753
                                                         FFTXCodeletOptions *opts,
754
                                                         int len, int inv,
755
                                                         const void *scale)
756
700
{
757
700
    if (!(s->tmp = av_malloc(len*sizeof(*s->tmp))))
758
0
        return AVERROR(ENOMEM);
759
700
    flags &= ~AV_TX_INPLACE;
760
700
    return TX_NAME(ff_tx_fft_init)(s, cd, flags, opts, len, inv, scale);
761
700
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_inplace_small_init_double_c
tx_float.c:ff_tx_fft_inplace_small_init_float_c
Line
Count
Source
756
700
{
757
700
    if (!(s->tmp = av_malloc(len*sizeof(*s->tmp))))
758
0
        return AVERROR(ENOMEM);
759
700
    flags &= ~AV_TX_INPLACE;
760
700
    return TX_NAME(ff_tx_fft_init)(s, cd, flags, opts, len, inv, scale);
761
700
}
Unexecuted instantiation: tx_int32.c:ff_tx_fft_inplace_small_init_int32_c
762
763
static void TX_NAME(ff_tx_fft)(AVTXContext *s, void *_dst,
764
                               void *_src, ptrdiff_t stride)
765
4.00M
{
766
4.00M
    TXComplex *src = _src;
767
4.00M
    TXComplex *dst1 = s->flags & AV_TX_INPLACE ? s->tmp : _dst;
768
4.00M
    TXComplex *dst2 = _dst;
769
4.00M
    int *map = s->sub[0].map;
770
4.00M
    int len = s->len;
771
772
    /* Compilers can't vectorize this anyway without assuming AVX2, which they
773
     * generally don't, at least without -march=native -mtune=native */
774
761M
    for (int i = 0; i < len; i++)
775
757M
        dst1[i] = src[map[i]];
776
777
4.00M
    s->fn[0](&s->sub[0], dst2, dst1, stride);
778
4.00M
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_double_c
tx_float.c:ff_tx_fft_float_c
Line
Count
Source
765
4.00M
{
766
4.00M
    TXComplex *src = _src;
767
4.00M
    TXComplex *dst1 = s->flags & AV_TX_INPLACE ? s->tmp : _dst;
768
4.00M
    TXComplex *dst2 = _dst;
769
4.00M
    int *map = s->sub[0].map;
770
4.00M
    int len = s->len;
771
772
    /* Compilers can't vectorize this anyway without assuming AVX2, which they
773
     * generally don't, at least without -march=native -mtune=native */
774
761M
    for (int i = 0; i < len; i++)
775
757M
        dst1[i] = src[map[i]];
776
777
4.00M
    s->fn[0](&s->sub[0], dst2, dst1, stride);
778
4.00M
}
Unexecuted instantiation: tx_int32.c:ff_tx_fft_int32_c
779
780
static void TX_NAME(ff_tx_fft_inplace)(AVTXContext *s, void *_dst,
781
                                       void *_src, ptrdiff_t stride)
782
0
{
783
0
    TXComplex *src = _src;
784
0
    TXComplex *dst = _dst;
785
0
    TXComplex tmp;
786
0
    const int *map = s->sub->map;
787
0
    const int *inplace_idx = s->map;
788
0
    int src_idx, dst_idx;
789
790
0
    src_idx = *inplace_idx++;
791
0
    do {
792
0
        tmp = src[src_idx];
793
0
        dst_idx = map[src_idx];
794
0
        do {
795
0
            FFSWAP(TXComplex, tmp, src[dst_idx]);
796
0
            dst_idx = map[dst_idx];
797
0
        } while (dst_idx != src_idx); /* Can be > as well, but was less predictable */
798
0
        src[dst_idx] = tmp;
799
0
    } while ((src_idx = *inplace_idx++));
800
801
0
    s->fn[0](&s->sub[0], dst, src, stride);
802
0
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_inplace_double_c
Unexecuted instantiation: tx_float.c:ff_tx_fft_inplace_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft_inplace_int32_c
803
804
static const FFTXCodelet TX_NAME(ff_tx_fft_def) = {
805
    .name       = TX_NAME_STR("fft"),
806
    .function   = TX_NAME(ff_tx_fft),
807
    .type       = TX_TYPE(FFT),
808
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE,
809
    .factors[0] = TX_FACTOR_ANY,
810
    .nb_factors = 1,
811
    .min_len    = 2,
812
    .max_len    = TX_LEN_UNLIMITED,
813
    .init       = TX_NAME(ff_tx_fft_init),
814
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
815
    .prio       = FF_TX_PRIO_BASE,
816
};
817
818
static const FFTXCodelet TX_NAME(ff_tx_fft_inplace_small_def) = {
819
    .name       = TX_NAME_STR("fft_inplace_small"),
820
    .function   = TX_NAME(ff_tx_fft),
821
    .type       = TX_TYPE(FFT),
822
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE | AV_TX_INPLACE,
823
    .factors[0] = TX_FACTOR_ANY,
824
    .nb_factors = 1,
825
    .min_len    = 2,
826
    .max_len    = 65536,
827
    .init       = TX_NAME(ff_tx_fft_inplace_small_init),
828
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
829
    .prio       = FF_TX_PRIO_BASE - 256,
830
};
831
832
static const FFTXCodelet TX_NAME(ff_tx_fft_inplace_def) = {
833
    .name       = TX_NAME_STR("fft_inplace"),
834
    .function   = TX_NAME(ff_tx_fft_inplace),
835
    .type       = TX_TYPE(FFT),
836
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE | AV_TX_INPLACE,
837
    .factors[0] = TX_FACTOR_ANY,
838
    .nb_factors = 1,
839
    .min_len    = 2,
840
    .max_len    = TX_LEN_UNLIMITED,
841
    .init       = TX_NAME(ff_tx_fft_init),
842
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
843
    .prio       = FF_TX_PRIO_BASE - 512,
844
};
845
846
static av_cold int TX_NAME(ff_tx_fft_init_naive_small)(AVTXContext *s,
847
                                                       const FFTXCodelet *cd,
848
                                                       uint64_t flags,
849
                                                       FFTXCodeletOptions *opts,
850
                                                       int len, int inv,
851
                                                       const void *scale)
852
700
{
853
700
    const double phase = s->inv ? 2.0*M_PI/len : -2.0*M_PI/len;
854
855
700
    if (!(s->exp = av_malloc(len*len*sizeof(*s->exp))))
856
0
        return AVERROR(ENOMEM);
857
858
9.80k
    for (int i = 0; i < len; i++) {
859
127k
        for (int j = 0; j < len; j++) {
860
118k
            const double factor = phase*i*j;
861
118k
            s->exp[i*j] = (TXComplex){
862
118k
                RESCALE(cos(factor)),
863
118k
                RESCALE(sin(factor)),
864
118k
            };
865
118k
        }
866
9.10k
    }
867
868
700
    return 0;
869
700
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_init_naive_small_double_c
tx_float.c:ff_tx_fft_init_naive_small_float_c
Line
Count
Source
852
700
{
853
700
    const double phase = s->inv ? 2.0*M_PI/len : -2.0*M_PI/len;
854
855
700
    if (!(s->exp = av_malloc(len*len*sizeof(*s->exp))))
856
0
        return AVERROR(ENOMEM);
857
858
9.80k
    for (int i = 0; i < len; i++) {
859
127k
        for (int j = 0; j < len; j++) {
860
118k
            const double factor = phase*i*j;
861
118k
            s->exp[i*j] = (TXComplex){
862
118k
                RESCALE(cos(factor)),
863
118k
                RESCALE(sin(factor)),
864
118k
            };
865
118k
        }
866
9.10k
    }
867
868
700
    return 0;
869
700
}
Unexecuted instantiation: tx_int32.c:ff_tx_fft_init_naive_small_int32_c
870
871
static void TX_NAME(ff_tx_fft_naive)(AVTXContext *s, void *_dst, void *_src,
872
                                     ptrdiff_t stride)
873
0
{
874
0
    TXComplex *src = _src;
875
0
    TXComplex *dst = _dst;
876
0
    const int n = s->len;
877
0
    double phase = s->inv ? 2.0*M_PI/n : -2.0*M_PI/n;
878
879
0
    stride /= sizeof(*dst);
880
881
0
    for (int i = 0; i < n; i++) {
882
0
        TXComplex tmp = { 0 };
883
0
        for (int j = 0; j < n; j++) {
884
0
            const double factor = phase*i*j;
885
0
            const TXComplex mult = {
886
0
                RESCALE(cos(factor)),
887
0
                RESCALE(sin(factor)),
888
0
            };
889
0
            TXComplex res;
890
0
            CMUL3(res, src[j], mult);
891
0
            tmp.re += res.re;
892
0
            tmp.im += res.im;
893
0
        }
894
0
        dst[i*stride] = tmp;
895
0
    }
896
0
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_naive_double_c
Unexecuted instantiation: tx_float.c:ff_tx_fft_naive_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft_naive_int32_c
897
898
static void TX_NAME(ff_tx_fft_naive_small)(AVTXContext *s, void *_dst, void *_src,
899
                                           ptrdiff_t stride)
900
1.31M
{
901
1.31M
    TXComplex *src = _src;
902
1.31M
    TXComplex *dst = _dst;
903
1.31M
    const int n = s->len;
904
905
1.31M
    stride /= sizeof(*dst);
906
907
18.3M
    for (int i = 0; i < n; i++) {
908
17.0M
        TXComplex tmp = { 0 };
909
238M
        for (int j = 0; j < n; j++) {
910
221M
            TXComplex res;
911
221M
            const TXComplex mult = s->exp[i*j];
912
221M
            CMUL3(res, src[j], mult);
913
221M
            tmp.re += res.re;
914
221M
            tmp.im += res.im;
915
221M
        }
916
17.0M
        dst[i*stride] = tmp;
917
17.0M
    }
918
1.31M
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_naive_small_double_c
tx_float.c:ff_tx_fft_naive_small_float_c
Line
Count
Source
900
1.31M
{
901
1.31M
    TXComplex *src = _src;
902
1.31M
    TXComplex *dst = _dst;
903
1.31M
    const int n = s->len;
904
905
1.31M
    stride /= sizeof(*dst);
906
907
18.3M
    for (int i = 0; i < n; i++) {
908
17.0M
        TXComplex tmp = { 0 };
909
238M
        for (int j = 0; j < n; j++) {
910
221M
            TXComplex res;
911
221M
            const TXComplex mult = s->exp[i*j];
912
221M
            CMUL3(res, src[j], mult);
913
221M
            tmp.re += res.re;
914
221M
            tmp.im += res.im;
915
221M
        }
916
17.0M
        dst[i*stride] = tmp;
917
17.0M
    }
918
1.31M
}
Unexecuted instantiation: tx_int32.c:ff_tx_fft_naive_small_int32_c
919
920
static const FFTXCodelet TX_NAME(ff_tx_fft_naive_small_def) = {
921
    .name       = TX_NAME_STR("fft_naive_small"),
922
    .function   = TX_NAME(ff_tx_fft_naive_small),
923
    .type       = TX_TYPE(FFT),
924
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE,
925
    .factors[0] = TX_FACTOR_ANY,
926
    .nb_factors = 1,
927
    .min_len    = 2,
928
    .max_len    = 1024,
929
    .init       = TX_NAME(ff_tx_fft_init_naive_small),
930
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
931
    .prio       = FF_TX_PRIO_MIN/2,
932
};
933
934
static const FFTXCodelet TX_NAME(ff_tx_fft_naive_def) = {
935
    .name       = TX_NAME_STR("fft_naive"),
936
    .function   = TX_NAME(ff_tx_fft_naive),
937
    .type       = TX_TYPE(FFT),
938
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE,
939
    .factors[0] = TX_FACTOR_ANY,
940
    .nb_factors = 1,
941
    .min_len    = 2,
942
    .max_len    = TX_LEN_UNLIMITED,
943
    .init       = NULL,
944
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
945
    .prio       = FF_TX_PRIO_MIN,
946
};
947
948
static av_cold int TX_NAME(ff_tx_fft_pfa_init)(AVTXContext *s,
949
                                               const FFTXCodelet *cd,
950
                                               uint64_t flags,
951
                                               FFTXCodeletOptions *opts,
952
                                               int len, int inv,
953
                                               const void *scale)
954
1.09M
{
955
1.09M
    int ret, *tmp, ps = flags & FF_TX_PRESHUFFLE;
956
1.09M
    FFTXCodeletOptions sub_opts = { .map_dir = FF_TX_MAP_GATHER };
957
1.09M
    size_t extra_tmp_len = 0;
958
1.09M
    int len_list[TX_MAX_DECOMPOSITIONS];
959
960
1.09M
    if ((ret = ff_tx_decompose_length(len_list, TX_TYPE(FFT), len, inv)) < 0)
961
1.09M
        return ret;
962
963
    /* Two iterations to test both orderings. */
964
1.40k
    for (int i = 0; i < ret; i++) {
965
1.40k
        int len1 = len_list[i];
966
1.40k
        int len2 = len / len1;
967
968
        /* Our ptwo transforms don't support striding the output. */
969
1.40k
        if (len2 & (len2 - 1))
970
1.40k
            FFSWAP(int, len1, len2);
971
972
1.40k
        ff_tx_clear_ctx(s);
973
974
        /* First transform */
975
1.40k
        sub_opts.map_dir = FF_TX_MAP_GATHER;
976
1.40k
        flags &= ~AV_TX_INPLACE;
977
1.40k
        flags |=  FF_TX_OUT_OF_PLACE;
978
1.40k
        flags |=  FF_TX_PRESHUFFLE; /* This function handles the permute step */
979
1.40k
        ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
980
1.40k
                               len1, inv, scale);
981
982
1.40k
        if (ret == AVERROR(ENOMEM)) {
983
0
            return ret;
984
1.40k
        } else if (ret < 0) { /* Try again without a preshuffle flag */
985
700
            flags &= ~FF_TX_PRESHUFFLE;
986
700
            ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
987
700
                                   len1, inv, scale);
988
700
            if (ret == AVERROR(ENOMEM))
989
0
                return ret;
990
700
            else if (ret < 0)
991
0
                continue;
992
700
        }
993
994
        /* Second transform. */
995
1.40k
        sub_opts.map_dir = FF_TX_MAP_SCATTER;
996
1.40k
        flags |=  FF_TX_PRESHUFFLE;
997
1.40k
retry:
998
1.40k
        flags &= ~FF_TX_OUT_OF_PLACE;
999
1.40k
        flags |=  AV_TX_INPLACE;
1000
1.40k
        ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1001
1.40k
                               len2, inv, scale);
1002
1003
1.40k
        if (ret == AVERROR(ENOMEM)) {
1004
0
            return ret;
1005
1.40k
        } else if (ret < 0) { /* Try again with an out-of-place transform */
1006
0
            flags |= FF_TX_OUT_OF_PLACE;
1007
0
            flags &= ~AV_TX_INPLACE;
1008
0
            ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1009
0
                                   len2, inv, scale);
1010
0
            if (ret == AVERROR(ENOMEM)) {
1011
0
                return ret;
1012
0
            } else if (ret < 0) {
1013
0
                if (flags & FF_TX_PRESHUFFLE) { /* Retry again without a preshuf flag */
1014
0
                    flags &= ~FF_TX_PRESHUFFLE;
1015
0
                    goto retry;
1016
0
                } else {
1017
0
                    continue;
1018
0
                }
1019
0
            }
1020
0
        }
1021
1022
        /* Success */
1023
1.40k
        break;
1024
1.40k
    }
1025
1026
    /* If nothing was successful, error out */
1027
1.40k
    if (ret < 0)
1028
0
        return ret;
1029
1030
    /* Generate PFA map */
1031
1.40k
    if ((ret = ff_tx_gen_compound_mapping(s, opts, 0,
1032
1.40k
                                          s->sub[0].len, s->sub[1].len)))
1033
0
        return ret;
1034
1035
1.40k
    if (!(s->tmp = av_malloc(len*sizeof(*s->tmp))))
1036
0
        return AVERROR(ENOMEM);
1037
1038
    /* Flatten input map */
1039
1.40k
    tmp = (int *)s->tmp;
1040
11.2k
    for (int k = 0; k < len; k += s->sub[0].len) {
1041
9.80k
        memcpy(tmp, &s->map[k], s->sub[0].len*sizeof(*tmp));
1042
99.4k
        for (int i = 0; i < s->sub[0].len; i++)
1043
89.6k
            s->map[k + i] = tmp[s->sub[0].map[i]];
1044
9.80k
    }
1045
1046
    /* Only allocate extra temporary memory if we need it */
1047
1.40k
    if (!(s->sub[1].flags & AV_TX_INPLACE))
1048
0
        extra_tmp_len = len;
1049
1.40k
    else if (!ps)
1050
1.40k
        extra_tmp_len = s->sub[0].len;
1051
1052
1.40k
    if (extra_tmp_len && !(s->exp = av_malloc(extra_tmp_len*sizeof(*s->exp))))
1053
0
        return AVERROR(ENOMEM);
1054
1055
1.40k
    return 0;
1056
1.40k
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_pfa_init_double_c
tx_float.c:ff_tx_fft_pfa_init_float_c
Line
Count
Source
954
875k
{
955
875k
    int ret, *tmp, ps = flags & FF_TX_PRESHUFFLE;
956
875k
    FFTXCodeletOptions sub_opts = { .map_dir = FF_TX_MAP_GATHER };
957
875k
    size_t extra_tmp_len = 0;
958
875k
    int len_list[TX_MAX_DECOMPOSITIONS];
959
960
875k
    if ((ret = ff_tx_decompose_length(len_list, TX_TYPE(FFT), len, inv)) < 0)
961
874k
        return ret;
962
963
    /* Two iterations to test both orderings. */
964
1.40k
    for (int i = 0; i < ret; i++) {
965
1.40k
        int len1 = len_list[i];
966
1.40k
        int len2 = len / len1;
967
968
        /* Our ptwo transforms don't support striding the output. */
969
1.40k
        if (len2 & (len2 - 1))
970
1.40k
            FFSWAP(int, len1, len2);
971
972
1.40k
        ff_tx_clear_ctx(s);
973
974
        /* First transform */
975
1.40k
        sub_opts.map_dir = FF_TX_MAP_GATHER;
976
1.40k
        flags &= ~AV_TX_INPLACE;
977
1.40k
        flags |=  FF_TX_OUT_OF_PLACE;
978
1.40k
        flags |=  FF_TX_PRESHUFFLE; /* This function handles the permute step */
979
1.40k
        ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
980
1.40k
                               len1, inv, scale);
981
982
1.40k
        if (ret == AVERROR(ENOMEM)) {
983
0
            return ret;
984
1.40k
        } else if (ret < 0) { /* Try again without a preshuffle flag */
985
700
            flags &= ~FF_TX_PRESHUFFLE;
986
700
            ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
987
700
                                   len1, inv, scale);
988
700
            if (ret == AVERROR(ENOMEM))
989
0
                return ret;
990
700
            else if (ret < 0)
991
0
                continue;
992
700
        }
993
994
        /* Second transform. */
995
1.40k
        sub_opts.map_dir = FF_TX_MAP_SCATTER;
996
1.40k
        flags |=  FF_TX_PRESHUFFLE;
997
1.40k
retry:
998
1.40k
        flags &= ~FF_TX_OUT_OF_PLACE;
999
1.40k
        flags |=  AV_TX_INPLACE;
1000
1.40k
        ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1001
1.40k
                               len2, inv, scale);
1002
1003
1.40k
        if (ret == AVERROR(ENOMEM)) {
1004
0
            return ret;
1005
1.40k
        } else if (ret < 0) { /* Try again with an out-of-place transform */
1006
0
            flags |= FF_TX_OUT_OF_PLACE;
1007
0
            flags &= ~AV_TX_INPLACE;
1008
0
            ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1009
0
                                   len2, inv, scale);
1010
0
            if (ret == AVERROR(ENOMEM)) {
1011
0
                return ret;
1012
0
            } else if (ret < 0) {
1013
0
                if (flags & FF_TX_PRESHUFFLE) { /* Retry again without a preshuf flag */
1014
0
                    flags &= ~FF_TX_PRESHUFFLE;
1015
0
                    goto retry;
1016
0
                } else {
1017
0
                    continue;
1018
0
                }
1019
0
            }
1020
0
        }
1021
1022
        /* Success */
1023
1.40k
        break;
1024
1.40k
    }
1025
1026
    /* If nothing was successful, error out */
1027
1.40k
    if (ret < 0)
1028
0
        return ret;
1029
1030
    /* Generate PFA map */
1031
1.40k
    if ((ret = ff_tx_gen_compound_mapping(s, opts, 0,
1032
1.40k
                                          s->sub[0].len, s->sub[1].len)))
1033
0
        return ret;
1034
1035
1.40k
    if (!(s->tmp = av_malloc(len*sizeof(*s->tmp))))
1036
0
        return AVERROR(ENOMEM);
1037
1038
    /* Flatten input map */
1039
1.40k
    tmp = (int *)s->tmp;
1040
11.2k
    for (int k = 0; k < len; k += s->sub[0].len) {
1041
9.80k
        memcpy(tmp, &s->map[k], s->sub[0].len*sizeof(*tmp));
1042
99.4k
        for (int i = 0; i < s->sub[0].len; i++)
1043
89.6k
            s->map[k + i] = tmp[s->sub[0].map[i]];
1044
9.80k
    }
1045
1046
    /* Only allocate extra temporary memory if we need it */
1047
1.40k
    if (!(s->sub[1].flags & AV_TX_INPLACE))
1048
0
        extra_tmp_len = len;
1049
1.40k
    else if (!ps)
1050
1.40k
        extra_tmp_len = s->sub[0].len;
1051
1052
1.40k
    if (extra_tmp_len && !(s->exp = av_malloc(extra_tmp_len*sizeof(*s->exp))))
1053
0
        return AVERROR(ENOMEM);
1054
1055
1.40k
    return 0;
1056
1.40k
}
tx_int32.c:ff_tx_fft_pfa_init_int32_c
Line
Count
Source
954
219k
{
955
219k
    int ret, *tmp, ps = flags & FF_TX_PRESHUFFLE;
956
219k
    FFTXCodeletOptions sub_opts = { .map_dir = FF_TX_MAP_GATHER };
957
219k
    size_t extra_tmp_len = 0;
958
219k
    int len_list[TX_MAX_DECOMPOSITIONS];
959
960
219k
    if ((ret = ff_tx_decompose_length(len_list, TX_TYPE(FFT), len, inv)) < 0)
961
219k
        return ret;
962
963
    /* Two iterations to test both orderings. */
964
0
    for (int i = 0; i < ret; i++) {
965
0
        int len1 = len_list[i];
966
0
        int len2 = len / len1;
967
968
        /* Our ptwo transforms don't support striding the output. */
969
0
        if (len2 & (len2 - 1))
970
0
            FFSWAP(int, len1, len2);
971
972
0
        ff_tx_clear_ctx(s);
973
974
        /* First transform */
975
0
        sub_opts.map_dir = FF_TX_MAP_GATHER;
976
0
        flags &= ~AV_TX_INPLACE;
977
0
        flags |=  FF_TX_OUT_OF_PLACE;
978
0
        flags |=  FF_TX_PRESHUFFLE; /* This function handles the permute step */
979
0
        ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
980
0
                               len1, inv, scale);
981
982
0
        if (ret == AVERROR(ENOMEM)) {
983
0
            return ret;
984
0
        } else if (ret < 0) { /* Try again without a preshuffle flag */
985
0
            flags &= ~FF_TX_PRESHUFFLE;
986
0
            ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
987
0
                                   len1, inv, scale);
988
0
            if (ret == AVERROR(ENOMEM))
989
0
                return ret;
990
0
            else if (ret < 0)
991
0
                continue;
992
0
        }
993
994
        /* Second transform. */
995
0
        sub_opts.map_dir = FF_TX_MAP_SCATTER;
996
0
        flags |=  FF_TX_PRESHUFFLE;
997
0
retry:
998
0
        flags &= ~FF_TX_OUT_OF_PLACE;
999
0
        flags |=  AV_TX_INPLACE;
1000
0
        ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1001
0
                               len2, inv, scale);
1002
1003
0
        if (ret == AVERROR(ENOMEM)) {
1004
0
            return ret;
1005
0
        } else if (ret < 0) { /* Try again with an out-of-place transform */
1006
0
            flags |= FF_TX_OUT_OF_PLACE;
1007
0
            flags &= ~AV_TX_INPLACE;
1008
0
            ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1009
0
                                   len2, inv, scale);
1010
0
            if (ret == AVERROR(ENOMEM)) {
1011
0
                return ret;
1012
0
            } else if (ret < 0) {
1013
0
                if (flags & FF_TX_PRESHUFFLE) { /* Retry again without a preshuf flag */
1014
0
                    flags &= ~FF_TX_PRESHUFFLE;
1015
0
                    goto retry;
1016
0
                } else {
1017
0
                    continue;
1018
0
                }
1019
0
            }
1020
0
        }
1021
1022
        /* Success */
1023
0
        break;
1024
0
    }
1025
1026
    /* If nothing was successful, error out */
1027
0
    if (ret < 0)
1028
0
        return ret;
1029
1030
    /* Generate PFA map */
1031
0
    if ((ret = ff_tx_gen_compound_mapping(s, opts, 0,
1032
0
                                          s->sub[0].len, s->sub[1].len)))
1033
0
        return ret;
1034
1035
0
    if (!(s->tmp = av_malloc(len*sizeof(*s->tmp))))
1036
0
        return AVERROR(ENOMEM);
1037
1038
    /* Flatten input map */
1039
0
    tmp = (int *)s->tmp;
1040
0
    for (int k = 0; k < len; k += s->sub[0].len) {
1041
0
        memcpy(tmp, &s->map[k], s->sub[0].len*sizeof(*tmp));
1042
0
        for (int i = 0; i < s->sub[0].len; i++)
1043
0
            s->map[k + i] = tmp[s->sub[0].map[i]];
1044
0
    }
1045
1046
    /* Only allocate extra temporary memory if we need it */
1047
0
    if (!(s->sub[1].flags & AV_TX_INPLACE))
1048
0
        extra_tmp_len = len;
1049
0
    else if (!ps)
1050
0
        extra_tmp_len = s->sub[0].len;
1051
1052
0
    if (extra_tmp_len && !(s->exp = av_malloc(extra_tmp_len*sizeof(*s->exp))))
1053
0
        return AVERROR(ENOMEM);
1054
1055
0
    return 0;
1056
0
}
1057
1058
static void TX_NAME(ff_tx_fft_pfa)(AVTXContext *s, void *_out,
1059
                                   void *_in, ptrdiff_t stride)
1060
524k
{
1061
524k
    const int n = s->sub[0].len, m = s->sub[1].len, l = s->len;
1062
524k
    const int *in_map = s->map, *out_map = in_map + l;
1063
524k
    const int *sub_map = s->sub[1].map;
1064
524k
    TXComplex *tmp1 = s->sub[1].flags & AV_TX_INPLACE ? s->tmp : s->exp;
1065
524k
    TXComplex *in = _in, *out = _out;
1066
1067
524k
    stride /= sizeof(*out);
1068
1069
4.19M
    for (int i = 0; i < m; i++) {
1070
37.2M
        for (int j = 0; j < n; j++)
1071
33.5M
            s->exp[j] = in[in_map[i*n + j]];
1072
3.66M
        s->fn[0](&s->sub[0], &s->tmp[sub_map[i]], s->exp, m*sizeof(TXComplex));
1073
3.66M
    }
1074
1075
5.76M
    for (int i = 0; i < n; i++)
1076
5.24M
        s->fn[1](&s->sub[1], &tmp1[m*i], &s->tmp[m*i], sizeof(TXComplex));
1077
1078
34.0M
    for (int i = 0; i < l; i++)
1079
33.5M
        out[i*stride] = tmp1[out_map[i]];
1080
524k
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_pfa_double_c
tx_float.c:ff_tx_fft_pfa_float_c
Line
Count
Source
1060
524k
{
1061
524k
    const int n = s->sub[0].len, m = s->sub[1].len, l = s->len;
1062
524k
    const int *in_map = s->map, *out_map = in_map + l;
1063
524k
    const int *sub_map = s->sub[1].map;
1064
524k
    TXComplex *tmp1 = s->sub[1].flags & AV_TX_INPLACE ? s->tmp : s->exp;
1065
524k
    TXComplex *in = _in, *out = _out;
1066
1067
524k
    stride /= sizeof(*out);
1068
1069
4.19M
    for (int i = 0; i < m; i++) {
1070
37.2M
        for (int j = 0; j < n; j++)
1071
33.5M
            s->exp[j] = in[in_map[i*n + j]];
1072
3.66M
        s->fn[0](&s->sub[0], &s->tmp[sub_map[i]], s->exp, m*sizeof(TXComplex));
1073
3.66M
    }
1074
1075
5.76M
    for (int i = 0; i < n; i++)
1076
5.24M
        s->fn[1](&s->sub[1], &tmp1[m*i], &s->tmp[m*i], sizeof(TXComplex));
1077
1078
34.0M
    for (int i = 0; i < l; i++)
1079
33.5M
        out[i*stride] = tmp1[out_map[i]];
1080
524k
}
Unexecuted instantiation: tx_int32.c:ff_tx_fft_pfa_int32_c
1081
1082
static void TX_NAME(ff_tx_fft_pfa_ns)(AVTXContext *s, void *_out,
1083
                                      void *_in, ptrdiff_t stride)
1084
0
{
1085
0
    const int n = s->sub[0].len, m = s->sub[1].len, l = s->len;
1086
0
    const int *in_map = s->map, *out_map = in_map + l;
1087
0
    const int *sub_map = s->sub[1].map;
1088
0
    TXComplex *tmp1 = s->sub[1].flags & AV_TX_INPLACE ? s->tmp : s->exp;
1089
0
    TXComplex *in = _in, *out = _out;
1090
1091
0
    stride /= sizeof(*out);
1092
1093
0
    for (int i = 0; i < m; i++)
1094
0
        s->fn[0](&s->sub[0], &s->tmp[sub_map[i]], &in[i*n], m*sizeof(TXComplex));
1095
1096
0
    for (int i = 0; i < n; i++)
1097
0
        s->fn[1](&s->sub[1], &tmp1[m*i], &s->tmp[m*i], sizeof(TXComplex));
1098
1099
0
    for (int i = 0; i < l; i++)
1100
0
        out[i*stride] = tmp1[out_map[i]];
1101
0
}
Unexecuted instantiation: tx_double.c:ff_tx_fft_pfa_ns_double_c
Unexecuted instantiation: tx_float.c:ff_tx_fft_pfa_ns_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_fft_pfa_ns_int32_c
1102
1103
static const FFTXCodelet TX_NAME(ff_tx_fft_pfa_def) = {
1104
    .name       = TX_NAME_STR("fft_pfa"),
1105
    .function   = TX_NAME(ff_tx_fft_pfa),
1106
    .type       = TX_TYPE(FFT),
1107
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE | FF_TX_OUT_OF_PLACE,
1108
    .factors    = { 7, 5, 3, 2, TX_FACTOR_ANY },
1109
    .nb_factors = 2,
1110
    .min_len    = 2*3,
1111
    .max_len    = TX_LEN_UNLIMITED,
1112
    .init       = TX_NAME(ff_tx_fft_pfa_init),
1113
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
1114
    .prio       = FF_TX_PRIO_BASE,
1115
};
1116
1117
static const FFTXCodelet TX_NAME(ff_tx_fft_pfa_ns_def) = {
1118
    .name       = TX_NAME_STR("fft_pfa_ns"),
1119
    .function   = TX_NAME(ff_tx_fft_pfa_ns),
1120
    .type       = TX_TYPE(FFT),
1121
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE | FF_TX_OUT_OF_PLACE |
1122
                  FF_TX_PRESHUFFLE,
1123
    .factors    = { 7, 5, 3, 2, TX_FACTOR_ANY },
1124
    .nb_factors = 2,
1125
    .min_len    = 2*3,
1126
    .max_len    = TX_LEN_UNLIMITED,
1127
    .init       = TX_NAME(ff_tx_fft_pfa_init),
1128
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
1129
    .prio       = FF_TX_PRIO_BASE,
1130
};
1131
1132
static av_cold int TX_NAME(ff_tx_mdct_naive_init)(AVTXContext *s,
1133
                                                  const FFTXCodelet *cd,
1134
                                                  uint64_t flags,
1135
                                                  FFTXCodeletOptions *opts,
1136
                                                  int len, int inv,
1137
                                                  const void *scale)
1138
0
{
1139
0
    s->scale_d = *((SCALE_TYPE *)scale);
1140
0
    s->scale_f = s->scale_d;
1141
0
    return 0;
1142
0
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_naive_init_double_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_naive_init_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_naive_init_int32_c
1143
1144
static void TX_NAME(ff_tx_mdct_naive_fwd)(AVTXContext *s, void *_dst,
1145
                                          void *_src, ptrdiff_t stride)
1146
0
{
1147
0
    TXSample *src = _src;
1148
0
    TXSample *dst = _dst;
1149
0
    double scale = s->scale_d;
1150
0
    int len = s->len;
1151
0
    const double phase = M_PI/(4.0*len);
1152
1153
0
    stride /= sizeof(*dst);
1154
1155
0
    for (int i = 0; i < len; i++) {
1156
0
        double sum = 0.0;
1157
0
        for (int j = 0; j < len*2; j++) {
1158
0
            int a = (2*j + 1 + len) * (2*i + 1);
1159
0
            sum += UNSCALE(src[j]) * cos(a * phase);
1160
0
        }
1161
0
        dst[i*stride] = RESCALE(sum*scale);
1162
0
    }
1163
0
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_naive_fwd_double_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_naive_fwd_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_naive_fwd_int32_c
1164
1165
static void TX_NAME(ff_tx_mdct_naive_inv)(AVTXContext *s, void *_dst,
1166
                                          void *_src, ptrdiff_t stride)
1167
0
{
1168
0
    TXSample *src = _src;
1169
0
    TXSample *dst = _dst;
1170
0
    double scale = s->scale_d;
1171
0
    int len = s->len >> 1;
1172
0
    int len2 = len*2;
1173
0
    const double phase = M_PI/(4.0*len2);
1174
1175
0
    stride /= sizeof(*src);
1176
1177
0
    for (int i = 0; i < len; i++) {
1178
0
        double sum_d = 0.0;
1179
0
        double sum_u = 0.0;
1180
0
        double i_d = phase * (4*len  - 2*i - 1);
1181
0
        double i_u = phase * (3*len2 + 2*i + 1);
1182
0
        for (int j = 0; j < len2; j++) {
1183
0
            double a = (2 * j + 1);
1184
0
            double a_d = cos(a * i_d);
1185
0
            double a_u = cos(a * i_u);
1186
0
            double val = UNSCALE(src[j*stride]);
1187
0
            sum_d += a_d * val;
1188
0
            sum_u += a_u * val;
1189
0
        }
1190
0
        dst[i +   0] = RESCALE( sum_d*scale);
1191
0
        dst[i + len] = RESCALE(-sum_u*scale);
1192
0
    }
1193
0
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_naive_inv_double_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_naive_inv_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_naive_inv_int32_c
1194
1195
static const FFTXCodelet TX_NAME(ff_tx_mdct_naive_fwd_def) = {
1196
    .name       = TX_NAME_STR("mdct_naive_fwd"),
1197
    .function   = TX_NAME(ff_tx_mdct_naive_fwd),
1198
    .type       = TX_TYPE(MDCT),
1199
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE | FF_TX_FORWARD_ONLY,
1200
    .factors    = { 2, TX_FACTOR_ANY }, /* MDCTs need an even length */
1201
    .nb_factors = 2,
1202
    .min_len    = 2,
1203
    .max_len    = TX_LEN_UNLIMITED,
1204
    .init       = TX_NAME(ff_tx_mdct_naive_init),
1205
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
1206
    .prio       = FF_TX_PRIO_MIN,
1207
};
1208
1209
static const FFTXCodelet TX_NAME(ff_tx_mdct_naive_inv_def) = {
1210
    .name       = TX_NAME_STR("mdct_naive_inv"),
1211
    .function   = TX_NAME(ff_tx_mdct_naive_inv),
1212
    .type       = TX_TYPE(MDCT),
1213
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE | FF_TX_INVERSE_ONLY,
1214
    .factors    = { 2, TX_FACTOR_ANY },
1215
    .nb_factors = 2,
1216
    .min_len    = 2,
1217
    .max_len    = TX_LEN_UNLIMITED,
1218
    .init       = TX_NAME(ff_tx_mdct_naive_init),
1219
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
1220
    .prio       = FF_TX_PRIO_MIN,
1221
};
1222
1223
static av_cold int TX_NAME(ff_tx_mdct_init)(AVTXContext *s,
1224
                                            const FFTXCodelet *cd,
1225
                                            uint64_t flags,
1226
                                            FFTXCodeletOptions *opts,
1227
                                            int len, int inv,
1228
                                            const void *scale)
1229
743k
{
1230
743k
    int ret;
1231
743k
    FFTXCodeletOptions sub_opts = {
1232
743k
        .map_dir = !inv ? FF_TX_MAP_SCATTER : FF_TX_MAP_GATHER,
1233
743k
    };
1234
1235
743k
    s->scale_d = *((SCALE_TYPE *)scale);
1236
743k
    s->scale_f = s->scale_d;
1237
1238
743k
    flags &= ~FF_TX_OUT_OF_PLACE; /* We want the subtransform to be */
1239
743k
    flags |=  AV_TX_INPLACE;      /* in-place */
1240
743k
    flags |=  FF_TX_PRESHUFFLE;   /* First try with an in-place transform */
1241
1242
743k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts, len >> 1,
1243
743k
                                inv, scale))) {
1244
0
        flags &= ~FF_TX_PRESHUFFLE; /* Now try with a generic FFT */
1245
0
        if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts, len >> 1,
1246
0
                                    inv, scale)))
1247
0
            return ret;
1248
0
    }
1249
1250
743k
    s->map = av_malloc((len >> 1)*sizeof(*s->map));
1251
743k
    if (!s->map)
1252
0
        return AVERROR(ENOMEM);
1253
1254
    /* If we need to preshuffle copy the map from the subcontext */
1255
743k
    if (s->sub[0].flags & FF_TX_PRESHUFFLE) {
1256
743k
        memcpy(s->map, s->sub->map, (len >> 1)*sizeof(*s->map));
1257
743k
    } else {
1258
0
        for (int i = 0; i < len >> 1; i++)
1259
0
            s->map[i] = i;
1260
0
    }
1261
1262
743k
    if ((ret = TX_TAB(ff_tx_mdct_gen_exp)(s, inv ? s->map : NULL)))
1263
0
        return ret;
1264
1265
    /* Saves a multiply in a hot path. */
1266
743k
    if (inv)
1267
123M
        for (int i = 0; i < (s->len >> 1); i++)
1268
122M
            s->map[i] <<= 1;
1269
1270
743k
    return 0;
1271
743k
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_init_double_c
tx_float.c:ff_tx_mdct_init_float_c
Line
Count
Source
1229
571k
{
1230
571k
    int ret;
1231
571k
    FFTXCodeletOptions sub_opts = {
1232
571k
        .map_dir = !inv ? FF_TX_MAP_SCATTER : FF_TX_MAP_GATHER,
1233
571k
    };
1234
1235
571k
    s->scale_d = *((SCALE_TYPE *)scale);
1236
571k
    s->scale_f = s->scale_d;
1237
1238
571k
    flags &= ~FF_TX_OUT_OF_PLACE; /* We want the subtransform to be */
1239
571k
    flags |=  AV_TX_INPLACE;      /* in-place */
1240
571k
    flags |=  FF_TX_PRESHUFFLE;   /* First try with an in-place transform */
1241
1242
571k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts, len >> 1,
1243
571k
                                inv, scale))) {
1244
0
        flags &= ~FF_TX_PRESHUFFLE; /* Now try with a generic FFT */
1245
0
        if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts, len >> 1,
1246
0
                                    inv, scale)))
1247
0
            return ret;
1248
0
    }
1249
1250
571k
    s->map = av_malloc((len >> 1)*sizeof(*s->map));
1251
571k
    if (!s->map)
1252
0
        return AVERROR(ENOMEM);
1253
1254
    /* If we need to preshuffle copy the map from the subcontext */
1255
571k
    if (s->sub[0].flags & FF_TX_PRESHUFFLE) {
1256
571k
        memcpy(s->map, s->sub->map, (len >> 1)*sizeof(*s->map));
1257
571k
    } else {
1258
0
        for (int i = 0; i < len >> 1; i++)
1259
0
            s->map[i] = i;
1260
0
    }
1261
1262
571k
    if ((ret = TX_TAB(ff_tx_mdct_gen_exp)(s, inv ? s->map : NULL)))
1263
0
        return ret;
1264
1265
    /* Saves a multiply in a hot path. */
1266
571k
    if (inv)
1267
108M
        for (int i = 0; i < (s->len >> 1); i++)
1268
108M
            s->map[i] <<= 1;
1269
1270
571k
    return 0;
1271
571k
}
tx_int32.c:ff_tx_mdct_init_int32_c
Line
Count
Source
1229
171k
{
1230
171k
    int ret;
1231
171k
    FFTXCodeletOptions sub_opts = {
1232
171k
        .map_dir = !inv ? FF_TX_MAP_SCATTER : FF_TX_MAP_GATHER,
1233
171k
    };
1234
1235
171k
    s->scale_d = *((SCALE_TYPE *)scale);
1236
171k
    s->scale_f = s->scale_d;
1237
1238
171k
    flags &= ~FF_TX_OUT_OF_PLACE; /* We want the subtransform to be */
1239
171k
    flags |=  AV_TX_INPLACE;      /* in-place */
1240
171k
    flags |=  FF_TX_PRESHUFFLE;   /* First try with an in-place transform */
1241
1242
171k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts, len >> 1,
1243
171k
                                inv, scale))) {
1244
0
        flags &= ~FF_TX_PRESHUFFLE; /* Now try with a generic FFT */
1245
0
        if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts, len >> 1,
1246
0
                                    inv, scale)))
1247
0
            return ret;
1248
0
    }
1249
1250
171k
    s->map = av_malloc((len >> 1)*sizeof(*s->map));
1251
171k
    if (!s->map)
1252
0
        return AVERROR(ENOMEM);
1253
1254
    /* If we need to preshuffle copy the map from the subcontext */
1255
171k
    if (s->sub[0].flags & FF_TX_PRESHUFFLE) {
1256
171k
        memcpy(s->map, s->sub->map, (len >> 1)*sizeof(*s->map));
1257
171k
    } else {
1258
0
        for (int i = 0; i < len >> 1; i++)
1259
0
            s->map[i] = i;
1260
0
    }
1261
1262
171k
    if ((ret = TX_TAB(ff_tx_mdct_gen_exp)(s, inv ? s->map : NULL)))
1263
0
        return ret;
1264
1265
    /* Saves a multiply in a hot path. */
1266
171k
    if (inv)
1267
14.8M
        for (int i = 0; i < (s->len >> 1); i++)
1268
14.7M
            s->map[i] <<= 1;
1269
1270
171k
    return 0;
1271
171k
}
1272
1273
static void TX_NAME(ff_tx_mdct_fwd)(AVTXContext *s, void *_dst, void *_src,
1274
                                    ptrdiff_t stride)
1275
52.4k
{
1276
52.4k
    TXSample *src = _src, *dst = _dst;
1277
52.4k
    TXComplex *exp = s->exp, tmp, *z = _dst;
1278
52.4k
    const int len2 = s->len >> 1;
1279
52.4k
    const int len4 = s->len >> 2;
1280
52.4k
    const int len3 = len2 * 3;
1281
52.4k
    const int *sub_map = s->map;
1282
1283
52.4k
    stride /= sizeof(*dst);
1284
1285
26.8M
    for (int i = 0; i < len2; i++) { /* Folding and pre-reindexing */
1286
26.8M
        const int k = 2*i;
1287
26.8M
        const int idx = sub_map[i];
1288
26.8M
        if (k < len2) {
1289
13.4M
            tmp.re = FOLD(-src[ len2 + k],  src[1*len2 - 1 - k]);
1290
13.4M
            tmp.im = FOLD(-src[ len3 + k], -src[1*len3 - 1 - k]);
1291
13.4M
        } else {
1292
13.4M
            tmp.re = FOLD(-src[ len2 + k], -src[5*len2 - 1 - k]);
1293
13.4M
            tmp.im = FOLD( src[-len2 + k], -src[1*len3 - 1 - k]);
1294
13.4M
        }
1295
26.8M
        CMUL(z[idx].im, z[idx].re, tmp.re, tmp.im, exp[i].re, exp[i].im);
1296
26.8M
    }
1297
1298
52.4k
    s->fn[0](&s->sub[0], z, z, sizeof(TXComplex));
1299
1300
13.4M
    for (int i = 0; i < len4; i++) {
1301
13.4M
        const int i0 = len4 + i, i1 = len4 - i - 1;
1302
13.4M
        TXComplex src1 = { z[i1].re, z[i1].im };
1303
13.4M
        TXComplex src0 = { z[i0].re, z[i0].im };
1304
1305
13.4M
        CMUL(dst[2*i1*stride + stride], dst[2*i0*stride], src0.re, src0.im,
1306
13.4M
             exp[i0].im, exp[i0].re);
1307
13.4M
        CMUL(dst[2*i0*stride + stride], dst[2*i1*stride], src1.re, src1.im,
1308
13.4M
             exp[i1].im, exp[i1].re);
1309
13.4M
    }
1310
52.4k
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_fwd_double_c
tx_float.c:ff_tx_mdct_fwd_float_c
Line
Count
Source
1275
18.9k
{
1276
18.9k
    TXSample *src = _src, *dst = _dst;
1277
18.9k
    TXComplex *exp = s->exp, tmp, *z = _dst;
1278
18.9k
    const int len2 = s->len >> 1;
1279
18.9k
    const int len4 = s->len >> 2;
1280
18.9k
    const int len3 = len2 * 3;
1281
18.9k
    const int *sub_map = s->map;
1282
1283
18.9k
    stride /= sizeof(*dst);
1284
1285
9.73M
    for (int i = 0; i < len2; i++) { /* Folding and pre-reindexing */
1286
9.71M
        const int k = 2*i;
1287
9.71M
        const int idx = sub_map[i];
1288
9.71M
        if (k < len2) {
1289
4.85M
            tmp.re = FOLD(-src[ len2 + k],  src[1*len2 - 1 - k]);
1290
4.85M
            tmp.im = FOLD(-src[ len3 + k], -src[1*len3 - 1 - k]);
1291
4.85M
        } else {
1292
4.85M
            tmp.re = FOLD(-src[ len2 + k], -src[5*len2 - 1 - k]);
1293
4.85M
            tmp.im = FOLD( src[-len2 + k], -src[1*len3 - 1 - k]);
1294
4.85M
        }
1295
9.71M
        CMUL(z[idx].im, z[idx].re, tmp.re, tmp.im, exp[i].re, exp[i].im);
1296
9.71M
    }
1297
1298
18.9k
    s->fn[0](&s->sub[0], z, z, sizeof(TXComplex));
1299
1300
4.87M
    for (int i = 0; i < len4; i++) {
1301
4.85M
        const int i0 = len4 + i, i1 = len4 - i - 1;
1302
4.85M
        TXComplex src1 = { z[i1].re, z[i1].im };
1303
4.85M
        TXComplex src0 = { z[i0].re, z[i0].im };
1304
1305
4.85M
        CMUL(dst[2*i1*stride + stride], dst[2*i0*stride], src0.re, src0.im,
1306
4.85M
             exp[i0].im, exp[i0].re);
1307
4.85M
        CMUL(dst[2*i0*stride + stride], dst[2*i1*stride], src1.re, src1.im,
1308
4.85M
             exp[i1].im, exp[i1].re);
1309
4.85M
    }
1310
18.9k
}
tx_int32.c:ff_tx_mdct_fwd_int32_c
Line
Count
Source
1275
33.4k
{
1276
33.4k
    TXSample *src = _src, *dst = _dst;
1277
33.4k
    TXComplex *exp = s->exp, tmp, *z = _dst;
1278
33.4k
    const int len2 = s->len >> 1;
1279
33.4k
    const int len4 = s->len >> 2;
1280
33.4k
    const int len3 = len2 * 3;
1281
33.4k
    const int *sub_map = s->map;
1282
1283
33.4k
    stride /= sizeof(*dst);
1284
1285
17.1M
    for (int i = 0; i < len2; i++) { /* Folding and pre-reindexing */
1286
17.1M
        const int k = 2*i;
1287
17.1M
        const int idx = sub_map[i];
1288
17.1M
        if (k < len2) {
1289
8.56M
            tmp.re = FOLD(-src[ len2 + k],  src[1*len2 - 1 - k]);
1290
8.56M
            tmp.im = FOLD(-src[ len3 + k], -src[1*len3 - 1 - k]);
1291
8.56M
        } else {
1292
8.56M
            tmp.re = FOLD(-src[ len2 + k], -src[5*len2 - 1 - k]);
1293
8.56M
            tmp.im = FOLD( src[-len2 + k], -src[1*len3 - 1 - k]);
1294
8.56M
        }
1295
17.1M
        CMUL(z[idx].im, z[idx].re, tmp.re, tmp.im, exp[i].re, exp[i].im);
1296
17.1M
    }
1297
1298
33.4k
    s->fn[0](&s->sub[0], z, z, sizeof(TXComplex));
1299
1300
8.59M
    for (int i = 0; i < len4; i++) {
1301
8.56M
        const int i0 = len4 + i, i1 = len4 - i - 1;
1302
8.56M
        TXComplex src1 = { z[i1].re, z[i1].im };
1303
8.56M
        TXComplex src0 = { z[i0].re, z[i0].im };
1304
1305
8.56M
        CMUL(dst[2*i1*stride + stride], dst[2*i0*stride], src0.re, src0.im,
1306
8.56M
             exp[i0].im, exp[i0].re);
1307
8.56M
        CMUL(dst[2*i0*stride + stride], dst[2*i1*stride], src1.re, src1.im,
1308
8.56M
             exp[i1].im, exp[i1].re);
1309
8.56M
    }
1310
33.4k
}
1311
1312
static void TX_NAME(ff_tx_mdct_inv)(AVTXContext *s, void *_dst, void *_src,
1313
                                    ptrdiff_t stride)
1314
283M
{
1315
283M
    TXComplex *z = _dst, *exp = s->exp;
1316
283M
    const TXSample *src = _src, *in1, *in2;
1317
283M
    const int len2 = s->len >> 1;
1318
283M
    const int len4 = s->len >> 2;
1319
283M
    const int *sub_map = s->map;
1320
1321
283M
    stride /= sizeof(*src);
1322
283M
    in1 = src;
1323
283M
    in2 = src + ((len2*2) - 1) * stride;
1324
1325
10.4G
    for (int i = 0; i < len2; i++) {
1326
10.1G
        int k = sub_map[i];
1327
10.1G
        TXComplex tmp = { in2[-k*stride], in1[k*stride] };
1328
10.1G
        CMUL3(z[i], tmp, exp[i]);
1329
10.1G
    }
1330
1331
283M
    s->fn[0](&s->sub[0], z, z, sizeof(TXComplex));
1332
1333
283M
    exp += len2;
1334
5.35G
    for (int i = 0; i < len4; i++) {
1335
5.07G
        const int i0 = len4 + i, i1 = len4 - i - 1;
1336
5.07G
        TXComplex src1 = { z[i1].im, z[i1].re };
1337
5.07G
        TXComplex src0 = { z[i0].im, z[i0].re };
1338
1339
5.07G
        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);
1340
5.07G
        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);
1341
5.07G
    }
1342
283M
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_inv_double_c
tx_float.c:ff_tx_mdct_inv_float_c
Line
Count
Source
1314
243M
{
1315
243M
    TXComplex *z = _dst, *exp = s->exp;
1316
243M
    const TXSample *src = _src, *in1, *in2;
1317
243M
    const int len2 = s->len >> 1;
1318
243M
    const int len4 = s->len >> 2;
1319
243M
    const int *sub_map = s->map;
1320
1321
243M
    stride /= sizeof(*src);
1322
243M
    in1 = src;
1323
243M
    in2 = src + ((len2*2) - 1) * stride;
1324
1325
8.63G
    for (int i = 0; i < len2; i++) {
1326
8.39G
        int k = sub_map[i];
1327
8.39G
        TXComplex tmp = { in2[-k*stride], in1[k*stride] };
1328
8.39G
        CMUL3(z[i], tmp, exp[i]);
1329
8.39G
    }
1330
1331
243M
    s->fn[0](&s->sub[0], z, z, sizeof(TXComplex));
1332
1333
243M
    exp += len2;
1334
4.44G
    for (int i = 0; i < len4; i++) {
1335
4.19G
        const int i0 = len4 + i, i1 = len4 - i - 1;
1336
4.19G
        TXComplex src1 = { z[i1].im, z[i1].re };
1337
4.19G
        TXComplex src0 = { z[i0].im, z[i0].re };
1338
1339
4.19G
        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);
1340
4.19G
        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);
1341
4.19G
    }
1342
243M
}
tx_int32.c:ff_tx_mdct_inv_int32_c
Line
Count
Source
1314
39.4M
{
1315
39.4M
    TXComplex *z = _dst, *exp = s->exp;
1316
39.4M
    const TXSample *src = _src, *in1, *in2;
1317
39.4M
    const int len2 = s->len >> 1;
1318
39.4M
    const int len4 = s->len >> 2;
1319
39.4M
    const int *sub_map = s->map;
1320
1321
39.4M
    stride /= sizeof(*src);
1322
39.4M
    in1 = src;
1323
39.4M
    in2 = src + ((len2*2) - 1) * stride;
1324
1325
1.78G
    for (int i = 0; i < len2; i++) {
1326
1.75G
        int k = sub_map[i];
1327
1.75G
        TXComplex tmp = { in2[-k*stride], in1[k*stride] };
1328
1.75G
        CMUL3(z[i], tmp, exp[i]);
1329
1.75G
    }
1330
1331
39.4M
    s->fn[0](&s->sub[0], z, z, sizeof(TXComplex));
1332
1333
39.4M
    exp += len2;
1334
914M
    for (int i = 0; i < len4; i++) {
1335
875M
        const int i0 = len4 + i, i1 = len4 - i - 1;
1336
875M
        TXComplex src1 = { z[i1].im, z[i1].re };
1337
875M
        TXComplex src0 = { z[i0].im, z[i0].re };
1338
1339
875M
        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);
1340
875M
        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);
1341
875M
    }
1342
39.4M
}
1343
1344
static const FFTXCodelet TX_NAME(ff_tx_mdct_fwd_def) = {
1345
    .name       = TX_NAME_STR("mdct_fwd"),
1346
    .function   = TX_NAME(ff_tx_mdct_fwd),
1347
    .type       = TX_TYPE(MDCT),
1348
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE | FF_TX_FORWARD_ONLY,
1349
    .factors    = { 2, TX_FACTOR_ANY },
1350
    .nb_factors = 2,
1351
    .min_len    = 2,
1352
    .max_len    = TX_LEN_UNLIMITED,
1353
    .init       = TX_NAME(ff_tx_mdct_init),
1354
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
1355
    .prio       = FF_TX_PRIO_BASE,
1356
};
1357
1358
static const FFTXCodelet TX_NAME(ff_tx_mdct_inv_def) = {
1359
    .name       = TX_NAME_STR("mdct_inv"),
1360
    .function   = TX_NAME(ff_tx_mdct_inv),
1361
    .type       = TX_TYPE(MDCT),
1362
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE | FF_TX_INVERSE_ONLY,
1363
    .factors    = { 2, TX_FACTOR_ANY },
1364
    .nb_factors = 2,
1365
    .min_len    = 2,
1366
    .max_len    = TX_LEN_UNLIMITED,
1367
    .init       = TX_NAME(ff_tx_mdct_init),
1368
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
1369
    .prio       = FF_TX_PRIO_BASE,
1370
};
1371
1372
static av_cold int TX_NAME(ff_tx_mdct_inv_full_init)(AVTXContext *s,
1373
                                                     const FFTXCodelet *cd,
1374
                                                     uint64_t flags,
1375
                                                     FFTXCodeletOptions *opts,
1376
                                                     int len, int inv,
1377
                                                     const void *scale)
1378
37.2k
{
1379
37.2k
    int ret;
1380
1381
37.2k
    s->scale_d = *((SCALE_TYPE *)scale);
1382
37.2k
    s->scale_f = s->scale_d;
1383
1384
37.2k
    flags &= ~AV_TX_FULL_IMDCT;
1385
1386
37.2k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(MDCT), flags, NULL, len, 1, scale)))
1387
0
        return ret;
1388
1389
37.2k
    return 0;
1390
37.2k
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_inv_full_init_double_c
tx_float.c:ff_tx_mdct_inv_full_init_float_c
Line
Count
Source
1378
37.2k
{
1379
37.2k
    int ret;
1380
1381
37.2k
    s->scale_d = *((SCALE_TYPE *)scale);
1382
37.2k
    s->scale_f = s->scale_d;
1383
1384
37.2k
    flags &= ~AV_TX_FULL_IMDCT;
1385
1386
37.2k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(MDCT), flags, NULL, len, 1, scale)))
1387
0
        return ret;
1388
1389
37.2k
    return 0;
1390
37.2k
}
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_inv_full_init_int32_c
1391
1392
static void TX_NAME(ff_tx_mdct_inv_full)(AVTXContext *s, void *_dst,
1393
                                         void *_src, ptrdiff_t stride)
1394
5.34M
{
1395
5.34M
    int len  = s->len << 1;
1396
5.34M
    int len2 = len >> 1;
1397
5.34M
    int len4 = len >> 2;
1398
5.34M
    TXSample *dst = _dst;
1399
1400
5.34M
    s->fn[0](&s->sub[0], dst + len4, _src, stride);
1401
1402
5.34M
    stride /= sizeof(*dst);
1403
1404
596M
    for (int i = 0; i < len4; i++) {
1405
591M
        dst[            i*stride] = -dst[(len2 - i - 1)*stride];
1406
591M
        dst[(len - i - 1)*stride] =  dst[(len2 + i + 0)*stride];
1407
591M
    }
1408
5.34M
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_inv_full_double_c
tx_float.c:ff_tx_mdct_inv_full_float_c
Line
Count
Source
1394
5.34M
{
1395
5.34M
    int len  = s->len << 1;
1396
5.34M
    int len2 = len >> 1;
1397
5.34M
    int len4 = len >> 2;
1398
5.34M
    TXSample *dst = _dst;
1399
1400
5.34M
    s->fn[0](&s->sub[0], dst + len4, _src, stride);
1401
1402
5.34M
    stride /= sizeof(*dst);
1403
1404
596M
    for (int i = 0; i < len4; i++) {
1405
591M
        dst[            i*stride] = -dst[(len2 - i - 1)*stride];
1406
591M
        dst[(len - i - 1)*stride] =  dst[(len2 + i + 0)*stride];
1407
591M
    }
1408
5.34M
}
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_inv_full_int32_c
1409
1410
static const FFTXCodelet TX_NAME(ff_tx_mdct_inv_full_def) = {
1411
    .name       = TX_NAME_STR("mdct_inv_full"),
1412
    .function   = TX_NAME(ff_tx_mdct_inv_full),
1413
    .type       = TX_TYPE(MDCT),
1414
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE |
1415
                  FF_TX_OUT_OF_PLACE | AV_TX_FULL_IMDCT,
1416
    .factors    = { 2, TX_FACTOR_ANY },
1417
    .nb_factors = 2,
1418
    .min_len    = 2,
1419
    .max_len    = TX_LEN_UNLIMITED,
1420
    .init       = TX_NAME(ff_tx_mdct_inv_full_init),
1421
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
1422
    .prio       = FF_TX_PRIO_BASE,
1423
};
1424
1425
static av_cold int TX_NAME(ff_tx_mdct_pfa_init)(AVTXContext *s,
1426
                                                const FFTXCodelet *cd,
1427
                                                uint64_t flags,
1428
                                                FFTXCodeletOptions *opts,
1429
                                                int len, int inv,
1430
                                                const void *scale)
1431
432k
{
1432
432k
    int ret, sub_len;
1433
432k
    FFTXCodeletOptions sub_opts = { .map_dir = FF_TX_MAP_SCATTER };
1434
1435
432k
    len >>= 1;
1436
432k
    sub_len = len / cd->factors[0];
1437
1438
432k
    s->scale_d = *((SCALE_TYPE *)scale);
1439
432k
    s->scale_f = s->scale_d;
1440
1441
432k
    flags &= ~FF_TX_OUT_OF_PLACE; /* We want the subtransform to be */
1442
432k
    flags |=  AV_TX_INPLACE;      /* in-place */
1443
432k
    flags |=  FF_TX_PRESHUFFLE;   /* This function handles the permute step */
1444
1445
432k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1446
432k
                                sub_len, inv, scale)))
1447
0
        return ret;
1448
1449
432k
    if ((ret = ff_tx_gen_compound_mapping(s, opts, s->inv, cd->factors[0], sub_len)))
1450
0
        return ret;
1451
1452
    /* Our 15-point transform is also a compound one, so embed its input map */
1453
432k
    if (cd->factors[0] == 15)
1454
362k
        TX_EMBED_INPUT_PFA_MAP(s->map, len, 3, 5);
1455
1456
432k
    if ((ret = TX_TAB(ff_tx_mdct_gen_exp)(s, inv ? s->map : NULL)))
1457
0
        return ret;
1458
1459
    /* Saves multiplies in loops. */
1460
100M
    for (int i = 0; i < len; i++)
1461
100M
        s->map[i] <<= 1;
1462
1463
432k
    if (!(s->tmp = av_malloc(len*sizeof(*s->tmp))))
1464
0
        return AVERROR(ENOMEM);
1465
1466
432k
    TX_TAB(ff_tx_init_tabs)(len / sub_len);
1467
1468
432k
    return 0;
1469
432k
}
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_init_double_c
tx_float.c:ff_tx_mdct_pfa_init_float_c
Line
Count
Source
1431
373k
{
1432
373k
    int ret, sub_len;
1433
373k
    FFTXCodeletOptions sub_opts = { .map_dir = FF_TX_MAP_SCATTER };
1434
1435
373k
    len >>= 1;
1436
373k
    sub_len = len / cd->factors[0];
1437
1438
373k
    s->scale_d = *((SCALE_TYPE *)scale);
1439
373k
    s->scale_f = s->scale_d;
1440
1441
373k
    flags &= ~FF_TX_OUT_OF_PLACE; /* We want the subtransform to be */
1442
373k
    flags |=  AV_TX_INPLACE;      /* in-place */
1443
373k
    flags |=  FF_TX_PRESHUFFLE;   /* This function handles the permute step */
1444
1445
373k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1446
373k
                                sub_len, inv, scale)))
1447
0
        return ret;
1448
1449
373k
    if ((ret = ff_tx_gen_compound_mapping(s, opts, s->inv, cd->factors[0], sub_len)))
1450
0
        return ret;
1451
1452
    /* Our 15-point transform is also a compound one, so embed its input map */
1453
373k
    if (cd->factors[0] == 15)
1454
326k
        TX_EMBED_INPUT_PFA_MAP(s->map, len, 3, 5);
1455
1456
373k
    if ((ret = TX_TAB(ff_tx_mdct_gen_exp)(s, inv ? s->map : NULL)))
1457
0
        return ret;
1458
1459
    /* Saves multiplies in loops. */
1460
86.1M
    for (int i = 0; i < len; i++)
1461
85.8M
        s->map[i] <<= 1;
1462
1463
373k
    if (!(s->tmp = av_malloc(len*sizeof(*s->tmp))))
1464
0
        return AVERROR(ENOMEM);
1465
1466
373k
    TX_TAB(ff_tx_init_tabs)(len / sub_len);
1467
1468
373k
    return 0;
1469
373k
}
tx_int32.c:ff_tx_mdct_pfa_init_int32_c
Line
Count
Source
1431
59.4k
{
1432
59.4k
    int ret, sub_len;
1433
59.4k
    FFTXCodeletOptions sub_opts = { .map_dir = FF_TX_MAP_SCATTER };
1434
1435
59.4k
    len >>= 1;
1436
59.4k
    sub_len = len / cd->factors[0];
1437
1438
59.4k
    s->scale_d = *((SCALE_TYPE *)scale);
1439
59.4k
    s->scale_f = s->scale_d;
1440
1441
59.4k
    flags &= ~FF_TX_OUT_OF_PLACE; /* We want the subtransform to be */
1442
59.4k
    flags |=  AV_TX_INPLACE;      /* in-place */
1443
59.4k
    flags |=  FF_TX_PRESHUFFLE;   /* This function handles the permute step */
1444
1445
59.4k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, &sub_opts,
1446
59.4k
                                sub_len, inv, scale)))
1447
0
        return ret;
1448
1449
59.4k
    if ((ret = ff_tx_gen_compound_mapping(s, opts, s->inv, cd->factors[0], sub_len)))
1450
0
        return ret;
1451
1452
    /* Our 15-point transform is also a compound one, so embed its input map */
1453
59.4k
    if (cd->factors[0] == 15)
1454
35.6k
        TX_EMBED_INPUT_PFA_MAP(s->map, len, 3, 5);
1455
1456
59.4k
    if ((ret = TX_TAB(ff_tx_mdct_gen_exp)(s, inv ? s->map : NULL)))
1457
0
        return ret;
1458
1459
    /* Saves multiplies in loops. */
1460
14.4M
    for (int i = 0; i < len; i++)
1461
14.4M
        s->map[i] <<= 1;
1462
1463
59.4k
    if (!(s->tmp = av_malloc(len*sizeof(*s->tmp))))
1464
0
        return AVERROR(ENOMEM);
1465
1466
59.4k
    TX_TAB(ff_tx_init_tabs)(len / sub_len);
1467
1468
59.4k
    return 0;
1469
59.4k
}
1470
1471
#define DECL_COMP_IMDCT(N)                                                     \
1472
static void TX_NAME(ff_tx_mdct_pfa_##N##xM_inv)(AVTXContext *s, void *_dst,    \
1473
2.08M
                                                void *_src, ptrdiff_t stride)  \
1474
2.08M
{                                                                              \
1475
2.08M
    TXComplex fft##N##in[N];                                                   \
1476
2.08M
    TXComplex *z = _dst, *exp = s->exp;                                        \
1477
2.08M
    const TXSample *src = _src, *in1, *in2;                                    \
1478
2.08M
    const int len4 = s->len >> 2;                                              \
1479
2.08M
    const int len2 = s->len >> 1;                                              \
1480
2.08M
    const int m = s->sub->len;                                                 \
1481
2.08M
    const int *in_map = s->map, *out_map = in_map + N*m;                       \
1482
2.08M
    const int *sub_map = s->sub->map;                                          \
1483
2.08M
                                                                               \
1484
2.08M
    stride /= sizeof(*src); /* To convert it from bytes */                     \
1485
2.08M
    in1 = src;                                                                 \
1486
2.08M
    in2 = src + ((N*m*2) - 1) * stride;                                        \
1487
2.08M
                                                                               \
1488
97.0M
    for (int i = 0; i < len2; i += N) {                                        \
1489
491M
        for (int j = 0; j < N; j++) {                                          \
1490
396M
            const int k = in_map[j];                                           \
1491
396M
            TXComplex tmp = { in2[-k*stride], in1[k*stride] };                 \
1492
396M
            CMUL3(fft##N##in[j], tmp, exp[j]);                                 \
1493
396M
        }                                                                      \
1494
94.9M
        fft##N(s->tmp + *(sub_map++), fft##N##in, m);                          \
1495
94.9M
        exp += N;                                                              \
1496
94.9M
        in_map += N;                                                           \
1497
94.9M
    }                                                                          \
1498
2.08M
                                                                               \
1499
14.5M
    for (int i = 0; i < N; i++)                                                \
1500
12.4M
        s->fn[0](&s->sub[0], s->tmp + m*i, s->tmp + m*i, sizeof(TXComplex));   \
1501
2.08M
                                                                               \
1502
200M
    for (int i = 0; i < len4; i++) {                                           \
1503
198M
        const int i0 = len4 + i, i1 = len4 - i - 1;                            \
1504
198M
        const int s0 = out_map[i0], s1 = out_map[i1];                          \
1505
198M
        TXComplex src1 = { s->tmp[s1].im, s->tmp[s1].re };                     \
1506
198M
        TXComplex src0 = { s->tmp[s0].im, s->tmp[s0].re };                     \
1507
198M
                                                                               \
1508
198M
        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);    \
1509
198M
        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);    \
1510
198M
    }                                                                          \
1511
2.08M
}                                                                              \
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_3xM_inv_double_c
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_5xM_inv_double_c
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_7xM_inv_double_c
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_9xM_inv_double_c
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_15xM_inv_double_c
tx_float.c:ff_tx_mdct_pfa_3xM_inv_float_c
Line
Count
Source
1473
881k
                                                void *_src, ptrdiff_t stride)  \
1474
881k
{                                                                              \
1475
881k
    TXComplex fft##N##in[N];                                                   \
1476
881k
    TXComplex *z = _dst, *exp = s->exp;                                        \
1477
881k
    const TXSample *src = _src, *in1, *in2;                                    \
1478
881k
    const int len4 = s->len >> 2;                                              \
1479
881k
    const int len2 = s->len >> 1;                                              \
1480
881k
    const int m = s->sub->len;                                                 \
1481
881k
    const int *in_map = s->map, *out_map = in_map + N*m;                       \
1482
881k
    const int *sub_map = s->sub->map;                                          \
1483
881k
                                                                               \
1484
881k
    stride /= sizeof(*src); /* To convert it from bytes */                     \
1485
881k
    in1 = src;                                                                 \
1486
881k
    in2 = src + ((N*m*2) - 1) * stride;                                        \
1487
881k
                                                                               \
1488
64.7M
    for (int i = 0; i < len2; i += N) {                                        \
1489
255M
        for (int j = 0; j < N; j++) {                                          \
1490
191M
            const int k = in_map[j];                                           \
1491
191M
            TXComplex tmp = { in2[-k*stride], in1[k*stride] };                 \
1492
191M
            CMUL3(fft##N##in[j], tmp, exp[j]);                                 \
1493
191M
        }                                                                      \
1494
63.8M
        fft##N(s->tmp + *(sub_map++), fft##N##in, m);                          \
1495
63.8M
        exp += N;                                                              \
1496
63.8M
        in_map += N;                                                           \
1497
63.8M
    }                                                                          \
1498
881k
                                                                               \
1499
3.52M
    for (int i = 0; i < N; i++)                                                \
1500
2.64M
        s->fn[0](&s->sub[0], s->tmp + m*i, s->tmp + m*i, sizeof(TXComplex));   \
1501
881k
                                                                               \
1502
96.6M
    for (int i = 0; i < len4; i++) {                                           \
1503
95.7M
        const int i0 = len4 + i, i1 = len4 - i - 1;                            \
1504
95.7M
        const int s0 = out_map[i0], s1 = out_map[i1];                          \
1505
95.7M
        TXComplex src1 = { s->tmp[s1].im, s->tmp[s1].re };                     \
1506
95.7M
        TXComplex src0 = { s->tmp[s0].im, s->tmp[s0].re };                     \
1507
95.7M
                                                                               \
1508
95.7M
        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);    \
1509
95.7M
        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);    \
1510
95.7M
    }                                                                          \
1511
881k
}                                                                              \
tx_float.c:ff_tx_mdct_pfa_5xM_inv_float_c
Line
Count
Source
1473
820k
                                                void *_src, ptrdiff_t stride)  \
1474
820k
{                                                                              \
1475
820k
    TXComplex fft##N##in[N];                                                   \
1476
820k
    TXComplex *z = _dst, *exp = s->exp;                                        \
1477
820k
    const TXSample *src = _src, *in1, *in2;                                    \
1478
820k
    const int len4 = s->len >> 2;                                              \
1479
820k
    const int len2 = s->len >> 1;                                              \
1480
820k
    const int m = s->sub->len;                                                 \
1481
820k
    const int *in_map = s->map, *out_map = in_map + N*m;                       \
1482
820k
    const int *sub_map = s->sub->map;                                          \
1483
820k
                                                                               \
1484
820k
    stride /= sizeof(*src); /* To convert it from bytes */                     \
1485
820k
    in1 = src;                                                                 \
1486
820k
    in2 = src + ((N*m*2) - 1) * stride;                                        \
1487
820k
                                                                               \
1488
27.0M
    for (int i = 0; i < len2; i += N) {                                        \
1489
157M
        for (int j = 0; j < N; j++) {                                          \
1490
131M
            const int k = in_map[j];                                           \
1491
131M
            TXComplex tmp = { in2[-k*stride], in1[k*stride] };                 \
1492
131M
            CMUL3(fft##N##in[j], tmp, exp[j]);                                 \
1493
131M
        }                                                                      \
1494
26.2M
        fft##N(s->tmp + *(sub_map++), fft##N##in, m);                          \
1495
26.2M
        exp += N;                                                              \
1496
26.2M
        in_map += N;                                                           \
1497
26.2M
    }                                                                          \
1498
820k
                                                                               \
1499
4.92M
    for (int i = 0; i < N; i++)                                                \
1500
4.10M
        s->fn[0](&s->sub[0], s->tmp + m*i, s->tmp + m*i, sizeof(TXComplex));   \
1501
820k
                                                                               \
1502
66.4M
    for (int i = 0; i < len4; i++) {                                           \
1503
65.6M
        const int i0 = len4 + i, i1 = len4 - i - 1;                            \
1504
65.6M
        const int s0 = out_map[i0], s1 = out_map[i1];                          \
1505
65.6M
        TXComplex src1 = { s->tmp[s1].im, s->tmp[s1].re };                     \
1506
65.6M
        TXComplex src0 = { s->tmp[s0].im, s->tmp[s0].re };                     \
1507
65.6M
                                                                               \
1508
65.6M
        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);    \
1509
65.6M
        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);    \
1510
65.6M
    }                                                                          \
1511
820k
}                                                                              \
Unexecuted instantiation: tx_float.c:ff_tx_mdct_pfa_7xM_inv_float_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_pfa_9xM_inv_float_c
tx_float.c:ff_tx_mdct_pfa_15xM_inv_float_c
Line
Count
Source
1473
367k
                                                void *_src, ptrdiff_t stride)  \
1474
367k
{                                                                              \
1475
367k
    TXComplex fft##N##in[N];                                                   \
1476
367k
    TXComplex *z = _dst, *exp = s->exp;                                        \
1477
367k
    const TXSample *src = _src, *in1, *in2;                                    \
1478
367k
    const int len4 = s->len >> 2;                                              \
1479
367k
    const int len2 = s->len >> 1;                                              \
1480
367k
    const int m = s->sub->len;                                                 \
1481
367k
    const int *in_map = s->map, *out_map = in_map + N*m;                       \
1482
367k
    const int *sub_map = s->sub->map;                                          \
1483
367k
                                                                               \
1484
367k
    stride /= sizeof(*src); /* To convert it from bytes */                     \
1485
367k
    in1 = src;                                                                 \
1486
367k
    in2 = src + ((N*m*2) - 1) * stride;                                        \
1487
367k
                                                                               \
1488
5.05M
    for (int i = 0; i < len2; i += N) {                                        \
1489
75.0M
        for (int j = 0; j < N; j++) {                                          \
1490
70.3M
            const int k = in_map[j];                                           \
1491
70.3M
            TXComplex tmp = { in2[-k*stride], in1[k*stride] };                 \
1492
70.3M
            CMUL3(fft##N##in[j], tmp, exp[j]);                                 \
1493
70.3M
        }                                                                      \
1494
4.68M
        fft##N(s->tmp + *(sub_map++), fft##N##in, m);                          \
1495
4.68M
        exp += N;                                                              \
1496
4.68M
        in_map += N;                                                           \
1497
4.68M
    }                                                                          \
1498
367k
                                                                               \
1499
5.87M
    for (int i = 0; i < N; i++)                                                \
1500
5.51M
        s->fn[0](&s->sub[0], s->tmp + m*i, s->tmp + m*i, sizeof(TXComplex));   \
1501
367k
                                                                               \
1502
35.5M
    for (int i = 0; i < len4; i++) {                                           \
1503
35.1M
        const int i0 = len4 + i, i1 = len4 - i - 1;                            \
1504
35.1M
        const int s0 = out_map[i0], s1 = out_map[i1];                          \
1505
35.1M
        TXComplex src1 = { s->tmp[s1].im, s->tmp[s1].re };                     \
1506
35.1M
        TXComplex src0 = { s->tmp[s0].im, s->tmp[s0].re };                     \
1507
35.1M
                                                                               \
1508
35.1M
        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);    \
1509
35.1M
        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);    \
1510
35.1M
    }                                                                          \
1511
367k
}                                                                              \
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_3xM_inv_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_5xM_inv_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_7xM_inv_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_9xM_inv_int32_c
tx_int32.c:ff_tx_mdct_pfa_15xM_inv_int32_c
Line
Count
Source
1473
14.2k
                                                void *_src, ptrdiff_t stride)  \
1474
14.2k
{                                                                              \
1475
14.2k
    TXComplex fft##N##in[N];                                                   \
1476
14.2k
    TXComplex *z = _dst, *exp = s->exp;                                        \
1477
14.2k
    const TXSample *src = _src, *in1, *in2;                                    \
1478
14.2k
    const int len4 = s->len >> 2;                                              \
1479
14.2k
    const int len2 = s->len >> 1;                                              \
1480
14.2k
    const int m = s->sub->len;                                                 \
1481
14.2k
    const int *in_map = s->map, *out_map = in_map + N*m;                       \
1482
14.2k
    const int *sub_map = s->sub->map;                                          \
1483
14.2k
                                                                               \
1484
14.2k
    stride /= sizeof(*src); /* To convert it from bytes */                     \
1485
14.2k
    in1 = src;                                                                 \
1486
14.2k
    in2 = src + ((N*m*2) - 1) * stride;                                        \
1487
14.2k
                                                                               \
1488
237k
    for (int i = 0; i < len2; i += N) {                                        \
1489
3.57M
        for (int j = 0; j < N; j++) {                                          \
1490
3.34M
            const int k = in_map[j];                                           \
1491
3.34M
            TXComplex tmp = { in2[-k*stride], in1[k*stride] };                 \
1492
3.34M
            CMUL3(fft##N##in[j], tmp, exp[j]);                                 \
1493
3.34M
        }                                                                      \
1494
223k
        fft##N(s->tmp + *(sub_map++), fft##N##in, m);                          \
1495
223k
        exp += N;                                                              \
1496
223k
        in_map += N;                                                           \
1497
223k
    }                                                                          \
1498
14.2k
                                                                               \
1499
228k
    for (int i = 0; i < N; i++)                                                \
1500
214k
        s->fn[0](&s->sub[0], s->tmp + m*i, s->tmp + m*i, sizeof(TXComplex));   \
1501
14.2k
                                                                               \
1502
1.68M
    for (int i = 0; i < len4; i++) {                                           \
1503
1.67M
        const int i0 = len4 + i, i1 = len4 - i - 1;                            \
1504
1.67M
        const int s0 = out_map[i0], s1 = out_map[i1];                          \
1505
1.67M
        TXComplex src1 = { s->tmp[s1].im, s->tmp[s1].re };                     \
1506
1.67M
        TXComplex src0 = { s->tmp[s0].im, s->tmp[s0].re };                     \
1507
1.67M
                                                                               \
1508
1.67M
        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);    \
1509
1.67M
        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);    \
1510
1.67M
    }                                                                          \
1511
14.2k
}                                                                              \
1512
                                                                               \
1513
static const FFTXCodelet TX_NAME(ff_tx_mdct_pfa_##N##xM_inv_def) = {           \
1514
    .name       = TX_NAME_STR("mdct_pfa_" #N "xM_inv"),                        \
1515
    .function   = TX_NAME(ff_tx_mdct_pfa_##N##xM_inv),                         \
1516
    .type       = TX_TYPE(MDCT),                                               \
1517
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE | FF_TX_INVERSE_ONLY,   \
1518
    .factors    = { N, TX_FACTOR_ANY },                                        \
1519
    .nb_factors = 2,                                                           \
1520
    .min_len    = N*2,                                                         \
1521
    .max_len    = TX_LEN_UNLIMITED,                                            \
1522
    .init       = TX_NAME(ff_tx_mdct_pfa_init),                                \
1523
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,                                         \
1524
    .prio       = FF_TX_PRIO_BASE,                                             \
1525
};
1526
1527
DECL_COMP_IMDCT(3)
1528
DECL_COMP_IMDCT(5)
1529
DECL_COMP_IMDCT(7)
1530
DECL_COMP_IMDCT(9)
1531
DECL_COMP_IMDCT(15)
1532
1533
#define DECL_COMP_MDCT(N)                                                      \
1534
static void TX_NAME(ff_tx_mdct_pfa_##N##xM_fwd)(AVTXContext *s, void *_dst,    \
1535
0
                                                void *_src, ptrdiff_t stride)  \
1536
0
{                                                                              \
1537
0
    TXComplex fft##N##in[N];                                                   \
1538
0
    TXSample *src = _src, *dst = _dst;                                         \
1539
0
    TXComplex *exp = s->exp, tmp;                                              \
1540
0
    const int m = s->sub->len;                                                 \
1541
0
    const int len4 = N*m;                                                      \
1542
0
    const int len3 = len4 * 3;                                                 \
1543
0
    const int len8 = s->len >> 2;                                              \
1544
0
    const int *in_map = s->map, *out_map = in_map + N*m;                       \
1545
0
    const int *sub_map = s->sub->map;                                          \
1546
0
                                                                               \
1547
0
    stride /= sizeof(*dst);                                                    \
1548
0
                                                                               \
1549
0
    for (int i = 0; i < m; i++) { /* Folding and pre-reindexing */             \
1550
0
        for (int j = 0; j < N; j++) {                                          \
1551
0
            const int k = in_map[i*N + j];                                     \
1552
0
            if (k < len4) {                                                    \
1553
0
                tmp.re = FOLD(-src[ len4 + k],  src[1*len4 - 1 - k]);          \
1554
0
                tmp.im = FOLD(-src[ len3 + k], -src[1*len3 - 1 - k]);          \
1555
0
            } else {                                                           \
1556
0
                tmp.re = FOLD(-src[ len4 + k], -src[5*len4 - 1 - k]);          \
1557
0
                tmp.im = FOLD( src[-len4 + k], -src[1*len3 - 1 - k]);          \
1558
0
            }                                                                  \
1559
0
            CMUL(fft##N##in[j].im, fft##N##in[j].re, tmp.re, tmp.im,           \
1560
0
                 exp[k >> 1].re, exp[k >> 1].im);                              \
1561
0
        }                                                                      \
1562
0
        fft##N(s->tmp + sub_map[i], fft##N##in, m);                            \
1563
0
    }                                                                          \
1564
0
                                                                               \
1565
0
    for (int i = 0; i < N; i++)                                                \
1566
0
        s->fn[0](&s->sub[0], s->tmp + m*i, s->tmp + m*i, sizeof(TXComplex));   \
1567
0
                                                                               \
1568
0
    for (int i = 0; i < len8; i++) {                                           \
1569
0
        const int i0 = len8 + i, i1 = len8 - i - 1;                            \
1570
0
        const int s0 = out_map[i0], s1 = out_map[i1];                          \
1571
0
        TXComplex src1 = { s->tmp[s1].re, s->tmp[s1].im };                     \
1572
0
        TXComplex src0 = { s->tmp[s0].re, s->tmp[s0].im };                     \
1573
0
                                                                               \
1574
0
        CMUL(dst[2*i1*stride + stride], dst[2*i0*stride], src0.re, src0.im,    \
1575
0
             exp[i0].im, exp[i0].re);                                          \
1576
0
        CMUL(dst[2*i0*stride + stride], dst[2*i1*stride], src1.re, src1.im,    \
1577
0
             exp[i1].im, exp[i1].re);                                          \
1578
0
    }                                                                          \
1579
0
}                                                                              \
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_3xM_fwd_double_c
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_5xM_fwd_double_c
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_7xM_fwd_double_c
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_9xM_fwd_double_c
Unexecuted instantiation: tx_double.c:ff_tx_mdct_pfa_15xM_fwd_double_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_pfa_3xM_fwd_float_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_pfa_5xM_fwd_float_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_pfa_7xM_fwd_float_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_pfa_9xM_fwd_float_c
Unexecuted instantiation: tx_float.c:ff_tx_mdct_pfa_15xM_fwd_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_3xM_fwd_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_5xM_fwd_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_7xM_fwd_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_9xM_fwd_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_mdct_pfa_15xM_fwd_int32_c
1580
                                                                               \
1581
static const FFTXCodelet TX_NAME(ff_tx_mdct_pfa_##N##xM_fwd_def) = {           \
1582
    .name       = TX_NAME_STR("mdct_pfa_" #N "xM_fwd"),                        \
1583
    .function   = TX_NAME(ff_tx_mdct_pfa_##N##xM_fwd),                         \
1584
    .type       = TX_TYPE(MDCT),                                               \
1585
    .flags      = AV_TX_UNALIGNED | FF_TX_OUT_OF_PLACE | FF_TX_FORWARD_ONLY,   \
1586
    .factors    = { N, TX_FACTOR_ANY },                                        \
1587
    .nb_factors = 2,                                                           \
1588
    .min_len    = N*2,                                                         \
1589
    .max_len    = TX_LEN_UNLIMITED,                                            \
1590
    .init       = TX_NAME(ff_tx_mdct_pfa_init),                                \
1591
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,                                         \
1592
    .prio       = FF_TX_PRIO_BASE,                                             \
1593
};
1594
1595
DECL_COMP_MDCT(3)
1596
DECL_COMP_MDCT(5)
1597
DECL_COMP_MDCT(7)
1598
DECL_COMP_MDCT(9)
1599
DECL_COMP_MDCT(15)
1600
1601
static av_cold int TX_NAME(ff_tx_rdft_init)(AVTXContext *s,
1602
                                            const FFTXCodelet *cd,
1603
                                            uint64_t flags,
1604
                                            FFTXCodeletOptions *opts,
1605
                                            int len, int inv,
1606
                                            const void *scale)
1607
5.70k
{
1608
5.70k
    int ret;
1609
5.70k
    double f, m;
1610
5.70k
    TXSample *tab;
1611
5.70k
    uint64_t r2r = flags & AV_TX_REAL_TO_REAL;
1612
5.70k
    int len4 = FFALIGN(len, 4) / 4;
1613
1614
5.70k
    s->scale_d = *((SCALE_TYPE *)scale);
1615
5.70k
    s->scale_f = s->scale_d;
1616
1617
5.70k
    flags &= ~(AV_TX_REAL_TO_REAL | AV_TX_REAL_TO_IMAGINARY);
1618
1619
5.70k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, NULL, len >> 1, inv, scale)))
1620
0
        return ret;
1621
1622
5.70k
    if (!(s->exp = av_mallocz((8 + 2*len4)*sizeof(*s->exp))))
1623
0
        return AVERROR(ENOMEM);
1624
1625
5.70k
    tab = (TXSample *)s->exp;
1626
1627
5.70k
    f = 2*M_PI/len;
1628
1629
5.70k
    m = (inv ? 2*s->scale_d : s->scale_d);
1630
1631
5.70k
    *tab++ = RESCALE((inv ? 0.5 : 1.0) * m);
1632
5.70k
    *tab++ = RESCALE(inv ? 0.5*m : 1.0*m);
1633
5.70k
    *tab++ = RESCALE( m);
1634
5.70k
    *tab++ = RESCALE(-m);
1635
1636
5.70k
    *tab++ = RESCALE( (0.5 - 0.0) * m);
1637
5.70k
    if (r2r)
1638
700
        *tab++ = 1 / s->scale_f;
1639
5.00k
    else
1640
5.00k
        *tab++ = RESCALE( (0.0 - 0.5) * m);
1641
5.70k
    *tab++ = RESCALE( (0.5 - inv) * m);
1642
5.70k
    *tab++ = RESCALE(-(0.5 - inv) * m);
1643
1644
777k
    for (int i = 0; i < len4; i++)
1645
772k
        *tab++ = RESCALE(cos(i*f));
1646
1647
5.70k
    tab = ((TXSample *)s->exp) + len4 + 8;
1648
1649
777k
    for (int i = 0; i < len4; i++)
1650
772k
        *tab++ = RESCALE(cos(((len - i*4)/4.0)*f)) * (inv ? 1 : -1);
1651
1652
5.70k
    return 0;
1653
5.70k
}
Unexecuted instantiation: tx_double.c:ff_tx_rdft_init_double_c
tx_float.c:ff_tx_rdft_init_float_c
Line
Count
Source
1607
5.70k
{
1608
5.70k
    int ret;
1609
5.70k
    double f, m;
1610
5.70k
    TXSample *tab;
1611
5.70k
    uint64_t r2r = flags & AV_TX_REAL_TO_REAL;
1612
5.70k
    int len4 = FFALIGN(len, 4) / 4;
1613
1614
5.70k
    s->scale_d = *((SCALE_TYPE *)scale);
1615
5.70k
    s->scale_f = s->scale_d;
1616
1617
5.70k
    flags &= ~(AV_TX_REAL_TO_REAL | AV_TX_REAL_TO_IMAGINARY);
1618
1619
5.70k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(FFT), flags, NULL, len >> 1, inv, scale)))
1620
0
        return ret;
1621
1622
5.70k
    if (!(s->exp = av_mallocz((8 + 2*len4)*sizeof(*s->exp))))
1623
0
        return AVERROR(ENOMEM);
1624
1625
5.70k
    tab = (TXSample *)s->exp;
1626
1627
5.70k
    f = 2*M_PI/len;
1628
1629
5.70k
    m = (inv ? 2*s->scale_d : s->scale_d);
1630
1631
5.70k
    *tab++ = RESCALE((inv ? 0.5 : 1.0) * m);
1632
5.70k
    *tab++ = RESCALE(inv ? 0.5*m : 1.0*m);
1633
5.70k
    *tab++ = RESCALE( m);
1634
5.70k
    *tab++ = RESCALE(-m);
1635
1636
5.70k
    *tab++ = RESCALE( (0.5 - 0.0) * m);
1637
5.70k
    if (r2r)
1638
700
        *tab++ = 1 / s->scale_f;
1639
5.00k
    else
1640
5.00k
        *tab++ = RESCALE( (0.0 - 0.5) * m);
1641
5.70k
    *tab++ = RESCALE( (0.5 - inv) * m);
1642
5.70k
    *tab++ = RESCALE(-(0.5 - inv) * m);
1643
1644
777k
    for (int i = 0; i < len4; i++)
1645
772k
        *tab++ = RESCALE(cos(i*f));
1646
1647
5.70k
    tab = ((TXSample *)s->exp) + len4 + 8;
1648
1649
777k
    for (int i = 0; i < len4; i++)
1650
772k
        *tab++ = RESCALE(cos(((len - i*4)/4.0)*f)) * (inv ? 1 : -1);
1651
1652
5.70k
    return 0;
1653
5.70k
}
Unexecuted instantiation: tx_int32.c:ff_tx_rdft_init_int32_c
1654
1655
#define DECL_RDFT(n, inv)                                                      \
1656
static void TX_NAME(ff_tx_rdft_ ##n)(AVTXContext *s, void *_dst,               \
1657
3.21M
                                     void *_src, ptrdiff_t stride)             \
1658
3.21M
{                                                                              \
1659
3.21M
    const int len2 = s->len >> 1;                                              \
1660
3.21M
    const int len4 = s->len >> 2;                                              \
1661
3.21M
    const TXSample *fact = (void *)s->exp;                                     \
1662
3.21M
    const TXSample *tcos = fact + 8;                                           \
1663
3.21M
    const TXSample *tsin = tcos + len4;                                        \
1664
3.21M
    TXComplex *data = inv ? _src : _dst;                                       \
1665
3.21M
    TXComplex t[3];                                                            \
1666
3.21M
                                                                               \
1667
3.21M
    if (!inv)                                                                  \
1668
3.21M
        s->fn[0](&s->sub[0], data, _src, sizeof(TXComplex));                   \
1669
3.21M
    else                                                                       \
1670
3.21M
        data[0].im = data[len2].re;                                            \
1671
3.21M
                                                                               \
1672
3.21M
    /* The DC value's both components are real, but we need to change them     \
1673
3.21M
     * into complex values. Also, the middle of the array is special-cased.    \
1674
3.21M
     * These operations can be done before or after the loop. */               \
1675
3.21M
    t[0].re = data[0].re;                                                      \
1676
3.21M
    data[0].re = t[0].re + data[0].im;                                         \
1677
3.21M
    data[0].im = t[0].re - data[0].im;                                         \
1678
3.21M
    data[   0].re = MULT(fact[0], data[   0].re);                              \
1679
3.21M
    data[   0].im = MULT(fact[1], data[   0].im);                              \
1680
3.21M
    data[len4].re = MULT(fact[2], data[len4].re);                              \
1681
3.21M
    data[len4].im = MULT(fact[3], data[len4].im);                              \
1682
3.21M
                                                                               \
1683
278M
    for (int i = 1; i < len4; i++) {                                           \
1684
274M
        /* Separate even and odd FFTs */                                       \
1685
274M
        t[0].re = MULT(fact[4], (data[i].re + data[len2 - i].re));             \
1686
274M
        t[0].im = MULT(fact[5], (data[i].im - data[len2 - i].im));             \
1687
274M
        t[1].re = MULT(fact[6], (data[i].im + data[len2 - i].im));             \
1688
274M
        t[1].im = MULT(fact[7], (data[i].re - data[len2 - i].re));             \
1689
274M
                                                                               \
1690
274M
        /* Apply twiddle factors to the odd FFT and add to the even FFT */     \
1691
274M
        CMUL(t[2].re, t[2].im, t[1].re, t[1].im, tcos[i], tsin[i]);            \
1692
274M
                                                                               \
1693
274M
        data[       i].re = t[0].re + t[2].re;                                 \
1694
274M
        data[       i].im = t[2].im - t[0].im;                                 \
1695
274M
        data[len2 - i].re = t[0].re - t[2].re;                                 \
1696
274M
        data[len2 - i].im = t[2].im + t[0].im;                                 \
1697
274M
    }                                                                          \
1698
3.21M
                                                                               \
1699
3.21M
    if (inv) {                                                                 \
1700
2.43M
        s->fn[0](&s->sub[0], _dst, data, sizeof(TXComplex));                   \
1701
2.43M
    } else {                                                                   \
1702
786k
        /* Move [0].im to the last position, as convention requires */         \
1703
786k
        data[len2].re = data[0].im;                                            \
1704
786k
        data[   0].im = data[len2].im = 0;                                     \
1705
786k
    }                                                                          \
1706
3.21M
}                                                                              \
Unexecuted instantiation: tx_double.c:ff_tx_rdft_r2c_double_c
Unexecuted instantiation: tx_double.c:ff_tx_rdft_c2r_double_c
tx_float.c:ff_tx_rdft_r2c_float_c
Line
Count
Source
1657
786k
                                     void *_src, ptrdiff_t stride)             \
1658
786k
{                                                                              \
1659
786k
    const int len2 = s->len >> 1;                                              \
1660
786k
    const int len4 = s->len >> 2;                                              \
1661
786k
    const TXSample *fact = (void *)s->exp;                                     \
1662
786k
    const TXSample *tcos = fact + 8;                                           \
1663
786k
    const TXSample *tsin = tcos + len4;                                        \
1664
786k
    TXComplex *data = inv ? _src : _dst;                                       \
1665
786k
    TXComplex t[3];                                                            \
1666
786k
                                                                               \
1667
786k
    if (!inv)                                                                  \
1668
786k
        s->fn[0](&s->sub[0], data, _src, sizeof(TXComplex));                   \
1669
786k
    else                                                                       \
1670
786k
        data[0].im = data[len2].re;                                            \
1671
786k
                                                                               \
1672
786k
    /* The DC value's both components are real, but we need to change them     \
1673
786k
     * into complex values. Also, the middle of the array is special-cased.    \
1674
786k
     * These operations can be done before or after the loop. */               \
1675
786k
    t[0].re = data[0].re;                                                      \
1676
786k
    data[0].re = t[0].re + data[0].im;                                         \
1677
786k
    data[0].im = t[0].re - data[0].im;                                         \
1678
786k
    data[   0].re = MULT(fact[0], data[   0].re);                              \
1679
786k
    data[   0].im = MULT(fact[1], data[   0].im);                              \
1680
786k
    data[len4].re = MULT(fact[2], data[len4].re);                              \
1681
786k
    data[len4].im = MULT(fact[3], data[len4].im);                              \
1682
786k
                                                                               \
1683
25.1M
    for (int i = 1; i < len4; i++) {                                           \
1684
24.3M
        /* Separate even and odd FFTs */                                       \
1685
24.3M
        t[0].re = MULT(fact[4], (data[i].re + data[len2 - i].re));             \
1686
24.3M
        t[0].im = MULT(fact[5], (data[i].im - data[len2 - i].im));             \
1687
24.3M
        t[1].re = MULT(fact[6], (data[i].im + data[len2 - i].im));             \
1688
24.3M
        t[1].im = MULT(fact[7], (data[i].re - data[len2 - i].re));             \
1689
24.3M
                                                                               \
1690
24.3M
        /* Apply twiddle factors to the odd FFT and add to the even FFT */     \
1691
24.3M
        CMUL(t[2].re, t[2].im, t[1].re, t[1].im, tcos[i], tsin[i]);            \
1692
24.3M
                                                                               \
1693
24.3M
        data[       i].re = t[0].re + t[2].re;                                 \
1694
24.3M
        data[       i].im = t[2].im - t[0].im;                                 \
1695
24.3M
        data[len2 - i].re = t[0].re - t[2].re;                                 \
1696
24.3M
        data[len2 - i].im = t[2].im + t[0].im;                                 \
1697
24.3M
    }                                                                          \
1698
786k
                                                                               \
1699
786k
    if (inv) {                                                                 \
1700
0
        s->fn[0](&s->sub[0], _dst, data, sizeof(TXComplex));                   \
1701
786k
    } else {                                                                   \
1702
786k
        /* Move [0].im to the last position, as convention requires */         \
1703
786k
        data[len2].re = data[0].im;                                            \
1704
786k
        data[   0].im = data[len2].im = 0;                                     \
1705
786k
    }                                                                          \
1706
786k
}                                                                              \
tx_float.c:ff_tx_rdft_c2r_float_c
Line
Count
Source
1657
2.43M
                                     void *_src, ptrdiff_t stride)             \
1658
2.43M
{                                                                              \
1659
2.43M
    const int len2 = s->len >> 1;                                              \
1660
2.43M
    const int len4 = s->len >> 2;                                              \
1661
2.43M
    const TXSample *fact = (void *)s->exp;                                     \
1662
2.43M
    const TXSample *tcos = fact + 8;                                           \
1663
2.43M
    const TXSample *tsin = tcos + len4;                                        \
1664
2.43M
    TXComplex *data = inv ? _src : _dst;                                       \
1665
2.43M
    TXComplex t[3];                                                            \
1666
2.43M
                                                                               \
1667
2.43M
    if (!inv)                                                                  \
1668
2.43M
        s->fn[0](&s->sub[0], data, _src, sizeof(TXComplex));                   \
1669
2.43M
    else                                                                       \
1670
2.43M
        data[0].im = data[len2].re;                                            \
1671
2.43M
                                                                               \
1672
2.43M
    /* The DC value's both components are real, but we need to change them     \
1673
2.43M
     * into complex values. Also, the middle of the array is special-cased.    \
1674
2.43M
     * These operations can be done before or after the loop. */               \
1675
2.43M
    t[0].re = data[0].re;                                                      \
1676
2.43M
    data[0].re = t[0].re + data[0].im;                                         \
1677
2.43M
    data[0].im = t[0].re - data[0].im;                                         \
1678
2.43M
    data[   0].re = MULT(fact[0], data[   0].re);                              \
1679
2.43M
    data[   0].im = MULT(fact[1], data[   0].im);                              \
1680
2.43M
    data[len4].re = MULT(fact[2], data[len4].re);                              \
1681
2.43M
    data[len4].im = MULT(fact[3], data[len4].im);                              \
1682
2.43M
                                                                               \
1683
252M
    for (int i = 1; i < len4; i++) {                                           \
1684
250M
        /* Separate even and odd FFTs */                                       \
1685
250M
        t[0].re = MULT(fact[4], (data[i].re + data[len2 - i].re));             \
1686
250M
        t[0].im = MULT(fact[5], (data[i].im - data[len2 - i].im));             \
1687
250M
        t[1].re = MULT(fact[6], (data[i].im + data[len2 - i].im));             \
1688
250M
        t[1].im = MULT(fact[7], (data[i].re - data[len2 - i].re));             \
1689
250M
                                                                               \
1690
250M
        /* Apply twiddle factors to the odd FFT and add to the even FFT */     \
1691
250M
        CMUL(t[2].re, t[2].im, t[1].re, t[1].im, tcos[i], tsin[i]);            \
1692
250M
                                                                               \
1693
250M
        data[       i].re = t[0].re + t[2].re;                                 \
1694
250M
        data[       i].im = t[2].im - t[0].im;                                 \
1695
250M
        data[len2 - i].re = t[0].re - t[2].re;                                 \
1696
250M
        data[len2 - i].im = t[2].im + t[0].im;                                 \
1697
250M
    }                                                                          \
1698
2.43M
                                                                               \
1699
2.43M
    if (inv) {                                                                 \
1700
2.43M
        s->fn[0](&s->sub[0], _dst, data, sizeof(TXComplex));                   \
1701
2.43M
    } else {                                                                   \
1702
0
        /* Move [0].im to the last position, as convention requires */         \
1703
0
        data[len2].re = data[0].im;                                            \
1704
0
        data[   0].im = data[len2].im = 0;                                     \
1705
0
    }                                                                          \
1706
2.43M
}                                                                              \
Unexecuted instantiation: tx_int32.c:ff_tx_rdft_r2c_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_rdft_c2r_int32_c
1707
                                                                               \
1708
static const FFTXCodelet TX_NAME(ff_tx_rdft_ ##n## _def) = {                   \
1709
    .name       = TX_NAME_STR("rdft_" #n),                                     \
1710
    .function   = TX_NAME(ff_tx_rdft_ ##n),                                    \
1711
    .type       = TX_TYPE(RDFT),                                               \
1712
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE | FF_TX_OUT_OF_PLACE |       \
1713
                  (inv ? FF_TX_INVERSE_ONLY : FF_TX_FORWARD_ONLY),             \
1714
    .factors    = { 4, TX_FACTOR_ANY },                                        \
1715
    .nb_factors = 2,                                                           \
1716
    .min_len    = 4,                                                           \
1717
    .max_len    = TX_LEN_UNLIMITED,                                            \
1718
    .init       = TX_NAME(ff_tx_rdft_init),                                    \
1719
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,                                         \
1720
    .prio       = FF_TX_PRIO_BASE,                                             \
1721
};
1722
1723
DECL_RDFT(r2c,  0)
1724
DECL_RDFT(c2r,  1)
1725
1726
#define DECL_RDFT_HALF(n, mode, mod2)                                          \
1727
static void TX_NAME(ff_tx_rdft_ ##n)(AVTXContext *s, void *_dst,               \
1728
524k
                                        void *_src, ptrdiff_t stride)          \
1729
524k
{                                                                              \
1730
524k
    const int len = s->len;                                                    \
1731
524k
    const int len2 = len >> 1;                                                 \
1732
524k
    const int len4 = len >> 2;                                                 \
1733
524k
    const int aligned_len4 = FFALIGN(len, 4)/4;                                \
1734
524k
    const TXSample *fact = (void *)s->exp;                                     \
1735
524k
    const TXSample *tcos = fact + 8;                                           \
1736
524k
    const TXSample *tsin = tcos + aligned_len4;                                \
1737
524k
    TXComplex *data = _dst;                                                    \
1738
524k
    TXSample *out = _dst; /* Half-complex is forward-only */                   \
1739
524k
    TXSample tmp_dc;                                                           \
1740
524k
    av_unused TXSample tmp_mid;                                                \
1741
524k
    TXSample tmp[4];                                                           \
1742
524k
    TXComplex sf, sl;                                                          \
1743
524k
                                                                               \
1744
524k
    s->fn[0](&s->sub[0], _dst, _src, sizeof(TXComplex));                       \
1745
524k
                                                                               \
1746
524k
    tmp_dc = data[0].re;                                                       \
1747
524k
    data[   0].re = tmp_dc + data[0].im;                                       \
1748
524k
    tmp_dc        = tmp_dc - data[0].im;                                       \
1749
524k
                                                                               \
1750
524k
    data[   0].re = MULT(fact[0], data[   0].re);                              \
1751
524k
    tmp_dc        = MULT(fact[1],        tmp_dc);                              \
1752
524k
    data[len4].re = MULT(fact[2], data[len4].re);                              \
1753
524k
                                                                               \
1754
524k
    if (!mod2) {                                                               \
1755
0
        data[len4].im = MULT(fact[3], data[len4].im);                          \
1756
524k
    } else {                                                                   \
1757
524k
        sf = data[len4];                                                       \
1758
524k
        sl = data[len4 + 1];                                                   \
1759
524k
        if (mode == AV_TX_REAL_TO_REAL)                                        \
1760
524k
            tmp[0] = MULT(fact[4], (sf.re + sl.re));                           \
1761
524k
        else                                                                   \
1762
524k
            tmp[0] = MULT(fact[5], (sf.im - sl.im));                           \
1763
524k
        tmp[1] = MULT(fact[6], (sf.im + sl.im));                               \
1764
524k
        tmp[2] = MULT(fact[7], (sf.re - sl.re));                               \
1765
524k
                                                                               \
1766
524k
        if (mode == AV_TX_REAL_TO_REAL) {                                      \
1767
262k
            tmp[3]  = tmp[1]*tcos[len4] - tmp[2]*tsin[len4];                   \
1768
262k
            tmp_mid = (tmp[0] - tmp[3]);                                       \
1769
262k
        } else {                                                               \
1770
262k
            tmp[3]  = tmp[1]*tsin[len4] + tmp[2]*tcos[len4];                   \
1771
262k
            tmp_mid = (tmp[0] + tmp[3]);                                       \
1772
262k
        }                                                                      \
1773
524k
    }                                                                          \
1774
524k
                                                                               \
1775
524k
    /* NOTE: unrolling this breaks non-mod8 lengths */                         \
1776
17.0M
    for (int i = 1; i <= len4; i++) {                                          \
1777
16.5M
        TXSample tmp[4];                                                       \
1778
16.5M
        TXComplex sf = data[i];                                                \
1779
16.5M
        TXComplex sl = data[len2 - i];                                         \
1780
16.5M
                                                                               \
1781
16.5M
        if (mode == AV_TX_REAL_TO_REAL)                                        \
1782
16.5M
            tmp[0] = MULT(fact[4], (sf.re + sl.re));                           \
1783
16.5M
        else                                                                   \
1784
16.5M
            tmp[0] = MULT(fact[5], (sf.im - sl.im));                           \
1785
16.5M
                                                                               \
1786
16.5M
        tmp[1] = MULT(fact[6], (sf.im + sl.im));                               \
1787
16.5M
        tmp[2] = MULT(fact[7], (sf.re - sl.re));                               \
1788
16.5M
                                                                               \
1789
16.5M
        if (mode == AV_TX_REAL_TO_REAL) {                                      \
1790
8.12M
            tmp[3]           = tmp[1]*tcos[i] - tmp[2]*tsin[i];                \
1791
8.12M
            out[i]           = (tmp[0] + tmp[3]);                              \
1792
8.12M
            out[len - i]     = (tmp[0] - tmp[3]);                              \
1793
8.38M
        } else {                                                               \
1794
8.38M
            tmp[3]           = tmp[1]*tsin[i] + tmp[2]*tcos[i];                \
1795
8.38M
            out[i - 1]       = (tmp[3] - tmp[0]);                              \
1796
8.38M
            out[len - i - 1] = (tmp[0] + tmp[3]);                              \
1797
8.38M
        }                                                                      \
1798
16.5M
    }                                                                          \
1799
524k
                                                                               \
1800
16.7M
    for (int i = 1; i < (len4 + (mode == AV_TX_REAL_TO_IMAGINARY)); i++)       \
1801
16.2M
        out[len2 - i] = out[len - i];                                          \
1802
524k
                                                                               \
1803
524k
    if (mode == AV_TX_REAL_TO_REAL) {                                          \
1804
262k
        out[len2] = tmp_dc;                                                    \
1805
262k
        if (mod2)                                                              \
1806
262k
            out[len4 + 1] = tmp_mid * fact[5];                                 \
1807
262k
    } else if (mod2) {                                                         \
1808
262k
        out[len4] = tmp_mid;                                                   \
1809
262k
    }                                                                          \
1810
524k
}                                                                              \
Unexecuted instantiation: tx_double.c:ff_tx_rdft_r2r_double_c
Unexecuted instantiation: tx_double.c:ff_tx_rdft_r2r_mod2_double_c
Unexecuted instantiation: tx_double.c:ff_tx_rdft_r2i_double_c
Unexecuted instantiation: tx_double.c:ff_tx_rdft_r2i_mod2_double_c
Unexecuted instantiation: tx_float.c:ff_tx_rdft_r2r_float_c
tx_float.c:ff_tx_rdft_r2r_mod2_float_c
Line
Count
Source
1728
262k
                                        void *_src, ptrdiff_t stride)          \
1729
262k
{                                                                              \
1730
262k
    const int len = s->len;                                                    \
1731
262k
    const int len2 = len >> 1;                                                 \
1732
262k
    const int len4 = len >> 2;                                                 \
1733
262k
    const int aligned_len4 = FFALIGN(len, 4)/4;                                \
1734
262k
    const TXSample *fact = (void *)s->exp;                                     \
1735
262k
    const TXSample *tcos = fact + 8;                                           \
1736
262k
    const TXSample *tsin = tcos + aligned_len4;                                \
1737
262k
    TXComplex *data = _dst;                                                    \
1738
262k
    TXSample *out = _dst; /* Half-complex is forward-only */                   \
1739
262k
    TXSample tmp_dc;                                                           \
1740
262k
    av_unused TXSample tmp_mid;                                                \
1741
262k
    TXSample tmp[4];                                                           \
1742
262k
    TXComplex sf, sl;                                                          \
1743
262k
                                                                               \
1744
262k
    s->fn[0](&s->sub[0], _dst, _src, sizeof(TXComplex));                       \
1745
262k
                                                                               \
1746
262k
    tmp_dc = data[0].re;                                                       \
1747
262k
    data[   0].re = tmp_dc + data[0].im;                                       \
1748
262k
    tmp_dc        = tmp_dc - data[0].im;                                       \
1749
262k
                                                                               \
1750
262k
    data[   0].re = MULT(fact[0], data[   0].re);                              \
1751
262k
    tmp_dc        = MULT(fact[1],        tmp_dc);                              \
1752
262k
    data[len4].re = MULT(fact[2], data[len4].re);                              \
1753
262k
                                                                               \
1754
262k
    if (!mod2) {                                                               \
1755
0
        data[len4].im = MULT(fact[3], data[len4].im);                          \
1756
262k
    } else {                                                                   \
1757
262k
        sf = data[len4];                                                       \
1758
262k
        sl = data[len4 + 1];                                                   \
1759
262k
        if (mode == AV_TX_REAL_TO_REAL)                                        \
1760
262k
            tmp[0] = MULT(fact[4], (sf.re + sl.re));                           \
1761
262k
        else                                                                   \
1762
262k
            tmp[0] = MULT(fact[5], (sf.im - sl.im));                           \
1763
262k
        tmp[1] = MULT(fact[6], (sf.im + sl.im));                               \
1764
262k
        tmp[2] = MULT(fact[7], (sf.re - sl.re));                               \
1765
262k
                                                                               \
1766
262k
        if (mode == AV_TX_REAL_TO_REAL) {                                      \
1767
262k
            tmp[3]  = tmp[1]*tcos[len4] - tmp[2]*tsin[len4];                   \
1768
262k
            tmp_mid = (tmp[0] - tmp[3]);                                       \
1769
262k
        } else {                                                               \
1770
0
            tmp[3]  = tmp[1]*tsin[len4] + tmp[2]*tcos[len4];                   \
1771
0
            tmp_mid = (tmp[0] + tmp[3]);                                       \
1772
0
        }                                                                      \
1773
262k
    }                                                                          \
1774
262k
                                                                               \
1775
262k
    /* NOTE: unrolling this breaks non-mod8 lengths */                         \
1776
8.38M
    for (int i = 1; i <= len4; i++) {                                          \
1777
8.12M
        TXSample tmp[4];                                                       \
1778
8.12M
        TXComplex sf = data[i];                                                \
1779
8.12M
        TXComplex sl = data[len2 - i];                                         \
1780
8.12M
                                                                               \
1781
8.12M
        if (mode == AV_TX_REAL_TO_REAL)                                        \
1782
8.12M
            tmp[0] = MULT(fact[4], (sf.re + sl.re));                           \
1783
8.12M
        else                                                                   \
1784
8.12M
            tmp[0] = MULT(fact[5], (sf.im - sl.im));                           \
1785
8.12M
                                                                               \
1786
8.12M
        tmp[1] = MULT(fact[6], (sf.im + sl.im));                               \
1787
8.12M
        tmp[2] = MULT(fact[7], (sf.re - sl.re));                               \
1788
8.12M
                                                                               \
1789
8.12M
        if (mode == AV_TX_REAL_TO_REAL) {                                      \
1790
8.12M
            tmp[3]           = tmp[1]*tcos[i] - tmp[2]*tsin[i];                \
1791
8.12M
            out[i]           = (tmp[0] + tmp[3]);                              \
1792
8.12M
            out[len - i]     = (tmp[0] - tmp[3]);                              \
1793
8.12M
        } else {                                                               \
1794
0
            tmp[3]           = tmp[1]*tsin[i] + tmp[2]*tcos[i];                \
1795
0
            out[i - 1]       = (tmp[3] - tmp[0]);                              \
1796
0
            out[len - i - 1] = (tmp[0] + tmp[3]);                              \
1797
0
        }                                                                      \
1798
8.12M
    }                                                                          \
1799
262k
                                                                               \
1800
8.12M
    for (int i = 1; i < (len4 + (mode == AV_TX_REAL_TO_IMAGINARY)); i++)       \
1801
7.86M
        out[len2 - i] = out[len - i];                                          \
1802
262k
                                                                               \
1803
262k
    if (mode == AV_TX_REAL_TO_REAL) {                                          \
1804
262k
        out[len2] = tmp_dc;                                                    \
1805
262k
        if (mod2)                                                              \
1806
262k
            out[len4 + 1] = tmp_mid * fact[5];                                 \
1807
262k
    } else if (mod2) {                                                         \
1808
0
        out[len4] = tmp_mid;                                                   \
1809
0
    }                                                                          \
1810
262k
}                                                                              \
Unexecuted instantiation: tx_float.c:ff_tx_rdft_r2i_float_c
tx_float.c:ff_tx_rdft_r2i_mod2_float_c
Line
Count
Source
1728
262k
                                        void *_src, ptrdiff_t stride)          \
1729
262k
{                                                                              \
1730
262k
    const int len = s->len;                                                    \
1731
262k
    const int len2 = len >> 1;                                                 \
1732
262k
    const int len4 = len >> 2;                                                 \
1733
262k
    const int aligned_len4 = FFALIGN(len, 4)/4;                                \
1734
262k
    const TXSample *fact = (void *)s->exp;                                     \
1735
262k
    const TXSample *tcos = fact + 8;                                           \
1736
262k
    const TXSample *tsin = tcos + aligned_len4;                                \
1737
262k
    TXComplex *data = _dst;                                                    \
1738
262k
    TXSample *out = _dst; /* Half-complex is forward-only */                   \
1739
262k
    TXSample tmp_dc;                                                           \
1740
262k
    av_unused TXSample tmp_mid;                                                \
1741
262k
    TXSample tmp[4];                                                           \
1742
262k
    TXComplex sf, sl;                                                          \
1743
262k
                                                                               \
1744
262k
    s->fn[0](&s->sub[0], _dst, _src, sizeof(TXComplex));                       \
1745
262k
                                                                               \
1746
262k
    tmp_dc = data[0].re;                                                       \
1747
262k
    data[   0].re = tmp_dc + data[0].im;                                       \
1748
262k
    tmp_dc        = tmp_dc - data[0].im;                                       \
1749
262k
                                                                               \
1750
262k
    data[   0].re = MULT(fact[0], data[   0].re);                              \
1751
262k
    tmp_dc        = MULT(fact[1],        tmp_dc);                              \
1752
262k
    data[len4].re = MULT(fact[2], data[len4].re);                              \
1753
262k
                                                                               \
1754
262k
    if (!mod2) {                                                               \
1755
0
        data[len4].im = MULT(fact[3], data[len4].im);                          \
1756
262k
    } else {                                                                   \
1757
262k
        sf = data[len4];                                                       \
1758
262k
        sl = data[len4 + 1];                                                   \
1759
262k
        if (mode == AV_TX_REAL_TO_REAL)                                        \
1760
262k
            tmp[0] = MULT(fact[4], (sf.re + sl.re));                           \
1761
262k
        else                                                                   \
1762
262k
            tmp[0] = MULT(fact[5], (sf.im - sl.im));                           \
1763
262k
        tmp[1] = MULT(fact[6], (sf.im + sl.im));                               \
1764
262k
        tmp[2] = MULT(fact[7], (sf.re - sl.re));                               \
1765
262k
                                                                               \
1766
262k
        if (mode == AV_TX_REAL_TO_REAL) {                                      \
1767
0
            tmp[3]  = tmp[1]*tcos[len4] - tmp[2]*tsin[len4];                   \
1768
0
            tmp_mid = (tmp[0] - tmp[3]);                                       \
1769
262k
        } else {                                                               \
1770
262k
            tmp[3]  = tmp[1]*tsin[len4] + tmp[2]*tcos[len4];                   \
1771
262k
            tmp_mid = (tmp[0] + tmp[3]);                                       \
1772
262k
        }                                                                      \
1773
262k
    }                                                                          \
1774
262k
                                                                               \
1775
262k
    /* NOTE: unrolling this breaks non-mod8 lengths */                         \
1776
8.64M
    for (int i = 1; i <= len4; i++) {                                          \
1777
8.38M
        TXSample tmp[4];                                                       \
1778
8.38M
        TXComplex sf = data[i];                                                \
1779
8.38M
        TXComplex sl = data[len2 - i];                                         \
1780
8.38M
                                                                               \
1781
8.38M
        if (mode == AV_TX_REAL_TO_REAL)                                        \
1782
8.38M
            tmp[0] = MULT(fact[4], (sf.re + sl.re));                           \
1783
8.38M
        else                                                                   \
1784
8.38M
            tmp[0] = MULT(fact[5], (sf.im - sl.im));                           \
1785
8.38M
                                                                               \
1786
8.38M
        tmp[1] = MULT(fact[6], (sf.im + sl.im));                               \
1787
8.38M
        tmp[2] = MULT(fact[7], (sf.re - sl.re));                               \
1788
8.38M
                                                                               \
1789
8.38M
        if (mode == AV_TX_REAL_TO_REAL) {                                      \
1790
0
            tmp[3]           = tmp[1]*tcos[i] - tmp[2]*tsin[i];                \
1791
0
            out[i]           = (tmp[0] + tmp[3]);                              \
1792
0
            out[len - i]     = (tmp[0] - tmp[3]);                              \
1793
8.38M
        } else {                                                               \
1794
8.38M
            tmp[3]           = tmp[1]*tsin[i] + tmp[2]*tcos[i];                \
1795
8.38M
            out[i - 1]       = (tmp[3] - tmp[0]);                              \
1796
8.38M
            out[len - i - 1] = (tmp[0] + tmp[3]);                              \
1797
8.38M
        }                                                                      \
1798
8.38M
    }                                                                          \
1799
262k
                                                                               \
1800
8.64M
    for (int i = 1; i < (len4 + (mode == AV_TX_REAL_TO_IMAGINARY)); i++)       \
1801
8.38M
        out[len2 - i] = out[len - i];                                          \
1802
262k
                                                                               \
1803
262k
    if (mode == AV_TX_REAL_TO_REAL) {                                          \
1804
0
        out[len2] = tmp_dc;                                                    \
1805
0
        if (mod2)                                                              \
1806
0
            out[len4 + 1] = tmp_mid * fact[5];                                 \
1807
262k
    } else if (mod2) {                                                         \
1808
262k
        out[len4] = tmp_mid;                                                   \
1809
262k
    }                                                                          \
1810
262k
}                                                                              \
Unexecuted instantiation: tx_int32.c:ff_tx_rdft_r2r_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_rdft_r2r_mod2_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_rdft_r2i_int32_c
Unexecuted instantiation: tx_int32.c:ff_tx_rdft_r2i_mod2_int32_c
1811
                                                                               \
1812
static const FFTXCodelet TX_NAME(ff_tx_rdft_ ##n## _def) = {                   \
1813
    .name       = TX_NAME_STR("rdft_" #n),                                     \
1814
    .function   = TX_NAME(ff_tx_rdft_ ##n),                                    \
1815
    .type       = TX_TYPE(RDFT),                                               \
1816
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE | mode |                     \
1817
                  FF_TX_OUT_OF_PLACE | FF_TX_FORWARD_ONLY,                     \
1818
    .factors    = { 2 + 2*(!mod2), TX_FACTOR_ANY },                            \
1819
    .nb_factors = 2,                                                           \
1820
    .min_len    = 2 + 2*(!mod2),                                               \
1821
    .max_len    = TX_LEN_UNLIMITED,                                            \
1822
    .init       = TX_NAME(ff_tx_rdft_init),                                    \
1823
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,                                         \
1824
    .prio       = FF_TX_PRIO_BASE,                                             \
1825
};
1826
1827
DECL_RDFT_HALF(r2r,      AV_TX_REAL_TO_REAL,      0)
1828
DECL_RDFT_HALF(r2r_mod2, AV_TX_REAL_TO_REAL,      1)
1829
DECL_RDFT_HALF(r2i,      AV_TX_REAL_TO_IMAGINARY, 0)
1830
DECL_RDFT_HALF(r2i_mod2, AV_TX_REAL_TO_IMAGINARY, 1)
1831
1832
static av_cold int TX_NAME(ff_tx_dct_init)(AVTXContext *s,
1833
                                           const FFTXCodelet *cd,
1834
                                           uint64_t flags,
1835
                                           FFTXCodeletOptions *opts,
1836
                                           int len, int inv,
1837
                                           const void *scale)
1838
816
{
1839
816
    int ret;
1840
816
    double freq;
1841
816
    TXSample *tab;
1842
816
    SCALE_TYPE rsc = *((SCALE_TYPE *)scale);
1843
1844
816
    if (inv) {
1845
816
        len *= 2;
1846
816
        s->len *= 2;
1847
816
        rsc *= 0.5;
1848
816
    }
1849
1850
816
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(RDFT), flags, NULL, len, inv, &rsc)))
1851
0
        return ret;
1852
1853
816
    s->exp = av_malloc((len/2)*3*sizeof(TXSample));
1854
816
    if (!s->exp)
1855
0
        return AVERROR(ENOMEM);
1856
1857
816
    tab = (TXSample *)s->exp;
1858
1859
816
    freq = M_PI/(len*2);
1860
1861
1.04M
    for (int i = 0; i < len; i++)
1862
1.04M
        tab[i] = RESCALE(cos(i*freq)*(!inv + 1));
1863
1864
816
    if (inv) {
1865
522k
        for (int i = 0; i < len/2; i++)
1866
521k
            tab[len + i] = RESCALE(0.5 / sin((2*i + 1)*freq));
1867
816
    } else {
1868
0
        for (int i = 0; i < len/2; i++)
1869
0
            tab[len + i] = RESCALE(cos((len - 2*i - 1)*freq));
1870
0
    }
1871
1872
816
    return 0;
1873
816
}
Unexecuted instantiation: tx_double.c:ff_tx_dct_init_double_c
tx_float.c:ff_tx_dct_init_float_c
Line
Count
Source
1838
816
{
1839
816
    int ret;
1840
816
    double freq;
1841
816
    TXSample *tab;
1842
816
    SCALE_TYPE rsc = *((SCALE_TYPE *)scale);
1843
1844
816
    if (inv) {
1845
816
        len *= 2;
1846
816
        s->len *= 2;
1847
816
        rsc *= 0.5;
1848
816
    }
1849
1850
816
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(RDFT), flags, NULL, len, inv, &rsc)))
1851
0
        return ret;
1852
1853
816
    s->exp = av_malloc((len/2)*3*sizeof(TXSample));
1854
816
    if (!s->exp)
1855
0
        return AVERROR(ENOMEM);
1856
1857
816
    tab = (TXSample *)s->exp;
1858
1859
816
    freq = M_PI/(len*2);
1860
1861
1.04M
    for (int i = 0; i < len; i++)
1862
1.04M
        tab[i] = RESCALE(cos(i*freq)*(!inv + 1));
1863
1864
816
    if (inv) {
1865
522k
        for (int i = 0; i < len/2; i++)
1866
521k
            tab[len + i] = RESCALE(0.5 / sin((2*i + 1)*freq));
1867
816
    } else {
1868
0
        for (int i = 0; i < len/2; i++)
1869
0
            tab[len + i] = RESCALE(cos((len - 2*i - 1)*freq));
1870
0
    }
1871
1872
816
    return 0;
1873
816
}
Unexecuted instantiation: tx_int32.c:ff_tx_dct_init_int32_c
1874
1875
static void TX_NAME(ff_tx_dctII)(AVTXContext *s, void *_dst,
1876
                                 void *_src, ptrdiff_t stride)
1877
0
{
1878
0
    TXSample *dst = _dst;
1879
0
    TXSample *src = _src;
1880
0
    const int len = s->len;
1881
0
    const int len2 = len >> 1;
1882
0
    const TXSample *exp = (void *)s->exp;
1883
0
    TXSample next;
1884
#ifdef TX_INT32
1885
    int64_t tmp1, tmp2;
1886
#else
1887
    TXSample tmp1, tmp2;
1888
#endif
1889
1890
0
    for (int i = 0; i < len2; i++) {
1891
0
        TXSample in1 = src[i];
1892
0
        TXSample in2 = src[len - i - 1];
1893
0
        TXSample s    = exp[len + i];
1894
1895
#ifdef TX_INT32
1896
        tmp1 = in1 + in2;
1897
        tmp2 = in1 - in2;
1898
1899
        tmp1 >>= 1;
1900
        tmp2 *= s;
1901
1902
        tmp2 = (tmp2 + 0x40000000) >> 31;
1903
#else
1904
        tmp1 = (in1 + in2)*0.5;
1905
        tmp2 = (in1 - in2)*s;
1906
#endif
1907
1908
0
        src[i]           = tmp1 + tmp2;
1909
0
        src[len - i - 1] = tmp1 - tmp2;
1910
0
    }
1911
1912
0
    s->fn[0](&s->sub[0], dst, src, sizeof(TXComplex));
1913
1914
0
    next = dst[len];
1915
1916
0
    for (int i = len - 2; i > 0; i -= 2) {
1917
0
        TXSample tmp;
1918
1919
0
        CMUL(tmp, dst[i], exp[len - i], exp[i], dst[i + 0], dst[i + 1]);
1920
1921
0
        dst[i + 1] = next;
1922
1923
0
        next += tmp;
1924
0
    }
1925
1926
#ifdef TX_INT32
1927
    tmp1 = ((int64_t)exp[0]) * ((int64_t)dst[0]);
1928
    dst[0] = (tmp1 + 0x40000000) >> 31;
1929
#else
1930
    dst[0] = exp[0] * dst[0];
1931
#endif
1932
0
    dst[1] = next;
1933
0
}
Unexecuted instantiation: tx_double.c:ff_tx_dctII_double_c
Unexecuted instantiation: tx_float.c:ff_tx_dctII_float_c
Unexecuted instantiation: tx_int32.c:ff_tx_dctII_int32_c
1934
1935
static void TX_NAME(ff_tx_dctIII)(AVTXContext *s, void *_dst,
1936
                                  void *_src, ptrdiff_t stride)
1937
370k
{
1938
370k
    TXSample *dst = _dst;
1939
370k
    TXSample *src = _src;
1940
370k
    const int len = s->len;
1941
370k
    const int len2 = len >> 1;
1942
370k
    const TXSample *exp = (void *)s->exp;
1943
#ifdef TX_INT32
1944
    int64_t  tmp1, tmp2 = src[len - 1];
1945
    tmp2 = (2*tmp2 + 0x40000000) >> 31;
1946
#else
1947
    TXSample tmp1, tmp2 = 2*src[len - 1];
1948
#endif
1949
1950
370k
    src[len] = tmp2;
1951
1952
141M
    for (int i = len - 2; i >= 2; i -= 2) {
1953
140M
        TXSample val1 = src[i - 0];
1954
140M
        TXSample val2 = src[i - 1] - src[i + 1];
1955
1956
140M
        CMUL(src[i + 1], src[i], exp[len - i], exp[i], val1, val2);
1957
140M
    }
1958
1959
370k
    s->fn[0](&s->sub[0], dst, src, sizeof(float));
1960
1961
141M
    for (int i = 0; i < len2; i++) {
1962
141M
        TXSample in1 = dst[i];
1963
141M
        TXSample in2 = dst[len - i - 1];
1964
141M
        TXSample c   = exp[len + i];
1965
1966
141M
        tmp1 = in1 + in2;
1967
141M
        tmp2 = in1 - in2;
1968
141M
        tmp2 *= c;
1969
#ifdef TX_INT32
1970
        tmp2 = (tmp2 + 0x40000000) >> 31;
1971
#endif
1972
1973
141M
        dst[i]            = tmp1 + tmp2;
1974
141M
        dst[len - i - 1]  = tmp1 - tmp2;
1975
141M
    }
1976
370k
}
Unexecuted instantiation: tx_double.c:ff_tx_dctIII_double_c
tx_float.c:ff_tx_dctIII_float_c
Line
Count
Source
1937
370k
{
1938
370k
    TXSample *dst = _dst;
1939
370k
    TXSample *src = _src;
1940
370k
    const int len = s->len;
1941
370k
    const int len2 = len >> 1;
1942
370k
    const TXSample *exp = (void *)s->exp;
1943
#ifdef TX_INT32
1944
    int64_t  tmp1, tmp2 = src[len - 1];
1945
    tmp2 = (2*tmp2 + 0x40000000) >> 31;
1946
#else
1947
370k
    TXSample tmp1, tmp2 = 2*src[len - 1];
1948
370k
#endif
1949
1950
370k
    src[len] = tmp2;
1951
1952
141M
    for (int i = len - 2; i >= 2; i -= 2) {
1953
140M
        TXSample val1 = src[i - 0];
1954
140M
        TXSample val2 = src[i - 1] - src[i + 1];
1955
1956
140M
        CMUL(src[i + 1], src[i], exp[len - i], exp[i], val1, val2);
1957
140M
    }
1958
1959
370k
    s->fn[0](&s->sub[0], dst, src, sizeof(float));
1960
1961
141M
    for (int i = 0; i < len2; i++) {
1962
141M
        TXSample in1 = dst[i];
1963
141M
        TXSample in2 = dst[len - i - 1];
1964
141M
        TXSample c   = exp[len + i];
1965
1966
141M
        tmp1 = in1 + in2;
1967
141M
        tmp2 = in1 - in2;
1968
141M
        tmp2 *= c;
1969
#ifdef TX_INT32
1970
        tmp2 = (tmp2 + 0x40000000) >> 31;
1971
#endif
1972
1973
141M
        dst[i]            = tmp1 + tmp2;
1974
141M
        dst[len - i - 1]  = tmp1 - tmp2;
1975
141M
    }
1976
370k
}
Unexecuted instantiation: tx_int32.c:ff_tx_dctIII_int32_c
1977
1978
static const FFTXCodelet TX_NAME(ff_tx_dctII_def) = {
1979
    .name       = TX_NAME_STR("dctII"),
1980
    .function   = TX_NAME(ff_tx_dctII),
1981
    .type       = TX_TYPE(DCT),
1982
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE |
1983
                  FF_TX_OUT_OF_PLACE | FF_TX_FORWARD_ONLY,
1984
    .factors    = { 2, TX_FACTOR_ANY },
1985
    .min_len    = 2,
1986
    .max_len    = TX_LEN_UNLIMITED,
1987
    .init       = TX_NAME(ff_tx_dct_init),
1988
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
1989
    .prio       = FF_TX_PRIO_BASE,
1990
};
1991
1992
static const FFTXCodelet TX_NAME(ff_tx_dctIII_def) = {
1993
    .name       = TX_NAME_STR("dctIII"),
1994
    .function   = TX_NAME(ff_tx_dctIII),
1995
    .type       = TX_TYPE(DCT),
1996
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE |
1997
                  FF_TX_OUT_OF_PLACE | FF_TX_INVERSE_ONLY,
1998
    .factors    = { 2, TX_FACTOR_ANY },
1999
    .min_len    = 2,
2000
    .max_len    = TX_LEN_UNLIMITED,
2001
    .init       = TX_NAME(ff_tx_dct_init),
2002
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
2003
    .prio       = FF_TX_PRIO_BASE,
2004
};
2005
2006
static av_cold int TX_NAME(ff_tx_dcstI_init)(AVTXContext *s,
2007
                                             const FFTXCodelet *cd,
2008
                                             uint64_t flags,
2009
                                             FFTXCodeletOptions *opts,
2010
                                             int len, int inv,
2011
                                             const void *scale)
2012
1.40k
{
2013
1.40k
    int ret;
2014
1.40k
    SCALE_TYPE rsc = *((SCALE_TYPE *)scale);
2015
2016
1.40k
    if (inv) {
2017
0
        len *= 2;
2018
0
        s->len *= 2;
2019
0
        rsc *= 0.5;
2020
0
    }
2021
2022
    /* We want a half-complex RDFT */
2023
1.40k
    flags |= cd->type == TX_TYPE(DCT_I) ? AV_TX_REAL_TO_REAL :
2024
1.40k
                                          AV_TX_REAL_TO_IMAGINARY;
2025
2026
1.40k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(RDFT), flags, NULL,
2027
1.40k
                                (len - 1 + 2*(cd->type == TX_TYPE(DST_I)))*2,
2028
1.40k
                                0, &rsc)))
2029
0
        return ret;
2030
2031
1.40k
    s->tmp = av_mallocz((len + 1)*2*sizeof(TXSample));
2032
1.40k
    if (!s->tmp)
2033
0
        return AVERROR(ENOMEM);
2034
2035
1.40k
    return 0;
2036
1.40k
}
Unexecuted instantiation: tx_double.c:ff_tx_dcstI_init_double_c
tx_float.c:ff_tx_dcstI_init_float_c
Line
Count
Source
2012
1.40k
{
2013
1.40k
    int ret;
2014
1.40k
    SCALE_TYPE rsc = *((SCALE_TYPE *)scale);
2015
2016
1.40k
    if (inv) {
2017
0
        len *= 2;
2018
0
        s->len *= 2;
2019
0
        rsc *= 0.5;
2020
0
    }
2021
2022
    /* We want a half-complex RDFT */
2023
1.40k
    flags |= cd->type == TX_TYPE(DCT_I) ? AV_TX_REAL_TO_REAL :
2024
1.40k
                                          AV_TX_REAL_TO_IMAGINARY;
2025
2026
1.40k
    if ((ret = ff_tx_init_subtx(s, TX_TYPE(RDFT), flags, NULL,
2027
1.40k
                                (len - 1 + 2*(cd->type == TX_TYPE(DST_I)))*2,
2028
1.40k
                                0, &rsc)))
2029
0
        return ret;
2030
2031
1.40k
    s->tmp = av_mallocz((len + 1)*2*sizeof(TXSample));
2032
1.40k
    if (!s->tmp)
2033
0
        return AVERROR(ENOMEM);
2034
2035
1.40k
    return 0;
2036
1.40k
}
Unexecuted instantiation: tx_int32.c:ff_tx_dcstI_init_int32_c
2037
2038
static void TX_NAME(ff_tx_dctI)(AVTXContext *s, void *_dst,
2039
                                void *_src, ptrdiff_t stride)
2040
262k
{
2041
262k
    TXSample *dst = _dst;
2042
262k
    TXSample *src = _src;
2043
262k
    const int len = s->len - 1;
2044
262k
    TXSample *tmp = (TXSample *)s->tmp;
2045
2046
262k
    stride /= sizeof(TXSample);
2047
2048
16.7M
    for (int i = 0; i < len; i++)
2049
16.5M
        tmp[i] = tmp[2*len - i] = src[i * stride];
2050
2051
262k
    tmp[len] = src[len * stride]; /* Middle */
2052
2053
262k
    s->fn[0](&s->sub[0], dst, tmp, sizeof(TXSample));
2054
262k
}
Unexecuted instantiation: tx_double.c:ff_tx_dctI_double_c
tx_float.c:ff_tx_dctI_float_c
Line
Count
Source
2040
262k
{
2041
262k
    TXSample *dst = _dst;
2042
262k
    TXSample *src = _src;
2043
262k
    const int len = s->len - 1;
2044
262k
    TXSample *tmp = (TXSample *)s->tmp;
2045
2046
262k
    stride /= sizeof(TXSample);
2047
2048
16.7M
    for (int i = 0; i < len; i++)
2049
16.5M
        tmp[i] = tmp[2*len - i] = src[i * stride];
2050
2051
262k
    tmp[len] = src[len * stride]; /* Middle */
2052
2053
262k
    s->fn[0](&s->sub[0], dst, tmp, sizeof(TXSample));
2054
262k
}
Unexecuted instantiation: tx_int32.c:ff_tx_dctI_int32_c
2055
2056
static void TX_NAME(ff_tx_dstI)(AVTXContext *s, void *_dst,
2057
                                void *_src, ptrdiff_t stride)
2058
262k
{
2059
262k
    TXSample *dst = _dst;
2060
262k
    TXSample *src = _src;
2061
262k
    const int len = s->len + 1;
2062
262k
    TXSample *tmp = (void *)s->tmp;
2063
2064
262k
    stride /= sizeof(TXSample);
2065
2066
262k
    tmp[0] = 0;
2067
2068
17.0M
    for (int i = 1; i < len; i++) {
2069
16.7M
        TXSample a = src[(i - 1) * stride];
2070
16.7M
        tmp[i] = -a;
2071
16.7M
        tmp[2*len - i] = a;
2072
16.7M
    }
2073
2074
262k
    tmp[len] = 0; /* i == n, Nyquist */
2075
2076
262k
    s->fn[0](&s->sub[0], dst, tmp, sizeof(float));
2077
262k
}
Unexecuted instantiation: tx_double.c:ff_tx_dstI_double_c
tx_float.c:ff_tx_dstI_float_c
Line
Count
Source
2058
262k
{
2059
262k
    TXSample *dst = _dst;
2060
262k
    TXSample *src = _src;
2061
262k
    const int len = s->len + 1;
2062
262k
    TXSample *tmp = (void *)s->tmp;
2063
2064
262k
    stride /= sizeof(TXSample);
2065
2066
262k
    tmp[0] = 0;
2067
2068
17.0M
    for (int i = 1; i < len; i++) {
2069
16.7M
        TXSample a = src[(i - 1) * stride];
2070
16.7M
        tmp[i] = -a;
2071
16.7M
        tmp[2*len - i] = a;
2072
16.7M
    }
2073
2074
262k
    tmp[len] = 0; /* i == n, Nyquist */
2075
2076
262k
    s->fn[0](&s->sub[0], dst, tmp, sizeof(float));
2077
262k
}
Unexecuted instantiation: tx_int32.c:ff_tx_dstI_int32_c
2078
2079
static const FFTXCodelet TX_NAME(ff_tx_dctI_def) = {
2080
    .name       = TX_NAME_STR("dctI"),
2081
    .function   = TX_NAME(ff_tx_dctI),
2082
    .type       = TX_TYPE(DCT_I),
2083
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE | FF_TX_OUT_OF_PLACE,
2084
    .factors    = { 2, TX_FACTOR_ANY },
2085
    .nb_factors = 2,
2086
    .min_len    = 2,
2087
    .max_len    = TX_LEN_UNLIMITED,
2088
    .init       = TX_NAME(ff_tx_dcstI_init),
2089
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
2090
    .prio       = FF_TX_PRIO_BASE,
2091
};
2092
2093
static const FFTXCodelet TX_NAME(ff_tx_dstI_def) = {
2094
    .name       = TX_NAME_STR("dstI"),
2095
    .function   = TX_NAME(ff_tx_dstI),
2096
    .type       = TX_TYPE(DST_I),
2097
    .flags      = AV_TX_UNALIGNED | AV_TX_INPLACE | FF_TX_OUT_OF_PLACE,
2098
    .factors    = { 2, TX_FACTOR_ANY },
2099
    .nb_factors = 2,
2100
    .min_len    = 2,
2101
    .max_len    = TX_LEN_UNLIMITED,
2102
    .init       = TX_NAME(ff_tx_dcstI_init),
2103
    .cpu_flags  = FF_TX_CPU_FLAGS_ALL,
2104
    .prio       = FF_TX_PRIO_BASE,
2105
};
2106
2107
int TX_TAB(ff_tx_mdct_gen_exp)(AVTXContext *s, int *pre_tab)
2108
1.17M
{
2109
1.17M
    int off = 0;
2110
1.17M
    int len4 = s->len >> 1;
2111
1.17M
    double scale = s->scale_d;
2112
1.17M
    const double theta = (scale < 0 ? len4 : 0) + 1.0/8.0;
2113
1.17M
    size_t alloc = pre_tab ? 2*len4 : len4;
2114
2115
1.17M
    if (!(s->exp = av_malloc_array(alloc, sizeof(*s->exp))))
2116
0
        return AVERROR(ENOMEM);
2117
2118
1.17M
    scale = sqrt(fabs(scale));
2119
2120
1.17M
    if (pre_tab)
2121
1.14M
        off = len4;
2122
2123
241M
    for (int i = 0; i < len4; i++) {
2124
240M
        const double alpha = M_PI_2 * (i + theta) / len4;
2125
240M
        s->exp[off + i] = (TXComplex){ RESCALE(cos(alpha) * scale),
2126
240M
                                       RESCALE(sin(alpha) * scale) };
2127
240M
    }
2128
2129
1.17M
    if (pre_tab)
2130
224M
        for (int i = 0; i < len4; i++)
2131
223M
            s->exp[i] = s->exp[len4 + pre_tab[i]];
2132
2133
1.17M
    return 0;
2134
1.17M
}
Unexecuted instantiation: ff_tx_mdct_gen_exp_double
ff_tx_mdct_gen_exp_float
Line
Count
Source
2108
945k
{
2109
945k
    int off = 0;
2110
945k
    int len4 = s->len >> 1;
2111
945k
    double scale = s->scale_d;
2112
945k
    const double theta = (scale < 0 ? len4 : 0) + 1.0/8.0;
2113
945k
    size_t alloc = pre_tab ? 2*len4 : len4;
2114
2115
945k
    if (!(s->exp = av_malloc_array(alloc, sizeof(*s->exp))))
2116
0
        return AVERROR(ENOMEM);
2117
2118
945k
    scale = sqrt(fabs(scale));
2119
2120
945k
    if (pre_tab)
2121
922k
        off = len4;
2122
2123
206M
    for (int i = 0; i < len4; i++) {
2124
205M
        const double alpha = M_PI_2 * (i + theta) / len4;
2125
205M
        s->exp[off + i] = (TXComplex){ RESCALE(cos(alpha) * scale),
2126
205M
                                       RESCALE(sin(alpha) * scale) };
2127
205M
    }
2128
2129
945k
    if (pre_tab)
2130
194M
        for (int i = 0; i < len4; i++)
2131
193M
            s->exp[i] = s->exp[len4 + pre_tab[i]];
2132
2133
945k
    return 0;
2134
945k
}
ff_tx_mdct_gen_exp_int32
Line
Count
Source
2108
231k
{
2109
231k
    int off = 0;
2110
231k
    int len4 = s->len >> 1;
2111
231k
    double scale = s->scale_d;
2112
231k
    const double theta = (scale < 0 ? len4 : 0) + 1.0/8.0;
2113
231k
    size_t alloc = pre_tab ? 2*len4 : len4;
2114
2115
231k
    if (!(s->exp = av_malloc_array(alloc, sizeof(*s->exp))))
2116
0
        return AVERROR(ENOMEM);
2117
2118
231k
    scale = sqrt(fabs(scale));
2119
2120
231k
    if (pre_tab)
2121
219k
        off = len4;
2122
2123
35.4M
    for (int i = 0; i < len4; i++) {
2124
35.2M
        const double alpha = M_PI_2 * (i + theta) / len4;
2125
35.2M
        s->exp[off + i] = (TXComplex){ RESCALE(cos(alpha) * scale),
2126
35.2M
                                       RESCALE(sin(alpha) * scale) };
2127
35.2M
    }
2128
2129
231k
    if (pre_tab)
2130
29.3M
        for (int i = 0; i < len4; i++)
2131
29.1M
            s->exp[i] = s->exp[len4 + pre_tab[i]];
2132
2133
231k
    return 0;
2134
231k
}
2135
2136
const FFTXCodelet * const TX_NAME(ff_tx_codelet_list)[] = {
2137
    /* Split-Radix codelets */
2138
    &TX_NAME(ff_tx_fft2_ns_def),
2139
    &TX_NAME(ff_tx_fft4_ns_def),
2140
    &TX_NAME(ff_tx_fft8_ns_def),
2141
    &TX_NAME(ff_tx_fft16_ns_def),
2142
    &TX_NAME(ff_tx_fft32_ns_def),
2143
    &TX_NAME(ff_tx_fft64_ns_def),
2144
    &TX_NAME(ff_tx_fft128_ns_def),
2145
    &TX_NAME(ff_tx_fft256_ns_def),
2146
    &TX_NAME(ff_tx_fft512_ns_def),
2147
    &TX_NAME(ff_tx_fft1024_ns_def),
2148
    &TX_NAME(ff_tx_fft2048_ns_def),
2149
    &TX_NAME(ff_tx_fft4096_ns_def),
2150
    &TX_NAME(ff_tx_fft8192_ns_def),
2151
    &TX_NAME(ff_tx_fft16384_ns_def),
2152
    &TX_NAME(ff_tx_fft32768_ns_def),
2153
    &TX_NAME(ff_tx_fft65536_ns_def),
2154
    &TX_NAME(ff_tx_fft131072_ns_def),
2155
2156
    /* Prime factor codelets */
2157
    &TX_NAME(ff_tx_fft3_ns_def),
2158
    &TX_NAME(ff_tx_fft5_ns_def),
2159
    &TX_NAME(ff_tx_fft7_ns_def),
2160
    &TX_NAME(ff_tx_fft9_ns_def),
2161
    &TX_NAME(ff_tx_fft15_ns_def),
2162
2163
    /* We get these for free */
2164
    &TX_NAME(ff_tx_fft3_fwd_def),
2165
    &TX_NAME(ff_tx_fft5_fwd_def),
2166
    &TX_NAME(ff_tx_fft7_fwd_def),
2167
    &TX_NAME(ff_tx_fft9_fwd_def),
2168
2169
    /* Standalone transforms */
2170
    &TX_NAME(ff_tx_fft_def),
2171
    &TX_NAME(ff_tx_fft_inplace_def),
2172
    &TX_NAME(ff_tx_fft_inplace_small_def),
2173
    &TX_NAME(ff_tx_fft_pfa_def),
2174
    &TX_NAME(ff_tx_fft_pfa_ns_def),
2175
    &TX_NAME(ff_tx_fft_naive_def),
2176
    &TX_NAME(ff_tx_fft_naive_small_def),
2177
    &TX_NAME(ff_tx_mdct_fwd_def),
2178
    &TX_NAME(ff_tx_mdct_inv_def),
2179
    &TX_NAME(ff_tx_mdct_pfa_3xM_fwd_def),
2180
    &TX_NAME(ff_tx_mdct_pfa_5xM_fwd_def),
2181
    &TX_NAME(ff_tx_mdct_pfa_7xM_fwd_def),
2182
    &TX_NAME(ff_tx_mdct_pfa_9xM_fwd_def),
2183
    &TX_NAME(ff_tx_mdct_pfa_15xM_fwd_def),
2184
    &TX_NAME(ff_tx_mdct_pfa_3xM_inv_def),
2185
    &TX_NAME(ff_tx_mdct_pfa_5xM_inv_def),
2186
    &TX_NAME(ff_tx_mdct_pfa_7xM_inv_def),
2187
    &TX_NAME(ff_tx_mdct_pfa_9xM_inv_def),
2188
    &TX_NAME(ff_tx_mdct_pfa_15xM_inv_def),
2189
    &TX_NAME(ff_tx_mdct_naive_fwd_def),
2190
    &TX_NAME(ff_tx_mdct_naive_inv_def),
2191
    &TX_NAME(ff_tx_mdct_inv_full_def),
2192
    &TX_NAME(ff_tx_rdft_r2c_def),
2193
    &TX_NAME(ff_tx_rdft_r2r_def),
2194
    &TX_NAME(ff_tx_rdft_r2r_mod2_def),
2195
    &TX_NAME(ff_tx_rdft_r2i_def),
2196
    &TX_NAME(ff_tx_rdft_r2i_mod2_def),
2197
    &TX_NAME(ff_tx_rdft_c2r_def),
2198
    &TX_NAME(ff_tx_dctII_def),
2199
    &TX_NAME(ff_tx_dctIII_def),
2200
    &TX_NAME(ff_tx_dctI_def),
2201
    &TX_NAME(ff_tx_dstI_def),
2202
2203
    NULL,
2204
};