annotate jfdctfst.c @ 3198:6b9f0c4fbdbe libavcodec

First part of a series of speed-enchancing patches. This one sets up a snow.h and makes snow use the dsputil function pointer framework to access the three functions that will be implemented in asm in the other parts of the patchset. Patch by Robert Edele < yartrebo AH earthlink POIS net> Original thread: Subject: [Ffmpeg-devel] [PATCH] Snow mmx+sse2 asm optimizations Date: Sun, 05 Feb 2006 12:47:14 -0500
author gpoirier
date Thu, 16 Mar 2006 19:18:18 +0000
parents bfabfdf9ce55
children 9b98e18a1b1c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 * jfdctfst.c
986e461dc072 Initial revision
glantau
parents:
diff changeset
3 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 * Copyright (C) 1994-1996, Thomas G. Lane.
986e461dc072 Initial revision
glantau
parents:
diff changeset
5 * This file is part of the Independent JPEG Group's software.
986e461dc072 Initial revision
glantau
parents:
diff changeset
6 * For conditions of distribution and use, see the accompanying README file.
986e461dc072 Initial revision
glantau
parents:
diff changeset
7 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
8 * This file contains a fast, not so accurate integer implementation of the
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 * forward DCT (Discrete Cosine Transform).
986e461dc072 Initial revision
glantau
parents:
diff changeset
10 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
986e461dc072 Initial revision
glantau
parents:
diff changeset
12 * on each column. Direct algorithms are also available, but they are
986e461dc072 Initial revision
glantau
parents:
diff changeset
13 * much more complex and seem not to be any faster when reduced to code.
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
15 * This implementation is based on Arai, Agui, and Nakajima's algorithm for
986e461dc072 Initial revision
glantau
parents:
diff changeset
16 * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in
986e461dc072 Initial revision
glantau
parents:
diff changeset
17 * Japanese, but the algorithm is described in the Pennebaker & Mitchell
986e461dc072 Initial revision
glantau
parents:
diff changeset
18 * JPEG textbook (see REFERENCES section in file README). The following code
986e461dc072 Initial revision
glantau
parents:
diff changeset
19 * is based directly on figure 4-8 in P&M.
986e461dc072 Initial revision
glantau
parents:
diff changeset
20 * While an 8-point DCT cannot be done in less than 11 multiplies, it is
986e461dc072 Initial revision
glantau
parents:
diff changeset
21 * possible to arrange the computation so that many of the multiplies are
986e461dc072 Initial revision
glantau
parents:
diff changeset
22 * simple scalings of the final outputs. These multiplies can then be
986e461dc072 Initial revision
glantau
parents:
diff changeset
23 * folded into the multiplications or divisions by the JPEG quantization
986e461dc072 Initial revision
glantau
parents:
diff changeset
24 * table entries. The AA&N method leaves only 5 multiplies and 29 adds
986e461dc072 Initial revision
glantau
parents:
diff changeset
25 * to be done in the DCT itself.
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 * The primary disadvantage of this method is that with fixed-point math,
986e461dc072 Initial revision
glantau
parents:
diff changeset
27 * accuracy is lost due to imprecise representation of the scaled
986e461dc072 Initial revision
glantau
parents:
diff changeset
28 * quantization values. The smaller the quantization table entry, the less
986e461dc072 Initial revision
glantau
parents:
diff changeset
29 * precise the scaled value, so this implementation does worse with high-
986e461dc072 Initial revision
glantau
parents:
diff changeset
30 * quality-setting files than with low-quality ones.
986e461dc072 Initial revision
glantau
parents:
diff changeset
31 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
32
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
33 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
34 * @file jfdctfst.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
35 * Independent JPEG Group's fast AAN dct.
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
36 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
37
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 #include <stdlib.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 #include <stdio.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 #include "common.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
42
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 #define DCTSIZE 8
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 #define GLOBAL(x) x
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 #define RIGHT_SHIFT(x, n) ((x) >> (n))
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 #define SHIFT_TEMPS
986e461dc072 Initial revision
glantau
parents:
diff changeset
47
986e461dc072 Initial revision
glantau
parents:
diff changeset
48 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 * This module is specialized to the case DCTSIZE = 8.
986e461dc072 Initial revision
glantau
parents:
diff changeset
50 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
51
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 #if DCTSIZE != 8
986e461dc072 Initial revision
glantau
parents:
diff changeset
53 Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
55
986e461dc072 Initial revision
glantau
parents:
diff changeset
56
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 /* Scaling decisions are generally the same as in the LL&M algorithm;
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 * see jfdctint.c for more details. However, we choose to descale
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 * (right shift) multiplication products as soon as they are formed,
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 * rather than carrying additional fractional bits into subsequent additions.
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 * This compromises accuracy slightly, but it lets us save a few shifts.
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 * everywhere except in the multiplications proper; this saves a good deal
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 * of work on 16-bit-int machines.
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 * Again to save a few shifts, the intermediate results between pass 1 and
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 * pass 2 are not upscaled, but are represented only to integral precision.
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
69 * A final compromise is to represent the multiplicative constants to only
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 * 8 fractional bits, rather than 13. This saves some shifting work on some
986e461dc072 Initial revision
glantau
parents:
diff changeset
71 * machines, and may also reduce the cost of multiplication (since there
986e461dc072 Initial revision
glantau
parents:
diff changeset
72 * are fewer one-bits in the constants).
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
74
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 #define CONST_BITS 8
986e461dc072 Initial revision
glantau
parents:
diff changeset
76
986e461dc072 Initial revision
glantau
parents:
diff changeset
77
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 * causing a lot of useless floating-point operations at run time.
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 * To get around this we use the following pre-calculated constants.
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 * If you change CONST_BITS you may want to add appropriate values.
986e461dc072 Initial revision
glantau
parents:
diff changeset
82 * (With a reasonable C compiler, you can just rely on the FIX() macro...)
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
84
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 #if CONST_BITS == 8
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
86 #define FIX_0_382683433 ((int32_t) 98) /* FIX(0.382683433) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
87 #define FIX_0_541196100 ((int32_t) 139) /* FIX(0.541196100) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
88 #define FIX_0_707106781 ((int32_t) 181) /* FIX(0.707106781) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
89 #define FIX_1_306562965 ((int32_t) 334) /* FIX(1.306562965) */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 #else
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 #define FIX_0_382683433 FIX(0.382683433)
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 #define FIX_0_541196100 FIX(0.541196100)
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 #define FIX_0_707106781 FIX(0.707106781)
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 #define FIX_1_306562965 FIX(1.306562965)
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
96
986e461dc072 Initial revision
glantau
parents:
diff changeset
97
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 /* We can gain a little more speed, with a further compromise in accuracy,
986e461dc072 Initial revision
glantau
parents:
diff changeset
99 * by omitting the addition in a descaling shift. This yields an incorrectly
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 * rounded result half the time...
986e461dc072 Initial revision
glantau
parents:
diff changeset
101 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
102
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 #ifndef USE_ACCURATE_ROUNDING
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 #undef DESCALE
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 #define DESCALE(x,n) RIGHT_SHIFT(x, n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
107
986e461dc072 Initial revision
glantau
parents:
diff changeset
108
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 474
diff changeset
109 /* Multiply a DCTELEM variable by an int32_t constant, and immediately
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
110 * descale to yield a DCTELEM result.
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
112
986e461dc072 Initial revision
glantau
parents:
diff changeset
113 #define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
986e461dc072 Initial revision
glantau
parents:
diff changeset
114
1589
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
115 static always_inline void row_fdct(DCTELEM * data){
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
116 int_fast16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
117 int_fast16_t tmp10, tmp11, tmp12, tmp13;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
118 int_fast16_t z1, z2, z3, z4, z5, z11, z13;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 DCTELEM *dataptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 int ctr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 SHIFT_TEMPS
986e461dc072 Initial revision
glantau
parents:
diff changeset
122
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 /* Pass 1: process rows. */
986e461dc072 Initial revision
glantau
parents:
diff changeset
124
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 dataptr = data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 tmp0 = dataptr[0] + dataptr[7];
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 tmp7 = dataptr[0] - dataptr[7];
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 tmp1 = dataptr[1] + dataptr[6];
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 tmp6 = dataptr[1] - dataptr[6];
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 tmp2 = dataptr[2] + dataptr[5];
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 tmp5 = dataptr[2] - dataptr[5];
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 tmp3 = dataptr[3] + dataptr[4];
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 tmp4 = dataptr[3] - dataptr[4];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
135
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 /* Even part */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
137
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
138 tmp10 = tmp0 + tmp3; /* phase 2 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 tmp13 = tmp0 - tmp3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 tmp11 = tmp1 + tmp2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 tmp12 = tmp1 - tmp2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
142
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 dataptr[0] = tmp10 + tmp11; /* phase 3 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 dataptr[4] = tmp10 - tmp11;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
145
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
147 dataptr[2] = tmp13 + z1; /* phase 5 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 dataptr[6] = tmp13 - z1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
149
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 /* Odd part */
986e461dc072 Initial revision
glantau
parents:
diff changeset
151
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
152 tmp10 = tmp4 + tmp5; /* phase 2 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 tmp11 = tmp5 + tmp6;
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 tmp12 = tmp6 + tmp7;
986e461dc072 Initial revision
glantau
parents:
diff changeset
155
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 /* The rotator is modified from fig 4-8 to avoid extra negations. */
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
158 z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
159 z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
160 z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
161
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
162 z11 = tmp7 + z3; /* phase 5 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 z13 = tmp7 - z3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
164
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
165 dataptr[5] = z13 + z2; /* phase 6 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 dataptr[3] = z13 - z2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 dataptr[1] = z11 + z4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 dataptr[7] = z11 - z4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
169
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
170 dataptr += DCTSIZE; /* advance pointer to next row */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 }
1589
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
172 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
173
1589
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
174 /*
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
175 * Perform the forward DCT on one block of samples.
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
176 */
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
177
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
178 GLOBAL(void)
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
179 fdct_ifast (DCTELEM * data)
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
180 {
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
181 int_fast16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
182 int_fast16_t tmp10, tmp11, tmp12, tmp13;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
183 int_fast16_t z1, z2, z3, z4, z5, z11, z13;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
184 DCTELEM *dataptr;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
185 int ctr;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
186 SHIFT_TEMPS
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
187
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
188 row_fdct(data);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
189
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 /* Pass 2: process columns. */
986e461dc072 Initial revision
glantau
parents:
diff changeset
191
986e461dc072 Initial revision
glantau
parents:
diff changeset
192 dataptr = data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
193 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
986e461dc072 Initial revision
glantau
parents:
diff changeset
196 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
202
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 /* Even part */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
204
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
205 tmp10 = tmp0 + tmp3; /* phase 2 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 tmp13 = tmp0 - tmp3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 tmp11 = tmp1 + tmp2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 tmp12 = tmp1 - tmp2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
209
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 dataptr[DCTSIZE*4] = tmp10 - tmp11;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
212
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
215 dataptr[DCTSIZE*6] = tmp13 - z1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
216
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 /* Odd part */
986e461dc072 Initial revision
glantau
parents:
diff changeset
218
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
219 tmp10 = tmp4 + tmp5; /* phase 2 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
220 tmp11 = tmp5 + tmp6;
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 tmp12 = tmp6 + tmp7;
986e461dc072 Initial revision
glantau
parents:
diff changeset
222
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 /* The rotator is modified from fig 4-8 to avoid extra negations. */
986e461dc072 Initial revision
glantau
parents:
diff changeset
224 z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
225 z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
227 z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
228
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
229 z11 = tmp7 + z3; /* phase 5 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 z13 = tmp7 - z3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
231
986e461dc072 Initial revision
glantau
parents:
diff changeset
232 dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
233 dataptr[DCTSIZE*3] = z13 - z2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
234 dataptr[DCTSIZE*1] = z11 + z4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 dataptr[DCTSIZE*7] = z11 - z4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
236
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
237 dataptr++; /* advance pointer to next column */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
238 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
239 }
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 0
diff changeset
240
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
241 /*
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
242 * Perform the forward 2-4-8 DCT on one block of samples.
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
243 */
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
244
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
245 GLOBAL(void)
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
246 fdct_ifast248 (DCTELEM * data)
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
247 {
1589
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
248 int_fast16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
249 int_fast16_t tmp10, tmp11, tmp12, tmp13;
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
250 int_fast16_t z1;
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
251 DCTELEM *dataptr;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
252 int ctr;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
253 SHIFT_TEMPS
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
254
1589
eb26d190cf5a move identical code into its own function
michael
parents: 1571
diff changeset
255 row_fdct(data);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
256
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
257 /* Pass 2: process columns. */
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
258
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
259 dataptr = data;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
260 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
261 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*1];
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
262 tmp1 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
263 tmp2 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
264 tmp3 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
265 tmp4 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*1];
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
266 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
267 tmp6 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
268 tmp7 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
269
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
270 /* Even part */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
271
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
272 tmp10 = tmp0 + tmp3;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
273 tmp11 = tmp1 + tmp2;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
274 tmp12 = tmp1 - tmp2;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
275 tmp13 = tmp0 - tmp3;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
276
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
277 dataptr[DCTSIZE*0] = tmp10 + tmp11;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
278 dataptr[DCTSIZE*4] = tmp10 - tmp11;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
279
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
280 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
281 dataptr[DCTSIZE*2] = tmp13 + z1;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
282 dataptr[DCTSIZE*6] = tmp13 - z1;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
283
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
284 tmp10 = tmp4 + tmp7;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
285 tmp11 = tmp5 + tmp6;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
286 tmp12 = tmp5 - tmp6;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
287 tmp13 = tmp4 - tmp7;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
288
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
289 dataptr[DCTSIZE*1] = tmp10 + tmp11;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
290 dataptr[DCTSIZE*5] = tmp10 - tmp11;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
291
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
292 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
293 dataptr[DCTSIZE*3] = tmp13 + z1;
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
294 dataptr[DCTSIZE*7] = tmp13 - z1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1589
diff changeset
295
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
296 dataptr++; /* advance pointer to next column */
1571
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
297 }
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
298 }
aa4dc16c0f18 * adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents: 1106
diff changeset
299
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 0
diff changeset
300
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 0
diff changeset
301 #undef GLOBAL
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 0
diff changeset
302 #undef CONST_BITS
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 0
diff changeset
303 #undef DESCALE
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 0
diff changeset
304 #undef FIX_0_541196100
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 0
diff changeset
305 #undef FIX_1_306562965