Skip to content

Commit a5c6209

Browse files
committed
fn get_lo_ctx: Make stride arg a u8 (necessary to prohibit overflows on multiplication) and pre-slice levels.
1 parent 9d00ae6 commit a5c6209

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

src/recon.rs

+22-20
Original file line numberDiff line numberDiff line change
@@ -472,8 +472,10 @@ fn get_lo_ctx(
472472
ctx_offsets: Option<&[[u8; 5]; 5]>,
473473
x: usize,
474474
y: usize,
475-
stride: usize,
475+
stride: u8,
476476
) -> usize {
477+
let stride = stride as usize;
478+
let levels = &levels[..2 * stride + 4 + 1];
477479
let level = |y, x| levels[y * stride + x] as usize;
478480

479481
let mut mag = level(0, 1) + level(1, 0);
@@ -730,7 +732,7 @@ fn decode_coefs<BD: BitDepth>(
730732
[nonsquare_tx.wrapping_add(tx as c_uint & nonsquare_tx) as usize],
731733
);
732734
scan = dav1d_scans[tx as usize];
733-
let stride = 4 * sh as usize;
735+
let stride = 4 * sh;
734736
let shift: c_uint = if t_dim.lh < 4 {
735737
t_dim.lh as c_uint + 2
736738
} else {
@@ -740,7 +742,7 @@ fn decode_coefs<BD: BitDepth>(
740742
let mask: c_uint = 4 * sh as c_uint - 1;
741743
// Optimizes better than `.fill(0)`,
742744
// which doesn't elide the bounds check, inline, or vectorize.
743-
for i in 0..stride * (4 * sw as usize + 2) {
745+
for i in 0..stride as usize * (4 * sw as usize + 2) {
744746
levels[i] = 0;
745747
}
746748
let mut x: c_uint;
@@ -796,7 +798,7 @@ fn decode_coefs<BD: BitDepth>(
796798
}
797799
}
798800
cf.set::<BD>(f, t_cf, rc as usize, (tok << 11).as_::<BD::Coef>());
799-
levels[x as usize * stride + y as usize] = level_tok as u8;
801+
levels[x as usize * stride as usize + y as usize] = level_tok as u8;
800802
let mut i = eob - 1;
801803
while i > 0 {
802804
// ac
@@ -819,7 +821,7 @@ fn decode_coefs<BD: BitDepth>(
819821
}
820822
}
821823
assert!(x < 32 && y < 32);
822-
let level = &mut levels[x as usize * stride + y as usize..];
824+
let level = &mut levels[x as usize * stride as usize + y as usize..];
823825
ctx = get_lo_ctx(
824826
level,
825827
tx_class,
@@ -907,9 +909,9 @@ fn decode_coefs<BD: BitDepth>(
907909
}
908910
if dc_tok == 3 {
909911
if tx_class == TxClass::TwoD {
910-
mag = levels[0 * stride + 1] as c_uint
911-
+ levels[1 * stride + 0] as c_uint
912-
+ levels[1 * stride + 1] as c_uint;
912+
mag = levels[0 * stride as usize + 1] as c_uint
913+
+ levels[1 * stride as usize + 0] as c_uint
914+
+ levels[1 * stride as usize + 1] as c_uint;
913915
}
914916
mag &= 63;
915917
ctx = if mag > 12 {
@@ -938,7 +940,7 @@ fn decode_coefs<BD: BitDepth>(
938940
let mask: c_uint = 4 * sh as c_uint - 1;
939941
// Optimizes better than `.fill(0)`,
940942
// which doesn't elide the bounds check, inline, or vectorize.
941-
for i in 0..stride * (4 * sh as usize + 2) {
943+
for i in 0..stride as usize * (4 * sh as usize + 2) {
942944
levels[i] = 0;
943945
}
944946
let mut x: c_uint;
@@ -993,7 +995,7 @@ fn decode_coefs<BD: BitDepth>(
993995
}
994996
}
995997
cf.set::<BD>(f, t_cf, rc as usize, (tok << 11).as_::<BD::Coef>());
996-
levels[x as usize * stride + y as usize] = level_tok as u8;
998+
levels[x as usize * stride as usize + y as usize] = level_tok as u8;
997999
let mut i = eob - 1;
9981000
while i > 0 {
9991001
let rc_i: c_uint;
@@ -1015,7 +1017,7 @@ fn decode_coefs<BD: BitDepth>(
10151017
}
10161018
}
10171019
assert!(x < 32 && y < 32);
1018-
let level = &mut levels[x as usize * stride + y as usize..];
1020+
let level = &mut levels[x as usize * stride as usize + y as usize..];
10191021
ctx = get_lo_ctx(
10201022
level,
10211023
tx_class,
@@ -1100,9 +1102,9 @@ fn decode_coefs<BD: BitDepth>(
11001102
}
11011103
if dc_tok == 3 {
11021104
if tx_class == TxClass::TwoD {
1103-
mag = levels[0 * stride + 1] as c_uint
1104-
+ levels[1 * stride + 0] as c_uint
1105-
+ levels[1 * stride + 1] as c_uint;
1105+
mag = levels[0 * stride as usize + 1] as c_uint
1106+
+ levels[1 * stride as usize + 0] as c_uint
1107+
+ levels[1 * stride as usize + 1] as c_uint;
11061108
}
11071109
mag &= 63;
11081110
ctx = if mag > 12 {
@@ -1131,7 +1133,7 @@ fn decode_coefs<BD: BitDepth>(
11311133
let mask: c_uint = 4 * sw as c_uint - 1;
11321134
// Optimizes better than `.fill(0)`,
11331135
// which doesn't elide the bounds check, inline, or vectorize.
1134-
for i in 0..stride * (4 * sw as usize + 2) {
1136+
for i in 0..stride as usize * (4 * sw as usize + 2) {
11351137
levels[i] = 0;
11361138
}
11371139
let mut x: c_uint;
@@ -1186,7 +1188,7 @@ fn decode_coefs<BD: BitDepth>(
11861188
}
11871189
}
11881190
cf.set::<BD>(f, t_cf, rc as usize, (tok << 11).as_::<BD::Coef>());
1189-
levels[x as usize * stride + y as usize] = level_tok as u8;
1191+
levels[x as usize * stride as usize + y as usize] = level_tok as u8;
11901192
let mut i = eob - 1;
11911193
while i > 0 {
11921194
let rc_i: c_uint;
@@ -1208,7 +1210,7 @@ fn decode_coefs<BD: BitDepth>(
12081210
}
12091211
}
12101212
assert!(x < 32 && y < 32);
1211-
let level = &mut levels[x as usize * stride + y as usize..];
1213+
let level = &mut levels[x as usize * stride as usize + y as usize..];
12121214
ctx = get_lo_ctx(
12131215
level,
12141216
tx_class,
@@ -1293,9 +1295,9 @@ fn decode_coefs<BD: BitDepth>(
12931295
}
12941296
if dc_tok == 3 {
12951297
if tx_class == TxClass::TwoD {
1296-
mag = levels[0 * stride + 1] as c_uint
1297-
+ levels[1 * stride + 0] as c_uint
1298-
+ levels[1 * stride + 1] as c_uint;
1298+
mag = levels[0 * stride as usize + 1] as c_uint
1299+
+ levels[1 * stride as usize + 0] as c_uint
1300+
+ levels[1 * stride as usize + 1] as c_uint;
12991301
}
13001302
mag &= 63;
13011303
ctx = if mag > 12 {

0 commit comments

Comments
 (0)