OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [image/] [jpeg/] [fdct.go] - Blame information for rev 747

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 747 jeremybenn
// Copyright 2011 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
4
 
5
package jpeg
6
 
7
// This file implements a Forward Discrete Cosine Transformation.
8
 
9
/*
10
It is based on the code in jfdctint.c from the Independent JPEG Group,
11
found at http://www.ijg.org/files/jpegsrc.v8c.tar.gz.
12
 
13
The "LEGAL ISSUES" section of the README in that archive says:
14
 
15
In plain English:
16
 
17
1. We don't promise that this software works.  (But if you find any bugs,
18
   please let us know!)
19
2. You can use this software for whatever you want.  You don't have to pay us.
20
3. You may not pretend that you wrote this software.  If you use it in a
21
   program, you must acknowledge somewhere in your documentation that
22
   you've used the IJG code.
23
 
24
In legalese:
25
 
26
The authors make NO WARRANTY or representation, either express or implied,
27
with respect to this software, its quality, accuracy, merchantability, or
28
fitness for a particular purpose.  This software is provided "AS IS", and you,
29
its user, assume the entire risk as to its quality and accuracy.
30
 
31
This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
32
All Rights Reserved except as specified below.
33
 
34
Permission is hereby granted to use, copy, modify, and distribute this
35
software (or portions thereof) for any purpose, without fee, subject to these
36
conditions:
37
(1) If any part of the source code for this software is distributed, then this
38
README file must be included, with this copyright and no-warranty notice
39
unaltered; and any additions, deletions, or changes to the original files
40
must be clearly indicated in accompanying documentation.
41
(2) If only executable code is distributed, then the accompanying
42
documentation must state that "this software is based in part on the work of
43
the Independent JPEG Group".
44
(3) Permission for use of this software is granted only if the user accepts
45
full responsibility for any undesirable consequences; the authors accept
46
NO LIABILITY for damages of any kind.
47
 
48
These conditions apply to any software derived from or based on the IJG code,
49
not just to the unmodified library.  If you use our work, you ought to
50
acknowledge us.
51
 
52
Permission is NOT granted for the use of any IJG author's name or company name
53
in advertising or publicity relating to this software or products derived from
54
it.  This software may be referred to only as "the Independent JPEG Group's
55
software".
56
 
57
We specifically permit and encourage the use of this software as the basis of
58
commercial products, provided that all warranty or liability claims are
59
assumed by the product vendor.
60
*/
61
 
62
// Trigonometric constants in 13-bit fixed point format.
63
const (
64
        fix_0_298631336 = 2446
65
        fix_0_390180644 = 3196
66
        fix_0_541196100 = 4433
67
        fix_0_765366865 = 6270
68
        fix_0_899976223 = 7373
69
        fix_1_175875602 = 9633
70
        fix_1_501321110 = 12299
71
        fix_1_847759065 = 15137
72
        fix_1_961570560 = 16069
73
        fix_2_053119869 = 16819
74
        fix_2_562915447 = 20995
75
        fix_3_072711026 = 25172
76
)
77
 
78
const (
79
        constBits     = 13
80
        pass1Bits     = 2
81
        centerJSample = 128
82
)
83
 
