31
32
#include "libavutil/mathematics.h"
35
/* sin((M_PI * x / (2*n)) */
36
#define SIN(s,n,x) (s->costab[(n) - (x)])
36
/* sin((M_PI * x / (2 * n)) */
37
#define SIN(s, n, x) (s->costab[(n) - (x)])
38
/* cos((M_PI * x / (2*n)) */
39
#define COS(s,n,x) (s->costab[x])
39
/* cos((M_PI * x / (2 * n)) */
40
#define COS(s, n, x) (s->costab[x])
41
42
static void ff_dst_calc_I_c(DCTContext *ctx, FFTSample *data)
47
for(i = 1; i < n/2; i++) {
48
float tmp1 = data[i ];
49
float tmp2 = data[n - i];
50
float s = SIN(ctx, n, 2*i);
48
for (i = 1; i < n / 2; i++) {
49
float tmp1 = data[i ];
50
float tmp2 = data[n - i];
51
float s = SIN(ctx, n, 2 * i);
53
tmp1 = (tmp1 - tmp2) * 0.5f;
55
data[n - i] = s - tmp1;
54
tmp1 = (tmp1 - tmp2) * 0.5f;
56
data[n - i] = s - tmp1;
59
60
ctx->rdft.rdft_calc(&ctx->rdft, data);
63
for(i = 1; i < n-2; i += 2) {
64
data[i + 1] += data[i - 1];
65
data[i ] = -data[i + 2];
64
for (i = 1; i < n - 2; i += 2) {
65
data[i + 1] += data[i - 1];
66
data[i] = -data[i + 2];
71
72
static void ff_dct_calc_I_c(DCTContext *ctx, FFTSample *data)
75
76
float next = -0.5f * (data[0] - data[n]);
77
for(i = 0; i < n/2; i++) {
78
float tmp1 = data[i ];
78
for (i = 0; i < n / 2; i++) {
79
80
float tmp2 = data[n - i];
80
float s = SIN(ctx, n, 2*i);
81
float c = COS(ctx, n, 2*i);
81
float s = SIN(ctx, n, 2 * i);
82
float c = COS(ctx, n, 2 * i);
88
tmp1 = (tmp1 + tmp2) * 0.5f;
89
tmp1 = (tmp1 + tmp2) * 0.5f;
90
91
data[n - i] = tmp1 + s;
103
104
int n = 1 << ctx->nbits;
106
float next = data[n - 1];
107
float next = data[n - 1];
107
108
float inv_n = 1.0f / n;
109
110
for (i = n - 2; i >= 2; i -= 2) {
110
float val1 = data[i ];
111
float val1 = data[i];
111
112
float val2 = data[i - 1] - data[i + 1];
112
float c = COS(ctx, n, i);
113
float s = SIN(ctx, n, i);
113
float c = COS(ctx, n, i);
114
float s = SIN(ctx, n, i);
115
data[i ] = c * val1 + s * val2;
116
data[i] = c * val1 + s * val2;
116
117
data[i + 1] = s * val1 - c * val2;
121
122
ctx->rdft.rdft_calc(&ctx->rdft, data);
123
124
for (i = 0; i < n / 2; i++) {
124
float tmp1 = data[i ] * inv_n;
125
float tmp1 = data[i] * inv_n;
125
126
float tmp2 = data[n - i - 1] * inv_n;
126
float csc = ctx->csc2[i] * (tmp1 - tmp2);
127
float csc = ctx->csc2[i] * (tmp1 - tmp2);
129
data[i ] = tmp1 + csc;
130
data[n - i - 1] = tmp1 - csc;
130
data[i] = tmp1 + csc;
131
data[n - i - 1] = tmp1 - csc;
140
for (i=0; i < n/2; i++) {
141
float tmp1 = data[i ];
141
for (i = 0; i < n / 2; i++) {
142
float tmp1 = data[i];
142
143
float tmp2 = data[n - i - 1];
143
float s = SIN(ctx, n, 2*i + 1);
146
tmp1 = (tmp1 + tmp2) * 0.5f;
144
float s = SIN(ctx, n, 2 * i + 1);
147
tmp1 = (tmp1 + tmp2) * 0.5f;
149
150
data[n-i-1] = tmp1 - s;
152
153
ctx->rdft.rdft_calc(&ctx->rdft, data);
154
next = data[1] * 0.5;
155
next = data[1] * 0.5;
157
158
for (i = n - 2; i >= 0; i -= 2) {
158
159
float inr = data[i ];
159
160
float ini = data[i + 1];
160
float c = COS(ctx, n, i);
161
float s = SIN(ctx, n, i);
163
data[i ] = c * inr + s * ini;
167
next += s * inr - c * ini;
161
float c = COS(ctx, n, i);
162
float s = SIN(ctx, n, i);
164
data[i] = c * inr + s * ini;
167
next += s * inr - c * ini;
181
181
memset(s, 0, sizeof(*s));
184
s->inverse = inverse;
184
s->inverse = inverse;
186
186
if (inverse == DCT_II && nbits == 5) {
187
187
s->dct_calc = dct32_func;
189
ff_init_ff_cos_tabs(nbits+2);
191
s->costab = ff_cos_tabs[nbits+2];
193
s->csc2 = av_malloc(n/2 * sizeof(FFTSample));
189
ff_init_ff_cos_tabs(nbits + 2);
191
s->costab = ff_cos_tabs[nbits + 2];
192
s->csc2 = av_malloc(n / 2 * sizeof(FFTSample));
195
194
if (ff_rdft_init(&s->rdft, nbits, inverse == DCT_III) < 0) {
196
195
av_free(s->csc2);
200
for (i = 0; i < n/2; i++)
201
s->csc2[i] = 0.5 / sin((M_PI / (2*n) * (2*i + 1)));
199
for (i = 0; i < n / 2; i++)
200
s->csc2[i] = 0.5 / sin((M_PI / (2 * n) * (2 * i + 1)));
204
case DCT_I : s->dct_calc = ff_dct_calc_I_c; break;
205
case DCT_II : s->dct_calc = ff_dct_calc_II_c ; break;
203
case DCT_I : s->dct_calc = ff_dct_calc_I_c; break;
204
case DCT_II : s->dct_calc = ff_dct_calc_II_c; break;
206
205
case DCT_III: s->dct_calc = ff_dct_calc_III_c; break;
207
case DST_I : s->dct_calc = ff_dst_calc_I_c; break;
206
case DST_I : s->dct_calc = ff_dst_calc_I_c; break;
211
210
s->dct32 = ff_dct32_float;
212
if (HAVE_MMX) ff_dct_init_mmx(s);