Mercurial > libavcodec.hg
annotate jfdctint.c @ 2497:69adfbbdcdeb libavcodec
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
which isn't the advanced one; and indeed, using adv. profile parser fails.
Using normal parser works, and that's what is done
- attempt at taking care of stride for NORM2 bitplane decoding
- duplication of much code from msmpeg4.c; this code isn't yet used, but
goes down as far as the block layer (mainly Transform Type stuff, the
remains are wild editing without checking). Unusable yet, and lacks the AC
decoding (but a step further in bitstream parsing)
patch by anonymous
| author | michael |
|---|---|
| date | Fri, 04 Feb 2005 02:20:38 +0000 |
| parents | eb26d190cf5a |
| children | ef2149182f1c |
| rev | line source |
|---|---|
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
1 /* |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
2 * jfdctint.c |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
3 * |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
4 * Copyright (C) 1991-1996, Thomas G. Lane. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
5 * This file is part of the Independent JPEG Group's software. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
6 * For conditions of distribution and use, see the accompanying README file. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
7 * |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
8 * This file contains a slow-but-accurate integer implementation of the |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
9 * forward DCT (Discrete Cosine Transform). |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
10 * |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
11 * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
12 * on each column. Direct algorithms are also available, but they are |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
13 * much more complex and seem not to be any faster when reduced to code. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
14 * |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
15 * This implementation is based on an algorithm described in |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
16 * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
17 * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
18 * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
19 * The primary algorithm described there uses 11 multiplies and 29 adds. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
20 * We use their alternate method with 12 multiplies and 32 adds. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
21 * The advantage of this method is that no data path contains more than one |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
22 * multiplication; this allows a very simple and accurate implementation in |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
23 * scaled fixed-point arithmetic, with a minimal number of shifts. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
24 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
25 |
| 1106 | 26 /** |
| 27 * @file jfdctint.c | |
| 28 * Independent JPEG Group's slow & accurate dct. | |
| 29 */ | |
| 30 | |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
31 #include <stdlib.h> |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
32 #include <stdio.h> |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
33 #include "common.h" |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
34 #include "dsputil.h" |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
35 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
36 #define SHIFT_TEMPS |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
37 #define DCTSIZE 8 |
| 637 | 38 #define BITS_IN_JSAMPLE 8 |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
39 #define GLOBAL(x) x |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
40 #define RIGHT_SHIFT(x, n) ((x) >> (n)) |
| 637 | 41 #define MULTIPLY16C16(var,const) ((var)*(const)) |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
42 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
43 #if 1 //def USE_ACCURATE_ROUNDING |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
44 #define DESCALE(x,n) RIGHT_SHIFT((x) + (1 << ((n) - 1)), n) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
45 #else |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
46 #define DESCALE(x,n) RIGHT_SHIFT(x, n) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
47 #endif |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
48 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
49 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
50 /* |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
51 * This module is specialized to the case DCTSIZE = 8. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
52 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
53 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
54 #if DCTSIZE != 8 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
55 Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
56 #endif |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
57 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
58 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
59 /* |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
60 * The poop on this scaling stuff is as follows: |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
61 * |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
62 * Each 1-D DCT step produces outputs which are a factor of sqrt(N) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
63 * larger than the true DCT outputs. The final outputs are therefore |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
64 * a factor of N larger than desired; since N=8 this can be cured by |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
65 * a simple right shift at the end of the algorithm. The advantage of |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
66 * this arrangement is that we save two multiplications per 1-D DCT, |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
67 * because the y0 and y4 outputs need not be divided by sqrt(N). |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
68 * In the IJG code, this factor of 8 is removed by the quantization step |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
69 * (in jcdctmgr.c), NOT in this module. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
70 * |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
71 * We have to do addition and subtraction of the integer inputs, which |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
72 * is no problem, and multiplication by fractional constants, which is |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
73 * a problem to do in integer arithmetic. We multiply all the constants |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
74 * by CONST_SCALE and convert them to integer constants (thus retaining |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
75 * CONST_BITS bits of precision in the constants). After doing a |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
76 * multiplication we have to divide the product by CONST_SCALE, with proper |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
77 * rounding, to produce the correct output. This division can be done |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
78 * cheaply as a right shift of CONST_BITS bits. We postpone shifting |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
79 * as long as possible so that partial sums can be added together with |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
80 * full fractional precision. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
81 * |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
82 * The outputs of the first pass are scaled up by PASS1_BITS bits so that |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
83 * they are represented to better-than-integral precision. These outputs |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
84 * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
85 * with the recommended scaling. (For 12-bit sample data, the intermediate |
| 1064 | 86 * array is int32_t anyway.) |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
87 * |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
88 * To avoid overflow of the 32-bit intermediate results in pass 2, we must |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
89 * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
90 * shows that the values given below are the most effective. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
91 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
92 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
93 #if BITS_IN_JSAMPLE == 8 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
94 #define CONST_BITS 13 |
| 637 | 95 #define PASS1_BITS 4 /* set this to 2 if 16x16 multiplies are faster */ |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
96 #else |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
97 #define CONST_BITS 13 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
98 #define PASS1_BITS 1 /* lose a little precision to avoid overflow */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
99 #endif |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
100 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
101 /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
102 * causing a lot of useless floating-point operations at run time. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
103 * To get around this we use the following pre-calculated constants. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
104 * If you change CONST_BITS you may want to add appropriate values. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
105 * (With a reasonable C compiler, you can just rely on the FIX() macro...) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
106 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
107 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
108 #if CONST_BITS == 13 |
| 1064 | 109 #define FIX_0_298631336 ((int32_t) 2446) /* FIX(0.298631336) */ |
| 110 #define FIX_0_390180644 ((int32_t) 3196) /* FIX(0.390180644) */ | |
| 111 #define FIX_0_541196100 ((int32_t) 4433) /* FIX(0.541196100) */ | |
| 112 #define FIX_0_765366865 ((int32_t) 6270) /* FIX(0.765366865) */ | |
| 113 #define FIX_0_899976223 ((int32_t) 7373) /* FIX(0.899976223) */ | |
| 114 #define FIX_1_175875602 ((int32_t) 9633) /* FIX(1.175875602) */ | |
| 115 #define FIX_1_501321110 ((int32_t) 12299) /* FIX(1.501321110) */ | |
| 116 #define FIX_1_847759065 ((int32_t) 15137) /* FIX(1.847759065) */ | |
| 117 #define FIX_1_961570560 ((int32_t) 16069) /* FIX(1.961570560) */ | |
| 118 #define FIX_2_053119869 ((int32_t) 16819) /* FIX(2.053119869) */ | |
| 119 #define FIX_2_562915447 ((int32_t) 20995) /* FIX(2.562915447) */ | |
| 120 #define FIX_3_072711026 ((int32_t) 25172) /* FIX(3.072711026) */ | |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
121 #else |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
122 #define FIX_0_298631336 FIX(0.298631336) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
123 #define FIX_0_390180644 FIX(0.390180644) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
124 #define FIX_0_541196100 FIX(0.541196100) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
125 #define FIX_0_765366865 FIX(0.765366865) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
126 #define FIX_0_899976223 FIX(0.899976223) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
127 #define FIX_1_175875602 FIX(1.175875602) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
128 #define FIX_1_501321110 FIX(1.501321110) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
129 #define FIX_1_847759065 FIX(1.847759065) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
130 #define FIX_1_961570560 FIX(1.961570560) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
131 #define FIX_2_053119869 FIX(2.053119869) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
132 #define FIX_2_562915447 FIX(2.562915447) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
133 #define FIX_3_072711026 FIX(3.072711026) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
134 #endif |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
135 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
136 |
| 1064 | 137 /* Multiply an int32_t variable by an int32_t constant to yield an int32_t result. |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
138 * For 8-bit samples with the recommended scaling, all the variable |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
139 * and constant values involved are no more than 16 bits wide, so a |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
140 * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
141 * For 12-bit samples, a full 32-bit multiplication will be needed. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
142 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
143 |
| 637 | 144 #if BITS_IN_JSAMPLE == 8 && CONST_BITS<=13 && PASS1_BITS<=2 |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
145 #define MULTIPLY(var,const) MULTIPLY16C16(var,const) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
146 #else |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
147 #define MULTIPLY(var,const) ((var) * (const)) |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
148 #endif |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
149 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
150 |
| 1589 | 151 static always_inline void row_fdct(DCTELEM * data){ |
| 152 int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; | |
| 153 int_fast32_t tmp10, tmp11, tmp12, tmp13; | |
| 154 int_fast32_t z1, z2, z3, z4, z5; | |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
155 DCTELEM *dataptr; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
156 int ctr; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
157 SHIFT_TEMPS |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
158 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
159 /* Pass 1: process rows. */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
160 /* Note results are scaled up by sqrt(8) compared to a true DCT; */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
161 /* furthermore, we scale the results by 2**PASS1_BITS. */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
162 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
163 dataptr = data; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
164 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
165 tmp0 = dataptr[0] + dataptr[7]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
166 tmp7 = dataptr[0] - dataptr[7]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
167 tmp1 = dataptr[1] + dataptr[6]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
168 tmp6 = dataptr[1] - dataptr[6]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
169 tmp2 = dataptr[2] + dataptr[5]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
170 tmp5 = dataptr[2] - dataptr[5]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
171 tmp3 = dataptr[3] + dataptr[4]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
172 tmp4 = dataptr[3] - dataptr[4]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
173 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
174 /* Even part per LL&M figure 1 --- note that published figure is faulty; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
175 * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
176 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
177 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
178 tmp10 = tmp0 + tmp3; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
179 tmp13 = tmp0 - tmp3; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
180 tmp11 = tmp1 + tmp2; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
181 tmp12 = tmp1 - tmp2; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
182 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
183 dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
184 dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
185 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
186 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
187 dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
188 CONST_BITS-PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
189 dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
190 CONST_BITS-PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
191 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
192 /* Odd part per figure 8 --- note paper omits factor of sqrt(2). |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
193 * cK represents cos(K*pi/16). |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
194 * i0..i3 in the paper are tmp4..tmp7 here. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
195 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
196 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
197 z1 = tmp4 + tmp7; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
198 z2 = tmp5 + tmp6; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
199 z3 = tmp4 + tmp6; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
200 z4 = tmp5 + tmp7; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
201 z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
202 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
203 tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
204 tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
205 tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
206 tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
207 z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
208 z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
209 z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
210 z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
211 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
212 z3 += z5; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
213 z4 += z5; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
214 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
215 dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
216 dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
217 dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
218 dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
219 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
220 dataptr += DCTSIZE; /* advance pointer to next row */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
221 } |
| 1589 | 222 } |
| 223 | |
| 224 /* | |
| 225 * Perform the forward DCT on one block of samples. | |
| 226 */ | |
| 227 | |
| 228 GLOBAL(void) | |
| 229 ff_jpeg_fdct_islow (DCTELEM * data) | |
| 230 { | |
| 231 int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; | |
| 232 int_fast32_t tmp10, tmp11, tmp12, tmp13; | |
| 233 int_fast32_t z1, z2, z3, z4, z5; | |
| 234 DCTELEM *dataptr; | |
| 235 int ctr; | |
| 236 SHIFT_TEMPS | |
| 237 | |
| 238 row_fdct(data); | |
|
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
239 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
240 /* Pass 2: process columns. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
241 * We remove the PASS1_BITS scaling, but leave the results scaled up |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
242 * by an overall factor of 8. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
243 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
244 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
245 dataptr = data; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
246 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
247 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
248 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
249 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
250 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
251 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
252 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
253 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
254 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
255 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
256 /* Even part per LL&M figure 1 --- note that published figure is faulty; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
257 * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
258 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
259 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
260 tmp10 = tmp0 + tmp3; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
261 tmp13 = tmp0 - tmp3; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
262 tmp11 = tmp1 + tmp2; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
263 tmp12 = tmp1 - tmp2; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
264 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
265 dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
266 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
267 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
268 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
269 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
270 CONST_BITS+PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
271 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
272 CONST_BITS+PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
273 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
274 /* Odd part per figure 8 --- note paper omits factor of sqrt(2). |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
275 * cK represents cos(K*pi/16). |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
276 * i0..i3 in the paper are tmp4..tmp7 here. |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
277 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
278 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
279 z1 = tmp4 + tmp7; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
280 z2 = tmp5 + tmp6; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
281 z3 = tmp4 + tmp6; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
282 z4 = tmp5 + tmp7; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
283 z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
284 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
285 tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
286 tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
287 tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
288 tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
289 z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
290 z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
291 z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
292 z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
293 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
294 z3 += z5; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
295 z4 += z5; |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
296 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
297 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
298 CONST_BITS+PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
299 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
300 CONST_BITS+PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
301 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
302 CONST_BITS+PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
303 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
304 CONST_BITS+PASS1_BITS); |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
305 |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
306 dataptr++; /* advance pointer to next column */ |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
307 } |
|
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
diff
changeset
|
308 } |
| 1567 | 309 |
| 310 /* | |
| 311 * The secret of DCT2-4-8 is really simple -- you do the usual 1-DCT | |
| 312 * on the rows and then, instead of doing even and odd, part on the colums | |
| 313 * you do even part two times. | |
| 314 */ | |
| 315 GLOBAL(void) | |
| 316 ff_fdct248_islow (DCTELEM * data) | |
| 317 { | |
| 1589 | 318 int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; |
| 319 int_fast32_t tmp10, tmp11, tmp12, tmp13; | |
| 320 int_fast32_t z1; | |
| 1567 | 321 DCTELEM *dataptr; |
| 322 int ctr; | |
| 323 SHIFT_TEMPS | |
| 324 | |
| 1589 | 325 row_fdct(data); |
| 1567 | 326 |
| 327 /* Pass 2: process columns. | |
| 328 * We remove the PASS1_BITS scaling, but leave the results scaled up | |
| 329 * by an overall factor of 8. | |
| 330 */ | |
| 331 | |
| 332 dataptr = data; | |
| 333 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { | |
| 334 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*1]; | |
| 335 tmp1 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; | |
| 336 tmp2 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; | |
| 337 tmp3 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; | |
| 338 tmp4 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*1]; | |
| 339 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; | |
| 340 tmp6 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; | |
| 341 tmp7 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; | |
| 342 | |
| 343 tmp10 = tmp0 + tmp3; | |
| 344 tmp11 = tmp1 + tmp2; | |
| 345 tmp12 = tmp1 - tmp2; | |
| 346 tmp13 = tmp0 - tmp3; | |
| 347 | |
| 348 dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); | |
| 349 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); | |
| 350 | |
| 351 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); | |
| 352 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), | |
| 353 CONST_BITS+PASS1_BITS); | |
| 354 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), | |
| 355 CONST_BITS+PASS1_BITS); | |
| 356 | |
| 357 tmp10 = tmp4 + tmp7; | |
| 358 tmp11 = tmp5 + tmp6; | |
| 359 tmp12 = tmp5 - tmp6; | |
| 360 tmp13 = tmp4 - tmp7; | |
| 361 | |
| 362 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); | |
| 363 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); | |
| 364 | |
| 365 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); | |
| 366 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), | |
| 367 CONST_BITS+PASS1_BITS); | |
| 368 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), | |
| 369 CONST_BITS+PASS1_BITS); | |
| 370 | |
| 371 dataptr++; /* advance pointer to next column */ | |
| 372 } | |
| 373 } |
