1 /* |
1 /* |
2 * jfdctfst.c |
2 * jfdctfst.c |
3 * |
3 * |
4 * Copyright (C) 1994-1996, Thomas G. Lane. |
4 * Copyright (C) 1994-1996, Thomas G. Lane. |
|
5 * Modified 2003-2009 by Guido Vollbeding. |
5 * This file is part of the Independent JPEG Group's software. |
6 * This file is part of the Independent JPEG Group's software. |
6 * For conditions of distribution and use, see the accompanying README file. |
7 * For conditions of distribution and use, see the accompanying README file. |
7 * |
8 * |
8 * This file contains a fast, not so accurate integer implementation of the |
9 * This file contains a fast, not so accurate integer implementation of the |
9 * forward DCT (Discrete Cosine Transform). |
10 * forward DCT (Discrete Cosine Transform). |
109 /* |
110 /* |
110 * Perform the forward DCT on one block of samples. |
111 * Perform the forward DCT on one block of samples. |
111 */ |
112 */ |
112 |
113 |
113 GLOBAL(void) |
114 GLOBAL(void) |
114 jpeg_fdct_ifast (DCTELEM * data) |
115 jpeg_fdct_ifast (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) |
115 { |
116 { |
116 DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; |
117 DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; |
117 DCTELEM tmp10, tmp11, tmp12, tmp13; |
118 DCTELEM tmp10, tmp11, tmp12, tmp13; |
118 DCTELEM z1, z2, z3, z4, z5, z11, z13; |
119 DCTELEM z1, z2, z3, z4, z5, z11, z13; |
119 DCTELEM *dataptr; |
120 DCTELEM *dataptr; |
|
121 JSAMPROW elemptr; |
120 int ctr; |
122 int ctr; |
121 SHIFT_TEMPS |
123 SHIFT_TEMPS |
122 |
124 |
123 /* Pass 1: process rows. */ |
125 /* Pass 1: process rows. */ |
124 |
126 |
125 dataptr = data; |
127 dataptr = data; |
126 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { |
128 for (ctr = 0; ctr < DCTSIZE; ctr++) { |
127 tmp0 = dataptr[0] + dataptr[7]; |
129 elemptr = sample_data[ctr] + start_col; |
128 tmp7 = dataptr[0] - dataptr[7]; |
130 |
129 tmp1 = dataptr[1] + dataptr[6]; |
131 /* Load data into workspace */ |
130 tmp6 = dataptr[1] - dataptr[6]; |
132 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); |
131 tmp2 = dataptr[2] + dataptr[5]; |
133 tmp7 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); |
132 tmp5 = dataptr[2] - dataptr[5]; |
134 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); |
133 tmp3 = dataptr[3] + dataptr[4]; |
135 tmp6 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); |
134 tmp4 = dataptr[3] - dataptr[4]; |
136 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); |
135 |
137 tmp5 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); |
|
138 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); |
|
139 tmp4 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); |
|
140 |
136 /* Even part */ |
141 /* Even part */ |
137 |
142 |
138 tmp10 = tmp0 + tmp3; /* phase 2 */ |
143 tmp10 = tmp0 + tmp3; /* phase 2 */ |
139 tmp13 = tmp0 - tmp3; |
144 tmp13 = tmp0 - tmp3; |
140 tmp11 = tmp1 + tmp2; |
145 tmp11 = tmp1 + tmp2; |
141 tmp12 = tmp1 - tmp2; |
146 tmp12 = tmp1 - tmp2; |
142 |
147 |
143 dataptr[0] = tmp10 + tmp11; /* phase 3 */ |
148 /* Apply unsigned->signed conversion */ |
|
149 dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */ |
144 dataptr[4] = tmp10 - tmp11; |
150 dataptr[4] = tmp10 - tmp11; |
145 |
151 |
146 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ |
152 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ |
147 dataptr[2] = tmp13 + z1; /* phase 5 */ |
153 dataptr[2] = tmp13 + z1; /* phase 5 */ |
148 dataptr[6] = tmp13 - z1; |
154 dataptr[6] = tmp13 - z1; |
149 |
155 |
150 /* Odd part */ |
156 /* Odd part */ |
151 |
157 |
152 tmp10 = tmp4 + tmp5; /* phase 2 */ |
158 tmp10 = tmp4 + tmp5; /* phase 2 */ |
153 tmp11 = tmp5 + tmp6; |
159 tmp11 = tmp5 + tmp6; |
154 tmp12 = tmp6 + tmp7; |
160 tmp12 = tmp6 + tmp7; |
180 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; |
186 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; |
181 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; |
187 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; |
182 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; |
188 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; |
183 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; |
189 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; |
184 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; |
190 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; |
185 |
191 |
186 /* Even part */ |
192 /* Even part */ |
187 |
193 |
188 tmp10 = tmp0 + tmp3; /* phase 2 */ |
194 tmp10 = tmp0 + tmp3; /* phase 2 */ |
189 tmp13 = tmp0 - tmp3; |
195 tmp13 = tmp0 - tmp3; |
190 tmp11 = tmp1 + tmp2; |
196 tmp11 = tmp1 + tmp2; |
191 tmp12 = tmp1 - tmp2; |
197 tmp12 = tmp1 - tmp2; |
192 |
198 |
193 dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ |
199 dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ |
194 dataptr[DCTSIZE*4] = tmp10 - tmp11; |
200 dataptr[DCTSIZE*4] = tmp10 - tmp11; |
195 |
201 |
196 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ |
202 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ |
197 dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ |
203 dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ |
198 dataptr[DCTSIZE*6] = tmp13 - z1; |
204 dataptr[DCTSIZE*6] = tmp13 - z1; |
199 |
205 |
200 /* Odd part */ |
206 /* Odd part */ |
201 |
207 |
202 tmp10 = tmp4 + tmp5; /* phase 2 */ |
208 tmp10 = tmp4 + tmp5; /* phase 2 */ |
203 tmp11 = tmp5 + tmp6; |
209 tmp11 = tmp5 + tmp6; |
204 tmp12 = tmp6 + tmp7; |
210 tmp12 = tmp6 + tmp7; |