From 307d2f764655dc67b28890fe909822b67f7b0abf Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 02:11:17 -0700 Subject: [PATCH 01/12] `fn generate_scaling`: Make `points` arg a slice. --- src/fg_apply.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 69a9fbc66..73de34428 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -15,7 +15,7 @@ use std::ffi::c_void; unsafe fn generate_scaling( bitdepth: c_int, - points: *const [u8; 2], + points: &[[u8; 2]], num: c_int, scaling: *mut u8, ) { @@ -34,14 +34,14 @@ unsafe fn generate_scaling( } memset( scaling as *mut c_void, - (*points.offset(0))[1] as c_int, - (((*points.offset(0))[0] as c_int) << shift_x) as usize, + points[0][1] as c_int, + ((points[0][0] as c_int) << shift_x) as usize, ); for i in 0..num - 1 { - let bx = (*points.offset(i as isize))[0] as c_int; - let by = (*points.offset(i as isize))[1] as c_int; - let ex = (*points.offset((i + 1) as isize))[0] as c_int; - let ey = (*points.offset((i + 1) as isize))[1] as c_int; + let bx = points[i as usize][0] as c_int; + let by = points[i as usize][1] as c_int; + let ex = points[(i + 1) as usize][0] as c_int; + let ey = points[(i + 1) as usize][1] as c_int; let dx = ex - bx; let dy = ey - by; assert!(dx > 0); @@ -52,10 +52,10 @@ unsafe fn generate_scaling( d += delta; } } - let n = ((*points.offset((num - 1) as isize))[0] as c_int) << shift_x; + let n = (points[(num - 1) as usize][0] as c_int) << shift_x; memset( scaling.offset(n as isize) as *mut c_void, - (*points.offset((num - 1) as isize))[1] as c_int, + points[(num - 1) as usize][1] as c_int, (scaling_size - n) as usize, ); @@ -63,8 +63,8 @@ unsafe fn generate_scaling( let pad = 1 << shift_x; let rnd = pad >> 1; for i in 0..num - 1 { - let bx = ((*points.offset(i as isize))[0] as c_int) << shift_x; - let ex = ((*points.offset((i + 1) as isize))[0] as c_int) << shift_x; + let bx = (points[i as usize][0] as c_int) << shift_x; + let ex = (points[(i + 1) as usize][0] as c_int) << shift_x; let dx = ex - bx; for x in (0..dx).step_by(pad as usize) { let range = *scaling.offset((bx + x + pad) as isize) as c_int @@ -115,7 +115,7 @@ pub(crate) unsafe fn rav1d_prep_grain( if data.num_y_points != 0 || data.chroma_scaling_from_luma != 0 { generate_scaling::( r#in.p.bpc, - (data.y_points).as_ptr(), + &data.y_points, data.num_y_points, scaling[0].as_mut().as_mut_ptr(), ); @@ -123,7 +123,7 @@ pub(crate) unsafe fn rav1d_prep_grain( if data.num_uv_points[0] != 0 { generate_scaling::( r#in.p.bpc, - (data.uv_points[0]).as_ptr(), + &data.uv_points[0], data.num_uv_points[0], scaling[1].as_mut().as_mut_ptr(), ); @@ -131,7 +131,7 @@ pub(crate) unsafe fn rav1d_prep_grain( if data.num_uv_points[1] != 0 { generate_scaling::( r#in.p.bpc, - (data.uv_points[1]).as_ptr(), + &data.uv_points[1], data.num_uv_points[1], scaling[2].as_mut().as_mut_ptr(), ); From 2a88ae3e051b78f17d492e7c039df6f510b37d4f Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 02:14:07 -0700 Subject: [PATCH 02/12] `fn generate_scaling`: Combine `num` arg into the `points` arg slice length. --- src/fg_apply.rs | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 73de34428..30fd904f0 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -13,12 +13,7 @@ use std::cmp; use std::ffi::c_int; use std::ffi::c_void; -unsafe fn generate_scaling( - bitdepth: c_int, - points: &[[u8; 2]], - num: c_int, - scaling: *mut u8, -) { +unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], scaling: *mut u8) { let (shift_x, scaling_size) = match BD::BPC { BPC::BPC8 => (0, 256), BPC::BPC16 => { @@ -28,7 +23,7 @@ unsafe fn generate_scaling( (shift_x, scaling_size) } }; - if num == 0 { + if points.is_empty() { memset(scaling as *mut c_void, 0, scaling_size as usize); return; } @@ -37,11 +32,11 @@ unsafe fn generate_scaling( points[0][1] as c_int, ((points[0][0] as c_int) << shift_x) as usize, ); - for i in 0..num - 1 { - let bx = points[i as usize][0] as c_int; - let by = points[i as usize][1] as c_int; - let ex = points[(i + 1) as usize][0] as c_int; - let ey = points[(i + 1) as usize][1] as c_int; + for i in 0..points.len() - 1 { + let bx = points[i][0] as c_int; + let by = points[i][1] as c_int; + let ex = points[i + 1][0] as c_int; + let ey = points[i + 1][1] as c_int; let dx = ex - bx; let dy = ey - by; assert!(dx > 0); @@ -52,19 +47,19 @@ unsafe fn generate_scaling( d += delta; } } - let n = (points[(num - 1) as usize][0] as c_int) << shift_x; + let n = (points[points.len() - 1][0] as c_int) << shift_x; memset( scaling.offset(n as isize) as *mut c_void, - points[(num - 1) as usize][1] as c_int, + points[points.len() - 1][1] as c_int, (scaling_size - n) as usize, ); if BD::BPC != BPC::BPC8 { let pad = 1 << shift_x; let rnd = pad >> 1; - for i in 0..num - 1 { - let bx = (points[i as usize][0] as c_int) << shift_x; - let ex = (points[(i + 1) as usize][0] as c_int) << shift_x; + for i in 0..points.len() - 1 { + let bx = (points[i][0] as c_int) << shift_x; + let ex = (points[i + 1][0] as c_int) << shift_x; let dx = ex - bx; for x in (0..dx).step_by(pad as usize) { let range = *scaling.offset((bx + x + pad) as isize) as c_int @@ -115,24 +110,21 @@ pub(crate) unsafe fn rav1d_prep_grain( if data.num_y_points != 0 || data.chroma_scaling_from_luma != 0 { generate_scaling::( r#in.p.bpc, - &data.y_points, - data.num_y_points, + &data.y_points[..data.num_y_points as usize], scaling[0].as_mut().as_mut_ptr(), ); } if data.num_uv_points[0] != 0 { generate_scaling::( r#in.p.bpc, - &data.uv_points[0], - data.num_uv_points[0], + &data.uv_points[0][..data.num_uv_points[0] as usize], scaling[1].as_mut().as_mut_ptr(), ); } if data.num_uv_points[1] != 0 { generate_scaling::( r#in.p.bpc, - &data.uv_points[1], - data.num_uv_points[1], + &data.uv_points[1][..data.num_uv_points[1] as usize], scaling[2].as_mut().as_mut_ptr(), ); } From 0ad0063c63c46f6c9491d8996953f59f8802c432 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 02:18:42 -0700 Subject: [PATCH 03/12] `fn generate_scaling`: Replace indexing loops with iterators. --- src/fg_apply.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 30fd904f0..3d384f392 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -32,11 +32,13 @@ unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], sc points[0][1] as c_int, ((points[0][0] as c_int) << shift_x) as usize, ); - for i in 0..points.len() - 1 { - let bx = points[i][0] as c_int; - let by = points[i][1] as c_int; - let ex = points[i + 1][0] as c_int; - let ey = points[i + 1][1] as c_int; + for ps in points.windows(2) { + // TODO(kkysen) use array_windows when stabilized + let [p0, p1] = ps.try_into().unwrap(); + let bx = p0[0] as c_int; + let by = p0[1] as c_int; + let ex = p1[0] as c_int; + let ey = p1[1] as c_int; let dx = ex - bx; let dy = ey - by; assert!(dx > 0); @@ -57,9 +59,11 @@ unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], sc if BD::BPC != BPC::BPC8 { let pad = 1 << shift_x; let rnd = pad >> 1; - for i in 0..points.len() - 1 { - let bx = (points[i][0] as c_int) << shift_x; - let ex = (points[i + 1][0] as c_int) << shift_x; + for ps in points.windows(2) { + // TODO(kkysen) use array_windows when stabilized + let [p0, p1] = ps.try_into().unwrap(); + let bx = (p0[0] as c_int) << shift_x; + let ex = (p1[0] as c_int) << shift_x; let dx = ex - bx; for x in (0..dx).step_by(pad as usize) { let range = *scaling.offset((bx + x + pad) as isize) as c_int From cad12bc147ac203f085d1863658cca0d2b057bcf Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 02:36:55 -0700 Subject: [PATCH 04/12] `fn generate_scaling`: Make `scaling` arg a slice. --- src/fg_apply.rs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 3d384f392..34a7dde57 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -13,7 +13,7 @@ use std::cmp; use std::ffi::c_int; use std::ffi::c_void; -unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], scaling: *mut u8) { +unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], scaling: &mut [u8]) { let (shift_x, scaling_size) = match BD::BPC { BPC::BPC8 => (0, 256), BPC::BPC16 => { @@ -24,11 +24,15 @@ unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], sc } }; if points.is_empty() { - memset(scaling as *mut c_void, 0, scaling_size as usize); + memset( + scaling.as_mut_ptr() as *mut c_void, + 0, + scaling_size as usize, + ); return; } memset( - scaling as *mut c_void, + scaling.as_mut_ptr() as *mut c_void, points[0][1] as c_int, ((points[0][0] as c_int) << shift_x) as usize, ); @@ -45,13 +49,13 @@ unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], sc let delta = dy * ((0x10000 + (dx >> 1)) / dx); let mut d = 0x8000; for x in 0..dx { - *scaling.offset((bx + x << shift_x) as isize) = (by + (d >> 16)) as u8; + scaling[(bx + x << shift_x) as usize] = (by + (d >> 16)) as u8; d += delta; } } let n = (points[points.len() - 1][0] as c_int) << shift_x; memset( - scaling.offset(n as isize) as *mut c_void, + scaling[n as usize..].as_mut_ptr() as *mut c_void, points[points.len() - 1][1] as c_int, (scaling_size - n) as usize, ); @@ -66,13 +70,13 @@ unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], sc let ex = (p1[0] as c_int) << shift_x; let dx = ex - bx; for x in (0..dx).step_by(pad as usize) { - let range = *scaling.offset((bx + x + pad) as isize) as c_int - - *scaling.offset((bx + x) as isize) as c_int; + let range = + scaling[(bx + x + pad) as usize] as c_int - scaling[(bx + x) as usize] as c_int; let mut r = rnd; for n in 1..pad { r += range; - *scaling.offset((bx + x + n) as isize) = - (*scaling.offset((bx + x) as isize) as c_int + (r >> shift_x)) as u8; + scaling[(bx + x + n) as usize] = + (scaling[(bx + x) as usize] as c_int + (r >> shift_x)) as u8; } } } @@ -115,21 +119,21 @@ pub(crate) unsafe fn rav1d_prep_grain( generate_scaling::( r#in.p.bpc, &data.y_points[..data.num_y_points as usize], - scaling[0].as_mut().as_mut_ptr(), + scaling[0].as_mut(), ); } if data.num_uv_points[0] != 0 { generate_scaling::( r#in.p.bpc, &data.uv_points[0][..data.num_uv_points[0] as usize], - scaling[1].as_mut().as_mut_ptr(), + scaling[1].as_mut(), ); } if data.num_uv_points[1] != 0 { generate_scaling::( r#in.p.bpc, &data.uv_points[1][..data.num_uv_points[1] as usize], - scaling[2].as_mut().as_mut_ptr(), + scaling[2].as_mut(), ); } assert!(out.stride[0] == r#in.stride[0]); From 12ce9dbd0eb0b645895f3cce6be7de1babd10f3d Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 02:39:45 -0700 Subject: [PATCH 05/12] `fn generate_scaling`: Replace `memset`s with `.fill`s. --- src/fg_apply.rs | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 34a7dde57..c0dcb8829 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -8,7 +8,6 @@ use crate::include::dav1d::picture::Rav1dPicture; use crate::src::filmgrain::Rav1dFilmGrainDSPContext; use crate::src::internal::GrainBD; use libc::memcpy; -use libc::memset; use std::cmp; use std::ffi::c_int; use std::ffi::c_void; @@ -24,18 +23,10 @@ unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], sc } }; if points.is_empty() { - memset( - scaling.as_mut_ptr() as *mut c_void, - 0, - scaling_size as usize, - ); + scaling[..scaling_size as usize].fill(0); return; } - memset( - scaling.as_mut_ptr() as *mut c_void, - points[0][1] as c_int, - ((points[0][0] as c_int) << shift_x) as usize, - ); + scaling[..((points[0][0] as c_int) << shift_x) as usize].fill(points[0][1]); for ps in points.windows(2) { // TODO(kkysen) use array_windows when stabilized let [p0, p1] = ps.try_into().unwrap(); @@ -54,11 +45,7 @@ unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], sc } } let n = (points[points.len() - 1][0] as c_int) << shift_x; - memset( - scaling[n as usize..].as_mut_ptr() as *mut c_void, - points[points.len() - 1][1] as c_int, - (scaling_size - n) as usize, - ); + scaling[n as usize..][..(scaling_size - n) as usize].fill(points[points.len() - 1][1]); if BD::BPC != BPC::BPC8 { let pad = 1 << shift_x; From 296d3357d3c3346e44ebbd33ff13f116a765ed05 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 02:40:17 -0700 Subject: [PATCH 06/12] `fn generate_scaling`: Make nominally safe. --- src/fg_apply.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index c0dcb8829..6e4311cce 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -12,7 +12,7 @@ use std::cmp; use std::ffi::c_int; use std::ffi::c_void; -unsafe fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], scaling: &mut [u8]) { +fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], scaling: &mut [u8]) { let (shift_x, scaling_size) = match BD::BPC { BPC::BPC8 => (0, 256), BPC::BPC16 => { From 20cd7ee65a39fb5dd6afcac612e7b512cc692bcb Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 02:56:19 -0700 Subject: [PATCH 07/12] `const BitDepth::SCALING_SIZE`: Factor into `1 << bpc`. --- include/common/bitdepth.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/common/bitdepth.rs b/include/common/bitdepth.rs index d50d49f85..7988ef46d 100644 --- a/include/common/bitdepth.rs +++ b/include/common/bitdepth.rs @@ -199,7 +199,7 @@ impl BitDepth for BitDepth8 { type Entry = i8; type Scaling = [u8; Self::SCALING_SIZE]; - const SCALING_SIZE: usize = 256; + const SCALING_SIZE: usize = 1 << 8; type BitDepthMax = (); @@ -280,7 +280,7 @@ impl BitDepth for BitDepth16 { type Entry = i16; type Scaling = [u8; Self::SCALING_SIZE]; - const SCALING_SIZE: usize = 4096; + const SCALING_SIZE: usize = 1 << 12; type BitDepthMax = Self::Pixel; From 363e5551c1a6be143df68809f834733ba02d6255 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 02:56:58 -0700 Subject: [PATCH 08/12] `fn generate_scaling`: Create and return `scaling` array instead of a `&mut` arg. --- src/fg_apply.rs | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 6e4311cce..7b7301d10 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -5,6 +5,7 @@ use crate::include::dav1d::headers::RAV1D_PIXEL_LAYOUT_I400; use crate::include::dav1d::headers::RAV1D_PIXEL_LAYOUT_I420; use crate::include::dav1d::headers::RAV1D_PIXEL_LAYOUT_I444; use crate::include::dav1d::picture::Rav1dPicture; +use crate::src::align::ArrayDefault; use crate::src::filmgrain::Rav1dFilmGrainDSPContext; use crate::src::internal::GrainBD; use libc::memcpy; @@ -12,7 +13,11 @@ use std::cmp; use std::ffi::c_int; use std::ffi::c_void; -fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], scaling: &mut [u8]) { +fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]]) -> BD::Scaling { + let mut scaling_array = ArrayDefault::default(); + if points.is_empty() { + return scaling_array; + } let (shift_x, scaling_size) = match BD::BPC { BPC::BPC8 => (0, 256), BPC::BPC16 => { @@ -22,10 +27,7 @@ fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], scaling: (shift_x, scaling_size) } }; - if points.is_empty() { - scaling[..scaling_size as usize].fill(0); - return; - } + let scaling = scaling_array.as_mut(); scaling[..((points[0][0] as c_int) << shift_x) as usize].fill(points[0][1]); for ps in points.windows(2) { // TODO(kkysen) use array_windows when stabilized @@ -68,6 +70,8 @@ fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]], scaling: } } } + + scaling_array } pub(crate) unsafe fn rav1d_prep_grain( @@ -103,24 +107,19 @@ pub(crate) unsafe fn rav1d_prep_grain( ); } if data.num_y_points != 0 || data.chroma_scaling_from_luma != 0 { - generate_scaling::( - r#in.p.bpc, - &data.y_points[..data.num_y_points as usize], - scaling[0].as_mut(), - ); + scaling[0] = + generate_scaling::(r#in.p.bpc, &data.y_points[..data.num_y_points as usize]); } if data.num_uv_points[0] != 0 { - generate_scaling::( + scaling[1] = generate_scaling::( r#in.p.bpc, &data.uv_points[0][..data.num_uv_points[0] as usize], - scaling[1].as_mut(), ); } if data.num_uv_points[1] != 0 { - generate_scaling::( + scaling[2] = generate_scaling::( r#in.p.bpc, &data.uv_points[1][..data.num_uv_points[1] as usize], - scaling[2].as_mut(), ); } assert!(out.stride[0] == r#in.stride[0]); From e15fd085d2c27a67247db9d101d7a983bb635705 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Mon, 16 Oct 2023 03:00:33 -0700 Subject: [PATCH 09/12] `fn generate_scaling`: Make `bitdepth` arg a `usize`. --- src/fg_apply.rs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 7b7301d10..585bdfb23 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -13,7 +13,7 @@ use std::cmp; use std::ffi::c_int; use std::ffi::c_void; -fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]]) -> BD::Scaling { +fn generate_scaling(bitdepth: usize, points: &[[u8; 2]]) -> BD::Scaling { let mut scaling_array = ArrayDefault::default(); if points.is_empty() { return scaling_array; @@ -28,7 +28,7 @@ fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]]) -> BD::Sc } }; let scaling = scaling_array.as_mut(); - scaling[..((points[0][0] as c_int) << shift_x) as usize].fill(points[0][1]); + scaling[..(points[0][0] as usize) << shift_x].fill(points[0][1]); for ps in points.windows(2) { // TODO(kkysen) use array_windows when stabilized let [p0, p1] = ps.try_into().unwrap(); @@ -46,8 +46,8 @@ fn generate_scaling(bitdepth: c_int, points: &[[u8; 2]]) -> BD::Sc d += delta; } } - let n = (points[points.len() - 1][0] as c_int) << shift_x; - scaling[n as usize..][..(scaling_size - n) as usize].fill(points[points.len() - 1][1]); + let n = (points[points.len() - 1][0] as usize) << shift_x; + scaling[n..][..scaling_size - n].fill(points[points.len() - 1][1]); if BD::BPC != BPC::BPC8 { let pad = 1 << shift_x; @@ -106,21 +106,17 @@ pub(crate) unsafe fn rav1d_prep_grain( bitdepth_max, ); } + let bpc = r#in.p.bpc as usize; if data.num_y_points != 0 || data.chroma_scaling_from_luma != 0 { - scaling[0] = - generate_scaling::(r#in.p.bpc, &data.y_points[..data.num_y_points as usize]); + scaling[0] = generate_scaling::(bpc, &data.y_points[..data.num_y_points as usize]); } if data.num_uv_points[0] != 0 { - scaling[1] = generate_scaling::( - r#in.p.bpc, - &data.uv_points[0][..data.num_uv_points[0] as usize], - ); + scaling[1] = + generate_scaling::(bpc, &data.uv_points[0][..data.num_uv_points[0] as usize]); } if data.num_uv_points[1] != 0 { - scaling[2] = generate_scaling::( - r#in.p.bpc, - &data.uv_points[1][..data.num_uv_points[1] as usize], - ); + scaling[2] = + generate_scaling::(bpc, &data.uv_points[1][..data.num_uv_points[1] as usize]); } assert!(out.stride[0] == r#in.stride[0]); if data.num_y_points == 0 { From c0940cf10d80f49f147213b25744f44c9133e495 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 18 Oct 2023 11:16:16 -0700 Subject: [PATCH 10/12] `fn generate_scaling`: Make index vars `usize`. --- src/fg_apply.rs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 585bdfb23..d66a7839a 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -32,17 +32,17 @@ fn generate_scaling(bitdepth: usize, points: &[[u8; 2]]) -> BD::Sc for ps in points.windows(2) { // TODO(kkysen) use array_windows when stabilized let [p0, p1] = ps.try_into().unwrap(); - let bx = p0[0] as c_int; - let by = p0[1] as c_int; - let ex = p1[0] as c_int; - let ey = p1[1] as c_int; + let bx = p0[0] as usize; + let by = p0[1] as isize; + let ex = p1[0] as usize; + let ey = p1[1] as isize; let dx = ex - bx; let dy = ey - by; assert!(dx > 0); - let delta = dy * ((0x10000 + (dx >> 1)) / dx); + let delta = dy * ((0x10000 + (dx >> 1)) / dx) as isize; let mut d = 0x8000; for x in 0..dx { - scaling[(bx + x << shift_x) as usize] = (by + (d >> 16)) as u8; + scaling[bx + x << shift_x] = (by + (d >> 16)) as u8; d += delta; } } @@ -55,17 +55,15 @@ fn generate_scaling(bitdepth: usize, points: &[[u8; 2]]) -> BD::Sc for ps in points.windows(2) { // TODO(kkysen) use array_windows when stabilized let [p0, p1] = ps.try_into().unwrap(); - let bx = (p0[0] as c_int) << shift_x; - let ex = (p1[0] as c_int) << shift_x; + let bx = (p0[0] as usize) << shift_x; + let ex = (p1[0] as usize) << shift_x; let dx = ex - bx; - for x in (0..dx).step_by(pad as usize) { - let range = - scaling[(bx + x + pad) as usize] as c_int - scaling[(bx + x) as usize] as c_int; - let mut r = rnd; + for x in (0..dx).step_by(pad) { + let range = scaling[bx + x + pad] as isize - scaling[(bx + x) as usize] as isize; + let mut r = rnd as isize; for n in 1..pad { r += range; - scaling[(bx + x + n) as usize] = - (scaling[(bx + x) as usize] as c_int + (r >> shift_x)) as u8; + scaling[bx + x + n] = (scaling[bx + x] as isize + (r >> shift_x)) as u8; } } } From af5a24ef7486f9170c8593f78418db179400839e Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 18 Oct 2023 11:39:21 -0700 Subject: [PATCH 11/12] `fn generate_scaling`: Make `bitdepth` arg a `bd: BD` so the bitdepth-specific code can be unified. --- src/fg_apply.rs | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index d66a7839a..b2b564c96 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -13,20 +13,13 @@ use std::cmp; use std::ffi::c_int; use std::ffi::c_void; -fn generate_scaling(bitdepth: usize, points: &[[u8; 2]]) -> BD::Scaling { +fn generate_scaling(bd: BD, points: &[[u8; 2]]) -> BD::Scaling { let mut scaling_array = ArrayDefault::default(); if points.is_empty() { return scaling_array; } - let (shift_x, scaling_size) = match BD::BPC { - BPC::BPC8 => (0, 256), - BPC::BPC16 => { - assert!(bitdepth > 8); - let shift_x = bitdepth - 8; - let scaling_size = 1 << bitdepth; - (shift_x, scaling_size) - } - }; + let shift_x = bd.bitdepth() - 8; + let scaling_size = 1 << bd.bitdepth(); let scaling = scaling_array.as_mut(); scaling[..(points[0][0] as usize) << shift_x].fill(points[0][1]); for ps in points.windows(2) { @@ -104,17 +97,17 @@ pub(crate) unsafe fn rav1d_prep_grain( bitdepth_max, ); } - let bpc = r#in.p.bpc as usize; + let bd = BD::from_c((1 << r#in.p.bpc) - 1); if data.num_y_points != 0 || data.chroma_scaling_from_luma != 0 { - scaling[0] = generate_scaling::(bpc, &data.y_points[..data.num_y_points as usize]); + scaling[0] = generate_scaling::(bd, &data.y_points[..data.num_y_points as usize]); } if data.num_uv_points[0] != 0 { scaling[1] = - generate_scaling::(bpc, &data.uv_points[0][..data.num_uv_points[0] as usize]); + generate_scaling::(bd, &data.uv_points[0][..data.num_uv_points[0] as usize]); } if data.num_uv_points[1] != 0 { scaling[2] = - generate_scaling::(bpc, &data.uv_points[1][..data.num_uv_points[1] as usize]); + generate_scaling::(bd, &data.uv_points[1][..data.num_uv_points[1] as usize]); } assert!(out.stride[0] == r#in.stride[0]); if data.num_y_points == 0 { From 193eebcf4599746e2c70539782b0677e18283625 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 18 Oct 2023 12:33:55 -0700 Subject: [PATCH 12/12] `fn rav1d_prep_grain`: Remove conditions for skipping `generate_scaling` calls as `fn generate_scaling` already does these checks. --- src/fg_apply.rs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index b2b564c96..0c1631fa7 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -98,17 +98,9 @@ pub(crate) unsafe fn rav1d_prep_grain( ); } let bd = BD::from_c((1 << r#in.p.bpc) - 1); - if data.num_y_points != 0 || data.chroma_scaling_from_luma != 0 { - scaling[0] = generate_scaling::(bd, &data.y_points[..data.num_y_points as usize]); - } - if data.num_uv_points[0] != 0 { - scaling[1] = - generate_scaling::(bd, &data.uv_points[0][..data.num_uv_points[0] as usize]); - } - if data.num_uv_points[1] != 0 { - scaling[2] = - generate_scaling::(bd, &data.uv_points[1][..data.num_uv_points[1] as usize]); - } + scaling[0] = generate_scaling::(bd, &data.y_points[..data.num_y_points as usize]); + scaling[1] = generate_scaling::(bd, &data.uv_points[0][..data.num_uv_points[0] as usize]); + scaling[2] = generate_scaling::(bd, &data.uv_points[1][..data.num_uv_points[1] as usize]); assert!(out.stride[0] == r#in.stride[0]); if data.num_y_points == 0 { let stride = out.stride[0];