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 "
faandct.h
"
29
#include "
libavutil/emms.h
"
30
#include "
libavutil/internal.h
"
31
#include "
libavutil/libm.h
"
32
33
typedef
float
FLOAT
;
34
35
/* numbers generated by arbitrary precision arithmetic followed by truncation
36
to 36 fractional digits (enough for a 128-bit IEEE quad, see /usr/include/math.h
37
for this approach). Unfortunately, long double is not always available correctly,
38
e.g ppc has issues.
39
TODO: add L suffixes when ppc and toolchains sort out their stuff.
40
*/
41
#define B0 1.000000000000000000000000000000000000
42
#define B1 0.720959822006947913789091890943021267
// (cos(pi*1/16)sqrt(2))^-1
43
#define B2 0.765366864730179543456919968060797734
// (cos(pi*2/16)sqrt(2))^-1
44
#define B3 0.850430094767256448766702844371412325
// (cos(pi*3/16)sqrt(2))^-1
45
#define B4 1.000000000000000000000000000000000000
// (cos(pi*4/16)sqrt(2))^-1
46
#define B5 1.272758580572833938461007018281767032
// (cos(pi*5/16)sqrt(2))^-1
47
#define B6 1.847759065022573512256366378793576574
// (cos(pi*6/16)sqrt(2))^-1
48
#define B7 3.624509785411551372409941227504289587
// (cos(pi*7/16)sqrt(2))^-1
49
50
#define A1 M_SQRT1_2
// cos(pi*4/16)
51
#define A2 0.54119610014619698435
// cos(pi*6/16)sqrt(2)
52
#define A5 0.38268343236508977170
// cos(pi*6/16)
53
#define A4 1.30656296487637652774
// cos(pi*2/16)sqrt(2)
54
55
static
const
FLOAT
postscale
[64]={
56
B0
*
B0
,
B0
*
B1
,
B0
*
B2
,
B0
*
B3
,
B0
*
B4
,
B0
*
B5
,
B0
*
B6
,
B0
*
B7
,
57
B1
*
B0
,
B1
*
B1
,
B1
*
B2
,
B1
*
B3
,
B1
*
B4
,
B1
*
B5
,
B1
*
B6
,
B1
*
B7
,
58
B2
*
B0
,
B2
*
B1
,
B2
*
B2
,
B2
*
B3
,
B2
*
B4
,
B2
*
B5
,
B2
*
B6
,
B2
*
B7
,
59
B3
*
B0
,
B3
*
B1
,
B3
*
B2
,
B3
*
B3
,
B3
*
B4
,
B3
*
B5
,
B3
*
B6
,
B3
*
B7
,
60
B4
*
B0
,
B4
*
B1
,
B4
*
B2
,
B4
*
B3
,
B4
*
B4
,
B4
*
B5
,
B4
*
B6
,
B4
*
B7
,
61
B5
*
B0
,
B5
*
B1
,
B5
*
B2
,
B5
*
B3
,
B5
*
B4
,
B5
*
B5
,
B5
*
B6
,
B5
*
B7
,
62
B6
*
B0
,
B6
*
B1
,
B6
*
B2
,
B6
*
B3
,
B6
*
B4
,
B6
*
B5
,
B6
*
B6
,
B6
*
B7
,
63
B7
*
B0
,
B7
*
B1
,
B7
*
B2
,
B7
*
B3
,
B7
*
B4
,
B7
*
B5
,
B7
*
B6
,
B7
*
B7
,
64
};
65
66
static
av_always_inline
void
row_fdct
(
FLOAT
temp
[64], int16_t *
data
)
67
{
68
FLOAT
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
69
FLOAT
tmp10, tmp11, tmp12, tmp13;
70
FLOAT
z2, z4, z11, z13;
71
int
i
;
72
73
for
(
i
=0;
i
<8*8;
i
+=8) {
74
tmp0=
data
[0 +
i
] +
data
[7 +
i
];
75
tmp7=
data
[0 +
i
] -
data
[7 +
i
];
76
tmp1=
data
[1 +
i
] +
data
[6 +
i
];
77
tmp6=
data
[1 +
i
] -
data
[6 +
i
];
78
tmp2=
data
[2 +
i
] +
data
[5 +
i
];
79
tmp5=
data
[2 +
i
] -
data
[5 +
i
];
80
tmp3=
data
[3 +
i
] +
data
[4 +
i
];
81
tmp4=
data
[3 +
i
] -
data
[4 +
i
];
82
83
tmp10= tmp0 + tmp3;
84
tmp13= tmp0 - tmp3;
85
tmp11= tmp1 + tmp2;
86
tmp12= tmp1 - tmp2;
87
88
temp
[0 +
i
]= tmp10 + tmp11;
89
temp
[4 +
i
]= tmp10 - tmp11;
90
91
tmp12 += tmp13;
92
tmp12 *=
A1
;
93
temp
[2 +
i
]= tmp13 + tmp12;
94
temp
[6 +
i
]= tmp13 - tmp12;
95
96
tmp4 += tmp5;
97
tmp5 += tmp6;
98
tmp6 += tmp7;
99
100
z2= tmp4*(
A2
+
A5
) - tmp6*
A5
;
101
z4= tmp6*(
A4
-
A5
) + tmp4*
A5
;
102
103
tmp5*=
A1
;
104
105
z11= tmp7 + tmp5;
106
z13= tmp7 - tmp5;
107
108
temp
[5 +
i
]= z13 + z2;
109
temp
[3 +
i
]= z13 - z2;
110
temp
[1 +
i
]= z11 + z4;
111
temp
[7 +
i
]= z11 - z4;
112
}
113
}
114
115
void
ff_faandct
(int16_t *
data
)
116
{
117
FLOAT
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
118
FLOAT
tmp10, tmp11, tmp12, tmp13;
119
FLOAT
z2, z4, z11, z13;
120
FLOAT
temp
[64];
121
int
i
;
122
123
emms_c
();
124
125
row_fdct
(
temp
,
data
);
126
127
for
(
i
=0;
i
<8;
i
++) {
128
tmp0=
temp
[8*0 +
i
] +
temp
[8*7 +
i
];
129
tmp7=
temp
[8*0 +
i
] -
temp
[8*7 +
i
];
130
tmp1=
temp
[8*1 +
i
] +
temp
[8*6 +
i
];
131
tmp6=
temp
[8*1 +
i
] -
temp
[8*6 +
i
];
132
tmp2=
temp
[8*2 +
i
] +
temp
[8*5 +
i
];
133
tmp5=
temp
[8*2 +
i
] -
temp
[8*5 +
i
];
134
tmp3=
temp
[8*3 +
i
] +
temp
[8*4 +
i
];
135
tmp4=
temp
[8*3 +
i
] -
temp
[8*4 +
i
];
136
137
tmp10= tmp0 + tmp3;
138
tmp13= tmp0 - tmp3;
139
tmp11= tmp1 + tmp2;
140
tmp12= tmp1 - tmp2;
141
142
data
[8*0 +
i
]=
lrintf
(
postscale
[8*0 +
i
] * (tmp10 + tmp11));
143
data
[8*4 +
i
]=
lrintf
(
postscale
[8*4 +
i
] * (tmp10 - tmp11));
144
145
tmp12 += tmp13;
146
tmp12 *=
A1
;
147
data
[8*2 +
i
]=
lrintf
(
postscale
[8*2 +
i
] * (tmp13 + tmp12));
148
data
[8*6 +
i
]=
lrintf
(
postscale
[8*6 +
i
] * (tmp13 - tmp12));
149
150
tmp4 += tmp5;
151
tmp5 += tmp6;
152
tmp6 += tmp7;
153
154
z2= tmp4*(
A2
+
A5
) - tmp6*
A5
;
155
z4= tmp6*(
A4
-
A5
) + tmp4*
A5
;
156
157
tmp5*=
A1
;
158
159
z11= tmp7 + tmp5;
160
z13= tmp7 - tmp5;
161
162
data
[8*5 +
i
]=
lrintf
(
postscale
[8*5 +
i
] * (z13 + z2));
163
data
[8*3 +
i
]=
lrintf
(
postscale
[8*3 +
i
] * (z13 - z2));
164
data
[8*1 +
i
]=
lrintf
(
postscale
[8*1 +
i
] * (z11 + z4));
165
data
[8*7 +
i
]=
lrintf
(
postscale
[8*7 +
i
] * (z11 - z4));
166
}
167
}
168
169
void
ff_faandct248
(int16_t *
data
)
170
{
171
FLOAT
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
172
FLOAT
tmp10, tmp11, tmp12, tmp13;
173
FLOAT
temp
[64];
174
int
i
;
175
176
emms_c
();
177
178
row_fdct
(
temp
,
data
);
179
180
for
(
i
=0;
i
<8;
i
++) {
181
tmp0 =
temp
[8*0 +
i
] +
temp
[8*1 +
i
];
182
tmp1 =
temp
[8*2 +
i
] +
temp
[8*3 +
i
];
183
tmp2 =
temp
[8*4 +
i
] +
temp
[8*5 +
i
];
184
tmp3 =
temp
[8*6 +
i
] +
temp
[8*7 +
i
];
185
tmp4 =
temp
[8*0 +
i
] -
temp
[8*1 +
i
];
186
tmp5 =
temp
[8*2 +
i
] -
temp
[8*3 +
i
];
187
tmp6 =
temp
[8*4 +
i
] -
temp
[8*5 +
i
];
188
tmp7 =
temp
[8*6 +
i
] -
temp
[8*7 +
i
];
189
190
tmp10 = tmp0 + tmp3;
191
tmp11 = tmp1 + tmp2;
192
tmp12 = tmp1 - tmp2;
193
tmp13 = tmp0 - tmp3;
194
195
data
[8*0 +
i
] =
lrintf
(
postscale
[8*0 +
i
] * (tmp10 + tmp11));
196
data
[8*4 +
i
] =
lrintf
(
postscale
[8*4 +
i
] * (tmp10 - tmp11));
197
198
tmp12 += tmp13;
199
tmp12 *=
A1
;
200
data
[8*2 +
i
] =
lrintf
(
postscale
[8*2 +
i
] * (tmp13 + tmp12));
201
data
[8*6 +
i
] =
lrintf
(
postscale
[8*6 +
i
] * (tmp13 - tmp12));
202
203
tmp10 = tmp4 + tmp7;
204
tmp11 = tmp5 + tmp6;
205
tmp12 = tmp5 - tmp6;
206
tmp13 = tmp4 - tmp7;
207
208
data
[8*1 +
i
] =
lrintf
(
postscale
[8*0 +
i
] * (tmp10 + tmp11));
209
data
[8*5 +
i
] =
lrintf
(
postscale
[8*4 +
i
] * (tmp10 - tmp11));
210
211
tmp12 += tmp13;
212
tmp12 *=
A1
;
213
data
[8*3 +
i
] =
lrintf
(
postscale
[8*2 +
i
] * (tmp13 + tmp12));
214
data
[8*7 +
i
] =
lrintf
(
postscale
[8*6 +
i
] * (tmp13 - tmp12));
215
}
216
}
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:45
row_fdct
static av_always_inline void row_fdct(FLOAT temp[64], int16_t *data)
Definition
faandct.c:66
ff_faandct
void ff_faandct(int16_t *data)
Definition
faandct.c:115
B2
#define B2
Definition
faandct.c:43
postscale
static const FLOAT postscale[64]
Definition
faandct.c:55
B7
#define B7
Definition
faandct.c:48
B1
#define B1
Definition
faandct.c:42
B6
#define B6
Definition
faandct.c:47
B0
#define B0
Definition
faandct.c:41
FLOAT
float FLOAT
Definition
faandct.c:33
ff_faandct248
void ff_faandct248(int16_t *data)
Definition
faandct.c:169
B5
#define B5
Definition
faandct.c:46
B3
#define B3
Definition
faandct.c:44
faandct.h
Floating point AAN DCT.
av_always_inline
#define av_always_inline
Definition
attributes.h:72
internal.h
common internal API header
libm.h
Replacements for frequently missing libm functions.
lrintf
#define lrintf(x)
Definition
libm_mips.h:72
data
const char data[16]
Definition
mxf.c:149
temp
else temp
Definition
vf_mcdeint.c:275
Generated on Wed Aug 19 2026 20:20:47 for FFmpeg by
1.13.2