FFmpeg
Loading...
Searching...
No Matches
libavcodec
faandct.c
Go to the documentation of this file.
1
/*
2
* Floating point AAN DCT
3
* this implementation is based upon the IJG integer AAN DCT (see jfdctfst.c)
4
*
5
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
6
* Copyright (c) 2003 Roman Shaposhnik
7
*
8
* Permission to use, copy, modify, and/or distribute this software for any
9
* purpose with or without fee is hereby granted, provided that the above
10
* copyright notice and this permission notice appear in all copies.
11
*
12
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
*/
20
21
/**
22
* @file
23
* @brief
24
* Floating point AAN DCT
25
* @author Michael Niedermayer <michaelni@gmx.at>
26
*/
27
28
#include <math.h>
29
30
#include "
faandct.h
"
31
#include "
libavutil/emms.h
"
32
#include "
libavutil/internal.h
"
33
#include "
libavutil/mathematics.h
"
34
35
typedef
float
FLOAT
;
36
37
/* numbers generated by arbitrary precision arithmetic followed by truncation
38
to 36 fractional digits (enough for a 128-bit IEEE quad, see /usr/include/math.h
39
for this approach). Unfortunately, long double is not always available correctly,
40
e.g ppc has issues.
41
TODO: add L suffixes when ppc and toolchains sort out their stuff.
42
*/
43
#define B0 1.000000000000000000000000000000000000
44
#define B1 0.720959822006947913789091890943021267
// (cos(pi*1/16)sqrt(2))^-1
45
#define B2 0.765366864730179543456919968060797734
// (cos(pi*2/16)sqrt(2))^-1
46
#define B3 0.850430094767256448766702844371412325
// (cos(pi*3/16)sqrt(2))^-1
47
#define B4 1.000000000000000000000000000000000000
// (cos(pi*4/16)sqrt(2))^-1
48
#define B5 1.272758580572833938461007018281767032
// (cos(pi*5/16)sqrt(2))^-1
49
#define B6 1.847759065022573512256366378793576574
// (cos(pi*6/16)sqrt(2))^-1
50
#define B7 3.624509785411551372409941227504289587
// (cos(pi*7/16)sqrt(2))^-1
51
52
#define A1 M_SQRT1_2
// cos(pi*4/16)
53
#define A2 0.54119610014619698435
// cos(pi*6/16)sqrt(2)
54
#define A5 0.38268343236508977170
// cos(pi*6/16)
55
#define A4 1.30656296487637652774
// cos(pi*2/16)sqrt(2)
56
57
static
const
FLOAT
postscale
[64]={
58
B0
*
B0
,
B0
*
B1
,
B0
*
B2
,
B0
*
B3
,
B0
*
B4
,
B0
*
B5
,
B0
*
B6
,
B0
*
B7
,
59
B1
*
B0
,
B1
*
B1
,
B1
*
B2
,
B1
*
B3
,
B1
*
B4
,
B1
*
B5
,
B1
*
B6
,
B1
*
B7
,
60
B2
*
B0
,
B2
*
B1
,
B2
*
B2
,
B2
*
B3
,
B2
*
B4
,
B2
*
B5
,
B2
*
B6
,
B2
*
B7
,
61
B3
*
B0
,
B3
*
B1
,
B3
*
B2
,
B3
*
B3
,
B3
*
B4
,
B3
*
B5
,
B3
*
B6
,
B3
*
B7
,
62
B4
*
B0
,
B4
*
B1
,
B4
*
B2
,
B4
*
B3
,
B4
*
B4
,
B4
*
B5
,
B4
*
B6
,
B4
*
B7
,
63
B5
*
B0
,
B5
*
B1
,
B5
*
B2
,
B5
*
B3
,
B5
*
B4
,
B5
*
B5
,
B5
*
B6
,
B5
*
B7
,
64
B6
*
B0
,
B6
*
B1
,
B6
*
B2
,
B6
*
B3
,
B6
*
B4
,
B6
*
B5
,
B6
*
B6
,
B6
*
B7
,
65
B7
*
B0
,
B7
*
B1
,
B7
*
B2
,
B7
*
B3
,
B7
*
B4
,
B7
*
B5
,
B7
*
B6
,
B7
*
B7
,
66
};
67
68
static
av_always_inline
void
row_fdct
(
FLOAT
temp
[64], int16_t *
data
)
69
{
70
FLOAT
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
71
FLOAT
tmp10, tmp11, tmp12, tmp13;
72
FLOAT
z2, z4, z11, z13;
73
int
i
;
74
75
for
(
i
=0;
i
<8*8;
i
+=8) {
76
tmp0=
data
[0 +
i
] +
data
[7 +
i
];
77
tmp7=
data
[0 +
i
] -
data
[7 +
i
];
78
tmp1=
data
[1 +
i
] +
data
[6 +
i
];
79
tmp6=
data
[1 +
i
] -
data
[6 +
i
];
80
tmp2=
data
[2 +
i
] +
data
[5 +
i
];
81
tmp5=
data
[2 +
i
] -
data
[5 +
i
];
82
tmp3=
data
[3 +
i
] +
data
[4 +
i
];
83
tmp4=
data
[3 +
i
] -
data
[4 +
i
];
84
85
tmp10= tmp0 + tmp3;
86
tmp13= tmp0 - tmp3;
87
tmp11= tmp1 + tmp2;
88
tmp12= tmp1 - tmp2;
89
90
temp
[0 +
i
]= tmp10 + tmp11;
91
temp
[4 +
i
]= tmp10 - tmp11;
92
93
tmp12 += tmp13;
94
tmp12 *=
A1
;
95
temp
[2 +
i
]= tmp13 + tmp12;
96
temp
[6 +
i
]= tmp13 - tmp12;
97
98
tmp4 += tmp5;
99
tmp5 += tmp6;
100
tmp6 += tmp7;
101
102
z2= tmp4*(
A2
+
A5
) - tmp6*
A5
;
103
z4= tmp6*(
A4
-
A5
) + tmp4*
A5
;
104
105
tmp5*=
A1
;
106
107
z11= tmp7 + tmp5;
108
z13= tmp7 - tmp5;
109
110
temp
[5 +
i
]= z13 + z2;
111
temp
[3 +
i
]= z13 - z2;
112
temp
[1 +
i
]= z11 + z4;
113
temp
[7 +
i
]= z11 - z4;
114
}
115
}
116
117
void
ff_faandct
(int16_t *
data
)
118
{
119
FLOAT
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
120
FLOAT
tmp10, tmp11, tmp12, tmp13;
121
FLOAT
z2, z4, z11, z13;
122
FLOAT
temp
[64];
123
int
i
;
124
125
emms_c
();
126
127
row_fdct
(
temp
,
data
);
128
129
for
(
i
=0;
i
<8;
i
++) {
130
tmp0=
temp
[8*0 +
i
] +
temp
[8*7 +
i
];
131
tmp7=
temp
[8*0 +
i
] -
temp
[8*7 +
i
];
132
tmp1=
temp
[8*1 +
i
] +
temp
[8*6 +
i
];
133
tmp6=
temp
[8*1 +
i
] -
temp
[8*6 +
i
];
134
tmp2=
temp
[8*2 +
i
] +
temp
[8*5 +
i
];
135
tmp5=
temp
[8*2 +
i
] -
temp
[8*5 +
i
];
136
tmp3=
temp
[8*3 +
i
] +
temp
[8*4 +
i
];
137
tmp4=
temp
[8*3 +
i
] -
temp
[8*4 +
i
];
138
139
tmp10= tmp0 + tmp3;
140
tmp13= tmp0 - tmp3;
141
tmp11= tmp1 + tmp2;
142
tmp12= tmp1 - tmp2;
143
144
data
[8*0 +
i
]=
lrintf
(
postscale
[8*0 +
i
] * (tmp10 + tmp11));
145
data
[8*4 +
i
]=
lrintf
(
postscale
[8*4 +
i
] * (tmp10 - tmp11));
146
147
tmp12 += tmp13;
148
tmp12 *=
A1
;
149
data
[8*2 +
i
]=
lrintf
(
postscale
[8*2 +
i
] * (tmp13 + tmp12));
150
data
[8*6 +
i
]=
lrintf
(
postscale
[8*6 +
i
] * (tmp13 - tmp12));
151
152
tmp4 += tmp5;
153
tmp5 += tmp6;
154
tmp6 += tmp7;
155
156
z2= tmp4*(
A2
+
A5
) - tmp6*
A5
;
157
z4= tmp6*(
A4
-
A5
) + tmp4*
A5
;
158
159
tmp5*=
A1
;
160
161
z11= tmp7 + tmp5;
162
z13= tmp7 - tmp5;
163
164
data
[8*5 +
i
]=
lrintf
(
postscale
[8*5 +
i
] * (z13 + z2));
165
data
[8*3 +
i
]=
lrintf
(
postscale
[8*3 +
i
] * (z13 - z2));
166
data
[8*1 +
i
]=
lrintf
(
postscale
[8*1 +
i
] * (z11 + z4));
167
data
[8*7 +
i
]=
lrintf
(
postscale
[8*7 +
i
] * (z11 - z4));
168
}
169
}
170
171
void
ff_faandct248
(int16_t *
data
)
172
{
173
FLOAT
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
174
FLOAT
tmp10, tmp11, tmp12, tmp13;
175
FLOAT
temp
[64];
176
int
i
;
177
178
emms_c
();
179
180
row_fdct
(
temp
,
data
);
181
182
for
(
i
=0;
i
<8;
i
++) {
183
tmp0 =
temp
[8*0 +
i
] +
temp
[8*1 +
i
];
184
tmp1 =
temp
[8*2 +
i
] +
temp
[8*3 +
i
];
185
tmp2 =
temp
[8*4 +
i
] +
temp
[8*5 +
i
];
186
tmp3 =
temp
[8*6 +
i
] +
temp
[8*7 +
i
];
187
tmp4 =
temp
[8*0 +
i
] -
temp
[8*1 +
i
];
188
tmp5 =
temp
[8*2 +
i
] -
temp
[8*3 +
i
];
189
tmp6 =
temp
[8*4 +
i
] -
temp
[8*5 +
i
];
190
tmp7 =
temp
[8*6 +
i
] -
temp
[8*7 +
i
];
191
192
tmp10 = tmp0 + tmp3;
193
tmp11 = tmp1 + tmp2;
194
tmp12 = tmp1 - tmp2;
195
tmp13 = tmp0 - tmp3;
196
197
data
[8*0 +
i
] =
lrintf
(
postscale
[8*0 +
i
] * (tmp10 + tmp11));
198
data
[8*4 +
i
] =
lrintf
(
postscale
[8*4 +
i
] * (tmp10 - tmp11));
199
200
tmp12 += tmp13;
201
tmp12 *=
A1
;
202
data
[8*2 +
i
] =
lrintf
(
postscale
[8*2 +
i
] * (tmp13 + tmp12));
203
data
[8*6 +
i
] =
lrintf
(
postscale
[8*6 +
i
] * (tmp13 - tmp12));
204
205
tmp10 = tmp4 + tmp7;
206
tmp11 = tmp5 + tmp6;
207
tmp12 = tmp5 - tmp6;
208
tmp13 = tmp4 - tmp7;
209
210
data
[8*1 +
i
] =
lrintf
(
postscale
[8*0 +
i
] * (tmp10 + tmp11));
211
data
[8*5 +
i
] =
lrintf
(
postscale
[8*4 +
i
] * (tmp10 - tmp11));
212
213
tmp12 += tmp13;
214
tmp12 *=
A1
;
215
data
[8*3 +
i
] =
lrintf
(
postscale
[8*2 +
i
] * (tmp13 + tmp12));
216
data
[8*7 +
i
] =
lrintf
(
postscale
[8*6 +
i
] * (tmp13 - tmp12));
217
}
218
}
A2
#define A2
Definition
binkdsp.c:31
A4
#define A4
Definition
binkdsp.c:33
A1
#define A1
Definition
binkdsp.c:30
i
#define i(width, name, range_min, range_max)
Definition
cbs_h264.c:63
A5
#define A5
Definition
eaidct.c:34
emms.h
emms_c
#define emms_c()
Definition
emms.h:88
B4
#define B4
Definition
faandct.c:47
row_fdct
static av_always_inline void row_fdct(FLOAT temp[64], int16_t *data)
Definition
faandct.c:68
ff_faandct
void ff_faandct(int16_t *data)
Definition
faandct.c:117
B2
#define B2
Definition
faandct.c:45
postscale
static const FLOAT postscale[64]
Definition
faandct.c:57
B7
#define B7
Definition
faandct.c:50
B1
#define B1
Definition
faandct.c:44
B6
#define B6
Definition
faandct.c:49
B0
#define B0
Definition
faandct.c:43
FLOAT
float FLOAT
Definition
faandct.c:35
ff_faandct248
void ff_faandct248(int16_t *data)
Definition
faandct.c:171
B5
#define B5
Definition
faandct.c:48
B3
#define B3
Definition
faandct.c:46
faandct.h
Floating point AAN DCT.
av_always_inline
#define av_always_inline
Definition
attributes.h:72
internal.h
common internal API header
lrintf
#define lrintf(x)
Definition
libm_mips.h:74
mathematics.h
data
const char data[16]
Definition
mxf.c:149
temp
else temp
Definition
vf_mcdeint.c:275
Generated on Tue Sep 29 2026 19:20:50 for FFmpeg by
1.13.2