Skip to content

Commit 156218d

Browse files
committed
Use i32 as intermediate value
1 parent 9d1a0cf commit 156218d

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

src/fdct.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ pub fn fdct(data: &mut [i16; 64]) {
107107
/* Note results are scaled up by sqrt(8) compared to a true DCT; */
108108
/* furthermore, we scale the results by 2**PASS1_BITS. */
109109

110+
let mut data2 = [0i32; 64];
111+
110112
for y in 0..8 {
111113
let offset = y * 8;
112114

@@ -128,18 +130,18 @@ pub fn fdct(data: &mut [i16; 64]) {
128130
let tmp11 = tmp1 + tmp2;
129131
let tmp12 = tmp1 - tmp2;
130132

131-
data[offset + 0] = into_el((tmp10 + tmp11) << PASS1_BITS);
132-
data[offset + 4] = into_el((tmp10 - tmp11) << PASS1_BITS);
133+
data2[offset + 0] = (tmp10 + tmp11) << PASS1_BITS;
134+
data2[offset + 4] = (tmp10 - tmp11) << PASS1_BITS;
133135

134136
let z1 = (tmp12 + tmp13) * FIX_0_541196100;
135-
data[offset + 2] = into_el(descale(
137+
data2[offset + 2] = descale(
136138
z1 + (tmp13 * FIX_0_765366865),
137139
CONST_BITS - PASS1_BITS,
138-
));
139-
data[offset + 6] = into_el(descale(
140+
);
141+
data2[offset + 6] = descale(
140142
z1 + (tmp12 * -FIX_1_847759065),
141143
CONST_BITS - PASS1_BITS,
142-
));
144+
);
143145

144146
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
145147
* cK represents cos(K*pi/16).
@@ -164,10 +166,10 @@ pub fn fdct(data: &mut [i16; 64]) {
164166
let z3 = z3 + z5;
165167
let z4 = z4 + z5;
166168

167-
data[offset + 7] = into_el(descale(tmp4 + z1 + z3, CONST_BITS - PASS1_BITS));
168-
data[offset + 5] = into_el(descale(tmp5 + z2 + z4, CONST_BITS - PASS1_BITS));
169-
data[offset + 3] = into_el(descale(tmp6 + z2 + z3, CONST_BITS - PASS1_BITS));
170-
data[offset + 1] = into_el(descale(tmp7 + z1 + z4, CONST_BITS - PASS1_BITS));
169+
data2[offset + 7] = descale(tmp4 + z1 + z3, CONST_BITS - PASS1_BITS);
170+
data2[offset + 5] = descale(tmp5 + z2 + z4, CONST_BITS - PASS1_BITS);
171+
data2[offset + 3] = descale(tmp6 + z2 + z3, CONST_BITS - PASS1_BITS);
172+
data2[offset + 1] = descale(tmp7 + z1 + z4, CONST_BITS - PASS1_BITS);
171173
}
172174

173175
/* Pass 2: process columns.
@@ -176,14 +178,14 @@ pub fn fdct(data: &mut [i16; 64]) {
176178
*/
177179

178180
for x in 0..8 {
179-
let tmp0 = i32::from(data[DCT_SIZE * 0 + x]) + i32::from(data[DCT_SIZE * 7 + x]);
180-
let tmp7 = i32::from(data[DCT_SIZE * 0 + x]) - i32::from(data[DCT_SIZE * 7 + x]);
181-
let tmp1 = i32::from(data[DCT_SIZE * 1 + x]) + i32::from(data[DCT_SIZE * 6 + x]);
182-
let tmp6 = i32::from(data[DCT_SIZE * 1 + x]) - i32::from(data[DCT_SIZE * 6 + x]);
183-
let tmp2 = i32::from(data[DCT_SIZE * 2 + x]) + i32::from(data[DCT_SIZE * 5 + x]);
184-
let tmp5 = i32::from(data[DCT_SIZE * 2 + x]) - i32::from(data[DCT_SIZE * 5 + x]);
185-
let tmp3 = i32::from(data[DCT_SIZE * 3 + x]) + i32::from(data[DCT_SIZE * 4 + x]);
186-
let tmp4 = i32::from(data[DCT_SIZE * 3 + x]) - i32::from(data[DCT_SIZE * 4 + x]);
181+
let tmp0 = data2[DCT_SIZE * 0 + x] + data2[DCT_SIZE * 7 + x];
182+
let tmp7 = data2[DCT_SIZE * 0 + x] - data2[DCT_SIZE * 7 + x];
183+
let tmp1 = data2[DCT_SIZE * 1 + x] + data2[DCT_SIZE * 6 + x];
184+
let tmp6 = data2[DCT_SIZE * 1 + x] - data2[DCT_SIZE * 6 + x];
185+
let tmp2 = data2[DCT_SIZE * 2 + x] + data2[DCT_SIZE * 5 + x];
186+
let tmp5 = data2[DCT_SIZE * 2 + x] - data2[DCT_SIZE * 5 + x];
187+
let tmp3 = data2[DCT_SIZE * 3 + x] + data2[DCT_SIZE * 4 + x];
188+
let tmp4 = data2[DCT_SIZE * 3 + x] - data2[DCT_SIZE * 4 + x];
187189

188190
/* Even part per LL&M figure 1 --- note that published figure is faulty;
189191
* rotator "sqrt(2)*c1" should be "sqrt(2)*c6".

0 commit comments

Comments
 (0)