Doxygen Source Code Documentation
jfdctint.c File Reference
#include "jinclude.h"#include "jpeglib.h"#include "jdct.h"Go to the source code of this file.
Defines | |
| #define | JPEG_INTERNALS |
| #define | CONST_BITS 13 |
| #define | PASS1_BITS 2 |
| #define | FIX_0_298631336 ((INT32) 2446) |
| #define | FIX_0_390180644 ((INT32) 3196) |
| #define | FIX_0_541196100 ((INT32) 4433) |
| #define | FIX_0_765366865 ((INT32) 6270) |
| #define | FIX_0_899976223 ((INT32) 7373) |
| #define | FIX_1_175875602 ((INT32) 9633) |
| #define | FIX_1_501321110 ((INT32) 12299) |
| #define | FIX_1_847759065 ((INT32) 15137) |
| #define | FIX_1_961570560 ((INT32) 16069) |
| #define | FIX_2_053119869 ((INT32) 16819) |
| #define | FIX_2_562915447 ((INT32) 20995) |
| #define | FIX_3_072711026 ((INT32) 25172) |
| #define | MULTIPLY(var, const) MULTIPLY16C16(var,const) |
Functions | |
| jpeg_fdct_islow (DCTELEM *data) | |
Define Documentation
|
|
Definition at line 78 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 93 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 94 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 95 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 96 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 97 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 98 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 99 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 100 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 101 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 102 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 103 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 104 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
|
|
Definition at line 26 of file jfdctint.c. |
|
|
Definition at line 129 of file jfdctint.c. |
|
|
Definition at line 79 of file jfdctint.c. Referenced by jpeg_fdct_islow(). |
Function Documentation
|
|
Definition at line 140 of file jfdctint.c. References CONST_BITS, dataptr, DESCALE, FIX_0_298631336, FIX_0_390180644, FIX_0_541196100, FIX_0_765366865, FIX_0_899976223, FIX_1_175875602, FIX_1_501321110, FIX_1_847759065, FIX_1_961570560, FIX_2_053119869, FIX_2_562915447, FIX_3_072711026, INT32, MULTIPLY, PASS1_BITS, and z1. Referenced by jinit_forward_dct().
00141 {
00142 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00143 INT32 tmp10, tmp11, tmp12, tmp13;
00144 INT32 z1, z2, z3, z4, z5;
00145 DCTELEM *dataptr;
00146 int ctr;
00147 SHIFT_TEMPS
00148
00149 /* Pass 1: process rows. */
00150 /* Note results are scaled up by sqrt(8) compared to a true DCT; */
00151 /* furthermore, we scale the results by 2**PASS1_BITS. */
00152
00153 dataptr = data;
00154 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00155 tmp0 = dataptr[0] + dataptr[7];
00156 tmp7 = dataptr[0] - dataptr[7];
00157 tmp1 = dataptr[1] + dataptr[6];
00158 tmp6 = dataptr[1] - dataptr[6];
00159 tmp2 = dataptr[2] + dataptr[5];
00160 tmp5 = dataptr[2] - dataptr[5];
00161 tmp3 = dataptr[3] + dataptr[4];
00162 tmp4 = dataptr[3] - dataptr[4];
00163
00164 /* Even part per LL&M figure 1 --- note that published figure is faulty;
00165 * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
00166 */
00167
00168 tmp10 = tmp0 + tmp3;
00169 tmp13 = tmp0 - tmp3;
00170 tmp11 = tmp1 + tmp2;
00171 tmp12 = tmp1 - tmp2;
00172
00173 dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
00174 dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
00175
00176 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
00177 dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
00178 CONST_BITS-PASS1_BITS);
00179 dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
00180 CONST_BITS-PASS1_BITS);
00181
00182 /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
00183 * cK represents cos(K*pi/16).
00184 * i0..i3 in the paper are tmp4..tmp7 here.
00185 */
00186
00187 z1 = tmp4 + tmp7;
00188 z2 = tmp5 + tmp6;
00189 z3 = tmp4 + tmp6;
00190 z4 = tmp5 + tmp7;
00191 z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
00192
00193 tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
00194 tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
00195 tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
00196 tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
00197 z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
00198 z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
00199 z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
00200 z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
00201
00202 z3 += z5;
00203 z4 += z5;
00204
00205 dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
00206 dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
00207 dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
00208 dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
00209
00210 dataptr += DCTSIZE; /* advance pointer to next row */
00211 }
00212
00213 /* Pass 2: process columns.
00214 * We remove the PASS1_BITS scaling, but leave the results scaled up
00215 * by an overall factor of 8.
00216 */
00217
00218 dataptr = data;
00219 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00220 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
00221 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
00222 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
00223 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
00224 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
00225 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
00226 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
00227 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
00228
00229 /* Even part per LL&M figure 1 --- note that published figure is faulty;
00230 * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
00231 */
00232
00233 tmp10 = tmp0 + tmp3;
00234 tmp13 = tmp0 - tmp3;
00235 tmp11 = tmp1 + tmp2;
00236 tmp12 = tmp1 - tmp2;
00237
00238 dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
00239 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
00240
00241 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
00242 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
00243 CONST_BITS+PASS1_BITS);
00244 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
00245 CONST_BITS+PASS1_BITS);
00246
00247 /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
00248 * cK represents cos(K*pi/16).
00249 * i0..i3 in the paper are tmp4..tmp7 here.
00250 */
00251
00252 z1 = tmp4 + tmp7;
00253 z2 = tmp5 + tmp6;
00254 z3 = tmp4 + tmp6;
00255 z4 = tmp5 + tmp7;
00256 z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
00257
00258 tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
00259 tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
00260 tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
00261 tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
00262 z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
00263 z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
00264 z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
00265 z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
00266
00267 z3 += z5;
00268 z4 += z5;
00269
00270 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
00271 CONST_BITS+PASS1_BITS);
00272 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
00273 CONST_BITS+PASS1_BITS);
00274 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
00275 CONST_BITS+PASS1_BITS);
00276 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
00277 CONST_BITS+PASS1_BITS);
00278
00279 dataptr++; /* advance pointer to next column */
00280 }
00281 }
|