diff --git a/src/cdef.rs b/src/cdef.rs index 5c810ba27..3c7b088f4 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 HAVE_LEFT = 1 << 0; + const HAVE_RIGHT = 1 << 1; + const HAVE_TOP = 1 << 2; + const HAVE_BOTTOM = 1 << 3; + } +} 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::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::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::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::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 66288a63e..704389f87 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -1,270 +1,224 @@ 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; 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; 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; use std::ffi::c_uint; use std::slice; -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: u8 { + const Y = 1 << 0; + const UV = 1 << 1; + } +} + +impl Backup2x8Flags { + pub const fn select(&self, select: bool) -> Self { + if select { + *self + } else { + Self::empty() + } + } +} unsafe fn backup2lines( - dst: *const *mut BD::Pixel, - src: *const *mut BD::Pixel, - stride: *const ptrdiff_t, + dst: &[*mut BD::Pixel; 3], + src: &[*mut BD::Pixel; 3], + 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; + let len = 2 * y_stride.unsigned_abs(); if y_stride < 0 { 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 { 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 as c_uint != Rav1dPixelLayout::I400 as c_int as c_uint { - let uv_stride: ptrdiff_t = BD::pxstride(*stride.offset(1) as usize) as isize; + + 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 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( - (*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 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), - 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, ); } } } unsafe fn backup2x8( - dst: *mut [[BD::Pixel; 2]; 8], - src: *const *mut BD::Pixel, - src_stride: *const ptrdiff_t, + dst: &mut [[[BD::Pixel; 2]; 8]; 3], + src: &[*mut BD::Pixel; 3], + src_stride: &[ptrdiff_t; 2], mut x_off: c_int, layout: Rav1dPixelLayout, 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 { - let mut y = 0; - while y < 8 { + if flag.contains(Backup2x8Flags::Y) { + 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 += 1; - 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 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.contains(Backup2x8Flags::UV) { 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; - 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( - &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 += 1; - y_off += BD::pxstride(*src_stride.offset(1) as usize) as isize; + y_off += BD::pxstride(src_stride[1] as usize) as isize; } } 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; } pub(crate) unsafe fn rav1d_cdef_brow( c: &Rav1dContext, - tc: *mut Rav1dTaskContext, - p: *const *mut BD::Pixel, + tc: &mut Rav1dTaskContext, + p: &[*mut BD::Pixel; 3], lflvl: *const Av1Filter, by_start: c_int, by_end: c_int, sbrow_start: c_int, 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 f: *mut Rav1dFrameContext = tc.f as *mut Rav1dFrameContext; + 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 = (CDEF_HAVE_BOTTOM as c_int - | (if by_start > 0 { - CDEF_HAVE_TOP as c_int - } else { - 0 as c_int - })) as CdefEdgeFlags; - let mut ptrs: [*mut BD::Pixel; 3] = [*p.offset(0), *p.offset(1), *p.offset(2)]; + let mut edges: CdefEdgeFlags = if by_start > 0 { + CdefEdgeFlags::HAVE_BOTTOM | CdefEdgeFlags::HAVE_TOP + } else { + CdefEdgeFlags::HAVE_BOTTOM + }; + 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(); 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; - 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_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: &[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; 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 { - let tf = (*tc).top_pre_cdef_toggle; + 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 { - edges = ::core::mem::transmute::( - edges as c_uint & !(CDEF_HAVE_BOTTOM as c_int) as c_uint, - ); + edges.remove(CdefEdgeFlags::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(CdefEdgeFlags::HAVE_BOTTOM) { 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.as_ptr(), - ptrs.as_mut_ptr() as *const *mut BD::Pixel, - ((*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]); - let mut iptrs: [*mut BD::Pixel; 3] = [ptrs[0], ptrs[1], ptrs[2]]; - 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, - ); - let mut prev_flag: Backup2x8Flags = 0 as Backup2x8Flags; - let mut sbx = 0; - let mut last_skip = 1; - while sbx < sb64w { + let mut iptrs: [*mut BD::Pixel; 3] = ptrs; + 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 { let noskip_row: *const [u16; 2]; let noskip_mask: c_uint; let y_lvl; @@ -282,7 +236,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() @@ -291,7 +245,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 = ((y_lvl != 0) as c_int + (((uv_lvl != 0) as c_int) << 1)) as Backup2x8Flags; + 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; @@ -301,8 +256,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; @@ -310,38 +264,35 @@ 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, - ); + edges.remove(CdefEdgeFlags::HAVE_RIGHT); } let bx_mask: u32 = (3 as c_uint) << (bx & 30); if noskip_mask & bx_mask == 0 { - last_skip = 1 as c_int; + last_skip = true; } else { - do_left = (if last_skip != 0 { - flag as c_uint + do_left = if last_skip { + flag } else { - (prev_flag as c_uint ^ flag as c_uint) & flag as c_uint - }) as c_int; + (prev_flag ^ flag) & flag + }; prev_flag = flag; - if do_left != 0 && edges as c_uint & CDEF_HAVE_LEFT as c_int as c_uint != 0 - { + if !do_left.is_empty() && edges.contains(CdefEdgeFlags::HAVE_LEFT) { backup2x8::( - (lr_bak[bit as usize]).as_mut_ptr(), - bptrs.as_mut_ptr() as *const *mut BD::Pixel, - ((*f).cur.stride).as_mut_ptr() as *const ptrdiff_t, + &mut lr_bak[bit as usize], + &bptrs, + &(*f).cur.stride, 0 as c_int, layout, do_left as Backup2x8Flags, ); } - if edges as c_uint & CDEF_HAVE_RIGHT as c_int as c_uint != 0 { + if edges.contains(CdefEdgeFlags::HAVE_RIGHT) { backup2x8::( - (lr_bak[(bit == 0) as c_int as usize]).as_mut_ptr(), - bptrs.as_mut_ptr() as *const *mut BD::Pixel, - ((*f).cur.stride).as_mut_ptr() as *const ptrdiff_t, + &mut lr_bak[(bit == 0) as usize], + &bptrs, + &(*f).cur.stride, 8 as c_int, layout, flag, @@ -360,62 +311,43 @@ 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; - top = &mut *((*((*f).lf.cdef_lpf_line).as_mut_ptr().offset(0)) - as *mut BD::Pixel) - .offset(offset as isize); + 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 as isize); + top = (*f).lf.lr_lpf_line[0].cast::().offset(offset); } - bot = (bptrs[0]).offset((8 * y_stride) as isize); - current_block_84 = 17075014677070940716; + 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 as isize); + 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 as isize); + bot = (*f).lf.lr_lpf_line[0].cast::().offset(offset); } - 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)) - .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); - } - _ => {} + + if st_y { + offset = (sby * 4) as isize * y_stride; + 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 { let adj_y_pri_lvl = adjust_strength(y_pri_lvl, variance); if adj_y_pri_lvl != 0 || y_sec_lvl != 0 { @@ -449,96 +381,75 @@ 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 { - *uv_dir.offset(dir as isize) as c_int + uv_dir[dir as usize] as c_int } else { - 0 as c_int + 0 }; - let mut pl = 1; - while pl <= 2 { - let current_block_77: u64; + for pl in 1..=2 { + 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 + (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 = (*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() - .offset(pl as isize)) - as *mut BD::Pixel) - .offset(offset as isize); + top = (*f).lf.lr_lpf_line[pl] + .cast::() + .offset(offset); } - bot = (bptrs[pl as usize]) - .offset(((8 >> ss_ver) as isize * uv_stride) as isize); - current_block_77 = 6540614962658479183; + 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() - .offset(pl as isize)) - 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() - .offset(pl as isize)) - 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() - .offset(pl as isize)) - as *mut BD::Pixel) - .offset(offset as isize); + bot = (*f).lf.lr_lpf_line[pl] + .cast::() + .offset(offset); } - 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)) - .as_mut_ptr() - .offset(pl as isize)) - as *mut BD::Pixel) - .offset( - (have_tt as isize * offset_0 - + (bx * 4 >> ss_hor) as isize) - as isize, - ); - bot = (bptrs[pl as usize]) - .offset(((8 >> ss_ver) as isize * uv_stride) as isize); - } - _ => {} + + if st_uv { + 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, + ); + bot = bptrs[pl].offset((8 >> ss_ver) * uv_stride); } + (*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,38 +459,26 @@ pub(crate) unsafe fn rav1d_cdef_brow( edges, (*f).bitdepth_max, ); - pl += 1; } } bit ^= 1 as c_int; - last_skip = 0 as c_int; + last_skip = false; } - 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, - ); + 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::HAVE_LEFT); } } - 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, - ); + 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::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; - by += 2 as c_int; - edges = ::core::mem::transmute::( - edges as c_uint | CDEF_HAVE_TOP 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); + tc.top_pre_cdef_toggle ^= 1 as c_int; + edges.insert(CdefEdgeFlags::HAVE_TOP); } } 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(