From 3dcce2598a3ec7f33b705398a8defe6d8e7a33e9 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 22:33:37 +0100 Subject: [PATCH 01/23] while loops -> for loops --- src/cdef_apply.rs | 62 +++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 40 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 66288a63e..6efa6eb76 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -121,8 +121,7 @@ unsafe fn backup2x8( ) { let mut y_off: ptrdiff_t = 0 as c_int as ptrdiff_t; if flag as c_uint & BACKUP_2X8_Y as c_int as c_uint != 0 { - let mut y = 0; - while y < 8 { + for y in 0..8 { BD::pixel_copy( &mut (*dst.offset(0))[y as usize], slice::from_raw_parts( @@ -132,7 +131,6 @@ unsafe fn backup2x8( ), 2, ); - y += 1; y_off += BD::pxstride(*src_stride.offset(0) as usize) as isize; } } @@ -145,8 +143,7 @@ unsafe fn backup2x8( let ss_hor = (layout as c_uint != Rav1dPixelLayout::I444 as c_int as c_uint) as c_int; x_off >>= ss_hor; y_off = 0 as c_int as ptrdiff_t; - let mut y = 0; - while y < 8 >> ss_ver { + for y in 0..8 >> ss_ver { BD::pixel_copy( &mut (*dst.offset(1))[y as usize], slice::from_raw_parts( @@ -165,7 +162,6 @@ unsafe fn backup2x8( ), 2, ); - y += 1; y_off += BD::pxstride(*src_stride.offset(1) as usize) as isize; } } @@ -225,8 +221,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( let y_stride: ptrdiff_t = BD::pxstride((*f).cur.stride[0] as usize) as isize; let uv_stride: ptrdiff_t = BD::pxstride((*f).cur.stride[1] as usize) as isize; let mut bit = 0; - let mut by = by_start; - while by < by_end { + for by in (by_start..by_end).step_by(2) { let tf = (*tc).top_pre_cdef_toggle; let by_idx = (by & 30) >> 1; if by + 2 >= (*f).bh { @@ -262,9 +257,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( edges as c_uint | CDEF_HAVE_RIGHT as c_int as c_uint, ); let mut prev_flag: Backup2x8Flags = 0 as Backup2x8Flags; - let mut sbx = 0; let mut last_skip = 1; - while sbx < sb64w { + for sbx in 0..sb64w { let noskip_row: *const [u16; 2]; let noskip_mask: c_uint; let y_lvl; @@ -301,8 +295,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( uv_sec_lvl += (uv_sec_lvl == 3) as c_int; uv_sec_lvl <<= bitdepth_min_8; bptrs = [iptrs[0], iptrs[1], iptrs[2]]; - let mut bx = sbx * sbsz; - while bx < cmp::min((sbx + 1) * sbsz, (*f).bw) { + for bx in (sbx * sbsz..cmp::min((sbx + 1) * sbsz, (*f).bw)).step_by(2) { let uvdir; let do_left; let mut dir; @@ -457,8 +450,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( } else { 0 as c_int }; - let mut pl = 1; - while pl <= 2 { + for pl in 1..=2 { let current_block_77: u64; if have_tt == 0 { current_block_77 = 5687667889785024198; @@ -466,22 +458,19 @@ pub(crate) unsafe fn rav1d_cdef_brow( if resize != 0 { offset = ((sby - 1) * 4) as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - top = &mut *((*((*f).lf.cdef_lpf_line) - .as_mut_ptr() - .offset(pl as isize)) - as *mut BD::Pixel) - .offset(offset as isize); + top = + &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().add(pl)) + as *mut BD::Pixel) + .offset(offset as isize); } else { let line_0 = sby * ((4 as c_int) << sb128) - 4; offset = line_0 as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - top = &mut *((*((*f).lf.lr_lpf_line) - .as_mut_ptr() - .offset(pl as isize)) + top = &mut *((*((*f).lf.lr_lpf_line).as_mut_ptr().add(pl)) as *mut BD::Pixel) .offset(offset as isize); } - bot = (bptrs[pl as usize]) + bot = (bptrs[pl]) .offset(((8 >> ss_ver) as isize * uv_stride) as isize); current_block_77 = 6540614962658479183; } else if sbrow_start == 0 && by + 2 >= by_end { @@ -491,24 +480,21 @@ pub(crate) unsafe fn rav1d_cdef_brow( .as_mut_ptr() .offset(tf as isize)) .as_mut_ptr() - .offset(pl as isize)) + .add(pl)) as *mut BD::Pixel) .offset(top_offset as isize); if resize != 0 { offset = (sby * 4 + 2) as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - bot = &mut *((*((*f).lf.cdef_lpf_line) - .as_mut_ptr() - .offset(pl as isize)) - as *mut BD::Pixel) - .offset(offset as isize); + bot = + &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().add(pl)) + as *mut BD::Pixel) + .offset(offset as isize); } else { let line_1 = sby * ((4 as c_int) << sb128) + 4 * sb128 + 2; offset = line_1 as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - bot = &mut *((*((*f).lf.lr_lpf_line) - .as_mut_ptr() - .offset(pl as isize)) + bot = &mut *((*((*f).lf.lr_lpf_line).as_mut_ptr().add(pl)) as *mut BD::Pixel) .offset(offset as isize); } @@ -523,22 +509,22 @@ pub(crate) unsafe fn rav1d_cdef_brow( .as_mut_ptr() .offset(tf as isize)) .as_mut_ptr() - .offset(pl as isize)) + .add(pl)) as *mut BD::Pixel) .offset( (have_tt as isize * offset_0 + (bx * 4 >> ss_hor) as isize) as isize, ); - bot = (bptrs[pl as usize]) + bot = (bptrs[pl]) .offset(((8 >> ss_ver) as isize * uv_stride) as isize); } _ => {} } (*dsp).cdef.fb[uv_idx as usize]( - bptrs[pl as usize].cast(), + bptrs[pl].cast(), (*f).cur.stride[1], - (lr_bak[bit as usize][pl as usize]).as_mut_ptr().cast(), + (lr_bak[bit as usize][pl]).as_mut_ptr().cast(), top.cast(), bot.cast(), uv_pri_lvl, @@ -548,7 +534,6 @@ pub(crate) unsafe fn rav1d_cdef_brow( edges, (*f).bitdepth_max, ); - pl += 1; } } bit ^= 1 as c_int; @@ -557,7 +542,6 @@ pub(crate) unsafe fn rav1d_cdef_brow( bptrs[0] = (bptrs[0]).offset(8); bptrs[1] = (bptrs[1]).offset((8 >> ss_hor) as isize); bptrs[2] = (bptrs[2]).offset((8 >> ss_hor) as isize); - bx += 2 as c_int; edges = ::core::mem::transmute::( edges as c_uint | CDEF_HAVE_LEFT as c_int as c_uint, ); @@ -566,7 +550,6 @@ pub(crate) unsafe fn rav1d_cdef_brow( iptrs[0] = (iptrs[0]).offset((sbsz * 4) as isize); iptrs[1] = (iptrs[1]).offset((sbsz * 4 >> ss_hor) as isize); iptrs[2] = (iptrs[2]).offset((sbsz * 4 >> ss_hor) as isize); - sbx += 1; edges = ::core::mem::transmute::( edges as c_uint | CDEF_HAVE_LEFT as c_int as c_uint, ); @@ -577,7 +560,6 @@ pub(crate) unsafe fn rav1d_cdef_brow( ptrs[2] = (ptrs[2]).offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); (*tc).top_pre_cdef_toggle ^= 1 as c_int; - by += 2 as c_int; edges = ::core::mem::transmute::( edges as c_uint | CDEF_HAVE_TOP as c_int as c_uint, ); From 20a270dc448bd87e3f1d27b8faac9b32c9419697 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 22:42:51 +0100 Subject: [PATCH 02/23] layout casts --- src/cdef_apply.rs | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 6efa6eb76..7d0dcae32 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -51,13 +51,13 @@ unsafe fn backup2lines( (2 * y_stride) as usize, ); } - if layout as c_uint != Rav1dPixelLayout::I400 as c_int as c_uint { + if layout != Rav1dPixelLayout::I400 { let uv_stride: ptrdiff_t = BD::pxstride(*stride.offset(1) as usize) as isize; if uv_stride < 0 { - let uv_off = if layout as c_uint == Rav1dPixelLayout::I420 as c_int as c_uint { - 3 as c_int + let uv_off = if layout == Rav1dPixelLayout::I420 { + 3 } else { - 7 as c_int + 7 }; BD::pixel_copy( slice::from_raw_parts_mut( @@ -84,10 +84,10 @@ unsafe fn backup2lines( (-2 * uv_stride) as usize, ); } else { - let uv_off = if layout as c_uint == Rav1dPixelLayout::I420 as c_int as c_uint { - 2 as c_int + let uv_off = if layout == Rav1dPixelLayout::I420 { + 2 } else { - 6 as c_int + 6 }; BD::pixel_copy( slice::from_raw_parts_mut(*dst.offset(1) as *mut BD::Pixel, 2 * uv_stride as usize), @@ -134,13 +134,11 @@ unsafe fn backup2x8( y_off += BD::pxstride(*src_stride.offset(0) as usize) as isize; } } - if layout as c_uint == Rav1dPixelLayout::I400 as c_int as c_uint - || flag as c_uint & BACKUP_2X8_UV as c_int as c_uint == 0 - { + if layout == Rav1dPixelLayout::I400 || flag & BACKUP_2X8_UV == 0 { return; } - let ss_ver = (layout as c_uint == Rav1dPixelLayout::I420 as c_int as c_uint) as c_int; - let ss_hor = (layout as c_uint != Rav1dPixelLayout::I444 as c_int as c_uint) as c_int; + let ss_ver = (layout == Rav1dPixelLayout::I420) as c_int; + let ss_hor = (layout != Rav1dPixelLayout::I444) as c_int; x_off >>= ss_hor; y_off = 0 as c_int as ptrdiff_t; for y in 0..8 >> ss_ver { @@ -207,14 +205,11 @@ pub(crate) unsafe fn rav1d_cdef_brow( let frame_hdr = &***(*f).frame_hdr.as_ref().unwrap(); let damping = frame_hdr.cdef.damping + bitdepth_min_8; let layout: Rav1dPixelLayout = (*f).cur.p.layout; - let uv_idx = - (Rav1dPixelLayout::I444 as c_int as c_uint).wrapping_sub(layout as c_uint) as c_int; - let ss_ver = (layout as c_uint == Rav1dPixelLayout::I420 as c_int as c_uint) as c_int; - let ss_hor = (layout as c_uint != Rav1dPixelLayout::I444 as c_int as c_uint) as c_int; + let uv_idx = (Rav1dPixelLayout::I444 as c_uint).wrapping_sub(layout as c_uint) as c_int; + let ss_ver = (layout == Rav1dPixelLayout::I420) as c_int; + let ss_hor = (layout != Rav1dPixelLayout::I444) as c_int; static uv_dirs: [[u8; 8]; 2] = [[0, 1, 2, 3, 4, 5, 6, 7], [7, 0, 2, 4, 5, 6, 6, 6]]; - let uv_dir: *const u8 = (uv_dirs - [(layout as c_uint == Rav1dPixelLayout::I422 as c_int as c_uint) as c_int as usize]) - .as_ptr(); + let uv_dir: *const u8 = (uv_dirs[(layout == Rav1dPixelLayout::I422) as usize]).as_ptr(); let have_tt = (c.tc.len() > 1) as c_int; let sb128 = (*f).seq_hdr.as_ref().unwrap().sb128; let resize = (frame_hdr.size.width[0] != frame_hdr.size.width[1]) as c_int; @@ -442,7 +437,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( ); } if !(uv_lvl == 0) { - if !(layout as c_uint != Rav1dPixelLayout::I400 as c_int as c_uint) { + if !(layout != Rav1dPixelLayout::I400) { unreachable!(); } uvdir = if uv_pri_lvl != 0 { From eead9b4d77499dce9837dc87bec854a6d12237d0 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 22:58:18 +0100 Subject: [PATCH 03/23] cleanup backup2lines --- src/cdef_apply.rs | 82 +++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 53 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 7d0dcae32..0bd34adbf 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -23,34 +23,28 @@ pub const BACKUP_2X8_UV: Backup2x8Flags = 2; pub const BACKUP_2X8_Y: Backup2x8Flags = 1; unsafe fn backup2lines( - dst: *const *mut BD::Pixel, - src: *const *mut BD::Pixel, + dst: &[*mut BD::Pixel], + src: &[*mut BD::Pixel; 3], stride: *const ptrdiff_t, layout: Rav1dPixelLayout, ) { let y_stride: ptrdiff_t = BD::pxstride(*stride.offset(0) as usize) as isize; if y_stride < 0 { + let len = (-2 * y_stride) as usize; BD::pixel_copy( - slice::from_raw_parts_mut( - *dst.offset(y_stride as isize) as *mut BD::Pixel, - (-2 * y_stride) as usize, - ), - slice::from_raw_parts( - *src.offset((7 as isize * y_stride) as isize) as *const BD::Pixel, - (-2 * y_stride) as usize, - ), - (-2 * y_stride) as usize, + slice::from_raw_parts_mut(dst[0].offset(y_stride), len), + slice::from_raw_parts(src[0].offset(7 * y_stride), len), + len, ); } else { + let len = 2 * y_stride as usize; BD::pixel_copy( - slice::from_raw_parts_mut(*dst as *mut BD::Pixel, (2 * y_stride) as usize), - slice::from_raw_parts( - (*src.offset(0)).offset(6 as isize * y_stride as isize) as *const BD::Pixel, - (2 * y_stride) as usize, - ), - (2 * y_stride) as usize, + slice::from_raw_parts_mut(dst[0], len), + slice::from_raw_parts(src[0].offset(6 * y_stride), len), + len, ); } + if layout != Rav1dPixelLayout::I400 { let uv_stride: ptrdiff_t = BD::pxstride(*stride.offset(1) as usize) as isize; if uv_stride < 0 { @@ -59,29 +53,17 @@ unsafe fn backup2lines( } else { 7 }; + + let len = (-2 * uv_stride) as usize; BD::pixel_copy( - slice::from_raw_parts_mut( - (*dst.offset(1)).offset(uv_stride as isize) as *mut BD::Pixel, - (-2 * uv_stride) as usize, - ), - slice::from_raw_parts( - (*src.offset(1)).offset((uv_off as isize * uv_stride) as isize) - as *const BD::Pixel, - (-2 * uv_stride) as usize, - ), - (-2 * uv_stride) as usize, + slice::from_raw_parts_mut(dst[1].offset(uv_stride), len), + slice::from_raw_parts(src[1].offset(uv_off * uv_stride), len), + len, ); BD::pixel_copy( - slice::from_raw_parts_mut( - (*dst.offset(2)).offset(uv_stride as isize) as *mut BD::Pixel, - (-2 * uv_stride) as usize, - ), - slice::from_raw_parts( - (*src.offset(2)).offset((uv_off as isize * uv_stride) as isize) - as *const BD::Pixel, - (-2 * uv_stride) as usize, - ), - (-2 * uv_stride) as usize, + slice::from_raw_parts_mut(dst[2].offset(uv_stride), len), + slice::from_raw_parts(src[2].offset(uv_off * uv_stride), len), + len, ); } else { let uv_off = if layout == Rav1dPixelLayout::I420 { @@ -89,23 +71,17 @@ unsafe fn backup2lines( } else { 6 }; + + let len = 2 * uv_stride as usize; BD::pixel_copy( - slice::from_raw_parts_mut(*dst.offset(1) as *mut BD::Pixel, 2 * uv_stride as usize), - slice::from_raw_parts( - (*src.offset(1)).offset((uv_off as isize * uv_stride) as isize) - as *const BD::Pixel, - 2 * uv_stride as usize, - ), - 2 * uv_stride as usize, + slice::from_raw_parts_mut(dst[1], len), + slice::from_raw_parts(src[1].offset(uv_off * uv_stride), len), + len, ); BD::pixel_copy( - slice::from_raw_parts_mut(*dst.offset(2) as *mut BD::Pixel, 2 * uv_stride as usize), - slice::from_raw_parts( - (*src.offset(2)).offset((uv_off as isize * uv_stride) as isize) - as *const BD::Pixel, - 2 * uv_stride as usize, - ), - 2 * uv_stride as usize, + slice::from_raw_parts_mut(dst[2], len), + slice::from_raw_parts(src[2].offset(uv_off * uv_stride), len), + len, ); } } @@ -236,8 +212,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( .offset(((have_tt * sby * 8) as isize * uv_stride) as isize), ]; backup2lines::( - cdef_top_bak.as_ptr(), - ptrs.as_mut_ptr() as *const *mut BD::Pixel, + &cdef_top_bak, + &ptrs, ((*f).cur.stride).as_mut_ptr() as *const ptrdiff_t, layout, ); From 3e01bc05d8054aac401b4de817bd3f486462bbff Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 23:05:11 +0100 Subject: [PATCH 04/23] cleanup backup2x8 --- src/cdef_apply.rs | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 0bd34adbf..0881814fd 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -88,8 +88,8 @@ unsafe fn backup2lines( } unsafe fn backup2x8( - dst: *mut [[BD::Pixel; 2]; 8], - src: *const *mut BD::Pixel, + dst: &mut [[[BD::Pixel; 2]; 8]; 3], + src: &[*mut BD::Pixel; 3], src_stride: *const ptrdiff_t, mut x_off: c_int, layout: Rav1dPixelLayout, @@ -99,12 +99,8 @@ unsafe fn backup2x8( if flag as c_uint & BACKUP_2X8_Y as c_int as c_uint != 0 { for y in 0..8 { BD::pixel_copy( - &mut (*dst.offset(0))[y as usize], - slice::from_raw_parts( - &mut *(*src.offset(0)).offset((y_off + x_off as isize - 2 as isize) as isize) - as *mut BD::Pixel, - 2, - ), + &mut dst[0][y], + slice::from_raw_parts(&mut *src[0].offset(y_off + x_off as isize - 2), 2), 2, ); y_off += BD::pxstride(*src_stride.offset(0) as usize) as isize; @@ -119,21 +115,13 @@ unsafe fn backup2x8( y_off = 0 as c_int as ptrdiff_t; for y in 0..8 >> ss_ver { BD::pixel_copy( - &mut (*dst.offset(1))[y as usize], - slice::from_raw_parts( - &mut *(*src.offset(1)).offset((y_off + x_off as isize - 2 as isize) as isize) - as *mut BD::Pixel, - 2, - ), + &mut dst[1][y], + slice::from_raw_parts(src[1].offset(y_off + x_off as isize - 2), 2), 2, ); BD::pixel_copy( - &mut (*dst.offset(2))[y as usize], - slice::from_raw_parts( - &mut *(*src.offset(2)).offset((y_off + x_off as isize - 2 as isize) as isize) - as *mut BD::Pixel, - 2, - ), + &mut dst[2][y], + slice::from_raw_parts(src[2].offset(y_off + x_off as isize - 2), 2), 2, ); y_off += BD::pxstride(*src_stride.offset(1) as usize) as isize; @@ -293,8 +281,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( if do_left != 0 && edges as c_uint & CDEF_HAVE_LEFT as c_int as c_uint != 0 { backup2x8::( - (lr_bak[bit as usize]).as_mut_ptr(), - bptrs.as_mut_ptr() as *const *mut BD::Pixel, + &mut lr_bak[bit as usize], + &bptrs, ((*f).cur.stride).as_mut_ptr() as *const ptrdiff_t, 0 as c_int, layout, @@ -303,8 +291,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( } if edges as c_uint & CDEF_HAVE_RIGHT as c_int as c_uint != 0 { backup2x8::( - (lr_bak[(bit == 0) as c_int as usize]).as_mut_ptr(), - bptrs.as_mut_ptr() as *const *mut BD::Pixel, + &mut lr_bak[(bit == 0) as usize], + &bptrs, ((*f).cur.stride).as_mut_ptr() as *const ptrdiff_t, 8 as c_int, layout, From 0dfd7126c715b06b4ab7ee87fa11d1e6179b9ff2 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 23:08:43 +0100 Subject: [PATCH 05/23] remove some integer casts --- src/cdef_apply.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 0881814fd..e726ee635 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -96,7 +96,7 @@ unsafe fn backup2x8( flag: Backup2x8Flags, ) { let mut y_off: ptrdiff_t = 0 as c_int as ptrdiff_t; - if flag as c_uint & BACKUP_2X8_Y as c_int as c_uint != 0 { + if flag & BACKUP_2X8_Y != 0 { for y in 0..8 { BD::pixel_copy( &mut dst[0][y], @@ -130,13 +130,15 @@ unsafe fn backup2x8( unsafe fn adjust_strength(strength: c_int, var: c_uint) -> c_int { if var == 0 { - return 0 as c_int; + return 0; } + let i = if var >> 6 != 0 { cmp::min(ulog2(var >> 6), 12 as c_int) } else { - 0 as c_int + 0 }; + return strength * (4 + i) + 8 >> 4; } @@ -151,17 +153,13 @@ pub(crate) unsafe fn rav1d_cdef_brow( sby: c_int, ) { let f: *mut Rav1dFrameContext = (*tc).f as *mut Rav1dFrameContext; - let bitdepth_min_8 = if 16 == 8 { - 0 as c_int - } else { - (*f).cur.p.bpc - 8 - }; + let bitdepth_min_8 = if 16 == 8 { 0 } else { (*f).cur.p.bpc - 8 }; let dsp: *const Rav1dDSPContext = (*f).dsp; let mut edges: CdefEdgeFlags = (CDEF_HAVE_BOTTOM as c_int | (if by_start > 0 { CDEF_HAVE_TOP as c_int } else { - 0 as c_int + 0 })) as CdefEdgeFlags; let mut ptrs: [*mut BD::Pixel; 3] = [*p.offset(0), *p.offset(1), *p.offset(2)]; let sbsz = 16; @@ -172,8 +170,10 @@ pub(crate) unsafe fn rav1d_cdef_brow( let uv_idx = (Rav1dPixelLayout::I444 as c_uint).wrapping_sub(layout as c_uint) as c_int; let ss_ver = (layout == Rav1dPixelLayout::I420) as c_int; let ss_hor = (layout != Rav1dPixelLayout::I444) as c_int; + static uv_dirs: [[u8; 8]; 2] = [[0, 1, 2, 3, 4, 5, 6, 7], [7, 0, 2, 4, 5, 6, 6, 6]]; - let uv_dir: *const u8 = (uv_dirs[(layout == Rav1dPixelLayout::I422) as usize]).as_ptr(); + let uv_dir: &[u8; 8] = &uv_dirs[(layout == Rav1dPixelLayout::I422) as usize]; + let have_tt = (c.tc.len() > 1) as c_int; let sb128 = (*f).seq_hdr.as_ref().unwrap().sb128; let resize = (frame_hdr.size.width[0] != frame_hdr.size.width[1]) as c_int; @@ -405,9 +405,9 @@ pub(crate) unsafe fn rav1d_cdef_brow( unreachable!(); } uvdir = if uv_pri_lvl != 0 { - *uv_dir.offset(dir as isize) as c_int + uv_dir[dir as usize] as c_int } else { - 0 as c_int + 0 }; for pl in 1..=2 { let current_block_77: u64; From 3b586080ad0990a317c6dbbcb855d46146fee2af Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 23:11:50 +0100 Subject: [PATCH 06/23] pass p as a array reference --- src/cdef_apply.rs | 4 ++-- src/recon.rs | 15 +++------------ 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index e726ee635..ec108e59f 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -145,7 +145,7 @@ unsafe fn adjust_strength(strength: c_int, var: c_uint) -> c_int { pub(crate) unsafe fn rav1d_cdef_brow( c: &Rav1dContext, tc: *mut Rav1dTaskContext, - p: *const *mut BD::Pixel, + p: &[*mut BD::Pixel; 3], lflvl: *const Av1Filter, by_start: c_int, by_end: c_int, @@ -161,7 +161,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( } else { 0 })) as CdefEdgeFlags; - let mut ptrs: [*mut BD::Pixel; 3] = [*p.offset(0), *p.offset(1), *p.offset(2)]; + let mut ptrs: [*mut BD::Pixel; 3] = *p; let sbsz = 16; let sb64w = (*f).sb128w << 1; let frame_hdr = &***(*f).frame_hdr.as_ref().unwrap(); diff --git a/src/recon.rs b/src/recon.rs index f82e3a1aa..085283c53 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -4622,7 +4622,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_cdef( if sby != 0 { let ss_ver = ((*f).cur.p.layout as c_uint == Rav1dPixelLayout::I420 as c_int as c_uint) as c_int; - let mut p_up: [*mut BD::Pixel; 3] = [ + let p_up: [*mut BD::Pixel; 3] = [ (p[0]).offset(-((8 * BD::pxstride((*f).cur.stride[0] as usize) as isize) as isize)), (p[1]).offset( -((8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver) as isize), @@ -4631,20 +4631,11 @@ pub(crate) unsafe fn rav1d_filter_sbrow_cdef( -((8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver) as isize), ), ]; - rav1d_cdef_brow::( - c, - tc, - p_up.as_mut_ptr(), - prev_mask, - start - 2, - start, - 1 as c_int, - sby, - ); + rav1d_cdef_brow::(c, tc, &p_up, prev_mask, start - 2, start, 1 as c_int, sby); } let n_blks = sbsz - 2 * ((sby + 1) < (*f).sbh) as c_int; let end = cmp::min(start + n_blks, (*f).bh); - rav1d_cdef_brow::(c, tc, p.as_ptr(), mask, start, end, 0 as c_int, sby); + rav1d_cdef_brow::(c, tc, &p, mask, start, end, 0 as c_int, sby); } pub(crate) unsafe fn rav1d_filter_sbrow_resize( From ca0a62e97d01627df1c411a8ec5cc41d42013f39 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 23:13:01 +0100 Subject: [PATCH 07/23] pass tc as mutable reference --- src/cdef_apply.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index ec108e59f..e915f31e5 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -144,7 +144,7 @@ unsafe fn adjust_strength(strength: c_int, var: c_uint) -> c_int { pub(crate) unsafe fn rav1d_cdef_brow( c: &Rav1dContext, - tc: *mut Rav1dTaskContext, + tc: &mut Rav1dTaskContext, p: &[*mut BD::Pixel; 3], lflvl: *const Av1Filter, by_start: c_int, @@ -152,7 +152,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( sbrow_start: c_int, sby: c_int, ) { - let f: *mut Rav1dFrameContext = (*tc).f as *mut Rav1dFrameContext; + let f: *mut Rav1dFrameContext = tc.f as *mut Rav1dFrameContext; let bitdepth_min_8 = if 16 == 8 { 0 } else { (*f).cur.p.bpc - 8 }; let dsp: *const Rav1dDSPContext = (*f).dsp; let mut edges: CdefEdgeFlags = (CDEF_HAVE_BOTTOM as c_int @@ -181,7 +181,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( let uv_stride: ptrdiff_t = BD::pxstride((*f).cur.stride[1] as usize) as isize; let mut bit = 0; for by in (by_start..by_end).step_by(2) { - let tf = (*tc).top_pre_cdef_toggle; + let tf = tc.top_pre_cdef_toggle; let by_idx = (by & 30) >> 1; if by + 2 >= (*f).bh { edges = ::core::mem::transmute::( @@ -518,7 +518,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( (ptrs[1]).offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); ptrs[2] = (ptrs[2]).offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); - (*tc).top_pre_cdef_toggle ^= 1 as c_int; + tc.top_pre_cdef_toggle ^= 1 as c_int; edges = ::core::mem::transmute::( edges as c_uint | CDEF_HAVE_TOP as c_int as c_uint, ); From a10f5cbf40f6b6eedb20d44de1a8278cc50a14d7 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 23:15:51 +0100 Subject: [PATCH 08/23] pass stride as array reference --- src/cdef_apply.rs | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index e915f31e5..607f6b057 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -25,10 +25,10 @@ pub const BACKUP_2X8_Y: Backup2x8Flags = 1; unsafe fn backup2lines( dst: &[*mut BD::Pixel], src: &[*mut BD::Pixel; 3], - stride: *const ptrdiff_t, + stride: &[ptrdiff_t; 2], layout: Rav1dPixelLayout, ) { - let y_stride: ptrdiff_t = BD::pxstride(*stride.offset(0) as usize) as isize; + let y_stride: ptrdiff_t = BD::pxstride(stride[0] as usize) as isize; if y_stride < 0 { let len = (-2 * y_stride) as usize; BD::pixel_copy( @@ -46,7 +46,7 @@ unsafe fn backup2lines( } if layout != Rav1dPixelLayout::I400 { - let uv_stride: ptrdiff_t = BD::pxstride(*stride.offset(1) as usize) as isize; + let uv_stride: ptrdiff_t = BD::pxstride(stride[1] as usize) as isize; if uv_stride < 0 { let uv_off = if layout == Rav1dPixelLayout::I420 { 3 @@ -90,7 +90,7 @@ unsafe fn backup2lines( unsafe fn backup2x8( dst: &mut [[[BD::Pixel; 2]; 8]; 3], src: &[*mut BD::Pixel; 3], - src_stride: *const ptrdiff_t, + src_stride: &[ptrdiff_t; 2], mut x_off: c_int, layout: Rav1dPixelLayout, flag: Backup2x8Flags, @@ -103,7 +103,7 @@ unsafe fn backup2x8( slice::from_raw_parts(&mut *src[0].offset(y_off + x_off as isize - 2), 2), 2, ); - y_off += BD::pxstride(*src_stride.offset(0) as usize) as isize; + y_off += BD::pxstride(src_stride[0] as usize) as isize; } } if layout == Rav1dPixelLayout::I400 || flag & BACKUP_2X8_UV == 0 { @@ -124,7 +124,7 @@ unsafe fn backup2x8( slice::from_raw_parts(src[2].offset(y_off + x_off as isize - 2), 2), 2, ); - y_off += BD::pxstride(*src_stride.offset(1) as usize) as isize; + y_off += BD::pxstride(src_stride[1] as usize) as isize; } } @@ -199,12 +199,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( ((*f).lf.cdef_line[(tf == 0) as c_int as usize][2] as *mut BD::Pixel) .offset(((have_tt * sby * 8) as isize * uv_stride) as isize), ]; - backup2lines::( - &cdef_top_bak, - &ptrs, - ((*f).cur.stride).as_mut_ptr() as *const ptrdiff_t, - layout, - ); + backup2lines::(&cdef_top_bak, &ptrs, &(*f).cur.stride, layout); } let mut lr_bak: Align16<[[[[BD::Pixel; 2]; 8]; 3]; 2]> = Align16([[[[0.into(); 2]; 8]; 3]; 2]); @@ -283,7 +278,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( backup2x8::( &mut lr_bak[bit as usize], &bptrs, - ((*f).cur.stride).as_mut_ptr() as *const ptrdiff_t, + &(*f).cur.stride, 0 as c_int, layout, do_left as Backup2x8Flags, @@ -293,7 +288,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( backup2x8::( &mut lr_bak[(bit == 0) as usize], &bptrs, - ((*f).cur.stride).as_mut_ptr() as *const ptrdiff_t, + &(*f).cur.stride, 8 as c_int, layout, flag, From 650a1dc6b63eb4a7fb7a2b25c367fca09a446188 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 23:24:05 +0100 Subject: [PATCH 09/23] cleanup state machine control flow --- src/cdef_apply.rs | 76 ++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 607f6b057..f68262e6a 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -203,7 +203,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( } let mut lr_bak: Align16<[[[[BD::Pixel; 2]; 8]; 3]; 2]> = Align16([[[[0.into(); 2]; 8]; 3]; 2]); - let mut iptrs: [*mut BD::Pixel; 3] = [ptrs[0], ptrs[1], ptrs[2]]; + let mut iptrs: [*mut BD::Pixel; 3] = ptrs; edges = ::core::mem::transmute::( edges as c_uint & !(CDEF_HAVE_LEFT as c_int) as c_uint, ); @@ -257,7 +257,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( let mut top: *const BD::Pixel; let mut bot: *const BD::Pixel; let mut offset: ptrdiff_t; - let current_block_84: u64; + let st_y: bool; if bx + 2 >= (*f).bw { edges = ::core::mem::transmute::( edges as c_uint & !(CDEF_HAVE_RIGHT as c_int) as c_uint, @@ -307,7 +307,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( top = 0 as *const BD::Pixel; bot = 0 as *const BD::Pixel; if have_tt == 0 { - current_block_84 = 17728966195399430138; + st_y = true; } else if sbrow_start != 0 && by == by_start { if resize != 0 { offset = ((sby - 1) * 4) as isize * y_stride + (bx * 4) as isize; @@ -322,7 +322,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( .offset(offset as isize); } bot = (bptrs[0]).offset((8 * y_stride) as isize); - current_block_84 = 17075014677070940716; + st_y = false; } else if sbrow_start == 0 && by + 2 >= by_end { top = &mut *((*(*((*f).lf.cdef_line).as_mut_ptr().offset(tf as isize)) .as_mut_ptr() @@ -343,26 +343,21 @@ pub(crate) unsafe fn rav1d_cdef_brow( as *mut BD::Pixel) .offset(offset as isize); } - current_block_84 = 17075014677070940716; + st_y = false; } else { - current_block_84 = 17728966195399430138; + st_y = true; } - match current_block_84 { - 17728966195399430138 => { - offset = (sby * 4) as isize * y_stride; - top = &mut *((*(*((*f).lf.cdef_line) - .as_mut_ptr() - .offset(tf as isize)) + + if st_y { + offset = (sby * 4) as isize * y_stride; + top = &mut *((*(*((*f).lf.cdef_line).as_mut_ptr().offset(tf as isize)) .as_mut_ptr() .offset(0)) - as *mut BD::Pixel) - .offset( - (have_tt as isize * offset + (bx * 4) as isize) as isize, - ); - bot = (bptrs[0]).offset((8 * y_stride) as isize); - } - _ => {} + as *mut BD::Pixel) + .offset((have_tt as isize * offset + (bx * 4) as isize) as isize); + bot = (bptrs[0]).offset((8 * y_stride) as isize); } + if y_pri_lvl != 0 { let adj_y_pri_lvl = adjust_strength(y_pri_lvl, variance); if adj_y_pri_lvl != 0 || y_sec_lvl != 0 { @@ -405,9 +400,9 @@ pub(crate) unsafe fn rav1d_cdef_brow( 0 }; for pl in 1..=2 { - let current_block_77: u64; + let st_uv: bool; if have_tt == 0 { - current_block_77 = 5687667889785024198; + st_uv = true; } else if sbrow_start != 0 && by == by_start { if resize != 0 { offset = ((sby - 1) * 4) as isize * uv_stride @@ -426,7 +421,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( } bot = (bptrs[pl]) .offset(((8 >> ss_ver) as isize * uv_stride) as isize); - current_block_77 = 6540614962658479183; + st_uv = false; } else if sbrow_start == 0 && by + 2 >= by_end { let top_offset: ptrdiff_t = (sby * 8) as isize * uv_stride + (bx * 4 >> ss_hor) as isize; @@ -452,29 +447,28 @@ pub(crate) unsafe fn rav1d_cdef_brow( as *mut BD::Pixel) .offset(offset as isize); } - current_block_77 = 6540614962658479183; + st_uv = false; } else { - current_block_77 = 5687667889785024198; + st_uv = true; } - match current_block_77 { - 5687667889785024198 => { - let offset_0: ptrdiff_t = (sby * 8) as isize * uv_stride; - top = &mut *((*(*((*f).lf.cdef_line) - .as_mut_ptr() - .offset(tf as isize)) + + if st_uv { + let offset_0: ptrdiff_t = (sby * 8) as isize * uv_stride; + top = &mut *((*(*((*f).lf.cdef_line) .as_mut_ptr() - .add(pl)) - as *mut BD::Pixel) - .offset( - (have_tt as isize * offset_0 - + (bx * 4 >> ss_hor) as isize) - as isize, - ); - bot = (bptrs[pl]) - .offset(((8 >> ss_ver) as isize * uv_stride) as isize); - } - _ => {} + .offset(tf as isize)) + .as_mut_ptr() + .add(pl)) + as *mut BD::Pixel) + .offset( + (have_tt as isize * offset_0 + + (bx * 4 >> ss_hor) as isize) + as isize, + ); + bot = (bptrs[pl]) + .offset(((8 >> ss_ver) as isize * uv_stride) as isize); } + (*dsp).cdef.fb[uv_idx as usize]( bptrs[pl].cast(), (*f).cur.stride[1], From bf7a8fd95c31aa03778978477383e970caee3919 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 6 Feb 2024 23:30:14 +0100 Subject: [PATCH 10/23] rename static --- src/cdef_apply.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index f68262e6a..384dd0bd9 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -171,8 +171,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( let ss_ver = (layout == Rav1dPixelLayout::I420) as c_int; let ss_hor = (layout != Rav1dPixelLayout::I444) as c_int; - static uv_dirs: [[u8; 8]; 2] = [[0, 1, 2, 3, 4, 5, 6, 7], [7, 0, 2, 4, 5, 6, 6, 6]]; - let uv_dir: &[u8; 8] = &uv_dirs[(layout == Rav1dPixelLayout::I422) as usize]; + static UV_DIRS: [[u8; 8]; 2] = [[0, 1, 2, 3, 4, 5, 6, 7], [7, 0, 2, 4, 5, 6, 6, 6]]; + let uv_dir: &[u8; 8] = &UV_DIRS[(layout == Rav1dPixelLayout::I422) as usize]; let have_tt = (c.tc.len() > 1) as c_int; let sb128 = (*f).seq_hdr.as_ref().unwrap().sb128; From b805afc28ab799ed2bdd36ba2d2dde261e2acc86 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 7 Feb 2024 20:15:42 +0100 Subject: [PATCH 11/23] remove casts --- src/cdef_apply.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 384dd0bd9..d149aa8d5 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -268,13 +268,12 @@ pub(crate) unsafe fn rav1d_cdef_brow( last_skip = 1 as c_int; } else { do_left = (if last_skip != 0 { - flag as c_uint + flag } else { - (prev_flag as c_uint ^ flag as c_uint) & flag as c_uint + (prev_flag ^ flag) & flag }) as c_int; prev_flag = flag; - if do_left != 0 && edges as c_uint & CDEF_HAVE_LEFT as c_int as c_uint != 0 - { + if do_left != 0 && edges & CDEF_HAVE_LEFT != 0 { backup2x8::( &mut lr_bak[bit as usize], &bptrs, @@ -313,13 +312,13 @@ pub(crate) unsafe fn rav1d_cdef_brow( offset = ((sby - 1) * 4) as isize * y_stride + (bx * 4) as isize; top = &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().offset(0)) as *mut BD::Pixel) - .offset(offset as isize); + .offset(offset); } else { offset = (sby * ((4 as c_int) << sb128) - 4) as isize * y_stride + (bx * 4) as isize; top = &mut *((*((*f).lf.lr_lpf_line).as_mut_ptr().offset(0)) as *mut BD::Pixel) - .offset(offset as isize); + .offset(offset); } bot = (bptrs[0]).offset((8 * y_stride) as isize); st_y = false; @@ -335,13 +334,13 @@ pub(crate) unsafe fn rav1d_cdef_brow( offset = (sby * 4 + 2) as isize * y_stride + (bx * 4) as isize; bot = &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().offset(0)) as *mut BD::Pixel) - .offset(offset as isize); + .offset(offset); } else { let line = sby * ((4 as c_int) << sb128) + 4 * sb128 + 2; offset = line as isize * y_stride + (bx * 4) as isize; bot = &mut *((*((*f).lf.lr_lpf_line).as_mut_ptr().offset(0)) as *mut BD::Pixel) - .offset(offset as isize); + .offset(offset); } st_y = false; } else { From a36d43e716e2d56855b6dbb11ee0709c123f98b1 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 7 Feb 2024 20:25:51 +0100 Subject: [PATCH 12/23] clean up top & bot assignments --- src/cdef_apply.rs | 95 +++++++++++++++++------------------------------ 1 file changed, 34 insertions(+), 61 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index d149aa8d5..267a6b922 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -310,37 +310,25 @@ pub(crate) unsafe fn rav1d_cdef_brow( } else if sbrow_start != 0 && by == by_start { if resize != 0 { offset = ((sby - 1) * 4) as isize * y_stride + (bx * 4) as isize; - top = &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().offset(0)) - as *mut BD::Pixel) - .offset(offset); + top = (*f).lf.cdef_lpf_line[0].cast::().offset(offset); } else { offset = (sby * ((4 as c_int) << sb128) - 4) as isize * y_stride + (bx * 4) as isize; - top = &mut *((*((*f).lf.lr_lpf_line).as_mut_ptr().offset(0)) - as *mut BD::Pixel) - .offset(offset); + top = (*f).lf.lr_lpf_line[0].cast::().offset(offset); } - bot = (bptrs[0]).offset((8 * y_stride) as isize); + bot = bptrs[0].offset(8 * y_stride as isize); st_y = false; } else if sbrow_start == 0 && by + 2 >= by_end { - top = &mut *((*(*((*f).lf.cdef_line).as_mut_ptr().offset(tf as isize)) - .as_mut_ptr() - .offset(0)) - as *mut BD::Pixel) - .offset( - ((sby * 4) as isize * y_stride + (bx * 4) as isize) as isize, - ); + top = (*f).lf.cdef_line[tf as usize][0] + .cast::() + .offset((sby * 4) as isize * y_stride + (bx * 4) as isize); if resize != 0 { offset = (sby * 4 + 2) as isize * y_stride + (bx * 4) as isize; - bot = &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().offset(0)) - as *mut BD::Pixel) - .offset(offset); + bot = (*f).lf.cdef_lpf_line[0].cast::().offset(offset); } else { let line = sby * ((4 as c_int) << sb128) + 4 * sb128 + 2; offset = line as isize * y_stride + (bx * 4) as isize; - bot = &mut *((*((*f).lf.lr_lpf_line).as_mut_ptr().offset(0)) - as *mut BD::Pixel) - .offset(offset); + bot = (*f).lf.lr_lpf_line[0].cast::().offset(offset); } st_y = false; } else { @@ -349,12 +337,10 @@ pub(crate) unsafe fn rav1d_cdef_brow( if st_y { offset = (sby * 4) as isize * y_stride; - top = &mut *((*(*((*f).lf.cdef_line).as_mut_ptr().offset(tf as isize)) - .as_mut_ptr() - .offset(0)) - as *mut BD::Pixel) - .offset((have_tt as isize * offset + (bx * 4) as isize) as isize); - bot = (bptrs[0]).offset((8 * y_stride) as isize); + top = (*f).lf.cdef_line[tf as usize][0] + .cast::() + .offset(have_tt as isize * offset + (bx * 4) as isize); + bot = bptrs[0].offset(8 * y_stride as isize); } if y_pri_lvl != 0 { @@ -406,45 +392,38 @@ pub(crate) unsafe fn rav1d_cdef_brow( if resize != 0 { offset = ((sby - 1) * 4) as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - top = - &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().add(pl)) - as *mut BD::Pixel) - .offset(offset as isize); + top = (*f).lf.cdef_lpf_line[pl] + .cast::() + .offset(offset); } else { let line_0 = sby * ((4 as c_int) << sb128) - 4; offset = line_0 as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - top = &mut *((*((*f).lf.lr_lpf_line).as_mut_ptr().add(pl)) - as *mut BD::Pixel) - .offset(offset as isize); + top = (*f).lf.lr_lpf_line[pl] + .cast::() + .offset(offset); } - bot = (bptrs[pl]) - .offset(((8 >> ss_ver) as isize * uv_stride) as isize); + bot = bptrs[pl].offset(((8 >> ss_ver) * uv_stride) as isize); st_uv = false; } else if sbrow_start == 0 && by + 2 >= by_end { let top_offset: ptrdiff_t = (sby * 8) as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - top = &mut *((*(*((*f).lf.cdef_line) - .as_mut_ptr() - .offset(tf as isize)) - .as_mut_ptr() - .add(pl)) - as *mut BD::Pixel) - .offset(top_offset as isize); + top = (*f).lf.cdef_line[tf as usize][pl] + .cast::() + .offset(top_offset); if resize != 0 { offset = (sby * 4 + 2) as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - bot = - &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().add(pl)) - as *mut BD::Pixel) - .offset(offset as isize); + bot = (*f).lf.cdef_lpf_line[pl] + .cast::() + .offset(offset); } else { let line_1 = sby * ((4 as c_int) << sb128) + 4 * sb128 + 2; offset = line_1 as isize * uv_stride + (bx * 4 >> ss_hor) as isize; - bot = &mut *((*((*f).lf.lr_lpf_line).as_mut_ptr().add(pl)) - as *mut BD::Pixel) - .offset(offset as isize); + bot = (*f).lf.lr_lpf_line[pl] + .cast::() + .offset(offset); } st_uv = false; } else { @@ -452,20 +431,14 @@ pub(crate) unsafe fn rav1d_cdef_brow( } if st_uv { - let offset_0: ptrdiff_t = (sby * 8) as isize * uv_stride; - top = &mut *((*(*((*f).lf.cdef_line) - .as_mut_ptr() - .offset(tf as isize)) - .as_mut_ptr() - .add(pl)) - as *mut BD::Pixel) + let offset_0 = (sby * 8) as isize * uv_stride; + top = (*f).lf.cdef_line[tf as usize][pl] + .cast::() .offset( - (have_tt as isize * offset_0 - + (bx * 4 >> ss_hor) as isize) - as isize, + have_tt as isize * offset_0 + + (bx * 4 >> ss_hor) as isize, ); - bot = (bptrs[pl]) - .offset(((8 >> ss_ver) as isize * uv_stride) as isize); + bot = bptrs[pl].offset((8 >> ss_ver) * uv_stride); } (*dsp).cdef.fb[uv_idx as usize]( From 3c62f20b1729e8b1a225f43521b148e2f4f4f766 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 7 Feb 2024 20:46:03 +0100 Subject: [PATCH 13/23] clean up array updates --- src/cdef_apply.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 267a6b922..d4de50ab9 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -459,26 +459,24 @@ pub(crate) unsafe fn rav1d_cdef_brow( bit ^= 1 as c_int; last_skip = 0 as c_int; } - bptrs[0] = (bptrs[0]).offset(8); - bptrs[1] = (bptrs[1]).offset((8 >> ss_hor) as isize); - bptrs[2] = (bptrs[2]).offset((8 >> ss_hor) as isize); + bptrs[0] = bptrs[0].add(8); + bptrs[1] = bptrs[1].add(8 >> ss_hor); + bptrs[2] = bptrs[2].add(8 >> ss_hor); edges = ::core::mem::transmute::( edges as c_uint | CDEF_HAVE_LEFT as c_int as c_uint, ); } } - iptrs[0] = (iptrs[0]).offset((sbsz * 4) as isize); - iptrs[1] = (iptrs[1]).offset((sbsz * 4 >> ss_hor) as isize); - iptrs[2] = (iptrs[2]).offset((sbsz * 4 >> ss_hor) as isize); + iptrs[0] = iptrs[0].add(sbsz as usize * 4); + iptrs[1] = iptrs[1].add(sbsz as usize * 4 >> ss_hor); + iptrs[2] = iptrs[2].add(sbsz as usize * 4 >> ss_hor); edges = ::core::mem::transmute::( edges as c_uint | CDEF_HAVE_LEFT as c_int as c_uint, ); } - ptrs[0] = (ptrs[0]).offset(8 * BD::pxstride((*f).cur.stride[0] as usize) as isize); - ptrs[1] = - (ptrs[1]).offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); - ptrs[2] = - (ptrs[2]).offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); + ptrs[0] = ptrs[0].offset(8 * BD::pxstride((*f).cur.stride[0] as usize) as isize); + ptrs[1] = ptrs[1].offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); + ptrs[2] = ptrs[2].offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); tc.top_pre_cdef_toggle ^= 1 as c_int; edges = ::core::mem::transmute::( edges as c_uint | CDEF_HAVE_TOP as c_int as c_uint, From 73226f3f13a480a9603661f0306f5c8a08fed031 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 7 Feb 2024 20:49:19 +0100 Subject: [PATCH 14/23] remove casts --- src/cdef_apply.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index d4de50ab9..d443b93ba 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -192,12 +192,12 @@ pub(crate) unsafe fn rav1d_cdef_brow( && edges as c_uint & CDEF_HAVE_BOTTOM as c_int as c_uint != 0 { let cdef_top_bak: [*mut BD::Pixel; 3] = [ - ((*f).lf.cdef_line[(tf == 0) as c_int as usize][0] as *mut BD::Pixel) - .offset(((have_tt * sby * 4) as isize * y_stride) as isize), - ((*f).lf.cdef_line[(tf == 0) as c_int as usize][1] as *mut BD::Pixel) - .offset(((have_tt * sby * 8) as isize * uv_stride) as isize), - ((*f).lf.cdef_line[(tf == 0) as c_int as usize][2] as *mut BD::Pixel) - .offset(((have_tt * sby * 8) as isize * uv_stride) as isize), + ((*f).lf.cdef_line[(tf == 0) as usize][0] as *mut BD::Pixel) + .offset((have_tt * sby * 4) as isize * y_stride), + ((*f).lf.cdef_line[(tf == 0) as usize][1] as *mut BD::Pixel) + .offset((have_tt * sby * 8) as isize * uv_stride), + ((*f).lf.cdef_line[(tf == 0) as usize][2] as *mut BD::Pixel) + .offset((have_tt * sby * 8) as isize * uv_stride), ]; backup2lines::(&cdef_top_bak, &ptrs, &(*f).cur.stride, layout); } @@ -265,7 +265,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( } let bx_mask: u32 = (3 as c_uint) << (bx & 30); if noskip_mask & bx_mask == 0 { - last_skip = 1 as c_int; + last_skip = 1; } else { do_left = (if last_skip != 0 { flag From ef5f47004aeac58d0d8a25e6c7909754eecae564 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 7 Feb 2024 20:52:21 +0100 Subject: [PATCH 15/23] make last_skip a bool --- src/cdef_apply.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index d443b93ba..c4d45914c 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -211,7 +211,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( edges as c_uint | CDEF_HAVE_RIGHT as c_int as c_uint, ); let mut prev_flag: Backup2x8Flags = 0 as Backup2x8Flags; - let mut last_skip = 1; + let mut last_skip = true; for sbx in 0..sb64w { let noskip_row: *const [u16; 2]; let noskip_mask: c_uint; @@ -230,7 +230,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( || frame_hdr.cdef.y_strength[cdef_idx as usize] == 0 && frame_hdr.cdef.uv_strength[cdef_idx as usize] == 0 { - last_skip = 1 as c_int; + last_skip = true; } else { noskip_row = &*((*lflvl.offset(sb128x as isize)).noskip_mask) .as_ptr() @@ -265,9 +265,9 @@ pub(crate) unsafe fn rav1d_cdef_brow( } let bx_mask: u32 = (3 as c_uint) << (bx & 30); if noskip_mask & bx_mask == 0 { - last_skip = 1; + last_skip = true; } else { - do_left = (if last_skip != 0 { + do_left = (if last_skip { flag } else { (prev_flag ^ flag) & flag @@ -457,7 +457,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( } } bit ^= 1 as c_int; - last_skip = 0 as c_int; + last_skip = false; } bptrs[0] = bptrs[0].add(8); bptrs[1] = bptrs[1].add(8 >> ss_hor); From dc594df1796594d7777b177f45ba6839046c6cb6 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 7 Feb 2024 21:23:43 +0100 Subject: [PATCH 16/23] bitflags! for CdefEdgeFlags --- src/cdef.rs | 36 ++++++++++++++++++------------- src/cdef_apply.rs | 54 ++++++++++++++++++----------------------------- 2 files changed, 41 insertions(+), 49 deletions(-) diff --git a/src/cdef.rs b/src/cdef.rs index 5c810ba27..4fda67a43 100644 --- a/src/cdef.rs +++ b/src/cdef.rs @@ -6,6 +6,7 @@ use crate::include::common::intops::apply_sign; use crate::include::common::intops::iclip; use crate::include::common::intops::ulog2; use crate::src::tables::dav1d_cdef_directions; +use bitflags::bitflags; use libc::ptrdiff_t; use std::cmp; use std::ffi::c_int; @@ -20,11 +21,16 @@ use crate::src::cpu::{rav1d_get_cpu_flags, CpuFlags}; #[cfg(feature = "asm")] use crate::include::common::bitdepth::BPC; -pub type CdefEdgeFlags = c_uint; -pub const CDEF_HAVE_BOTTOM: CdefEdgeFlags = 8; -pub const CDEF_HAVE_TOP: CdefEdgeFlags = 4; -pub const CDEF_HAVE_RIGHT: CdefEdgeFlags = 2; -pub const CDEF_HAVE_LEFT: CdefEdgeFlags = 1; +bitflags! { + #[repr(transparent)] + #[derive(Clone, Copy)] + pub struct CdefEdgeFlags: u32 { + const CDEF_HAVE_BOTTOM = 1 << 3; + const CDEF_HAVE_TOP = 1 << 2; + const CDEF_HAVE_RIGHT = 1 << 1; + const CDEF_HAVE_LEFT = 1 << 0; + } +} pub type cdef_fn = unsafe extern "C" fn( *mut DynPixel, @@ -574,7 +580,7 @@ unsafe fn padding( let mut x_end = w + 2; let mut y_start = -(2 as c_int); let mut y_end = h + 2; - if edges as c_uint & CDEF_HAVE_TOP as c_int as c_uint == 0 { + if !edges.contains(CdefEdgeFlags::CDEF_HAVE_TOP) { fill( tmp.offset(-2).offset(-((2 * tmp_stride) as isize)), tmp_stride, @@ -583,7 +589,7 @@ unsafe fn padding( ); y_start = 0 as c_int; } - if edges as c_uint & CDEF_HAVE_BOTTOM as c_int as c_uint == 0 { + if !edges.contains(CdefEdgeFlags::CDEF_HAVE_BOTTOM) { fill( tmp.offset((h as isize * tmp_stride) as isize) .offset(-(2 as c_int as isize)), @@ -593,7 +599,7 @@ unsafe fn padding( ); y_end -= 2 as c_int; } - if edges as c_uint & CDEF_HAVE_LEFT as c_int as c_uint == 0 { + if !edges.contains(CdefEdgeFlags::CDEF_HAVE_LEFT) { fill( tmp.offset((y_start as isize * tmp_stride) as isize) .offset(-(2 as c_int as isize)), @@ -603,7 +609,7 @@ unsafe fn padding( ); x_start = 0 as c_int; } - if edges as c_uint & CDEF_HAVE_RIGHT as c_int as c_uint == 0 { + if !edges.contains(CdefEdgeFlags::CDEF_HAVE_RIGHT) { fill( tmp.offset((y_start as isize * tmp_stride) as isize) .offset(w as isize), @@ -1147,7 +1153,7 @@ unsafe extern "C" fn cdef_filter_8x8_neon_erased( dir, damping, 8, - edges as usize, + edges.bits() as usize, ); } BPC::BPC16 => { @@ -1161,7 +1167,7 @@ unsafe extern "C" fn cdef_filter_8x8_neon_erased( dir, damping, 8, - edges as usize, + edges.bits() as usize, bitdepth_max, ); } @@ -1197,7 +1203,7 @@ unsafe extern "C" fn cdef_filter_4x8_neon_erased( dir, damping, 8, - edges as usize, + edges.bits() as usize, ); } BPC::BPC16 => { @@ -1211,7 +1217,7 @@ unsafe extern "C" fn cdef_filter_4x8_neon_erased( dir, damping, 8, - edges as usize, + edges.bits() as usize, bitdepth_max, ); } @@ -1247,7 +1253,7 @@ unsafe extern "C" fn cdef_filter_4x4_neon_erased( dir, damping, 4, - edges as usize, + edges.bits() as usize, ); } BPC::BPC16 => { @@ -1261,7 +1267,7 @@ unsafe extern "C" fn cdef_filter_4x4_neon_erased( dir, damping, 4, - edges as usize, + edges.bits() as usize, bitdepth_max, ); } diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index c4d45914c..2f21aa079 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -3,10 +3,6 @@ use crate::include::common::intops::ulog2; use crate::include::dav1d::headers::Rav1dPixelLayout; use crate::src::align::Align16; use crate::src::cdef::CdefEdgeFlags; -use crate::src::cdef::CDEF_HAVE_BOTTOM; -use crate::src::cdef::CDEF_HAVE_LEFT; -use crate::src::cdef::CDEF_HAVE_RIGHT; -use crate::src::cdef::CDEF_HAVE_TOP; use crate::src::internal::Rav1dContext; use crate::src::internal::Rav1dDSPContext; use crate::src::internal::Rav1dFrameContext; @@ -18,6 +14,11 @@ use std::ffi::c_int; use std::ffi::c_uint; use std::slice; +const CDEF_HAVE_BOTTOM: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_BOTTOM; +const CDEF_HAVE_LEFT: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_LEFT; +const CDEF_HAVE_RIGHT: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_RIGHT; +const CDEF_HAVE_TOP: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_TOP; + pub type Backup2x8Flags = c_uint; pub const BACKUP_2X8_UV: Backup2x8Flags = 2; pub const BACKUP_2X8_Y: Backup2x8Flags = 1; @@ -155,12 +156,11 @@ pub(crate) unsafe fn rav1d_cdef_brow( let f: *mut Rav1dFrameContext = tc.f as *mut Rav1dFrameContext; let bitdepth_min_8 = if 16 == 8 { 0 } else { (*f).cur.p.bpc - 8 }; let dsp: *const Rav1dDSPContext = (*f).dsp; - let mut edges: CdefEdgeFlags = (CDEF_HAVE_BOTTOM as c_int - | (if by_start > 0 { - CDEF_HAVE_TOP as c_int - } else { - 0 - })) as CdefEdgeFlags; + let mut edges: CdefEdgeFlags = if by_start > 0 { + CDEF_HAVE_BOTTOM | CDEF_HAVE_TOP + } else { + CDEF_HAVE_BOTTOM + }; let mut ptrs: [*mut BD::Pixel; 3] = *p; let sbsz = 16; let sb64w = (*f).sb128w << 1; @@ -184,12 +184,10 @@ pub(crate) unsafe fn rav1d_cdef_brow( let tf = tc.top_pre_cdef_toggle; let by_idx = (by & 30) >> 1; if by + 2 >= (*f).bh { - edges = ::core::mem::transmute::( - edges as c_uint & !(CDEF_HAVE_BOTTOM as c_int) as c_uint, - ); + edges.remove(CDEF_HAVE_BOTTOM); } if (have_tt == 0 || sbrow_start != 0 || (by + 2) < by_end) - && edges as c_uint & CDEF_HAVE_BOTTOM as c_int as c_uint != 0 + && edges.contains(CDEF_HAVE_BOTTOM) { let cdef_top_bak: [*mut BD::Pixel; 3] = [ ((*f).lf.cdef_line[(tf == 0) as usize][0] as *mut BD::Pixel) @@ -204,12 +202,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( let mut lr_bak: Align16<[[[[BD::Pixel; 2]; 8]; 3]; 2]> = Align16([[[[0.into(); 2]; 8]; 3]; 2]); let mut iptrs: [*mut BD::Pixel; 3] = ptrs; - edges = ::core::mem::transmute::( - edges as c_uint & !(CDEF_HAVE_LEFT as c_int) as c_uint, - ); - edges = ::core::mem::transmute::( - edges as c_uint | CDEF_HAVE_RIGHT as c_int as c_uint, - ); + edges.remove(CDEF_HAVE_LEFT); + edges.insert(CDEF_HAVE_RIGHT); let mut prev_flag: Backup2x8Flags = 0 as Backup2x8Flags; let mut last_skip = true; for sbx in 0..sb64w { @@ -259,9 +253,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( let mut offset: ptrdiff_t; let st_y: bool; if bx + 2 >= (*f).bw { - edges = ::core::mem::transmute::( - edges as c_uint & !(CDEF_HAVE_RIGHT as c_int) as c_uint, - ); + edges.remove(CDEF_HAVE_RIGHT); } let bx_mask: u32 = (3 as c_uint) << (bx & 30); if noskip_mask & bx_mask == 0 { @@ -273,7 +265,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( (prev_flag ^ flag) & flag }) as c_int; prev_flag = flag; - if do_left != 0 && edges & CDEF_HAVE_LEFT != 0 { + if do_left != 0 && edges.contains(CDEF_HAVE_LEFT) { backup2x8::( &mut lr_bak[bit as usize], &bptrs, @@ -283,7 +275,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( do_left as Backup2x8Flags, ); } - if edges as c_uint & CDEF_HAVE_RIGHT as c_int as c_uint != 0 { + if edges.contains(CDEF_HAVE_RIGHT) { backup2x8::( &mut lr_bak[(bit == 0) as usize], &bptrs, @@ -462,24 +454,18 @@ pub(crate) unsafe fn rav1d_cdef_brow( bptrs[0] = bptrs[0].add(8); bptrs[1] = bptrs[1].add(8 >> ss_hor); bptrs[2] = bptrs[2].add(8 >> ss_hor); - edges = ::core::mem::transmute::( - edges as c_uint | CDEF_HAVE_LEFT as c_int as c_uint, - ); + edges.insert(CDEF_HAVE_LEFT); } } iptrs[0] = iptrs[0].add(sbsz as usize * 4); iptrs[1] = iptrs[1].add(sbsz as usize * 4 >> ss_hor); iptrs[2] = iptrs[2].add(sbsz as usize * 4 >> ss_hor); - edges = ::core::mem::transmute::( - edges as c_uint | CDEF_HAVE_LEFT as c_int as c_uint, - ); + edges.insert(CDEF_HAVE_LEFT); } ptrs[0] = ptrs[0].offset(8 * BD::pxstride((*f).cur.stride[0] as usize) as isize); ptrs[1] = ptrs[1].offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); ptrs[2] = ptrs[2].offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); tc.top_pre_cdef_toggle ^= 1 as c_int; - edges = ::core::mem::transmute::( - edges as c_uint | CDEF_HAVE_TOP as c_int as c_uint, - ); + edges.insert(CDEF_HAVE_TOP); } } From 2739b70e236ad69fa241cc05b637e3771baea40c Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 7 Feb 2024 22:07:33 +0100 Subject: [PATCH 17/23] bitflags! for Backup2x8Flags --- src/cdef_apply.rs | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 2f21aa079..72950eef1 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -8,6 +8,7 @@ use crate::src::internal::Rav1dDSPContext; use crate::src::internal::Rav1dFrameContext; use crate::src::internal::Rav1dTaskContext; use crate::src::lf_mask::Av1Filter; +use bitflags::bitflags; use libc::ptrdiff_t; use std::cmp; use std::ffi::c_int; @@ -19,9 +20,13 @@ const CDEF_HAVE_LEFT: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_LEFT; const CDEF_HAVE_RIGHT: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_RIGHT; const CDEF_HAVE_TOP: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_TOP; -pub type Backup2x8Flags = c_uint; -pub const BACKUP_2X8_UV: Backup2x8Flags = 2; -pub const BACKUP_2X8_Y: Backup2x8Flags = 1; +bitflags! { + #[derive(Clone, Copy)] + struct Backup2x8Flags : u32 { + const BACKUP_2X8_UV = 2; + const BACKUP_2X8_Y = 1; + } +} unsafe fn backup2lines( dst: &[*mut BD::Pixel], @@ -97,7 +102,7 @@ unsafe fn backup2x8( flag: Backup2x8Flags, ) { let mut y_off: ptrdiff_t = 0 as c_int as ptrdiff_t; - if flag & BACKUP_2X8_Y != 0 { + if flag.contains(Backup2x8Flags::BACKUP_2X8_Y) { for y in 0..8 { BD::pixel_copy( &mut dst[0][y], @@ -107,7 +112,7 @@ unsafe fn backup2x8( y_off += BD::pxstride(src_stride[0] as usize) as isize; } } - if layout == Rav1dPixelLayout::I400 || flag & BACKUP_2X8_UV == 0 { + if layout == Rav1dPixelLayout::I400 || !flag.contains(Backup2x8Flags::BACKUP_2X8_UV) { return; } let ss_ver = (layout == Rav1dPixelLayout::I420) as c_int; @@ -204,7 +209,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( let mut iptrs: [*mut BD::Pixel; 3] = ptrs; edges.remove(CDEF_HAVE_LEFT); edges.insert(CDEF_HAVE_RIGHT); - let mut prev_flag: Backup2x8Flags = 0 as Backup2x8Flags; + let mut prev_flag: Backup2x8Flags = Backup2x8Flags::empty(); let mut last_skip = true; for sbx in 0..sb64w { let noskip_row: *const [u16; 2]; @@ -233,7 +238,9 @@ pub(crate) unsafe fn rav1d_cdef_brow( | (*noskip_row.offset(0))[0] as c_uint; y_lvl = frame_hdr.cdef.y_strength[cdef_idx as usize]; uv_lvl = frame_hdr.cdef.uv_strength[cdef_idx as usize]; - flag = ((y_lvl != 0) as c_int + (((uv_lvl != 0) as c_int) << 1)) as Backup2x8Flags; + flag = Backup2x8Flags::from_bits_truncate( + (y_lvl != 0) as u32 + (((uv_lvl != 0) as u32) << 1), + ); y_pri_lvl = (y_lvl >> 2) << bitdepth_min_8; y_sec_lvl = y_lvl & 3; y_sec_lvl += (y_sec_lvl == 3) as c_int; @@ -259,13 +266,13 @@ pub(crate) unsafe fn rav1d_cdef_brow( if noskip_mask & bx_mask == 0 { last_skip = true; } else { - do_left = (if last_skip { + do_left = if last_skip { flag } else { (prev_flag ^ flag) & flag - }) as c_int; + }; prev_flag = flag; - if do_left != 0 && edges.contains(CDEF_HAVE_LEFT) { + if !do_left.is_empty() && edges.contains(CDEF_HAVE_LEFT) { backup2x8::( &mut lr_bak[bit as usize], &bptrs, From 11fb77bcd46a0010c95815d754205bfe16bc91b7 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Thu, 8 Feb 2024 10:14:33 +0100 Subject: [PATCH 18/23] Apply suggestions from code review Co-authored-by: Khyber Sen --- src/cdef_apply.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 72950eef1..2e0951f73 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -1,4 +1,5 @@ use crate::include::common::bitdepth::BitDepth; +use crate::include::common::bitdepth::BPC; use crate::include::common::intops::ulog2; use crate::include::dav1d::headers::Rav1dPixelLayout; use crate::src::align::Align16; @@ -22,9 +23,9 @@ const CDEF_HAVE_TOP: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_TOP; bitflags! { #[derive(Clone, Copy)] - struct Backup2x8Flags : u32 { - const BACKUP_2X8_UV = 2; - const BACKUP_2X8_Y = 1; + struct Backup2x8Flags: u8 { + const BACKUP_2X8_Y = 1 << 0; + const BACKUP_2X8_UV = 1 << 1; } } @@ -159,7 +160,10 @@ pub(crate) unsafe fn rav1d_cdef_brow( sby: c_int, ) { let f: *mut Rav1dFrameContext = tc.f as *mut Rav1dFrameContext; - let bitdepth_min_8 = if 16 == 8 { 0 } else { (*f).cur.p.bpc - 8 }; + let bitdepth_min_8 = match BD::BPC { + BPC::BPC8 => 0, + BPC::BPC16 => (*f).cur.p.bpc - 8, + }; let dsp: *const Rav1dDSPContext = (*f).dsp; let mut edges: CdefEdgeFlags = if by_start > 0 { CDEF_HAVE_BOTTOM | CDEF_HAVE_TOP @@ -239,7 +243,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( y_lvl = frame_hdr.cdef.y_strength[cdef_idx as usize]; uv_lvl = frame_hdr.cdef.uv_strength[cdef_idx as usize]; flag = Backup2x8Flags::from_bits_truncate( - (y_lvl != 0) as u32 + (((uv_lvl != 0) as u32) << 1), + (y_lvl != 0) as u8 + (((uv_lvl != 0) as u8) << 1), ); y_pri_lvl = (y_lvl >> 2) << bitdepth_min_8; y_sec_lvl = y_lvl & 3; From bdc61bce1304d6d59e2a4890d64f43f4b4805e94 Mon Sep 17 00:00:00 2001 From: Folkert Date: Thu, 8 Feb 2024 10:21:30 +0100 Subject: [PATCH 19/23] clean up CdefEdgeFlags definition and use --- src/cdef.rs | 6 +++--- src/cdef_apply.rs | 29 ++++++++++++----------------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/cdef.rs b/src/cdef.rs index 4fda67a43..9f5dda2ee 100644 --- a/src/cdef.rs +++ b/src/cdef.rs @@ -25,10 +25,10 @@ bitflags! { #[repr(transparent)] #[derive(Clone, Copy)] pub struct CdefEdgeFlags: u32 { - const CDEF_HAVE_BOTTOM = 1 << 3; - const CDEF_HAVE_TOP = 1 << 2; - const CDEF_HAVE_RIGHT = 1 << 1; const CDEF_HAVE_LEFT = 1 << 0; + const CDEF_HAVE_RIGHT = 1 << 1; + const CDEF_HAVE_TOP = 1 << 2; + const CDEF_HAVE_BOTTOM = 1 << 3; } } diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 2e0951f73..3c34e04dc 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -16,11 +16,6 @@ use std::ffi::c_int; use std::ffi::c_uint; use std::slice; -const CDEF_HAVE_BOTTOM: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_BOTTOM; -const CDEF_HAVE_LEFT: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_LEFT; -const CDEF_HAVE_RIGHT: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_RIGHT; -const CDEF_HAVE_TOP: CdefEdgeFlags = CdefEdgeFlags::CDEF_HAVE_TOP; - bitflags! { #[derive(Clone, Copy)] struct Backup2x8Flags: u8 { @@ -166,9 +161,9 @@ pub(crate) unsafe fn rav1d_cdef_brow( }; let dsp: *const Rav1dDSPContext = (*f).dsp; let mut edges: CdefEdgeFlags = if by_start > 0 { - CDEF_HAVE_BOTTOM | CDEF_HAVE_TOP + CdefEdgeFlags::CDEF_HAVE_BOTTOM | CdefEdgeFlags::CDEF_HAVE_TOP } else { - CDEF_HAVE_BOTTOM + CdefEdgeFlags::CDEF_HAVE_BOTTOM }; let mut ptrs: [*mut BD::Pixel; 3] = *p; let sbsz = 16; @@ -193,10 +188,10 @@ pub(crate) unsafe fn rav1d_cdef_brow( let tf = tc.top_pre_cdef_toggle; let by_idx = (by & 30) >> 1; if by + 2 >= (*f).bh { - edges.remove(CDEF_HAVE_BOTTOM); + edges.remove(CdefEdgeFlags::CDEF_HAVE_BOTTOM); } if (have_tt == 0 || sbrow_start != 0 || (by + 2) < by_end) - && edges.contains(CDEF_HAVE_BOTTOM) + && edges.contains(CdefEdgeFlags::CDEF_HAVE_BOTTOM) { let cdef_top_bak: [*mut BD::Pixel; 3] = [ ((*f).lf.cdef_line[(tf == 0) as usize][0] as *mut BD::Pixel) @@ -211,8 +206,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( let mut lr_bak: Align16<[[[[BD::Pixel; 2]; 8]; 3]; 2]> = Align16([[[[0.into(); 2]; 8]; 3]; 2]); let mut iptrs: [*mut BD::Pixel; 3] = ptrs; - edges.remove(CDEF_HAVE_LEFT); - edges.insert(CDEF_HAVE_RIGHT); + edges.remove(CdefEdgeFlags::CDEF_HAVE_LEFT); + edges.insert(CdefEdgeFlags::CDEF_HAVE_RIGHT); let mut prev_flag: Backup2x8Flags = Backup2x8Flags::empty(); let mut last_skip = true; for sbx in 0..sb64w { @@ -264,7 +259,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( let mut offset: ptrdiff_t; let st_y: bool; if bx + 2 >= (*f).bw { - edges.remove(CDEF_HAVE_RIGHT); + edges.remove(CdefEdgeFlags::CDEF_HAVE_RIGHT); } let bx_mask: u32 = (3 as c_uint) << (bx & 30); if noskip_mask & bx_mask == 0 { @@ -276,7 +271,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( (prev_flag ^ flag) & flag }; prev_flag = flag; - if !do_left.is_empty() && edges.contains(CDEF_HAVE_LEFT) { + if !do_left.is_empty() && edges.contains(CdefEdgeFlags::CDEF_HAVE_LEFT) { backup2x8::( &mut lr_bak[bit as usize], &bptrs, @@ -286,7 +281,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( do_left as Backup2x8Flags, ); } - if edges.contains(CDEF_HAVE_RIGHT) { + if edges.contains(CdefEdgeFlags::CDEF_HAVE_RIGHT) { backup2x8::( &mut lr_bak[(bit == 0) as usize], &bptrs, @@ -465,18 +460,18 @@ pub(crate) unsafe fn rav1d_cdef_brow( bptrs[0] = bptrs[0].add(8); bptrs[1] = bptrs[1].add(8 >> ss_hor); bptrs[2] = bptrs[2].add(8 >> ss_hor); - edges.insert(CDEF_HAVE_LEFT); + edges.insert(CdefEdgeFlags::CDEF_HAVE_LEFT); } } iptrs[0] = iptrs[0].add(sbsz as usize * 4); iptrs[1] = iptrs[1].add(sbsz as usize * 4 >> ss_hor); iptrs[2] = iptrs[2].add(sbsz as usize * 4 >> ss_hor); - edges.insert(CDEF_HAVE_LEFT); + edges.insert(CdefEdgeFlags::CDEF_HAVE_LEFT); } ptrs[0] = ptrs[0].offset(8 * BD::pxstride((*f).cur.stride[0] as usize) as isize); ptrs[1] = ptrs[1].offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); ptrs[2] = ptrs[2].offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); tc.top_pre_cdef_toggle ^= 1 as c_int; - edges.insert(CDEF_HAVE_TOP); + edges.insert(CdefEdgeFlags::CDEF_HAVE_TOP); } } From 5f467d42a084eee107185abb66eafe0f3dbd01ef Mon Sep 17 00:00:00 2001 From: Folkert Date: Thu, 8 Feb 2024 12:20:01 +0100 Subject: [PATCH 20/23] shorten bitflag constant names --- src/cdef.rs | 16 ++++++++-------- src/cdef_apply.rs | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/cdef.rs b/src/cdef.rs index 9f5dda2ee..3c7b088f4 100644 --- a/src/cdef.rs +++ b/src/cdef.rs @@ -25,10 +25,10 @@ bitflags! { #[repr(transparent)] #[derive(Clone, Copy)] pub struct CdefEdgeFlags: u32 { - const CDEF_HAVE_LEFT = 1 << 0; - const CDEF_HAVE_RIGHT = 1 << 1; - const CDEF_HAVE_TOP = 1 << 2; - const CDEF_HAVE_BOTTOM = 1 << 3; + const HAVE_LEFT = 1 << 0; + const HAVE_RIGHT = 1 << 1; + const HAVE_TOP = 1 << 2; + const HAVE_BOTTOM = 1 << 3; } } @@ -580,7 +580,7 @@ unsafe fn padding( let mut x_end = w + 2; let mut y_start = -(2 as c_int); let mut y_end = h + 2; - if !edges.contains(CdefEdgeFlags::CDEF_HAVE_TOP) { + if !edges.contains(CdefEdgeFlags::HAVE_TOP) { fill( tmp.offset(-2).offset(-((2 * tmp_stride) as isize)), tmp_stride, @@ -589,7 +589,7 @@ unsafe fn padding( ); y_start = 0 as c_int; } - if !edges.contains(CdefEdgeFlags::CDEF_HAVE_BOTTOM) { + if !edges.contains(CdefEdgeFlags::HAVE_BOTTOM) { fill( tmp.offset((h as isize * tmp_stride) as isize) .offset(-(2 as c_int as isize)), @@ -599,7 +599,7 @@ unsafe fn padding( ); y_end -= 2 as c_int; } - if !edges.contains(CdefEdgeFlags::CDEF_HAVE_LEFT) { + if !edges.contains(CdefEdgeFlags::HAVE_LEFT) { fill( tmp.offset((y_start as isize * tmp_stride) as isize) .offset(-(2 as c_int as isize)), @@ -609,7 +609,7 @@ unsafe fn padding( ); x_start = 0 as c_int; } - if !edges.contains(CdefEdgeFlags::CDEF_HAVE_RIGHT) { + if !edges.contains(CdefEdgeFlags::HAVE_RIGHT) { fill( tmp.offset((y_start as isize * tmp_stride) as isize) .offset(w as isize), diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 3c34e04dc..e7c732a08 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -19,8 +19,8 @@ use std::slice; bitflags! { #[derive(Clone, Copy)] struct Backup2x8Flags: u8 { - const BACKUP_2X8_Y = 1 << 0; - const BACKUP_2X8_UV = 1 << 1; + const Y = 1 << 0; + const UV = 1 << 1; } } @@ -98,7 +98,7 @@ unsafe fn backup2x8( flag: Backup2x8Flags, ) { let mut y_off: ptrdiff_t = 0 as c_int as ptrdiff_t; - if flag.contains(Backup2x8Flags::BACKUP_2X8_Y) { + if flag.contains(Backup2x8Flags::Y) { for y in 0..8 { BD::pixel_copy( &mut dst[0][y], @@ -108,7 +108,7 @@ unsafe fn backup2x8( y_off += BD::pxstride(src_stride[0] as usize) as isize; } } - if layout == Rav1dPixelLayout::I400 || !flag.contains(Backup2x8Flags::BACKUP_2X8_UV) { + if layout == Rav1dPixelLayout::I400 || !flag.contains(Backup2x8Flags::UV) { return; } let ss_ver = (layout == Rav1dPixelLayout::I420) as c_int; @@ -161,9 +161,9 @@ pub(crate) unsafe fn rav1d_cdef_brow( }; let dsp: *const Rav1dDSPContext = (*f).dsp; let mut edges: CdefEdgeFlags = if by_start > 0 { - CdefEdgeFlags::CDEF_HAVE_BOTTOM | CdefEdgeFlags::CDEF_HAVE_TOP + CdefEdgeFlags::HAVE_BOTTOM | CdefEdgeFlags::HAVE_TOP } else { - CdefEdgeFlags::CDEF_HAVE_BOTTOM + CdefEdgeFlags::HAVE_BOTTOM }; let mut ptrs: [*mut BD::Pixel; 3] = *p; let sbsz = 16; @@ -188,10 +188,10 @@ pub(crate) unsafe fn rav1d_cdef_brow( let tf = tc.top_pre_cdef_toggle; let by_idx = (by & 30) >> 1; if by + 2 >= (*f).bh { - edges.remove(CdefEdgeFlags::CDEF_HAVE_BOTTOM); + edges.remove(CdefEdgeFlags::HAVE_BOTTOM); } if (have_tt == 0 || sbrow_start != 0 || (by + 2) < by_end) - && edges.contains(CdefEdgeFlags::CDEF_HAVE_BOTTOM) + && edges.contains(CdefEdgeFlags::HAVE_BOTTOM) { let cdef_top_bak: [*mut BD::Pixel; 3] = [ ((*f).lf.cdef_line[(tf == 0) as usize][0] as *mut BD::Pixel) @@ -206,8 +206,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( let mut lr_bak: Align16<[[[[BD::Pixel; 2]; 8]; 3]; 2]> = Align16([[[[0.into(); 2]; 8]; 3]; 2]); let mut iptrs: [*mut BD::Pixel; 3] = ptrs; - edges.remove(CdefEdgeFlags::CDEF_HAVE_LEFT); - edges.insert(CdefEdgeFlags::CDEF_HAVE_RIGHT); + edges.remove(CdefEdgeFlags::HAVE_LEFT); + edges.insert(CdefEdgeFlags::HAVE_RIGHT); let mut prev_flag: Backup2x8Flags = Backup2x8Flags::empty(); let mut last_skip = true; for sbx in 0..sb64w { @@ -259,7 +259,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( let mut offset: ptrdiff_t; let st_y: bool; if bx + 2 >= (*f).bw { - edges.remove(CdefEdgeFlags::CDEF_HAVE_RIGHT); + edges.remove(CdefEdgeFlags::HAVE_RIGHT); } let bx_mask: u32 = (3 as c_uint) << (bx & 30); if noskip_mask & bx_mask == 0 { @@ -271,7 +271,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( (prev_flag ^ flag) & flag }; prev_flag = flag; - if !do_left.is_empty() && edges.contains(CdefEdgeFlags::CDEF_HAVE_LEFT) { + if !do_left.is_empty() && edges.contains(CdefEdgeFlags::HAVE_LEFT) { backup2x8::( &mut lr_bak[bit as usize], &bptrs, @@ -281,7 +281,7 @@ pub(crate) unsafe fn rav1d_cdef_brow( do_left as Backup2x8Flags, ); } - if edges.contains(CdefEdgeFlags::CDEF_HAVE_RIGHT) { + if edges.contains(CdefEdgeFlags::HAVE_RIGHT) { backup2x8::( &mut lr_bak[(bit == 0) as usize], &bptrs, @@ -460,18 +460,18 @@ pub(crate) unsafe fn rav1d_cdef_brow( bptrs[0] = bptrs[0].add(8); bptrs[1] = bptrs[1].add(8 >> ss_hor); bptrs[2] = bptrs[2].add(8 >> ss_hor); - edges.insert(CdefEdgeFlags::CDEF_HAVE_LEFT); + edges.insert(CdefEdgeFlags::HAVE_LEFT); } } iptrs[0] = iptrs[0].add(sbsz as usize * 4); iptrs[1] = iptrs[1].add(sbsz as usize * 4 >> ss_hor); iptrs[2] = iptrs[2].add(sbsz as usize * 4 >> ss_hor); - edges.insert(CdefEdgeFlags::CDEF_HAVE_LEFT); + edges.insert(CdefEdgeFlags::HAVE_LEFT); } ptrs[0] = ptrs[0].offset(8 * BD::pxstride((*f).cur.stride[0] as usize) as isize); ptrs[1] = ptrs[1].offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); ptrs[2] = ptrs[2].offset(8 * BD::pxstride((*f).cur.stride[1] as usize) as isize >> ss_ver); tc.top_pre_cdef_toggle ^= 1 as c_int; - edges.insert(CdefEdgeFlags::CDEF_HAVE_TOP); + edges.insert(CdefEdgeFlags::HAVE_TOP); } } From f9118b70392d21264e6dae29128633236557baa7 Mon Sep 17 00:00:00 2001 From: Folkert Date: Thu, 8 Feb 2024 12:31:28 +0100 Subject: [PATCH 21/23] clean up ugly bitwise logic --- src/cdef_apply.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index e7c732a08..244640192 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -24,6 +24,16 @@ bitflags! { } } +impl Backup2x8Flags { + pub const fn select(&self, select: bool) -> Self { + if select { + *self + } else { + Self::empty() + } + } +} + unsafe fn backup2lines( dst: &[*mut BD::Pixel], src: &[*mut BD::Pixel; 3], @@ -237,9 +247,8 @@ pub(crate) unsafe fn rav1d_cdef_brow( | (*noskip_row.offset(0))[0] as c_uint; y_lvl = frame_hdr.cdef.y_strength[cdef_idx as usize]; uv_lvl = frame_hdr.cdef.uv_strength[cdef_idx as usize]; - flag = Backup2x8Flags::from_bits_truncate( - (y_lvl != 0) as u8 + (((uv_lvl != 0) as u8) << 1), - ); + flag = + Backup2x8Flags::Y.select(y_lvl != 0) | Backup2x8Flags::UV.select(uv_lvl != 0); y_pri_lvl = (y_lvl >> 2) << bitdepth_min_8; y_sec_lvl = y_lvl & 3; y_sec_lvl += (y_sec_lvl == 3) as c_int; From 6c459fc3895bb8c11da5cfabc9f00a3bb1e42bbf Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Mon, 12 Feb 2024 09:38:57 +0100 Subject: [PATCH 22/23] pass `dst` as an array Co-authored-by: Khyber Sen --- src/cdef_apply.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 244640192..6c7507740 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -35,7 +35,7 @@ impl Backup2x8Flags { } unsafe fn backup2lines( - dst: &[*mut BD::Pixel], + dst: &[*mut BD::Pixel; 3], src: &[*mut BD::Pixel; 3], stride: &[ptrdiff_t; 2], layout: Rav1dPixelLayout, From ecdb77ce6d479096262dac7c313210986dbbeaba Mon Sep 17 00:00:00 2001 From: Folkert Date: Mon, 12 Feb 2024 09:39:25 +0100 Subject: [PATCH 23/23] use unsigned_abs to calculate len --- src/cdef_apply.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 6c7507740..704389f87 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -41,15 +41,14 @@ unsafe fn backup2lines( layout: Rav1dPixelLayout, ) { let y_stride: ptrdiff_t = BD::pxstride(stride[0] as usize) as isize; + let len = 2 * y_stride.unsigned_abs(); if y_stride < 0 { - let len = (-2 * y_stride) as usize; BD::pixel_copy( slice::from_raw_parts_mut(dst[0].offset(y_stride), len), slice::from_raw_parts(src[0].offset(7 * y_stride), len), len, ); } else { - let len = 2 * y_stride as usize; BD::pixel_copy( slice::from_raw_parts_mut(dst[0], len), slice::from_raw_parts(src[0].offset(6 * y_stride), len), @@ -59,6 +58,7 @@ unsafe fn backup2lines( if layout != Rav1dPixelLayout::I400 { let uv_stride: ptrdiff_t = BD::pxstride(stride[1] as usize) as isize; + let len = 2 * uv_stride.unsigned_abs(); if uv_stride < 0 { let uv_off = if layout == Rav1dPixelLayout::I420 { 3 @@ -66,7 +66,6 @@ unsafe fn backup2lines( 7 }; - let len = (-2 * uv_stride) as usize; BD::pixel_copy( slice::from_raw_parts_mut(dst[1].offset(uv_stride), len), slice::from_raw_parts(src[1].offset(uv_off * uv_stride), len), @@ -84,7 +83,6 @@ unsafe fn backup2lines( 6 }; - let len = 2 * uv_stride as usize; BD::pixel_copy( slice::from_raw_parts_mut(dst[1], len), slice::from_raw_parts(src[1].offset(uv_off * uv_stride), len),