From ff95bf595061ff937d7c0153aa47f382d4ac1aae Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Mon, 22 Jan 2024 10:35:00 -0500 Subject: [PATCH 01/24] `ipred_prepare.rs`: remove unnecessary casts --- src/ipred_prepare.rs | 77 +++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 618feee59..96b9228ed 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -18,6 +18,7 @@ use crate::src::levels::SMOOTH_H_PRED; use crate::src::levels::SMOOTH_PRED; use crate::src::levels::SMOOTH_V_PRED; use crate::src::levels::TOP_DC_PRED; +use crate::src::levels::VERT_LEFT_PRED; use crate::src::levels::VERT_PRED; use crate::src::levels::Z1_PRED; use crate::src::levels::Z2_PRED; @@ -143,31 +144,27 @@ pub unsafe fn rav1d_prepare_intra_edges( if !(y < h && x < w) { unreachable!(); } - match mode as c_uint { - 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 => { - *angle = av1_mode_to_angle_map - [(mode as c_uint).wrapping_sub(VERT_PRED as c_int as c_uint) as usize] - as c_int - + 3 * *angle; + match mode { + VERT_PRED..=VERT_LEFT_PRED => { + *angle = av1_mode_to_angle_map[(mode - VERT_PRED) as usize] as c_int + 3 * *angle; if *angle <= 90 { - mode = (if *angle < 90 && have_top != 0 { - Z1_PRED as c_int + mode = if *angle < 90 && have_top != 0 { + Z1_PRED } else { - VERT_PRED as c_int - }) as IntraPredMode; + VERT_PRED + }; } else if *angle < 180 { mode = Z2_PRED; } else { - mode = (if *angle > 180 && have_left != 0 { - Z3_PRED as c_int + mode = if *angle > 180 && have_left != 0 { + Z3_PRED } else { - HOR_PRED as c_int - }) as IntraPredMode; + HOR_PRED + }; } } - 0 | 12 => { - mode = av1_mode_conv[mode as usize][have_left as usize][have_top as usize] - as IntraPredMode; + DC_PRED | PAETH_PRED => { + mode = av1_mode_conv[mode as usize][have_left as usize][have_top as usize]; } _ => {} } @@ -226,12 +223,12 @@ pub unsafe fn rav1d_prepare_intra_edges( .needs .contains(Needs::BOTTOM_LEFT) { - let have_bottomleft = (if have_left == 0 || y + th >= h { - 0 as c_int as c_uint + let have_bottomleft = if have_left == 0 || y + th >= h { + false } else { - edge_flags as c_uint & EDGE_I444_LEFT_HAS_BOTTOM as c_int as c_uint - }) as c_int; - if have_bottomleft != 0 { + (edge_flags & EDGE_I444_LEFT_HAS_BOTTOM) != 0 + }; + if have_bottomleft { let px_have_0 = cmp::min(sz, h - y - th << 2); let mut i_0 = 0; while i_0 < px_have_0 { @@ -287,7 +284,7 @@ pub unsafe fn rav1d_prepare_intra_edges( BD::pixel_set( slice::from_raw_parts_mut(top, sz_0.try_into().unwrap()), if have_left != 0 { - *dst.offset(-(1 as c_int) as isize) + *dst.offset(-1) } else { ((1 << bitdepth >> 1) - 1).as_::() }, @@ -298,16 +295,16 @@ pub unsafe fn rav1d_prepare_intra_edges( .needs .contains(Needs::TOP_RIGHT) { - let have_topright = (if have_top == 0 || x + tw >= w { - 0 as c_int as c_uint + let have_topright = if have_top == 0 || x + tw >= w { + false } else { - edge_flags as c_uint & EDGE_I444_TOP_HAS_RIGHT as c_int as c_uint - }) as c_int; - if have_topright != 0 { + (edge_flags & EDGE_I444_TOP_HAS_RIGHT) != 0 + }; + if have_topright { let px_have_2 = cmp::min(sz_0, w - x - tw << 2); memcpy( top.offset(sz_0 as isize) as *mut c_void, - &*dst_top.offset(sz_0 as isize) as *const BD::Pixel as *const c_void, + dst_top.offset(sz_0 as isize) as *const c_void, (px_have_2 << 1) as usize, ); if px_have_2 < sz_0 { @@ -334,22 +331,20 @@ pub unsafe fn rav1d_prepare_intra_edges( .contains(Needs::TOP_LEFT) { if have_left != 0 { - *topleft_out = (if have_top != 0 { - (*dst_top.offset(-(1 as c_int) as isize)).as_::() + *topleft_out = if have_top != 0 { + *dst_top.offset(-1) } else { - (*dst.offset(-(1 as c_int) as isize)).as_::() - }) - .as_::(); + *dst.offset(-1) + }; } else { - *topleft_out = (if have_top != 0 { - (*dst_top).as_::() + *topleft_out = if have_top != 0 { + *dst_top } else { - (1 as c_int) << bitdepth >> 1 - }) - .as_::(); + (1 << bitdepth >> 1).as_::() + }; } - if mode as c_uint == Z2_PRED as c_int as c_uint && tw + th >= 6 && filter_edge != 0 { - *topleft_out = (((*topleft_out.offset(-(1 as c_int) as isize)).as_::() + if mode == Z2_PRED && tw + th >= 6 && filter_edge != 0 { + *topleft_out = (((*topleft_out.offset(-1)).as_::() + (*topleft_out.offset(1)).as_::()) * 5 + (*topleft_out.offset(0)).as_::() * 6 From 72e120c30693539ef0476183289deedcf5d4fdec Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Mon, 22 Jan 2024 10:48:13 -0500 Subject: [PATCH 02/24] `fn rav1d_prepare_intra_edges`: clean up function parameters Use `bool` instead of `c_int` and reference instead of raw pointer --- src/ipred_prepare.rs | 32 ++++++++++++++++---------------- src/recon.rs | 20 ++++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 96b9228ed..cd84950bd 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -123,9 +123,9 @@ static av1_intra_prediction_edges: [av1_intra_prediction_edge; N_IMPL_INTRA_PRED pub unsafe fn rav1d_prepare_intra_edges( x: c_int, - have_left: c_int, + have_left: bool, y: c_int, - have_top: c_int, + have_top: bool, w: c_int, h: c_int, edge_flags: EdgeFlags, @@ -133,7 +133,7 @@ pub unsafe fn rav1d_prepare_intra_edges( stride: ptrdiff_t, prefilter_toplevel_sb_edge: *const BD::Pixel, mut mode: IntraPredMode, - angle: *mut c_int, + angle: &mut c_int, tw: c_int, th: c_int, filter_edge: c_int, @@ -148,7 +148,7 @@ pub unsafe fn rav1d_prepare_intra_edges( VERT_PRED..=VERT_LEFT_PRED => { *angle = av1_mode_to_angle_map[(mode - VERT_PRED) as usize] as c_int + 3 * *angle; if *angle <= 90 { - mode = if *angle < 90 && have_top != 0 { + mode = if *angle < 90 && have_top { Z1_PRED } else { VERT_PRED @@ -156,7 +156,7 @@ pub unsafe fn rav1d_prepare_intra_edges( } else if *angle < 180 { mode = Z2_PRED; } else { - mode = if *angle > 180 && have_left != 0 { + mode = if *angle > 180 && have_left { Z3_PRED } else { HOR_PRED @@ -169,7 +169,7 @@ pub unsafe fn rav1d_prepare_intra_edges( _ => {} } let mut dst_top: *const BD::Pixel = 0 as *const BD::Pixel; - if have_top != 0 + if have_top && (av1_intra_prediction_edges[mode as usize] .needs .contains(Needs::TOP) @@ -179,7 +179,7 @@ pub unsafe fn rav1d_prepare_intra_edges( || av1_intra_prediction_edges[mode as usize] .needs .contains(Needs::LEFT) - && have_left == 0) + && !have_left) { if !prefilter_toplevel_sb_edge.is_null() { dst_top = &*prefilter_toplevel_sb_edge.offset((x * 4) as isize) as *const BD::Pixel; @@ -193,7 +193,7 @@ pub unsafe fn rav1d_prepare_intra_edges( { let sz = th << 2; let left: *mut BD::Pixel = &mut *topleft_out.offset(-sz as isize) as *mut BD::Pixel; - if have_left != 0 { + if have_left { let px_have = cmp::min(sz, h - y << 2); let mut i = 0; while i < px_have { @@ -211,7 +211,7 @@ pub unsafe fn rav1d_prepare_intra_edges( } else { BD::pixel_set( slice::from_raw_parts_mut(left, sz.try_into().unwrap()), - if have_top != 0 { + if have_top { *dst_top } else { ((1 << bitdepth >> 1) + 1).as_::() @@ -223,7 +223,7 @@ pub unsafe fn rav1d_prepare_intra_edges( .needs .contains(Needs::BOTTOM_LEFT) { - let have_bottomleft = if have_left == 0 || y + th >= h { + let have_bottomleft = if !have_left || y + th >= h { false } else { (edge_flags & EDGE_I444_LEFT_HAS_BOTTOM) != 0 @@ -263,7 +263,7 @@ pub unsafe fn rav1d_prepare_intra_edges( { let sz_0 = tw << 2; let top: *mut BD::Pixel = &mut *topleft_out.offset(1) as *mut BD::Pixel; - if have_top != 0 { + if have_top { let px_have_1 = cmp::min(sz_0, w - x << 2); memcpy( top as *mut c_void, @@ -283,7 +283,7 @@ pub unsafe fn rav1d_prepare_intra_edges( } else { BD::pixel_set( slice::from_raw_parts_mut(top, sz_0.try_into().unwrap()), - if have_left != 0 { + if have_left { *dst.offset(-1) } else { ((1 << bitdepth >> 1) - 1).as_::() @@ -295,7 +295,7 @@ pub unsafe fn rav1d_prepare_intra_edges( .needs .contains(Needs::TOP_RIGHT) { - let have_topright = if have_top == 0 || x + tw >= w { + let have_topright = if !have_top || x + tw >= w { false } else { (edge_flags & EDGE_I444_TOP_HAS_RIGHT) != 0 @@ -330,14 +330,14 @@ pub unsafe fn rav1d_prepare_intra_edges( .needs .contains(Needs::TOP_LEFT) { - if have_left != 0 { - *topleft_out = if have_top != 0 { + if have_left { + *topleft_out = if have_top { *dst_top.offset(-1) } else { *dst.offset(-1) }; } else { - *topleft_out = if have_top != 0 { + *topleft_out = if have_top { *dst_top } else { (1 << bitdepth >> 1).as_::() diff --git a/src/recon.rs b/src/recon.rs index f45166102..365a5e69c 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2659,9 +2659,9 @@ pub(crate) unsafe fn rav1d_recon_b_intra( } m = rav1d_prepare_intra_edges( t.bx, - (t.bx > (*ts).tiling.col_start) as c_int, + t.bx > (*ts).tiling.col_start, t.by, - (t.by > (*ts).tiling.row_start) as c_int, + t.by > (*ts).tiling.row_start, (*ts).tiling.col_end, (*ts).tiling.row_end, edge_flags, @@ -2867,9 +2867,9 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let ystart = (*ts).tiling.row_start >> ss_ver; let m: IntraPredMode = rav1d_prepare_intra_edges( xpos, - (xpos > xstart) as c_int, + xpos > xstart, ypos, - (ypos > ystart) as c_int, + ypos > ystart, (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, 0 as EdgeFlags, @@ -3064,9 +3064,9 @@ pub(crate) unsafe fn rav1d_recon_b_intra( ystart = (*ts).tiling.row_start >> ss_ver; m = rav1d_prepare_intra_edges( xpos, - (xpos > xstart) as c_int, + xpos > xstart, ypos, - (ypos > ystart) as c_int, + ypos > ystart, (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, edge_flags, @@ -3451,9 +3451,9 @@ pub(crate) unsafe fn rav1d_recon_b_inter( } m = rav1d_prepare_intra_edges( t.bx, - (t.bx > (*ts).tiling.col_start) as c_int, + t.bx > (*ts).tiling.col_start, t.by, - (t.by > (*ts).tiling.row_start) as c_int, + t.by > (*ts).tiling.row_start, (*ts).tiling.col_end, (*ts).tiling.row_end, 0 as EdgeFlags, @@ -3869,9 +3869,9 @@ pub(crate) unsafe fn rav1d_recon_b_inter( } m = rav1d_prepare_intra_edges( t.bx >> ss_hor, - (t.bx >> ss_hor > (*ts).tiling.col_start >> ss_hor) as c_int, + t.bx >> ss_hor > (*ts).tiling.col_start >> ss_hor, t.by >> ss_ver, - (t.by >> ss_ver > (*ts).tiling.row_start >> ss_ver) as c_int, + t.by >> ss_ver > (*ts).tiling.row_start >> ss_ver, (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, 0 as EdgeFlags, From 36270789ee5b731efccac20de35de5ea9898bb93 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Mon, 22 Jan 2024 16:10:02 -0500 Subject: [PATCH 03/24] `fn rav1d_prepare_intra_edges`: use slice instead of raw pointer Use slice for parameter prefilter_toplevel_sb_edge --- src/ipred_prepare.rs | 6 ++-- src/recon.rs | 73 +++++++++++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index cd84950bd..896f723c7 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -131,7 +131,7 @@ pub unsafe fn rav1d_prepare_intra_edges( edge_flags: EdgeFlags, dst: *const BD::Pixel, stride: ptrdiff_t, - prefilter_toplevel_sb_edge: *const BD::Pixel, + prefilter_toplevel_sb_edge: &[BD::Pixel], mut mode: IntraPredMode, angle: &mut c_int, tw: c_int, @@ -181,8 +181,8 @@ pub unsafe fn rav1d_prepare_intra_edges( .contains(Needs::LEFT) && !have_left) { - if !prefilter_toplevel_sb_edge.is_null() { - dst_top = &*prefilter_toplevel_sb_edge.offset((x * 4) as isize) as *const BD::Pixel; + if prefilter_toplevel_sb_edge.len() != 0 { + dst_top = prefilter_toplevel_sb_edge[(x * 4) as usize..].as_ptr(); } else { dst_top = &*dst.offset(-(BD::pxstride(stride as usize) as isize)) as *const BD::Pixel; } diff --git a/src/recon.rs b/src/recon.rs index 365a5e69c..26420352b 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2633,7 +2633,6 @@ pub(crate) unsafe fn rav1d_recon_b_intra( while x < sub_w4 { let mut angle; let edge_flags: EdgeFlags; - let mut top_sb_edge: *const BD::Pixel; let m: IntraPredMode; if !(b.c2rust_unnamed.c2rust_unnamed.pal_sz[0] != 0) { angle = b.c2rust_unnamed.c2rust_unnamed.y_angle as c_int; @@ -2650,13 +2649,16 @@ pub(crate) unsafe fn rav1d_recon_b_intra( } else { EDGE_I444_LEFT_HAS_BOTTOM as c_int })) as EdgeFlags; - top_sb_edge = 0 as *const BD::Pixel; - if t.by & (*f).sb_step - 1 == 0 { - top_sb_edge = (*f).ipred_edge[0] as *mut BD::Pixel; + let top_sb_edge_slice = if t.by & (*f).sb_step - 1 == 0 { + let mut top_sb_edge: *const BD::Pixel = + (*f).ipred_edge[0] as *mut BD::Pixel; let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - } + slice::from_raw_parts(top_sb_edge, (*f).ipred_edge_sz as usize * 128) + } else { + &[] + }; m = rav1d_prepare_intra_edges( t.bx, t.bx > (*ts).tiling.col_start, @@ -2667,7 +2669,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( edge_flags, dst, (*f).cur.stride[0], - top_sb_edge, + top_sb_edge_slice, b.c2rust_unnamed.c2rust_unnamed.y_mode as IntraPredMode, &mut angle, (*t_dim).w as c_int, @@ -2854,13 +2856,19 @@ pub(crate) unsafe fn rav1d_recon_b_intra( while pl < 2 { if !(b.c2rust_unnamed.c2rust_unnamed.cfl_alpha[pl as usize] == 0) { let mut angle = 0; - let mut top_sb_edge: *const BD::Pixel = 0 as *const BD::Pixel; - if t.by & !ss_ver & (*f).sb_step - 1 == 0 { - top_sb_edge = (*f).ipred_edge[(pl + 1) as usize] as *mut BD::Pixel; + let top_sb_edge_slice = if t.by & !ss_ver & (*f).sb_step - 1 == 0 { + let mut top_sb_edge: *const BD::Pixel = + (*f).ipred_edge[(pl + 1) as usize] as *mut BD::Pixel; let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - } + slice::from_raw_parts( + top_sb_edge, + (*f).ipred_edge_sz as usize * 128, + ) + } else { + &[] + }; let xpos = t.bx >> ss_hor; let ypos = t.by >> ss_ver; let xstart = (*ts).tiling.col_start >> ss_hor; @@ -2875,7 +2883,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( 0 as EdgeFlags, uv_dst[pl as usize], stride, - top_sb_edge, + top_sb_edge_slice, DC_PRED, &mut angle, (*uv_t_dim).w as c_int, @@ -3016,7 +3024,6 @@ pub(crate) unsafe fn rav1d_recon_b_intra( while x < sub_cw4 { let mut angle; let edge_flags: EdgeFlags; - let mut top_sb_edge: *const BD::Pixel; let uv_mode: IntraPredMode; let xpos; let ypos; @@ -3043,14 +3050,19 @@ pub(crate) unsafe fn rav1d_recon_b_intra( } else { EDGE_I444_LEFT_HAS_BOTTOM as c_int })) as EdgeFlags; - top_sb_edge = 0 as *const BD::Pixel; - if t.by & !ss_ver & (*f).sb_step - 1 == 0 { - top_sb_edge = - (*f).ipred_edge[(1 + pl) as usize] as *mut BD::Pixel; + let top_sb_edge_slice = if t.by & !ss_ver & (*f).sb_step - 1 == 0 { + let mut top_sb_edge: *const BD::Pixel = + (*f).ipred_edge[(1 + pl) as usize] as *const BD::Pixel; let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge .offset(((*f).sb128w * 128 * (sby - 1)) as isize); - } + slice::from_raw_parts( + top_sb_edge, + (*f).ipred_edge_sz as usize * 128, + ) + } else { + &[] + }; uv_mode = (if b.c2rust_unnamed.c2rust_unnamed.uv_mode as c_int == CFL_PRED as c_int { @@ -3072,7 +3084,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( edge_flags, dst, stride, - top_sb_edge, + top_sb_edge_slice, uv_mode, &mut angle, (*uv_t_dim).w as c_int, @@ -3443,12 +3455,14 @@ pub(crate) unsafe fn rav1d_recon_b_inter( .interintra .as_mut_ptr(); let mut angle = 0; - let mut top_sb_edge: *const BD::Pixel = 0 as *const BD::Pixel; - if t.by & (*f).sb_step - 1 == 0 { - top_sb_edge = (*f).ipred_edge[0] as *mut BD::Pixel; + let top_sb_edge_slice = if t.by & (*f).sb_step - 1 == 0 { + let mut top_sb_edge: *const BD::Pixel = (*f).ipred_edge[0] as *const BD::Pixel; let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - } + slice::from_raw_parts(top_sb_edge, (*f).ipred_edge_sz as usize * 128) + } else { + &[] + }; m = rav1d_prepare_intra_edges( t.bx, t.bx > (*ts).tiling.col_start, @@ -3459,7 +3473,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( 0 as EdgeFlags, dst, (*f).cur.stride[0], - top_sb_edge, + top_sb_edge_slice, m, &mut angle, bw4, @@ -3860,13 +3874,16 @@ pub(crate) unsafe fn rav1d_recon_b_inter( let uvdst: *mut BD::Pixel = ((*f).cur.data.data[(1 + pl) as usize] as *mut BD::Pixel) .offset(uvdstoff as isize); - let mut top_sb_edge: *const BD::Pixel = 0 as *const BD::Pixel; - if t.by & (*f).sb_step - 1 == 0 { - top_sb_edge = (*f).ipred_edge[(pl + 1) as usize] as *mut BD::Pixel; + let top_sb_edge_slice = if t.by & (*f).sb_step - 1 == 0 { + let mut top_sb_edge: *const BD::Pixel = + (*f).ipred_edge[(pl + 1) as usize] as *const BD::Pixel; let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - } + slice::from_raw_parts(top_sb_edge, (*f).ipred_edge_sz as usize * 128) + } else { + &[] + }; m = rav1d_prepare_intra_edges( t.bx >> ss_hor, t.bx >> ss_hor > (*ts).tiling.col_start >> ss_hor, @@ -3877,7 +3894,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( 0 as EdgeFlags, uvdst, (*f).cur.stride[1], - top_sb_edge, + top_sb_edge_slice, m, &mut angle, cbw4, From 991f8ced6376f0139946a4ff73e6551bbd4d00c7 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 07:00:01 -0500 Subject: [PATCH 04/24] `fn rav1d_prepare_intra_edges`: use slice instead of raw pointer Use slice for parameter `topleft_out`. A parameter `topleft_origin` is added to point to the position of the top-left sample within the `topleft_out` slice. --- src/ipred_prepare.rs | 101 +++++++++++++++++-------------------------- src/recon.rs | 29 ++++++++++--- 2 files changed, 64 insertions(+), 66 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 896f723c7..c4886fec0 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -24,13 +24,9 @@ use crate::src::levels::Z1_PRED; use crate::src::levels::Z2_PRED; use crate::src::levels::Z3_PRED; use bitflags::bitflags; -use libc::memcpy; use libc::ptrdiff_t; use std::cmp; use std::ffi::c_int; -use std::ffi::c_uint; -use std::ffi::c_void; -use std::slice; #[inline] pub fn sm_flag(b: &BlockContext, idx: usize) -> c_int { @@ -137,7 +133,8 @@ pub unsafe fn rav1d_prepare_intra_edges( tw: c_int, th: c_int, filter_edge: c_int, - topleft_out: *mut BD::Pixel, + topleft_out: &mut [BD::Pixel], + topleft_origin: usize, // position of top-left sample in `topleft_out` bd: BD, ) -> IntraPredMode { let bitdepth = bd.bitdepth(); @@ -192,37 +189,34 @@ pub unsafe fn rav1d_prepare_intra_edges( .contains(Needs::LEFT) { let sz = th << 2; - let left: *mut BD::Pixel = &mut *topleft_out.offset(-sz as isize) as *mut BD::Pixel; + let left = &mut topleft_out[(topleft_origin - sz as usize)..]; if have_left { let px_have = cmp::min(sz, h - y << 2); let mut i = 0; while i < px_have { - *left.offset((sz - 1 - i) as isize) = + left[(sz - 1 - i) as usize] = *dst.offset(BD::pxstride(stride as usize) as isize * i as isize - 1); i += 1; } if px_have < sz { - BD::pixel_set( - slice::from_raw_parts_mut(left, (sz - px_have).try_into().unwrap()), - *left.offset((sz - px_have) as isize), - (sz - px_have).try_into().unwrap(), - ); + BD::pixel_set(left, left[(sz - px_have) as usize], (sz - px_have) as usize); } } else { BD::pixel_set( - slice::from_raw_parts_mut(left, sz.try_into().unwrap()), + left, if have_top { *dst_top } else { ((1 << bitdepth >> 1) + 1).as_::() }, - sz.try_into().unwrap(), + sz as usize, ); } if av1_intra_prediction_edges[mode as usize] .needs .contains(Needs::BOTTOM_LEFT) { + let bottom_left = &mut topleft_out[(topleft_origin - 2 * sz as usize)..]; let have_bottomleft = if !have_left || y + th >= h { false } else { @@ -232,7 +226,7 @@ pub unsafe fn rav1d_prepare_intra_edges( let px_have_0 = cmp::min(sz, h - y - th << 2); let mut i_0 = 0; while i_0 < px_have_0 { - *left.offset(-(i_0 + 1) as isize) = *dst.offset( + bottom_left[(sz - 1 - i_0) as usize] = *dst.offset( ((sz + i_0) as isize * BD::pxstride(stride as usize) as isize - 1 as isize) as isize, ); @@ -240,20 +234,14 @@ pub unsafe fn rav1d_prepare_intra_edges( } if px_have_0 < sz { BD::pixel_set( - slice::from_raw_parts_mut( - left.offset(-(sz as isize)), - (sz - px_have_0).try_into().unwrap(), - ), - *left.offset(-px_have_0 as isize), - (sz - px_have_0).try_into().unwrap(), + bottom_left, + bottom_left[(sz - px_have_0) as usize], + (sz - px_have_0) as usize, ); } } else { - BD::pixel_set( - slice::from_raw_parts_mut(left.offset(-(sz as isize)), sz.try_into().unwrap()), - *left.offset(0), - sz.try_into().unwrap(), - ); + let fill_value = bottom_left[sz as usize]; + BD::pixel_set(bottom_left, fill_value, sz as usize); } } } @@ -262,27 +250,23 @@ pub unsafe fn rav1d_prepare_intra_edges( .contains(Needs::TOP) { let sz_0 = tw << 2; - let top: *mut BD::Pixel = &mut *topleft_out.offset(1) as *mut BD::Pixel; + let top = &mut topleft_out[(topleft_origin + 1)..]; if have_top { let px_have_1 = cmp::min(sz_0, w - x << 2); - memcpy( - top as *mut c_void, - dst_top as *const c_void, - (px_have_1 << 1) as usize, - ); + for i in 0..px_have_1 { + top[i as usize] = *dst_top.offset(i as isize); + } if px_have_1 < sz_0 { + let fill_value = top[px_have_1 as usize - 1]; BD::pixel_set( - slice::from_raw_parts_mut( - top.offset(px_have_1 as isize), - (sz_0 - px_have_1).try_into().unwrap(), - ), - *top.offset((px_have_1 - 1) as isize), - (sz_0 - px_have_1).try_into().unwrap(), + &mut top[px_have_1 as usize..], + fill_value, + (sz_0 - px_have_1) as usize, ); } } else { BD::pixel_set( - slice::from_raw_parts_mut(top, sz_0.try_into().unwrap()), + top, if have_left { *dst.offset(-1) } else { @@ -301,28 +285,23 @@ pub unsafe fn rav1d_prepare_intra_edges( (edge_flags & EDGE_I444_TOP_HAS_RIGHT) != 0 }; if have_topright { + let top_right = &mut top[sz_0 as usize..]; let px_have_2 = cmp::min(sz_0, w - x - tw << 2); - memcpy( - top.offset(sz_0 as isize) as *mut c_void, - dst_top.offset(sz_0 as isize) as *const c_void, - (px_have_2 << 1) as usize, - ); + for i in 0..px_have_2 { + top_right[i as usize] = *dst_top.offset((sz_0 + i) as isize); + } if px_have_2 < sz_0 { + let fill_value = top_right[px_have_2 as usize - 1]; BD::pixel_set( - slice::from_raw_parts_mut( - top.offset(sz_0 as isize).offset(px_have_2 as isize), - (sz_0 - px_have_2).try_into().unwrap(), - ), - *top.offset((sz_0 + px_have_2 - 1) as isize), - (sz_0 - px_have_2).try_into().unwrap(), + &mut top_right[px_have_2 as usize..], + fill_value, + (sz_0 - px_have_2) as usize, ); } } else { - BD::pixel_set( - slice::from_raw_parts_mut(top.offset(sz_0 as isize), sz_0.try_into().unwrap()), - *top.offset((sz_0 - 1) as isize), - sz_0.try_into().unwrap(), - ); + let fill_value = top[sz_0 as usize - 1]; + let top_right = &mut top[sz_0 as usize..]; + BD::pixel_set(top_right, fill_value, sz_0 as usize); } } } @@ -330,24 +309,24 @@ pub unsafe fn rav1d_prepare_intra_edges( .needs .contains(Needs::TOP_LEFT) { + // top-left sample and immediate neighbours + let corner = &mut topleft_out[(topleft_origin - 1)..(topleft_origin + 2)]; if have_left { - *topleft_out = if have_top { + corner[1] = if have_top { *dst_top.offset(-1) } else { *dst.offset(-1) }; } else { - *topleft_out = if have_top { + corner[1] = if have_top { *dst_top } else { (1 << bitdepth >> 1).as_::() }; } if mode == Z2_PRED && tw + th >= 6 && filter_edge != 0 { - *topleft_out = (((*topleft_out.offset(-1)).as_::() - + (*topleft_out.offset(1)).as_::()) - * 5 - + (*topleft_out.offset(0)).as_::() * 6 + corner[1] = ((corner[0].as_::() + corner[2].as_::()) * 5 + + corner[1].as_::() * 6 + 8 >> 4) .as_::(); diff --git a/src/recon.rs b/src/recon.rs index 26420352b..8d309923e 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2675,7 +2675,10 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*t_dim).w as c_int, (*t_dim).h as c_int, seq_hdr.intra_edge_filter, - edge, + &mut BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) + .0 + .edge, + 128, BD::from_c((*f).bitdepth_max), ); (*dsp).ipred.intra_pred[m as usize].call( @@ -2889,7 +2892,12 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*uv_t_dim).w as c_int, (*uv_t_dim).h as c_int, 0 as c_int, - edge, + &mut BD::select_mut( + &mut t.scratch.c2rust_unnamed_0.interintra_edge, + ) + .0 + .edge, + 128, BD::from_c((*f).bitdepth_max), ); (*dsp).ipred.cfl_pred[m as usize].call( @@ -3090,7 +3098,12 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*uv_t_dim).w as c_int, (*uv_t_dim).h as c_int, seq_hdr.intra_edge_filter, - edge, + &mut BD::select_mut( + &mut t.scratch.c2rust_unnamed_0.interintra_edge, + ) + .0 + .edge, + 128, BD::from_c((*f).bitdepth_max), ); angle |= intra_edge_filter_flag; @@ -3479,7 +3492,10 @@ pub(crate) unsafe fn rav1d_recon_b_inter( bw4, bh4, 0 as c_int, - tl_edge, + &mut BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) + .0 + .edge, + 32, BD::from_c((*f).bitdepth_max), ); (*dsp).ipred.intra_pred[m as usize].call( @@ -3900,7 +3916,10 @@ pub(crate) unsafe fn rav1d_recon_b_inter( cbw4, cbh4, 0 as c_int, - tl_edge, + &mut BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) + .0 + .edge, + 32, BD::from_c((*f).bitdepth_max), ); (*dsp).ipred.intra_pred[m as usize].call( From 0de2b623639f2fcd08aa439b58b29fb9ede3815d Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 09:21:53 -0500 Subject: [PATCH 05/24] `fn rav1d_prepare_intra_edges`: use slice instead of raw pointer Use slice for `dst_top`. First element of the slice may be either the top-left element or the left-most top element, depending on the value of `have_left`. --- src/ipred_prepare.rs | 52 ++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index c4886fec0..cb6654cb6 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -27,6 +27,7 @@ use bitflags::bitflags; use libc::ptrdiff_t; use std::cmp; use std::ffi::c_int; +use std::slice; #[inline] pub fn sm_flag(b: &BlockContext, idx: usize) -> c_int { @@ -165,8 +166,9 @@ pub unsafe fn rav1d_prepare_intra_edges( } _ => {} } - let mut dst_top: *const BD::Pixel = 0 as *const BD::Pixel; - if have_top + + // `dst_top` starts with either the top or top-left sample depending on whether have_left is true + let dst_top = if have_top && (av1_intra_prediction_edges[mode as usize] .needs .contains(Needs::TOP) @@ -178,12 +180,20 @@ pub unsafe fn rav1d_prepare_intra_edges( .contains(Needs::LEFT) && !have_left) { + let n = (4 * w) as usize + have_left as usize; if prefilter_toplevel_sb_edge.len() != 0 { - dst_top = prefilter_toplevel_sb_edge[(x * 4) as usize..].as_ptr(); + let offset = (x * 4) as usize - have_left as usize; + &prefilter_toplevel_sb_edge[offset..offset + n] } else { - dst_top = &*dst.offset(-(BD::pxstride(stride as usize) as isize)) as *const BD::Pixel; + slice::from_raw_parts( + dst.offset(-(BD::pxstride(stride as usize) as isize) - have_left as isize), + n, + ) } - } + } else { + &[] + }; + if av1_intra_prediction_edges[mode as usize] .needs .contains(Needs::LEFT) @@ -205,7 +215,7 @@ pub unsafe fn rav1d_prepare_intra_edges( BD::pixel_set( left, if have_top { - *dst_top + dst_top[0] // have_left is always false } else { ((1 << bitdepth >> 1) + 1).as_::() }, @@ -253,9 +263,7 @@ pub unsafe fn rav1d_prepare_intra_edges( let top = &mut topleft_out[(topleft_origin + 1)..]; if have_top { let px_have_1 = cmp::min(sz_0, w - x << 2); - for i in 0..px_have_1 { - top[i as usize] = *dst_top.offset(i as isize); - } + BD::pixel_copy(top, &dst_top[have_left as usize..], px_have_1 as usize); if px_have_1 < sz_0 { let fill_value = top[px_have_1 as usize - 1]; BD::pixel_set( @@ -287,9 +295,11 @@ pub unsafe fn rav1d_prepare_intra_edges( if have_topright { let top_right = &mut top[sz_0 as usize..]; let px_have_2 = cmp::min(sz_0, w - x - tw << 2); - for i in 0..px_have_2 { - top_right[i as usize] = *dst_top.offset((sz_0 + i) as isize); - } + BD::pixel_copy( + top_right, + &dst_top[(sz_0 as usize + have_left as usize)..], + px_have_2 as usize, + ); if px_have_2 < sz_0 { let fill_value = top_right[px_have_2 as usize - 1]; BD::pixel_set( @@ -311,19 +321,13 @@ pub unsafe fn rav1d_prepare_intra_edges( { // top-left sample and immediate neighbours let corner = &mut topleft_out[(topleft_origin - 1)..(topleft_origin + 2)]; - if have_left { - corner[1] = if have_top { - *dst_top.offset(-1) - } else { - *dst.offset(-1) - }; + corner[1] = if have_top { + dst_top[0] + } else if have_left { + *dst.offset(-1) } else { - corner[1] = if have_top { - *dst_top - } else { - (1 << bitdepth >> 1).as_::() - }; - } + (1 << bitdepth >> 1).as_::() + }; if mode == Z2_PRED && tw + th >= 6 && filter_edge != 0 { corner[1] = ((corner[0].as_::() + corner[2].as_::()) * 5 + corner[1].as_::() * 6 From ddb356d4999c58b980d667fd930f0752de30e40e Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 10:20:25 -0500 Subject: [PATCH 06/24] `fn rav1d_prepare_intra_edges`: use slice instead of raw pointer Redefine `dst` to be a slice. --- src/ipred_prepare.rs | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index cb6654cb6..40a026dc0 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -139,6 +139,21 @@ pub unsafe fn rav1d_prepare_intra_edges( bd: BD, ) -> IntraPredMode { let bitdepth = bd.bitdepth(); + let stride = BD::pxstride(stride as usize) as isize; + let first_pos = if have_left { -1 } else { 0 } + if have_top { -stride } else { 0 }; + let last_pos = if have_left { + (4 * h - 1) as isize * stride + } else if have_top { + 4 * w as isize + } else { + 0 + }; + let dst = if last_pos > first_pos { + slice::from_raw_parts(dst.offset(first_pos), (last_pos - first_pos) as usize) + } else { + &[] + }; + let dst_origin = (-first_pos) as usize; if !(y < h && x < w) { unreachable!(); } @@ -185,10 +200,7 @@ pub unsafe fn rav1d_prepare_intra_edges( let offset = (x * 4) as usize - have_left as usize; &prefilter_toplevel_sb_edge[offset..offset + n] } else { - slice::from_raw_parts( - dst.offset(-(BD::pxstride(stride as usize) as isize) - have_left as isize), - n, - ) + &dst[..n] } } else { &[] @@ -204,8 +216,7 @@ pub unsafe fn rav1d_prepare_intra_edges( let px_have = cmp::min(sz, h - y << 2); let mut i = 0; while i < px_have { - left[(sz - 1 - i) as usize] = - *dst.offset(BD::pxstride(stride as usize) as isize * i as isize - 1); + left[(sz - 1 - i) as usize] = dst[i as usize * stride as usize + dst_origin - 1]; i += 1; } if px_have < sz { @@ -236,10 +247,8 @@ pub unsafe fn rav1d_prepare_intra_edges( let px_have_0 = cmp::min(sz, h - y - th << 2); let mut i_0 = 0; while i_0 < px_have_0 { - bottom_left[(sz - 1 - i_0) as usize] = *dst.offset( - ((sz + i_0) as isize * BD::pxstride(stride as usize) as isize - 1 as isize) - as isize, - ); + bottom_left[(sz - 1 - i_0) as usize] = + dst[(sz + i_0) as usize * stride as usize + dst_origin - 1]; i_0 += 1; } if px_have_0 < sz { @@ -276,7 +285,7 @@ pub unsafe fn rav1d_prepare_intra_edges( BD::pixel_set( top, if have_left { - *dst.offset(-1) + dst[dst_origin - 1] } else { ((1 << bitdepth >> 1) - 1).as_::() }, @@ -324,7 +333,7 @@ pub unsafe fn rav1d_prepare_intra_edges( corner[1] = if have_top { dst_top[0] } else if have_left { - *dst.offset(-1) + dst[dst_origin - 1] } else { (1 << bitdepth >> 1).as_::() }; From 7fa9bb3385cf3326df81047de2969f0cc7e11b69 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 10:44:21 -0500 Subject: [PATCH 07/24] `fn rav1d_prepare_intra_edges`: clean up loops, variable names, and casts Clean up including: - use `for i in 0..n` pattern for loops - remove `_0`, `_1` prefixes from variable names - avoid repeated casts to `usize` --- src/ipred_prepare.rs | 83 +++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 40a026dc0..09f1e8a1e 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -210,17 +210,15 @@ pub unsafe fn rav1d_prepare_intra_edges( .needs .contains(Needs::LEFT) { - let sz = th << 2; - let left = &mut topleft_out[(topleft_origin - sz as usize)..]; + let sz = 4 * th as usize; + let left = &mut topleft_out[(topleft_origin - sz)..]; if have_left { - let px_have = cmp::min(sz, h - y << 2); - let mut i = 0; - while i < px_have { - left[(sz - 1 - i) as usize] = dst[i as usize * stride as usize + dst_origin - 1]; - i += 1; + let px_have = cmp::min(sz, (h - y << 2) as usize); + for i in 0..px_have { + left[sz - 1 - i] = dst[i * stride as usize + dst_origin - 1]; } if px_have < sz { - BD::pixel_set(left, left[(sz - px_have) as usize], (sz - px_have) as usize); + BD::pixel_set(left, left[sz - px_have], sz - px_have); } } else { BD::pixel_set( @@ -230,37 +228,30 @@ pub unsafe fn rav1d_prepare_intra_edges( } else { ((1 << bitdepth >> 1) + 1).as_::() }, - sz as usize, + sz, ); } if av1_intra_prediction_edges[mode as usize] .needs .contains(Needs::BOTTOM_LEFT) { - let bottom_left = &mut topleft_out[(topleft_origin - 2 * sz as usize)..]; + let bottom_left = &mut topleft_out[(topleft_origin - 2 * sz)..]; let have_bottomleft = if !have_left || y + th >= h { false } else { (edge_flags & EDGE_I444_LEFT_HAS_BOTTOM) != 0 }; if have_bottomleft { - let px_have_0 = cmp::min(sz, h - y - th << 2); - let mut i_0 = 0; - while i_0 < px_have_0 { - bottom_left[(sz - 1 - i_0) as usize] = - dst[(sz + i_0) as usize * stride as usize + dst_origin - 1]; - i_0 += 1; + let px_have = cmp::min(sz, (h - y - th << 2) as usize); + for i in 0..px_have { + bottom_left[sz - 1 - i] = dst[(sz + i) * stride as usize + dst_origin - 1]; } - if px_have_0 < sz { - BD::pixel_set( - bottom_left, - bottom_left[(sz - px_have_0) as usize], - (sz - px_have_0) as usize, - ); + if px_have < sz { + BD::pixel_set(bottom_left, bottom_left[sz - px_have], sz - px_have); } } else { - let fill_value = bottom_left[sz as usize]; - BD::pixel_set(bottom_left, fill_value, sz as usize); + let fill_value = bottom_left[sz]; + BD::pixel_set(bottom_left, fill_value, sz); } } } @@ -268,18 +259,14 @@ pub unsafe fn rav1d_prepare_intra_edges( .needs .contains(Needs::TOP) { - let sz_0 = tw << 2; + let sz = 4 * tw as usize; let top = &mut topleft_out[(topleft_origin + 1)..]; if have_top { - let px_have_1 = cmp::min(sz_0, w - x << 2); - BD::pixel_copy(top, &dst_top[have_left as usize..], px_have_1 as usize); - if px_have_1 < sz_0 { - let fill_value = top[px_have_1 as usize - 1]; - BD::pixel_set( - &mut top[px_have_1 as usize..], - fill_value, - (sz_0 - px_have_1) as usize, - ); + let px_have = cmp::min(sz, (w - x << 2) as usize); + BD::pixel_copy(top, &dst_top[have_left as usize..], px_have); + if px_have < sz { + let fill_value = top[px_have - 1]; + BD::pixel_set(&mut top[px_have..], fill_value, sz - px_have); } } else { BD::pixel_set( @@ -289,7 +276,7 @@ pub unsafe fn rav1d_prepare_intra_edges( } else { ((1 << bitdepth >> 1) - 1).as_::() }, - sz_0.try_into().unwrap(), + sz, ); } if av1_intra_prediction_edges[mode as usize] @@ -302,25 +289,17 @@ pub unsafe fn rav1d_prepare_intra_edges( (edge_flags & EDGE_I444_TOP_HAS_RIGHT) != 0 }; if have_topright { - let top_right = &mut top[sz_0 as usize..]; - let px_have_2 = cmp::min(sz_0, w - x - tw << 2); - BD::pixel_copy( - top_right, - &dst_top[(sz_0 as usize + have_left as usize)..], - px_have_2 as usize, - ); - if px_have_2 < sz_0 { - let fill_value = top_right[px_have_2 as usize - 1]; - BD::pixel_set( - &mut top_right[px_have_2 as usize..], - fill_value, - (sz_0 - px_have_2) as usize, - ); + let top_right = &mut top[sz..]; + let px_have = cmp::min(sz, (w - x - tw << 2) as usize); + BD::pixel_copy(top_right, &dst_top[(sz + have_left as usize)..], px_have); + if px_have < sz { + let fill_value = top_right[px_have - 1]; + BD::pixel_set(&mut top_right[px_have..], fill_value, sz - px_have); } } else { - let fill_value = top[sz_0 as usize - 1]; - let top_right = &mut top[sz_0 as usize..]; - BD::pixel_set(top_right, fill_value, sz_0 as usize); + let fill_value = top[sz - 1]; + let top_right = &mut top[sz..]; + BD::pixel_set(top_right, fill_value, sz); } } } From 0d6ef9b9ac226f80981244bdaa037d80850322b3 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 10:54:08 -0500 Subject: [PATCH 08/24] `fn rav1d_prepare_intra_edges`: mark as safe --- src/ipred_prepare.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 09f1e8a1e..0914e73d8 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -118,7 +118,7 @@ static av1_intra_prediction_edges: [av1_intra_prediction_edge; N_IMPL_INTRA_PRED b }; -pub unsafe fn rav1d_prepare_intra_edges( +pub fn rav1d_prepare_intra_edges( x: c_int, have_left: bool, y: c_int, @@ -149,7 +149,7 @@ pub unsafe fn rav1d_prepare_intra_edges( 0 }; let dst = if last_pos > first_pos { - slice::from_raw_parts(dst.offset(first_pos), (last_pos - first_pos) as usize) + unsafe { slice::from_raw_parts(dst.offset(first_pos), (last_pos - first_pos) as usize) } } else { &[] }; From 5f2cccd77e4794244eab01277176932061174532 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 11:03:39 -0500 Subject: [PATCH 09/24] `fn rav1d_prepare_intra_edges`: Remove intermediate variables --- src/ipred_prepare.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 0914e73d8..e293cf092 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -250,8 +250,7 @@ pub fn rav1d_prepare_intra_edges( BD::pixel_set(bottom_left, bottom_left[sz - px_have], sz - px_have); } } else { - let fill_value = bottom_left[sz]; - BD::pixel_set(bottom_left, fill_value, sz); + BD::pixel_set(bottom_left, bottom_left[sz], sz); } } } @@ -298,8 +297,7 @@ pub fn rav1d_prepare_intra_edges( } } else { let fill_value = top[sz - 1]; - let top_right = &mut top[sz..]; - BD::pixel_set(top_right, fill_value, sz); + BD::pixel_set(&mut top[sz..], fill_value, sz); } } } From e88b9d17eb24b5c0506cb07c128de2e776283c1a Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 16:21:40 -0500 Subject: [PATCH 10/24] Fix slice size for `top_sb_edge_slice` Set the slice size to `(*f).sb128w as usize * 128` which corresponds to one row of samples. Also fix the slice size for `dst_top` in `rav1d_prepare_intra_edges` --- src/ipred_prepare.rs | 3 ++- src/recon.rs | 16 +++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index e293cf092..78c8bc748 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -195,7 +195,8 @@ pub fn rav1d_prepare_intra_edges( .contains(Needs::LEFT) && !have_left) { - let n = (4 * w) as usize + have_left as usize; + let px_have = cmp::min(8 * tw, 4 * (w - x)) as usize; + let n = px_have + have_left as usize; if prefilter_toplevel_sb_edge.len() != 0 { let offset = (x * 4) as usize - have_left as usize; &prefilter_toplevel_sb_edge[offset..offset + n] diff --git a/src/recon.rs b/src/recon.rs index 8d309923e..e84b7cd85 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2655,7 +2655,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts(top_sb_edge, (*f).ipred_edge_sz as usize * 128) + slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) } else { &[] }; @@ -2865,10 +2865,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts( - top_sb_edge, - (*f).ipred_edge_sz as usize * 128, - ) + slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) } else { &[] }; @@ -3064,10 +3061,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge .offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts( - top_sb_edge, - (*f).ipred_edge_sz as usize * 128, - ) + slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) } else { &[] }; @@ -3472,7 +3466,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( let mut top_sb_edge: *const BD::Pixel = (*f).ipred_edge[0] as *const BD::Pixel; let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts(top_sb_edge, (*f).ipred_edge_sz as usize * 128) + slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) } else { &[] }; @@ -3896,7 +3890,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts(top_sb_edge, (*f).ipred_edge_sz as usize * 128) + slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) } else { &[] }; From 0af980917b1ee37cd169891c9d49b5d593bf606e Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 16:50:21 -0500 Subject: [PATCH 11/24] Use `Option` for `prefilter_toplevel_sb_edge` parameter Use `Option` to cover the case where the parameter is unused instead of an empty slice --- src/ipred_prepare.rs | 4 ++-- src/recon.rs | 35 +++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 78c8bc748..0b661263c 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -128,7 +128,7 @@ pub fn rav1d_prepare_intra_edges( edge_flags: EdgeFlags, dst: *const BD::Pixel, stride: ptrdiff_t, - prefilter_toplevel_sb_edge: &[BD::Pixel], + prefilter_toplevel_sb_edge: Option<&[BD::Pixel]>, mut mode: IntraPredMode, angle: &mut c_int, tw: c_int, @@ -197,7 +197,7 @@ pub fn rav1d_prepare_intra_edges( { let px_have = cmp::min(8 * tw, 4 * (w - x)) as usize; let n = px_have + have_left as usize; - if prefilter_toplevel_sb_edge.len() != 0 { + if let Some(prefilter_toplevel_sb_edge) = prefilter_toplevel_sb_edge { let offset = (x * 4) as usize - have_left as usize; &prefilter_toplevel_sb_edge[offset..offset + n] } else { diff --git a/src/recon.rs b/src/recon.rs index e84b7cd85..c58b09b70 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2655,9 +2655,12 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) + Some(slice::from_raw_parts( + top_sb_edge, + (*f).sb128w as usize * 128, + )) } else { - &[] + None }; m = rav1d_prepare_intra_edges( t.bx, @@ -2865,9 +2868,12 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) + Some(slice::from_raw_parts( + top_sb_edge, + (*f).sb128w as usize * 128, + )) } else { - &[] + None }; let xpos = t.bx >> ss_hor; let ypos = t.by >> ss_ver; @@ -3061,9 +3067,12 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge .offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) + Some(slice::from_raw_parts( + top_sb_edge, + (*f).sb128w as usize * 128, + )) } else { - &[] + None }; uv_mode = (if b.c2rust_unnamed.c2rust_unnamed.uv_mode as c_int == CFL_PRED as c_int @@ -3466,9 +3475,12 @@ pub(crate) unsafe fn rav1d_recon_b_inter( let mut top_sb_edge: *const BD::Pixel = (*f).ipred_edge[0] as *const BD::Pixel; let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) + Some(slice::from_raw_parts( + top_sb_edge, + (*f).sb128w as usize * 128, + )) } else { - &[] + None }; m = rav1d_prepare_intra_edges( t.bx, @@ -3890,9 +3902,12 @@ pub(crate) unsafe fn rav1d_recon_b_inter( let sby = t.by >> (*f).sb_shift; top_sb_edge = top_sb_edge.offset(((*f).sb128w * 128 * (sby - 1)) as isize); - slice::from_raw_parts(top_sb_edge, (*f).sb128w as usize * 128) + Some(slice::from_raw_parts( + top_sb_edge, + (*f).sb128w as usize * 128, + )) } else { - &[] + None }; m = rav1d_prepare_intra_edges( t.bx >> ss_hor, From dd4b49956045c928be6203bb8ebcc56d1fdb96ff Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 16:58:47 -0500 Subject: [PATCH 12/24] `fn rav1d_prepare_intra_edges`: fix slice bound Fix bounds of slice `dst` by accounting for the current position `x`:`y` --- src/ipred_prepare.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 0b661263c..085a017d3 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -142,9 +142,9 @@ pub fn rav1d_prepare_intra_edges( let stride = BD::pxstride(stride as usize) as isize; let first_pos = if have_left { -1 } else { 0 } + if have_top { -stride } else { 0 }; let last_pos = if have_left { - (4 * h - 1) as isize * stride + (4 * (h - y) - 1) as isize * stride } else if have_top { - 4 * w as isize + 4 * (w - x) as isize } else { 0 }; From 0e296698695785cd8698353ec2a7e6c4ae002e67 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 23 Jan 2024 17:50:16 -0500 Subject: [PATCH 13/24] Use array instead of slice where size is fixed This should guarantee a minimal number of bound checks --- src/ipred_prepare.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 085a017d3..3bba669a5 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -307,7 +307,7 @@ pub fn rav1d_prepare_intra_edges( .contains(Needs::TOP_LEFT) { // top-left sample and immediate neighbours - let corner = &mut topleft_out[(topleft_origin - 1)..(topleft_origin + 2)]; + let corner = <&mut [_; 3]>::try_from(&mut topleft_out[topleft_origin - 1..][..3]).unwrap(); corner[1] = if have_top { dst_top[0] } else if have_left { From 4ac47d9b0603360c31ce077843df3ddd86e0fe32 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Wed, 24 Jan 2024 02:39:06 -0500 Subject: [PATCH 14/24] `fn rav1d_prepare_intra_edges`: move `assert` to top of function --- src/ipred_prepare.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 3bba669a5..e6b33fcbc 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -138,6 +138,8 @@ pub fn rav1d_prepare_intra_edges( topleft_origin: usize, // position of top-left sample in `topleft_out` bd: BD, ) -> IntraPredMode { + assert!(y < h && x < w); + let bitdepth = bd.bitdepth(); let stride = BD::pxstride(stride as usize) as isize; let first_pos = if have_left { -1 } else { 0 } + if have_top { -stride } else { 0 }; @@ -154,9 +156,6 @@ pub fn rav1d_prepare_intra_edges( &[] }; let dst_origin = (-first_pos) as usize; - if !(y < h && x < w) { - unreachable!(); - } match mode { VERT_PRED..=VERT_LEFT_PRED => { *angle = av1_mode_to_angle_map[(mode - VERT_PRED) as usize] as c_int + 3 * *angle; From fa8ac8facaeac920f4d3a916c7d29c97e684433e Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Wed, 24 Jan 2024 03:06:11 -0500 Subject: [PATCH 15/24] `fn rav1d_prepare_intra_edges`: simplify derivation of `dst` slice Modify `dst` slice to include entire picture and account for possible negative value of `stride`. Rename `dst_origin` as `dst_offset`. --- src/ipred_prepare.rs | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index e6b33fcbc..4fba1ed1e 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -142,20 +142,12 @@ pub fn rav1d_prepare_intra_edges( let bitdepth = bd.bitdepth(); let stride = BD::pxstride(stride as usize) as isize; - let first_pos = if have_left { -1 } else { 0 } + if have_top { -stride } else { 0 }; - let last_pos = if have_left { - (4 * (h - y) - 1) as isize * stride - } else if have_top { - 4 * (w - x) as isize - } else { - 0 - }; - let dst = if last_pos > first_pos { - unsafe { slice::from_raw_parts(dst.offset(first_pos), (last_pos - first_pos) as usize) } - } else { - &[] - }; - let dst_origin = (-first_pos) as usize; + + let dst_size = 4 * h as usize * stride.abs() as usize; + let dst_offset = 4 * x as usize + + (if stride >= 0 { 4 * y } else { 4 * (h - y) - 1 }) as usize * stride.abs() as usize; + let dst = unsafe { slice::from_raw_parts(dst.sub(dst_offset), dst_size) }; + match mode { VERT_PRED..=VERT_LEFT_PRED => { *angle = av1_mode_to_angle_map[(mode - VERT_PRED) as usize] as c_int + 3 * *angle; @@ -200,7 +192,7 @@ pub fn rav1d_prepare_intra_edges( let offset = (x * 4) as usize - have_left as usize; &prefilter_toplevel_sb_edge[offset..offset + n] } else { - &dst[..n] + &dst[(dst_offset as isize - stride) as usize - have_left as usize..][..n] } } else { &[] @@ -215,7 +207,7 @@ pub fn rav1d_prepare_intra_edges( if have_left { let px_have = cmp::min(sz, (h - y << 2) as usize); for i in 0..px_have { - left[sz - 1 - i] = dst[i * stride as usize + dst_origin - 1]; + left[sz - 1 - i] = dst[i * stride as usize + dst_offset - 1]; } if px_have < sz { BD::pixel_set(left, left[sz - px_have], sz - px_have); @@ -244,7 +236,7 @@ pub fn rav1d_prepare_intra_edges( if have_bottomleft { let px_have = cmp::min(sz, (h - y - th << 2) as usize); for i in 0..px_have { - bottom_left[sz - 1 - i] = dst[(sz + i) * stride as usize + dst_origin - 1]; + bottom_left[sz - 1 - i] = dst[(sz + i) * stride as usize + dst_offset - 1]; } if px_have < sz { BD::pixel_set(bottom_left, bottom_left[sz - px_have], sz - px_have); @@ -271,7 +263,7 @@ pub fn rav1d_prepare_intra_edges( BD::pixel_set( top, if have_left { - dst[dst_origin - 1] + dst[dst_offset - 1] } else { ((1 << bitdepth >> 1) - 1).as_::() }, @@ -310,7 +302,7 @@ pub fn rav1d_prepare_intra_edges( corner[1] = if have_top { dst_top[0] } else if have_left { - dst[dst_origin - 1] + dst[dst_offset - 1] } else { (1 << bitdepth >> 1).as_::() }; From c4000f92cd16e188ebb1d126ac921964f6f2726f Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Wed, 24 Jan 2024 03:11:34 -0500 Subject: [PATCH 16/24] `fn rav1d_prepare_intra_edges`: remove unnecessary parantheses --- src/ipred_prepare.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 4fba1ed1e..910f090e9 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -203,7 +203,7 @@ pub fn rav1d_prepare_intra_edges( .contains(Needs::LEFT) { let sz = 4 * th as usize; - let left = &mut topleft_out[(topleft_origin - sz)..]; + let left = &mut topleft_out[topleft_origin - sz..]; if have_left { let px_have = cmp::min(sz, (h - y << 2) as usize); for i in 0..px_have { @@ -227,7 +227,7 @@ pub fn rav1d_prepare_intra_edges( .needs .contains(Needs::BOTTOM_LEFT) { - let bottom_left = &mut topleft_out[(topleft_origin - 2 * sz)..]; + let bottom_left = &mut topleft_out[topleft_origin - 2 * sz..]; let have_bottomleft = if !have_left || y + th >= h { false } else { @@ -251,7 +251,7 @@ pub fn rav1d_prepare_intra_edges( .contains(Needs::TOP) { let sz = 4 * tw as usize; - let top = &mut topleft_out[(topleft_origin + 1)..]; + let top = &mut topleft_out[topleft_origin + 1..]; if have_top { let px_have = cmp::min(sz, (w - x << 2) as usize); BD::pixel_copy(top, &dst_top[have_left as usize..], px_have); @@ -282,7 +282,7 @@ pub fn rav1d_prepare_intra_edges( if have_topright { let top_right = &mut top[sz..]; let px_have = cmp::min(sz, (w - x - tw << 2) as usize); - BD::pixel_copy(top_right, &dst_top[(sz + have_left as usize)..], px_have); + BD::pixel_copy(top_right, &dst_top[sz + have_left as usize..], px_have); if px_have < sz { let fill_value = top_right[px_have - 1]; BD::pixel_set(&mut top_right[px_have..], fill_value, sz - px_have); From 9c39dfe26905394e6ac3e520e3b7a5c31bc25081 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Wed, 24 Jan 2024 03:15:15 -0500 Subject: [PATCH 17/24] `fn rav1d_prepare_intra_edges`: rename variable Rename `topleft_origin` as `topleft_out_offset` --- src/ipred_prepare.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index 910f090e9..bdac54e9e 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -135,7 +135,7 @@ pub fn rav1d_prepare_intra_edges( th: c_int, filter_edge: c_int, topleft_out: &mut [BD::Pixel], - topleft_origin: usize, // position of top-left sample in `topleft_out` + topleft_out_offset: usize, // position of top-left sample in `topleft_out` bd: BD, ) -> IntraPredMode { assert!(y < h && x < w); @@ -203,7 +203,7 @@ pub fn rav1d_prepare_intra_edges( .contains(Needs::LEFT) { let sz = 4 * th as usize; - let left = &mut topleft_out[topleft_origin - sz..]; + let left = &mut topleft_out[topleft_out_offset - sz..]; if have_left { let px_have = cmp::min(sz, (h - y << 2) as usize); for i in 0..px_have { @@ -227,7 +227,7 @@ pub fn rav1d_prepare_intra_edges( .needs .contains(Needs::BOTTOM_LEFT) { - let bottom_left = &mut topleft_out[topleft_origin - 2 * sz..]; + let bottom_left = &mut topleft_out[topleft_out_offset - 2 * sz..]; let have_bottomleft = if !have_left || y + th >= h { false } else { @@ -251,7 +251,7 @@ pub fn rav1d_prepare_intra_edges( .contains(Needs::TOP) { let sz = 4 * tw as usize; - let top = &mut topleft_out[topleft_origin + 1..]; + let top = &mut topleft_out[topleft_out_offset + 1..]; if have_top { let px_have = cmp::min(sz, (w - x << 2) as usize); BD::pixel_copy(top, &dst_top[have_left as usize..], px_have); @@ -298,7 +298,8 @@ pub fn rav1d_prepare_intra_edges( .contains(Needs::TOP_LEFT) { // top-left sample and immediate neighbours - let corner = <&mut [_; 3]>::try_from(&mut topleft_out[topleft_origin - 1..][..3]).unwrap(); + let corner = + <&mut [_; 3]>::try_from(&mut topleft_out[topleft_out_offset - 1..][..3]).unwrap(); corner[1] = if have_top { dst_top[0] } else if have_left { From 66fd9885553a1dd536be2d01d89d1bfac19f6a92 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Wed, 24 Jan 2024 03:22:15 -0500 Subject: [PATCH 18/24] Beautify code --- src/ipred_prepare.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index bdac54e9e..cfff7661f 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -190,7 +190,7 @@ pub fn rav1d_prepare_intra_edges( let n = px_have + have_left as usize; if let Some(prefilter_toplevel_sb_edge) = prefilter_toplevel_sb_edge { let offset = (x * 4) as usize - have_left as usize; - &prefilter_toplevel_sb_edge[offset..offset + n] + &prefilter_toplevel_sb_edge[offset..][..n] } else { &dst[(dst_offset as isize - stride) as usize - have_left as usize..][..n] } From ede86202b222bfe105da076ee96bbfbccd740162 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Wed, 24 Jan 2024 04:28:16 -0500 Subject: [PATCH 19/24] Clean up derivation of `edge` array / pointer Define `edge_offset` constant to avoid repetition of numeric constants in code. Define `edge_array` array from which the `edge` pointer is derived. --- src/recon.rs | 81 +++++++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 45 deletions(-) diff --git a/src/recon.rs b/src/recon.rs index c58b09b70..085fbf9e2 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2542,10 +2542,6 @@ pub(crate) unsafe fn rav1d_recon_b_intra( as *const TxfmInfo; let uv_t_dim: *const TxfmInfo = &*dav1d_txfm_dimensions.as_ptr().offset(b.uvtx as isize) as *const TxfmInfo; - let edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) - .0 - .edge[128..] - .as_mut_ptr(); let cbw4 = bw4 + ss_hor >> ss_hor; let cbh4 = bh4 + ss_ver >> ss_ver; let seq_hdr = &***(*f).seq_hdr.as_ref().unwrap(); @@ -2662,6 +2658,10 @@ pub(crate) unsafe fn rav1d_recon_b_intra( } else { None }; + let interintra_edge = + BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); + let edge_array = &mut interintra_edge.0.edge; + let edge_offset = 128 as usize; m = rav1d_prepare_intra_edges( t.bx, t.bx > (*ts).tiling.col_start, @@ -2678,12 +2678,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*t_dim).w as c_int, (*t_dim).h as c_int, seq_hdr.intra_edge_filter, - &mut BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) - .0 - .edge, - 128, + edge_array, + edge_offset, BD::from_c((*f).bitdepth_max), ); + let edge = edge_array.as_ptr().add(edge_offset); (*dsp).ipred.intra_pred[m as usize].call( dst, (*f).cur.stride[0], @@ -2879,6 +2878,10 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let ypos = t.by >> ss_ver; let xstart = (*ts).tiling.col_start >> ss_hor; let ystart = (*ts).tiling.row_start >> ss_ver; + let interintra_edge = + BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); + let edge_array = &mut interintra_edge.0.edge; + let edge_offset = 128 as usize; let m: IntraPredMode = rav1d_prepare_intra_edges( xpos, xpos > xstart, @@ -2895,14 +2898,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*uv_t_dim).w as c_int, (*uv_t_dim).h as c_int, 0 as c_int, - &mut BD::select_mut( - &mut t.scratch.c2rust_unnamed_0.interintra_edge, - ) - .0 - .edge, - 128, + edge_array, + edge_offset, BD::from_c((*f).bitdepth_max), ); + let edge = edge_array.as_ptr().add(edge_offset); (*dsp).ipred.cfl_pred[m as usize].call( uv_dst[pl as usize], stride, @@ -3085,6 +3085,10 @@ pub(crate) unsafe fn rav1d_recon_b_intra( ypos = t.by >> ss_ver; xstart = (*ts).tiling.col_start >> ss_hor; ystart = (*ts).tiling.row_start >> ss_ver; + let interintra_edge = + BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); + let edge_array = &mut interintra_edge.0.edge; + let edge_offset = 128 as usize; m = rav1d_prepare_intra_edges( xpos, xpos > xstart, @@ -3101,15 +3105,12 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*uv_t_dim).w as c_int, (*uv_t_dim).h as c_int, seq_hdr.intra_edge_filter, - &mut BD::select_mut( - &mut t.scratch.c2rust_unnamed_0.interintra_edge, - ) - .0 - .edge, - 128, + edge_array, + edge_offset, BD::from_c((*f).bitdepth_max), ); angle |= intra_edge_filter_flag; + let edge = edge_array.as_ptr().add(edge_offset); (*dsp).ipred.intra_pred[m as usize].call( dst, stride, @@ -3446,10 +3447,9 @@ pub(crate) unsafe fn rav1d_recon_b_inter( } } if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type != 0 { - let tl_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) - .0 - .edge[32..] - .as_mut_ptr(); + let interintra_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); + let tl_edge_array = &mut interintra_edge.0.edge; + let tl_edge_offset = 32 as usize; let mut m: IntraPredMode = (if b .c2rust_unnamed .c2rust_unnamed_0 @@ -3466,10 +3466,6 @@ pub(crate) unsafe fn rav1d_recon_b_inter( .c2rust_unnamed .interintra_mode as c_int }) as IntraPredMode; - let tmp = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) - .0 - .interintra - .as_mut_ptr(); let mut angle = 0; let top_sb_edge_slice = if t.by & (*f).sb_step - 1 == 0 { let mut top_sb_edge: *const BD::Pixel = (*f).ipred_edge[0] as *const BD::Pixel; @@ -3498,12 +3494,12 @@ pub(crate) unsafe fn rav1d_recon_b_inter( bw4, bh4, 0 as c_int, - &mut BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) - .0 - .edge, - 32, + tl_edge_array, + tl_edge_offset, BD::from_c((*f).bitdepth_max), ); + let tl_edge = tl_edge_array[tl_edge_offset..].as_ptr(); + let tmp = interintra_edge.0.interintra.as_mut_ptr(); (*dsp).ipred.intra_pred[m as usize].call( tmp, ((4 * bw4) as c_ulong).wrapping_mul(::core::mem::size_of::() as c_ulong) @@ -3866,15 +3862,10 @@ pub(crate) unsafe fn rav1d_recon_b_inter( }; let mut pl = 0; while pl < 2 { - let tmp = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) - .0 - .interintra - .as_mut_ptr(); - let tl_edge = - BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) - .0 - .edge[32..] - .as_mut_ptr(); + let interintra_edge = + BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); + let tl_edge_array = &mut interintra_edge.0.edge; + let tl_edge_offset = 32 as usize; let mut m: IntraPredMode = (if b .c2rust_unnamed .c2rust_unnamed_0 @@ -3925,12 +3916,12 @@ pub(crate) unsafe fn rav1d_recon_b_inter( cbw4, cbh4, 0 as c_int, - &mut BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge) - .0 - .edge, - 32, + tl_edge_array, + tl_edge_offset, BD::from_c((*f).bitdepth_max), ); + let tl_edge = tl_edge_array[tl_edge_offset..].as_ptr(); + let tmp = interintra_edge.0.interintra.as_mut_ptr(); (*dsp).ipred.intra_pred[m as usize].call( tmp, ((cbw4 * 4) as c_ulong) From b9719b77234fad346dcf8de48741bf5e597b5895 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Wed, 24 Jan 2024 09:37:58 -0500 Subject: [PATCH 20/24] `fn rav1d_prepare_intra_edges`: make `dst` parameter a slice `dst` is made a slice. The slice is designed to contain `4*h` rows of samples. The last row in the slice may contain only `4*w` samples. --- src/ipred_prepare.rs | 5 +---- src/recon.rs | 50 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index cfff7661f..cdb98e8a0 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -27,7 +27,6 @@ use bitflags::bitflags; use libc::ptrdiff_t; use std::cmp; use std::ffi::c_int; -use std::slice; #[inline] pub fn sm_flag(b: &BlockContext, idx: usize) -> c_int { @@ -126,7 +125,7 @@ pub fn rav1d_prepare_intra_edges( w: c_int, h: c_int, edge_flags: EdgeFlags, - dst: *const BD::Pixel, + dst: &[BD::Pixel], // contains 4*h first rows of picture, last row in slice contains 4*w samples stride: ptrdiff_t, prefilter_toplevel_sb_edge: Option<&[BD::Pixel]>, mut mode: IntraPredMode, @@ -143,10 +142,8 @@ pub fn rav1d_prepare_intra_edges( let bitdepth = bd.bitdepth(); let stride = BD::pxstride(stride as usize) as isize; - let dst_size = 4 * h as usize * stride.abs() as usize; let dst_offset = 4 * x as usize + (if stride >= 0 { 4 * y } else { 4 * (h - y) - 1 }) as usize * stride.abs() as usize; - let dst = unsafe { slice::from_raw_parts(dst.sub(dst_offset), dst_size) }; match mode { VERT_PRED..=VERT_LEFT_PRED => { diff --git a/src/recon.rs b/src/recon.rs index 085fbf9e2..7bed8a925 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2662,6 +2662,10 @@ pub(crate) unsafe fn rav1d_recon_b_intra( BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let edge_array = &mut interintra_edge.0.edge; let edge_offset = 128 as usize; + let data_stride = BD::pxstride((*f).cur.stride[0] as usize) as isize; + let data_width = 4 * (*ts).tiling.col_end; + let data_height = 4 * (*ts).tiling.row_end; + let data_diff = (data_height - 1) as isize * data_stride; m = rav1d_prepare_intra_edges( t.bx, t.bx > (*ts).tiling.col_start, @@ -2670,7 +2674,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*ts).tiling.col_end, (*ts).tiling.row_end, edge_flags, - dst, + slice::from_raw_parts( + ((*f).cur.data.data[0] as *const BD::Pixel) + .offset(cmp::min(data_diff, 0)), + data_diff.abs() as usize + data_width as usize, + ), (*f).cur.stride[0], top_sb_edge_slice, b.c2rust_unnamed.c2rust_unnamed.y_mode as IntraPredMode, @@ -2882,6 +2890,10 @@ pub(crate) unsafe fn rav1d_recon_b_intra( BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let edge_array = &mut interintra_edge.0.edge; let edge_offset = 128 as usize; + let data_stride = BD::pxstride((*f).cur.stride[1] as usize) as isize; + let data_width = 4 * (*ts).tiling.col_end >> ss_ver; + let data_height = 4 * (*ts).tiling.row_end >> ss_ver; + let data_diff = (data_height - 1) as isize * data_stride; let m: IntraPredMode = rav1d_prepare_intra_edges( xpos, xpos > xstart, @@ -2890,7 +2902,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, 0 as EdgeFlags, - uv_dst[pl as usize], + slice::from_raw_parts( + ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) + .offset(cmp::min(data_diff, 0)), + data_diff.abs() as usize + data_width as usize, + ), stride, top_sb_edge_slice, DC_PRED, @@ -3089,6 +3105,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let edge_array = &mut interintra_edge.0.edge; let edge_offset = 128 as usize; + let data_stride = + BD::pxstride((*f).cur.stride[1] as usize) as isize; + let data_width = 4 * (*ts).tiling.col_end >> ss_ver; + let data_height = 4 * (*ts).tiling.row_end >> ss_ver; + let data_diff = (data_height - 1) as isize * data_stride; m = rav1d_prepare_intra_edges( xpos, xpos > xstart, @@ -3097,7 +3118,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, edge_flags, - dst, + slice::from_raw_parts( + ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) + .offset(cmp::min(data_diff, 0)), + data_diff.abs() as usize + data_width as usize, + ), stride, top_sb_edge_slice, uv_mode, @@ -3478,6 +3503,10 @@ pub(crate) unsafe fn rav1d_recon_b_inter( } else { None }; + let data_stride = BD::pxstride((*f).cur.stride[0] as usize) as isize; + let data_width = 4 * (*ts).tiling.col_end; + let data_height = 4 * (*ts).tiling.row_end; + let data_diff = (data_height - 1) as isize * data_stride; m = rav1d_prepare_intra_edges( t.bx, t.bx > (*ts).tiling.col_start, @@ -3486,7 +3515,10 @@ pub(crate) unsafe fn rav1d_recon_b_inter( (*ts).tiling.col_end, (*ts).tiling.row_end, 0 as EdgeFlags, - dst, + slice::from_raw_parts( + ((*f).cur.data.data[0] as *const BD::Pixel).offset(cmp::min(data_diff, 0)), + data_diff.abs() as usize + data_width as usize, + ), (*f).cur.stride[0], top_sb_edge_slice, m, @@ -3900,6 +3932,10 @@ pub(crate) unsafe fn rav1d_recon_b_inter( } else { None }; + let data_stride = BD::pxstride((*f).cur.stride[1] as usize) as isize; + let data_width = 4 * (*ts).tiling.col_end >> ss_hor; + let data_height = 4 * (*ts).tiling.row_end >> ss_ver; + let data_diff = (data_height - 1) as isize * data_stride; m = rav1d_prepare_intra_edges( t.bx >> ss_hor, t.bx >> ss_hor > (*ts).tiling.col_start >> ss_hor, @@ -3908,7 +3944,11 @@ pub(crate) unsafe fn rav1d_recon_b_inter( (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, 0 as EdgeFlags, - uvdst, + slice::from_raw_parts( + ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) + .offset(cmp::min(data_diff, 0)), + data_diff.abs() as usize + data_width as usize, + ), (*f).cur.stride[1], top_sb_edge_slice, m, From 64be12be3ac61e2b3d9d00002473b6fb68bb5122 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Mon, 29 Jan 2024 15:55:35 -0500 Subject: [PATCH 21/24] Use `.unsigned_abs()` instead of `.abs() as usize` --- src/ipred_prepare.rs | 2 +- src/recon.rs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ipred_prepare.rs b/src/ipred_prepare.rs index cdb98e8a0..2fa2f1e1c 100644 --- a/src/ipred_prepare.rs +++ b/src/ipred_prepare.rs @@ -143,7 +143,7 @@ pub fn rav1d_prepare_intra_edges( let stride = BD::pxstride(stride as usize) as isize; let dst_offset = 4 * x as usize - + (if stride >= 0 { 4 * y } else { 4 * (h - y) - 1 }) as usize * stride.abs() as usize; + + (if stride >= 0 { 4 * y } else { 4 * (h - y) - 1 }) as usize * stride.unsigned_abs(); match mode { VERT_PRED..=VERT_LEFT_PRED => { diff --git a/src/recon.rs b/src/recon.rs index 7bed8a925..caf415133 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2677,7 +2677,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( slice::from_raw_parts( ((*f).cur.data.data[0] as *const BD::Pixel) .offset(cmp::min(data_diff, 0)), - data_diff.abs() as usize + data_width as usize, + data_diff.unsigned_abs() + data_width as usize, ), (*f).cur.stride[0], top_sb_edge_slice, @@ -2905,7 +2905,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( slice::from_raw_parts( ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) .offset(cmp::min(data_diff, 0)), - data_diff.abs() as usize + data_width as usize, + data_diff.unsigned_abs() + data_width as usize, ), stride, top_sb_edge_slice, @@ -3121,7 +3121,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( slice::from_raw_parts( ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) .offset(cmp::min(data_diff, 0)), - data_diff.abs() as usize + data_width as usize, + data_diff.unsigned_abs() + data_width as usize, ), stride, top_sb_edge_slice, @@ -3517,7 +3517,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( 0 as EdgeFlags, slice::from_raw_parts( ((*f).cur.data.data[0] as *const BD::Pixel).offset(cmp::min(data_diff, 0)), - data_diff.abs() as usize + data_width as usize, + data_diff.unsigned_abs() + data_width as usize, ), (*f).cur.stride[0], top_sb_edge_slice, @@ -3947,7 +3947,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( slice::from_raw_parts( ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) .offset(cmp::min(data_diff, 0)), - data_diff.abs() as usize + data_width as usize, + data_diff.unsigned_abs() + data_width as usize, ), (*f).cur.stride[1], top_sb_edge_slice, From 0a3c9a1f5cc61a6c275c78c095af4c0769616a2c Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Mon, 29 Jan 2024 16:13:35 -0500 Subject: [PATCH 22/24] Omit unnecessary type for numeric constants --- src/recon.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/recon.rs b/src/recon.rs index caf415133..76a80dfec 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2661,7 +2661,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let interintra_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let edge_array = &mut interintra_edge.0.edge; - let edge_offset = 128 as usize; + let edge_offset = 128; let data_stride = BD::pxstride((*f).cur.stride[0] as usize) as isize; let data_width = 4 * (*ts).tiling.col_end; let data_height = 4 * (*ts).tiling.row_end; @@ -2889,7 +2889,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let interintra_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let edge_array = &mut interintra_edge.0.edge; - let edge_offset = 128 as usize; + let edge_offset = 128; let data_stride = BD::pxstride((*f).cur.stride[1] as usize) as isize; let data_width = 4 * (*ts).tiling.col_end >> ss_ver; let data_height = 4 * (*ts).tiling.row_end >> ss_ver; @@ -3104,7 +3104,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let interintra_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let edge_array = &mut interintra_edge.0.edge; - let edge_offset = 128 as usize; + let edge_offset = 128; let data_stride = BD::pxstride((*f).cur.stride[1] as usize) as isize; let data_width = 4 * (*ts).tiling.col_end >> ss_ver; @@ -3474,7 +3474,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type != 0 { let interintra_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let tl_edge_array = &mut interintra_edge.0.edge; - let tl_edge_offset = 32 as usize; + let tl_edge_offset = 32; let mut m: IntraPredMode = (if b .c2rust_unnamed .c2rust_unnamed_0 @@ -3897,7 +3897,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( let interintra_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let tl_edge_array = &mut interintra_edge.0.edge; - let tl_edge_offset = 32 as usize; + let tl_edge_offset = 32; let mut m: IntraPredMode = (if b .c2rust_unnamed .c2rust_unnamed_0 From cf2527f1cd2d4886a5f1e2cd26a4fab74735f2d5 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Mon, 29 Jan 2024 16:33:27 -0500 Subject: [PATCH 23/24] Define intermediate variables to minimize "distance" from existing code --- src/recon.rs | 53 ++++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/recon.rs b/src/recon.rs index 76a80dfec..87cf4ec1f 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2666,6 +2666,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let data_width = 4 * (*ts).tiling.col_end; let data_height = 4 * (*ts).tiling.row_end; let data_diff = (data_height - 1) as isize * data_stride; + let dst_slice = slice::from_raw_parts( + ((*f).cur.data.data[0] as *const BD::Pixel) + .offset(cmp::min(data_diff, 0)), + data_diff.unsigned_abs() + data_width as usize, + ); m = rav1d_prepare_intra_edges( t.bx, t.bx > (*ts).tiling.col_start, @@ -2674,11 +2679,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*ts).tiling.col_end, (*ts).tiling.row_end, edge_flags, - slice::from_raw_parts( - ((*f).cur.data.data[0] as *const BD::Pixel) - .offset(cmp::min(data_diff, 0)), - data_diff.unsigned_abs() + data_width as usize, - ), + dst_slice, (*f).cur.stride[0], top_sb_edge_slice, b.c2rust_unnamed.c2rust_unnamed.y_mode as IntraPredMode, @@ -2894,6 +2895,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let data_width = 4 * (*ts).tiling.col_end >> ss_ver; let data_height = 4 * (*ts).tiling.row_end >> ss_ver; let data_diff = (data_height - 1) as isize * data_stride; + let uvdst_slice = slice::from_raw_parts( + ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) + .offset(cmp::min(data_diff, 0)), + data_diff.unsigned_abs() + data_width as usize, + ); let m: IntraPredMode = rav1d_prepare_intra_edges( xpos, xpos > xstart, @@ -2902,11 +2908,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, 0 as EdgeFlags, - slice::from_raw_parts( - ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) - .offset(cmp::min(data_diff, 0)), - data_diff.unsigned_abs() + data_width as usize, - ), + uvdst_slice, stride, top_sb_edge_slice, DC_PRED, @@ -3110,6 +3112,11 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let data_width = 4 * (*ts).tiling.col_end >> ss_ver; let data_height = 4 * (*ts).tiling.row_end >> ss_ver; let data_diff = (data_height - 1) as isize * data_stride; + let dstuv_slice = slice::from_raw_parts( + ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) + .offset(cmp::min(data_diff, 0)), + data_diff.unsigned_abs() + data_width as usize, + ); m = rav1d_prepare_intra_edges( xpos, xpos > xstart, @@ -3118,11 +3125,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, edge_flags, - slice::from_raw_parts( - ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) - .offset(cmp::min(data_diff, 0)), - data_diff.unsigned_abs() + data_width as usize, - ), + dstuv_slice, stride, top_sb_edge_slice, uv_mode, @@ -3507,6 +3510,10 @@ pub(crate) unsafe fn rav1d_recon_b_inter( let data_width = 4 * (*ts).tiling.col_end; let data_height = 4 * (*ts).tiling.row_end; let data_diff = (data_height - 1) as isize * data_stride; + let dst_slice = slice::from_raw_parts( + ((*f).cur.data.data[0] as *const BD::Pixel).offset(cmp::min(data_diff, 0)), + data_diff.unsigned_abs() + data_width as usize, + ); m = rav1d_prepare_intra_edges( t.bx, t.bx > (*ts).tiling.col_start, @@ -3515,10 +3522,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( (*ts).tiling.col_end, (*ts).tiling.row_end, 0 as EdgeFlags, - slice::from_raw_parts( - ((*f).cur.data.data[0] as *const BD::Pixel).offset(cmp::min(data_diff, 0)), - data_diff.unsigned_abs() + data_width as usize, - ), + dst_slice, (*f).cur.stride[0], top_sb_edge_slice, m, @@ -3936,6 +3940,11 @@ pub(crate) unsafe fn rav1d_recon_b_inter( let data_width = 4 * (*ts).tiling.col_end >> ss_hor; let data_height = 4 * (*ts).tiling.row_end >> ss_ver; let data_diff = (data_height - 1) as isize * data_stride; + let dstuv_slice = slice::from_raw_parts( + ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) + .offset(cmp::min(data_diff, 0)), + data_diff.unsigned_abs() + data_width as usize, + ); m = rav1d_prepare_intra_edges( t.bx >> ss_hor, t.bx >> ss_hor > (*ts).tiling.col_start >> ss_hor, @@ -3944,11 +3953,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( (*ts).tiling.col_end >> ss_hor, (*ts).tiling.row_end >> ss_ver, 0 as EdgeFlags, - slice::from_raw_parts( - ((*f).cur.data.data[1 + pl as usize] as *const BD::Pixel) - .offset(cmp::min(data_diff, 0)), - data_diff.unsigned_abs() + data_width as usize, - ), + dstuv_slice, (*f).cur.stride[1], top_sb_edge_slice, m, From ddddc08ef85fbcafcd5402de755e81fbfcfb8c24 Mon Sep 17 00:00:00 2001 From: Frank Bossen Date: Tue, 30 Jan 2024 16:25:40 -0500 Subject: [PATCH 24/24] Fix chroma scaling --- src/recon.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/recon.rs b/src/recon.rs index 87cf4ec1f..7958c1802 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2892,7 +2892,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let edge_array = &mut interintra_edge.0.edge; let edge_offset = 128; let data_stride = BD::pxstride((*f).cur.stride[1] as usize) as isize; - let data_width = 4 * (*ts).tiling.col_end >> ss_ver; + let data_width = 4 * (*ts).tiling.col_end >> ss_hor; let data_height = 4 * (*ts).tiling.row_end >> ss_ver; let data_diff = (data_height - 1) as isize * data_stride; let uvdst_slice = slice::from_raw_parts( @@ -3109,7 +3109,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let edge_offset = 128; let data_stride = BD::pxstride((*f).cur.stride[1] as usize) as isize; - let data_width = 4 * (*ts).tiling.col_end >> ss_ver; + let data_width = 4 * (*ts).tiling.col_end >> ss_hor; let data_height = 4 * (*ts).tiling.row_end >> ss_ver; let data_diff = (data_height - 1) as isize * data_stride; let dstuv_slice = slice::from_raw_parts(