From 39015774c9c244b44be1cbca7802771f50036d0a Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 18 Oct 2023 13:13:59 -0700 Subject: [PATCH 1/5] `fn rav1d_apply_grain_row`: Make `pl` index vars `usize`s. --- src/fg_apply.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 0c1631fa7..e4e998732 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -211,46 +211,46 @@ pub(crate) unsafe fn rav1d_apply_grain_row( if data.chroma_scaling_from_luma != 0 { for pl in 0..2 { (dsp.fguv_32x32xn[r#in.p.layout as usize - 1]).expect("non-null function pointer")( - (out.data[(1 + pl) as usize] as *mut BD::Pixel) + (out.data[1 + pl] as *mut BD::Pixel) .offset(uv_off as isize) .cast(), - (r#in.data[(1 + pl) as usize] as *const BD::Pixel) + (r#in.data[1 + pl] as *const BD::Pixel) .offset(uv_off as isize) .cast(), r#in.stride[1], data, cpw as usize, scaling[0].as_ref().as_ptr(), - grain_lut[(1 + pl) as usize].as_ptr().cast(), + grain_lut[1 + pl].as_ptr().cast(), bh, row, luma_src.cast(), r#in.stride[0], - pl, + pl as c_int, is_id, bitdepth_max, ); } } else { for pl in 0..2 { - if data.num_uv_points[pl as usize] != 0 { + if data.num_uv_points[pl] != 0 { (dsp.fguv_32x32xn[r#in.p.layout as usize - 1]).expect("non-null function pointer")( - (out.data[(1 + pl) as usize] as *mut BD::Pixel) + (out.data[1 + pl] as *mut BD::Pixel) .offset(uv_off as isize) .cast(), - (r#in.data[(1 + pl) as usize] as *const BD::Pixel) + (r#in.data[1 + pl] as *const BD::Pixel) .offset(uv_off as isize) .cast(), r#in.stride[1], data, cpw as usize, - scaling[(1 + pl) as usize].as_ref().as_ptr(), - grain_lut[(1 + pl) as usize].as_ptr().cast(), + scaling[1 + pl].as_ref().as_ptr(), + grain_lut[1 + pl].as_ptr().cast(), bh, row, luma_src.cast(), r#in.stride[0], - pl, + pl as c_int, is_id, bitdepth_max, ); From d96410a863d95d497c16f8818c05dd73b9b520d5 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 18 Oct 2023 23:46:54 -0700 Subject: [PATCH 2/5] `fn generate_scaling`: Add back comments and line breaks from C. --- src/fg_apply.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index e4e998732..d1cbe9d02 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -15,13 +15,19 @@ use std::ffi::c_void; 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 = bd.bitdepth() - 8; let scaling_size = 1 << bd.bitdepth(); let scaling = scaling_array.as_mut(); + + // Fill up the preceding entries with the initial value scaling[..(points[0][0] as usize) << shift_x].fill(points[0][1]); + + // Linearly interpolate the values in the middle for ps in points.windows(2) { // TODO(kkysen) use array_windows when stabilized let [p0, p1] = ps.try_into().unwrap(); @@ -39,6 +45,8 @@ fn generate_scaling(bd: BD, points: &[[u8; 2]]) -> BD::Scaling { d += delta; } } + + // Fill up the remaining entries with the final value let n = (points[points.len() - 1][0] as usize) << shift_x; scaling[n..][..scaling_size - n].fill(points[points.len() - 1][1]); From fdaac3504a4b5f55eae36419f143f3a2bfacd62a Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 18 Oct 2023 23:50:23 -0700 Subject: [PATCH 3/5] `fn rav1d_prep_grain`: Add back comments and line breaks from C. --- src/fg_apply.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index d1cbe9d02..5cc6270ab 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -82,6 +82,8 @@ pub(crate) unsafe fn rav1d_prep_grain( let GrainBD { grain_lut, scaling } = grain; let data = &mut (*out.frame_hdr).film_grain.data; let bitdepth_max = (1 << out.p.bpc) - 1; + + // Generate grain LUTs as needed (dsp.generate_grain_y).expect("non-null function pointer")( grain_lut[0].as_mut_ptr().cast(), data, @@ -105,10 +107,15 @@ pub(crate) unsafe fn rav1d_prep_grain( bitdepth_max, ); } + + // Generate scaling LUTs as needed let bd = BD::from_c((1 << r#in.p.bpc) - 1); 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]); + + // Copy over the non-modified planes + // TODO: eliminate in favor of per-plane refs assert!(out.stride[0] == r#in.stride[0]); if data.num_y_points == 0 { let stride = out.stride[0]; @@ -127,6 +134,7 @@ pub(crate) unsafe fn rav1d_prep_grain( memcpy(out.data[0], r#in.data[0], sz as usize); } } + if r#in.p.layout != RAV1D_PIXEL_LAYOUT_I400 && data.chroma_scaling_from_luma == 0 { assert!(out.stride[1] == r#in.stride[1]); let ss_ver = (r#in.p.layout == RAV1D_PIXEL_LAYOUT_I420) as c_int; From bfb850997d87eefd11616e69d32a6591d2c1e516 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 18 Oct 2023 23:51:45 -0700 Subject: [PATCH 4/5] `fn rav1d_apply_grain_row`: Add back comments and line breaks from C. --- src/fg_apply.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 5cc6270ab..21689ada4 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -181,6 +181,7 @@ pub(crate) unsafe fn rav1d_apply_grain_row( grain: &GrainBD, row: c_int, ) { + // Synthesize grain for the affected planes let GrainBD { grain_lut, scaling } = grain; let data = &mut (*out.frame_hdr).film_grain.data; let ss_y = (r#in.p.layout == RAV1D_PIXEL_LAYOUT_I420) as c_int; @@ -190,6 +191,7 @@ pub(crate) unsafe fn rav1d_apply_grain_row( let luma_src = (r#in.data[0] as *mut BD::Pixel) .offset(((row * 32) as isize * BD::pxstride(r#in.stride[0] as usize) as isize) as isize); let bitdepth_max = (1 << out.p.bpc) - 1; + if data.num_y_points != 0 { let bh = cmp::min(out.p.h - row * 32, 32); (dsp.fgy_32x32xn).expect("non-null function pointer")( @@ -209,13 +211,17 @@ pub(crate) unsafe fn rav1d_apply_grain_row( bitdepth_max, ); } + if data.num_uv_points[0] == 0 && data.num_uv_points[1] == 0 && data.chroma_scaling_from_luma == 0 { return; } + let bh = cmp::min(out.p.h - row * 32, 32) + ss_y >> ss_y; + + // extend padding pixels if out.p.w & ss_x != 0 { let mut ptr = luma_src; for _ in 0..bh { @@ -223,6 +229,7 @@ pub(crate) unsafe fn rav1d_apply_grain_row( ptr = ptr.offset(((BD::pxstride(r#in.stride[0] as usize) as isize) << ss_y) as isize); } } + let uv_off = (row * 32) as isize * BD::pxstride(out.stride[1] as usize) as isize >> ss_y; if data.chroma_scaling_from_luma != 0 { for pl in 0..2 { From 1faf32728edd21377d3e4ae8610eb6f6c26d7287 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Wed, 18 Oct 2023 23:52:19 -0700 Subject: [PATCH 5/5] `fn rav1d_apply_grain`: Add back comments and line breaks from C. --- src/fg_apply.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fg_apply.rs b/src/fg_apply.rs index 21689ada4..671184e24 100644 --- a/src/fg_apply.rs +++ b/src/fg_apply.rs @@ -289,6 +289,7 @@ pub(crate) unsafe fn rav1d_apply_grain( ) { let mut grain = Default::default(); let rows = out.p.h + 31 >> 5; + rav1d_prep_grain::(dsp, out, r#in, &mut grain); for row in 0..rows { rav1d_apply_grain_row::(dsp, out, r#in, &grain, row);