84
// fdct performs a forward DCT on an 8x8 block of coefficients, including a
85
// level shift.
86
func fdct(b *block) {
87
        // Pass 1: process rows.
88
        for y := 0; y < 8; y++ {
89
                x0 := b[y*8+0]
90
                x1 := b[y*8+1]
91
                x2 := b[y*8+2]
92
                x3 := b[y*8+3]
93
                x4 := b[y*8+4]
94
                x5 := b[y*8+5]
95
                x6 := b[y*8+6]
96
                x7 := b[y*8+7]
97
 
98
                tmp0 := x0 + x7
99
                tmp1 := x1 + x6
100
                tmp2 := x2 + x5
101
                tmp3 := x3 + x4
102
 
103
                tmp10 := tmp0 + tmp3
104
                tmp12 := tmp0 - tmp3
105
                tmp11 := tmp1 + tmp2
106
                tmp13 := tmp1 - tmp2
107
 
108
                tmp0 = x0 - x7
109
                tmp1 = x1 - x6
110
                tmp2 = x2 - x5
111
                tmp3 = x3 - x4
112
 
113
                b[y*8+0] = (tmp10 + tmp11 - 8*centerJSample) << pass1Bits
114
                b[y*8+4] = (tmp10 - tmp11) << pass1Bits
115
                z1 := (tmp12 + tmp13) * fix_0_541196100
116
                z1 += 1 << (constBits - pass1Bits - 1)
117
                b[y*8+2] = (z1 + tmp12*fix_0_765366865) >> (constBits - pass1Bits)
118
                b[y*8+6] = (z1 - tmp13*fix_1_847759065) >> (constBits - pass1Bits)
119
 
120
                tmp10 = tmp0 + tmp3
121
                tmp11 = tmp1 + tmp2
122
                tmp12 = tmp0 + tmp2
123
                tmp13 = tmp1 + tmp3
124
                z1 = (tmp12 + tmp13) * fix_1_175875602
125
                z1 += 1 << (constBits - pass1Bits - 1)
126
                tmp0 = tmp0 * fix_1_501321110
127
                tmp1 = tmp1 * fix_3_072711026
128
                tmp2 = tmp2 * fix_2_053119869
129
                tmp3 = tmp3 * fix_0_298631336
130
                tmp10 = tmp10 * -fix_0_899976223
131
                tmp11 = tmp11 * -fix_2_562915447
132
                tmp12 = tmp12 * -fix_0_390180644
133
                tmp13 = tmp13 * -fix_1_961570560
134
 
135
                tmp12 += z1
136
                tmp13 += z1
137
                b[y*8+1] = (tmp0 + tmp10 + tmp12) >> (constBits - pass1Bits)
138
                b[y*8+3] = (tmp1 + tmp11 + tmp13) >> (constBits - pass1Bits)
139
                b[y*8+5] = (tmp2 + tmp11 + tmp12) >> (constBits - pass1Bits)
140
                b[y*8+7] = (tmp3 + tmp10 + tmp13) >> (constBits - pass1Bits)
141
        }
142
        // Pass 2: process columns.
143
        // We remove pass1Bits scaling, but leave results scaled up by an overall factor of 8.
144
        for x := 0; x < 8; x++ {
145
                tmp0 := b[0*8+x] + b[7*8+x]
146
                tmp1 := b[1*8+x] + b[6*8+x]
147
                tmp2 := b[2*8+x] + b[5*8+x]
148
                tmp3 := b[3*8+x] + b[4*8+x]
149
 
150
                tmp10 := tmp0 + tmp3 + 1<<(pass1Bits-1)
151
                tmp12 := tmp0 - tmp3
152
                tmp11 := tmp1 + tmp2
153
                tmp13 := tmp1 - tmp2
154
 
155
                tmp0 = b[0*8+x] - b[7*8+x]
156
                tmp1 = b[1*8+x] - b[6*8+x]
157
                tmp2 = b[2*8+x] - b[5*8+x]
158
                tmp3 = b[3*8+x] - b[4*8+x]
159
 
160
                b[0*8+x] = (tmp10 + tmp11) >> pass1Bits
161
                b[4*8+x] = (tmp10 - tmp11) >> pass1Bits
162
 
163
                z1 := (tmp12 + tmp13) * fix_0_541196100
164
                z1 += 1 << (constBits + pass1Bits - 1)
165
                b[2*8+x] = (z1 + tmp12*fix_0_765366865) >> (constBits + pass1Bits)
166
                b[6*8+x] = (z1 - tmp13*fix_1_847759065) >> (constBits + pass1Bits)
167
 
168
                tmp10 = tmp0 + tmp3
169
                tmp11 = tmp1 + tmp2
170
                tmp12 = tmp0 + tmp2
171
                tmp13 = tmp1 + tmp3
172
                z1 = (tmp12 + tmp13) * fix_1_175875602
173
                z1 += 1 << (constBits + pass1Bits - 1)
174
                tmp0 = tmp0 * fix_1_501321110
175
                tmp1 = tmp1 * fix_3_072711026
176
                tmp2 = tmp2 * fix_2_053119869
177
                tmp3 = tmp3 * fix_0_298631336
178
                tmp10 = tmp10 * -fix_0_899976223
179
                tmp11 = tmp11 * -fix_2_562915447
180
                tmp12 = tmp12 * -fix_0_390180644
181
                tmp13 = tmp13 * -fix_1_961570560
182
 
183
                tmp12 += z1
184
                tmp13 += z1
185
                b[1*8+x] = (tmp0 + tmp10 + tmp12) >> (constBits + pass1Bits)
186
                b[3*8+x] = (tmp1 + tmp11 + tmp13) >> (constBits + pass1Bits)
187
                b[5*8+x] = (tmp2 + tmp11 + tmp12) >> (constBits + pass1Bits)
188
                b[7*8+x] = (tmp3 + tmp10 + tmp13) >> (constBits + pass1Bits)
189
        }
190
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.