From 0949efec5b87ee2a84cf6f5ea6d567e13ac53bff Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 18 Sep 2023 15:09:08 -0700 Subject: [PATCH 1/5] `fn init_chroma`: Use offsets instead of slicing. --- src/wedge.rs | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/wedge.rs b/src/wedge.rs index 87a97bec2..d7aa8fee4 100644 --- a/src/wedge.rs +++ b/src/wedge.rs @@ -232,27 +232,22 @@ unsafe fn copy2d( } #[cold] -fn init_chroma( - mut chroma: &mut [u8], - mut luma: &[u8], - sign: bool, - w: usize, - h: usize, - ss_ver: bool, -) { +fn init_chroma(chroma: &mut [u8], luma: &[u8], sign: bool, w: usize, h: usize, ss_ver: bool) { let sign = sign as u16; let ss_ver = ss_ver as usize; + let mut luma_off = 0; + let mut chroma_off = 0; for _ in (0..h).step_by(1 + ss_ver) { for x in (0..w).step_by(2) { - let mut sum = luma[x] as u16 + luma[x + 1] as u16 + 1; + let mut sum = luma[luma_off + x] as u16 + luma[luma_off + x + 1] as u16 + 1; if ss_ver != 0 { - sum += luma[w + x] as u16 + luma[w + x + 1] as u16 + 1; + sum += luma[luma_off + w + x] as u16 + luma[luma_off + w + x + 1] as u16 + 1; } - chroma[x >> 1] = (sum - sign >> 1 + ss_ver) as u8; + chroma[chroma_off + (x >> 1)] = (sum - sign >> 1 + ss_ver) as u8; } - luma = &luma[w << ss_ver..]; - chroma = &mut chroma[w >> 1..]; + luma_off += w << ss_ver; + chroma_off += w >> 1; } } From fa7e72737600e1309d1c49dd4ff46b1182d2ba05 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 18 Sep 2023 15:10:03 -0700 Subject: [PATCH 2/5] `fn init_chroma`: Make `chroma`, `luma` args array refs with const generics. --- src/wedge.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/wedge.rs b/src/wedge.rs index d7aa8fee4..fcf611a02 100644 --- a/src/wedge.rs +++ b/src/wedge.rs @@ -232,7 +232,14 @@ unsafe fn copy2d( } #[cold] -fn init_chroma(chroma: &mut [u8], luma: &[u8], sign: bool, w: usize, h: usize, ss_ver: bool) { +fn init_chroma( + chroma: &mut [u8; LEN_CHROMA], + luma: &[u8; LEN_LUMA], + sign: bool, + w: usize, + h: usize, + ss_ver: bool, +) { let sign = sign as u16; let ss_ver = ss_ver as usize; From 6a3186e99fde128795808a8697f3f31e0816e8e4 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 18 Sep 2023 15:12:12 -0700 Subject: [PATCH 3/5] `fn init_chroma`: Create and return `chroma` array by value. --- src/wedge.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/wedge.rs b/src/wedge.rs index fcf611a02..c36ef1c45 100644 --- a/src/wedge.rs +++ b/src/wedge.rs @@ -233,16 +233,17 @@ unsafe fn copy2d( #[cold] fn init_chroma( - chroma: &mut [u8; LEN_CHROMA], luma: &[u8; LEN_LUMA], sign: bool, w: usize, h: usize, ss_ver: bool, -) { +) -> [u8; LEN_CHROMA] { let sign = sign as u16; let ss_ver = ss_ver as usize; + let mut chroma = [0; LEN_CHROMA]; + let mut luma_off = 0; let mut chroma_off = 0; for _ in (0..h).step_by(1 + ss_ver) { @@ -256,6 +257,8 @@ fn init_chroma( luma_off += w << ss_ver; chroma_off += w >> 1; } + + chroma } #[cold] @@ -295,10 +298,10 @@ unsafe fn fill2d_16x2> n & 1) != 0; let luma = &masks_444[sign as usize][n]; - init_chroma(&mut masks_422[sign as usize][n], luma, false, w, h, false); - init_chroma(&mut masks_422[!sign as usize][n], luma, true, w, h, false); - init_chroma(&mut masks_420[sign as usize][n], luma, false, w, h, true); - init_chroma(&mut masks_420[!sign as usize][n], luma, true, w, h, true); + masks_422[sign as usize][n] = init_chroma(luma, false, w, h, false); + masks_422[!sign as usize][n] = init_chroma(luma, true, w, h, false); + masks_420[sign as usize][n] = init_chroma(luma, false, w, h, true); + masks_420[!sign as usize][n] = init_chroma(luma, true, w, h, true); masks[0][0][n] = masks_444[sign as usize][n].as_ptr(); // not using !sign is intentional here, since 444 does not require From c1a7b74684b3908ec83a09a045523e47b9ab76b4 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 18 Sep 2023 15:14:16 -0700 Subject: [PATCH 4/5] `fn init_chroma`: Replace `for` loops with `const_for!` loops. --- src/wedge.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wedge.rs b/src/wedge.rs index c36ef1c45..140f2911a 100644 --- a/src/wedge.rs +++ b/src/wedge.rs @@ -246,17 +246,17 @@ fn init_chroma( let mut luma_off = 0; let mut chroma_off = 0; - for _ in (0..h).step_by(1 + ss_ver) { - for x in (0..w).step_by(2) { + const_for!(_y in 0..h, step_by 1 + ss_ver => { + const_for!(x in 0..w, step_by 2 => { let mut sum = luma[luma_off + x] as u16 + luma[luma_off + x + 1] as u16 + 1; if ss_ver != 0 { sum += luma[luma_off + w + x] as u16 + luma[luma_off + w + x + 1] as u16 + 1; } chroma[chroma_off + (x >> 1)] = (sum - sign >> 1 + ss_ver) as u8; - } + }); luma_off += w << ss_ver; chroma_off += w >> 1; - } + }); chroma } From a5fcda0ad839ca1f494f8f19d10004eb5b4812fb Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 18 Sep 2023 15:14:28 -0700 Subject: [PATCH 5/5] `fn init_chroma`: Make `const`. --- src/wedge.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wedge.rs b/src/wedge.rs index 140f2911a..246fc7c72 100644 --- a/src/wedge.rs +++ b/src/wedge.rs @@ -231,8 +231,7 @@ unsafe fn copy2d( } } -#[cold] -fn init_chroma( +const fn init_chroma( luma: &[u8; LEN_LUMA], sign: bool, w: usize,