@@ -13,14 +13,11 @@ import (
13
13
)
14
14
15
15
func benchmarkDCT (b * testing.B , f func (* block )) {
16
- b .StopTimer ()
17
- blocks := make ([]block , 0 , b .N * len (testBlocks ))
18
- for i := 0 ; i < b .N ; i ++ {
19
- blocks = append (blocks , testBlocks [:]... )
20
- }
21
- b .StartTimer ()
22
- for i := range blocks {
23
- f (& blocks [i ])
16
+ var blk block // avoid potential allocation in loop
17
+ for b .Loop () {
18
+ for _ , blk = range testBlocks {
19
+ f (& blk )
20
+ }
24
21
}
25
22
}
26
23
@@ -52,16 +49,13 @@ func TestDCT(t *testing.T) {
52
49
// floats to ints.
53
50
for i , b := range blocks {
54
51
got , want := b , b
55
- for j := range got {
56
- got [j ] = (got [j ] - 128 ) * 8
57
- }
58
52
slowFDCT (& got )
59
53
slowIDCT (& got )
60
54
for j := range got {
61
55
got [j ] = got [j ]/ 8 + 128
62
56
}
63
- if differ (& got , & want ) {
64
- t .Errorf ("i=%d: IDCT(FDCT)\n src\n %s\n got\n %s\n want\n %s\n " , i , & b , & got , & want )
57
+ if d := differ (& got , & want , 2 ); d >= 0 {
58
+ t .Errorf ("i=%d: IDCT(FDCT) (diff at %d,%d) \n src\n %s\n got\n %s\n want\n %s\n " , i , d / 8 , d % 8 , & b , & got , & want )
65
59
}
66
60
}
67
61
@@ -70,12 +64,9 @@ func TestDCT(t *testing.T) {
70
64
for i , b := range blocks {
71
65
got , want := b , b
72
66
fdct (& got )
73
- for j := range want {
74
- want [j ] = (want [j ] - 128 ) * 8
75
- }
76
67
slowFDCT (& want )
77
- if differ (& got , & want ) {
78
- t .Errorf ("i=%d: FDCT\n src\n %s\n got\n %s\n want\n %s\n " , i , & b , & got , & want )
68
+ if d := differ (& got , & want , 2 ); d >= 0 {
69
+ t .Errorf ("i=%d: FDCT (diff at %d,%d) \n src\n %s\n got\n %s\n want\n %s\n " , i , d / 8 , d % 8 , & b , & got , & want )
79
70
}
80
71
}
81
72
@@ -84,24 +75,26 @@ func TestDCT(t *testing.T) {
84
75
got , want := b , b
85
76
idct (& got )
86
77
slowIDCT (& want )
87
- if differ (& got , & want ) {
88
- t .Errorf ("i=%d: IDCT\n src\n %s\n got\n %s\n want\n %s\n " , i , & b , & got , & want )
78
+ if d := differ (& got , & want , 2 ); d >= 0 {
79
+ t .Errorf ("i=%d: IDCT (diff at %d,%d) \n src\n %s\n got\n %s\n want\n %s\n " , i , d / 8 , d % 8 , & b , & got , & want )
89
80
}
90
81
}
91
82
}
92
83
93
- // differ reports whether any pair-wise elements in b0 and b1 differ by 2 or
94
- // more. That tolerance is because there isn't a single definitive decoding of
84
+ // differ reports whether any pair-wise elements in b0 and b1 differ by more than 'ok'.
85
+ // That tolerance is because there isn't a single definitive decoding of
95
86
// a given JPEG image, even before the YCbCr to RGB conversion; implementations
96
87
// can have different IDCT rounding errors.
97
- func differ (b0 , b1 * block ) bool {
88
+ // If there is a difference, differ returns the index of the first difference.
89
+ // Otherwise it returns -1.
90
+ func differ (b0 , b1 * block , ok int32 ) int {
98
91
for i := range b0 {
99
92
delta := b0 [i ] - b1 [i ]
100
- if delta < - 2 || + 2 < delta {
101
- return true
93
+ if delta < - ok || ok < delta {
94
+ return i
102
95
}
103
96
}
104
- return false
97
+ return - 1
105
98
}
106
99
107
100
// alpha returns 1 if i is 0 and returns √2 otherwise.
@@ -166,12 +159,12 @@ func slowFDCT(b *block) {
166
159
sum := 0.0
167
160
for y := 0 ; y < 8 ; y ++ {
168
161
for x := 0 ; x < 8 ; x ++ {
169
- sum += alpha (u ) * alpha (v ) * float64 (b [8 * y + x ]) *
162
+ sum += alpha (u ) * alpha (v ) * float64 (b [8 * y + x ]- 128 ) *
170
163
cosines [((2 * x + 1 )* u )% 32 ] *
171
164
cosines [((2 * y + 1 )* v )% 32 ]
172
165
}
173
166
}
174
- dst [8 * v + u ] = sum / 8
167
+ dst [8 * v + u ] = sum
175
168
}
176
169
}
177
170
// Convert from float64 to int32.
0 commit comments