diff --git a/src/lf_apply.rs b/src/lf_apply.rs index a5624bea8..c4e17fc88 100644 --- a/src/lf_apply.rs +++ b/src/lf_apply.rs @@ -143,8 +143,7 @@ unsafe fn backup_lpf( } else { while row + stripe_h <= row_h { let n_lines_0 = 4 - (row + stripe_h + 1 == h) as c_int; - let mut i = 0; - while i < 4 { + for i in 0..4 { BD::pixel_copy( slice::from_raw_parts_mut(dst, src_w as usize), slice::from_raw_parts( @@ -160,7 +159,6 @@ unsafe fn backup_lpf( ); dst = dst.offset(BD::pxstride(dst_stride as usize) as isize); src = src.offset(BD::pxstride(src_stride as usize) as isize); - i += 1; } row += stripe_h; // unmodified stripe_h for the 1st stripe stripe_h = 64 >> ss_ver; @@ -172,7 +170,7 @@ unsafe fn backup_lpf( pub(crate) unsafe fn rav1d_copy_lpf( c: &Rav1dContext, f: *mut Rav1dFrameContext, - src: *const *mut BD::Pixel, + src: &[*mut BD::Pixel; 3], sby: c_int, ) { let have_tt = (c.n_tc > 1 as c_uint) as c_int; @@ -203,7 +201,7 @@ pub(crate) unsafe fn rav1d_copy_lpf( f, dst[0], *lr_stride.offset(0), - (*src.offset(0)).offset( + src[0].offset( -(offset as isize * BD::pxstride(*src_stride.offset(0) as usize) as isize), ), *src_stride.offset(0), @@ -225,7 +223,7 @@ pub(crate) unsafe fn rav1d_copy_lpf( f, ((*f).lf.cdef_lpf_line[0] as *mut BD::Pixel).offset(cdef_off_y as isize), *src_stride.offset(0), - (*src.offset(0)).offset( + src[0].offset( -offset as isize * BD::pxstride(*src_stride.offset(0) as usize) as isize, ), *src_stride.offset(0), @@ -241,12 +239,10 @@ pub(crate) unsafe fn rav1d_copy_lpf( } } if (seq_hdr.cdef != 0 || restore_planes & (LR_RESTORE_U as c_int | LR_RESTORE_V as c_int) != 0) - && (*f).cur.p.layout as c_uint != Rav1dPixelLayout::I400 as c_int as c_uint + && (*f).cur.p.layout != Rav1dPixelLayout::I400 { - let ss_ver = ((*f).sr_cur.p.p.layout as c_uint == Rav1dPixelLayout::I420 as c_int as c_uint) - as c_int; - let ss_hor = ((*f).sr_cur.p.p.layout as c_uint != Rav1dPixelLayout::I444 as c_int as c_uint) - as c_int; + let ss_ver = ((*f).sr_cur.p.p.layout == Rav1dPixelLayout::I420) as c_int; + let ss_hor = ((*f).sr_cur.p.p.layout != Rav1dPixelLayout::I444) as c_int; let h_0 = (*f).cur.p.h + ss_ver >> ss_ver; let w_0 = (*f).bw << 2 - ss_hor; let row_h_0 = cmp::min((sby + 1) << 6 - ss_ver + seq_hdr.sb128, h_0 - 1); @@ -261,7 +257,7 @@ pub(crate) unsafe fn rav1d_copy_lpf( f, dst[1], *lr_stride.offset(1), - (*src.offset(1)).offset( + src[1].offset( -offset_uv as isize * BD::pxstride(*src_stride.offset(1) as usize) as isize, ), *src_stride.offset(1), @@ -281,7 +277,7 @@ pub(crate) unsafe fn rav1d_copy_lpf( f, ((*f).lf.cdef_lpf_line[1] as *mut BD::Pixel).offset(cdef_off_uv as isize), *src_stride.offset(1), - (*src.offset(1)).offset( + src[1].offset( -offset_uv as isize * BD::pxstride(*src_stride.offset(1) as usize) as isize, ), *src_stride.offset(1), @@ -303,7 +299,7 @@ pub(crate) unsafe fn rav1d_copy_lpf( f, dst[2], *lr_stride.offset(1), - (*src.offset(2)).offset( + src[2].offset( -offset_uv as isize * BD::pxstride(*src_stride.offset(1) as usize) as isize, ), *src_stride.offset(1), @@ -323,7 +319,7 @@ pub(crate) unsafe fn rav1d_copy_lpf( f, ((*f).lf.cdef_lpf_line[2] as *mut BD::Pixel).offset(cdef_off_uv as isize), *src_stride.offset(1), - (*src.offset(2)).offset( + src[2].offset( -offset_uv as isize * BD::pxstride(*src_stride.offset(1) as usize) as isize, ), *src_stride.offset(1), @@ -344,10 +340,10 @@ pub(crate) unsafe fn rav1d_copy_lpf( #[inline] unsafe fn filter_plane_cols_y( f: *const Rav1dFrameContext, - have_left: c_int, + have_left: bool, lvl: &[[u8; 4]], b4_stride: ptrdiff_t, - mask: *const [[u16; 2]; 3], + mask: &[[[u16; 2]; 3]; 32], dst: *mut BD::Pixel, ls: ptrdiff_t, w: c_int, @@ -355,29 +351,31 @@ unsafe fn filter_plane_cols_y( endy4: c_int, ) { let dsp: *const Rav1dDSPContext = (*f).dsp; - for x in 0..w { - if !(have_left == 0 && x == 0) { + + // filter edges between columns (e.g. block1 | block2) + for x in 0..w as usize { + if !(!have_left && x == 0) { let mut hmask: [u32; 4] = [0; 4]; if starty4 == 0 { - hmask[0] = (*mask.offset(x as isize))[0][0] as u32; - hmask[1] = (*mask.offset(x as isize))[1][0] as u32; - hmask[2] = (*mask.offset(x as isize))[2][0] as u32; + hmask[0] = mask[x][0][0] as u32; + hmask[1] = mask[x][1][0] as u32; + hmask[2] = mask[x][2][0] as u32; if endy4 > 16 { - hmask[0] |= ((*mask.offset(x as isize))[0][1] as c_uint) << 16; - hmask[1] |= ((*mask.offset(x as isize))[1][1] as c_uint) << 16; - hmask[2] |= ((*mask.offset(x as isize))[2][1] as c_uint) << 16; + hmask[0] |= (mask[x][0][1] as u32) << 16; + hmask[1] |= (mask[x][1][1] as u32) << 16; + hmask[2] |= (mask[x][2][1] as u32) << 16; } } else { - hmask[0] = (*mask.offset(x as isize))[0][1] as u32; - hmask[1] = (*mask.offset(x as isize))[1][1] as u32; - hmask[2] = (*mask.offset(x as isize))[2][1] as u32; + hmask[0] = mask[x][0][1] as u32; + hmask[1] = mask[x][1][1] as u32; + hmask[2] = mask[x][2][1] as u32; } - hmask[3] = 0 as c_int as u32; + hmask[3] = 0; (*dsp).lf.loop_filter_sb[0][0]( - dst.offset((x * 4) as isize).cast(), + dst.add(x * 4).cast(), ls, hmask.as_mut_ptr(), - lvl[x as usize][0..].as_ptr() as *const [u8; 4], + lvl[x][0..].as_ptr() as *const [u8; 4], b4_stride, &(*f).lf.lim_lut.0, endy4 - starty4, @@ -390,10 +388,10 @@ unsafe fn filter_plane_cols_y( #[inline] unsafe fn filter_plane_rows_y( f: *const Rav1dFrameContext, - have_top: c_int, + have_top: bool, lvl: &[[u8; 4]], b4_stride: ptrdiff_t, - mask: *const [[u16; 2]; 3], + mask: &[[[u16; 2]; 3]; 32], mut dst: *mut BD::Pixel, ls: ptrdiff_t, w: c_int, @@ -401,16 +399,17 @@ unsafe fn filter_plane_rows_y( endy4: c_int, ) { let dsp: *const Rav1dDSPContext = (*f).dsp; - for (y, lvl) in (starty4..endy4).zip(lvl.chunks(b4_stride as usize)) { - if !(have_top == 0 && y == 0) { + + // block1 + // filter edges between rows (e.g. ------) + // block2 + for (y, lvl) in (starty4 as usize..endy4 as usize).zip(lvl.chunks(b4_stride as usize)) { + if !(!have_top && y == 0) { let vmask: [u32; 4] = [ - (*mask.offset(y as isize))[0][0] as c_uint - | ((*mask.offset(y as isize))[0][1] as c_uint) << 16, - (*mask.offset(y as isize))[1][0] as c_uint - | ((*mask.offset(y as isize))[1][1] as c_uint) << 16, - (*mask.offset(y as isize))[2][0] as c_uint - | ((*mask.offset(y as isize))[2][1] as c_uint) << 16, - 0 as c_int as u32, + mask[y][0][0] as u32 | (mask[y][0][1] as u32) << 16, + mask[y][1][0] as u32 | (mask[y][1][1] as u32) << 16, + mask[y][2][0] as u32 | (mask[y][2][1] as u32) << 16, + 0, ]; (*dsp).lf.loop_filter_sb[0][1]( dst.cast(), @@ -430,10 +429,10 @@ unsafe fn filter_plane_rows_y( #[inline] unsafe fn filter_plane_cols_uv( f: *const Rav1dFrameContext, - have_left: c_int, + have_left: bool, lvl: &[[u8; 4]], b4_stride: ptrdiff_t, - mask: *const [[u16; 2]; 2], + mask: &[[[u16; 2]; 2]; 32], u: *mut BD::Pixel, v: *mut BD::Pixel, ls: ptrdiff_t, @@ -443,23 +442,25 @@ unsafe fn filter_plane_cols_uv( ss_ver: c_int, ) { let dsp: *const Rav1dDSPContext = (*f).dsp; - for x in 0..w { - if !(have_left == 0 && x == 0) { + + // filter edges between columns (e.g. block1 | block2) + for x in 0..w as usize { + if !(!have_left && x == 0) { let mut hmask: [u32; 3] = [0; 3]; if starty4 == 0 { - hmask[0] = (*mask.offset(x as isize))[0][0] as u32; - hmask[1] = (*mask.offset(x as isize))[1][0] as u32; + hmask[0] = mask[x][0][0] as u32; + hmask[1] = mask[x][1][0] as u32; if endy4 > 16 >> ss_ver { - hmask[0] |= ((*mask.offset(x as isize))[0][1] as c_uint) << (16 >> ss_ver); - hmask[1] |= ((*mask.offset(x as isize))[1][1] as c_uint) << (16 >> ss_ver); + hmask[0] |= (mask[x][0][1] as u32) << (16 >> ss_ver); + hmask[1] |= (mask[x][1][1] as u32) << (16 >> ss_ver); } } else { - hmask[0] = (*mask.offset(x as isize))[0][1] as u32; - hmask[1] = (*mask.offset(x as isize))[1][1] as u32; + hmask[0] = mask[x][0][1] as u32; + hmask[1] = mask[x][1][1] as u32; } hmask[2] = 0 as c_int as u32; (*dsp).lf.loop_filter_sb[1][0]( - u.offset((x * 4) as isize).cast(), + u.add(x * 4).cast(), ls, hmask.as_mut_ptr(), lvl[x as usize][2..].as_ptr() as *const [u8; 4], @@ -469,7 +470,7 @@ unsafe fn filter_plane_cols_uv( (*f).bitdepth_max, ); (*dsp).lf.loop_filter_sb[1][0]( - v.offset((x * 4) as isize).cast(), + v.add(x * 4).cast(), ls, hmask.as_mut_ptr(), lvl[x as usize][3..].as_ptr() as *const [u8; 4], @@ -485,10 +486,10 @@ unsafe fn filter_plane_cols_uv( #[inline] unsafe fn filter_plane_rows_uv( f: *const Rav1dFrameContext, - have_top: c_int, + have_top: bool, lvl: &[[u8; 4]], b4_stride: ptrdiff_t, - mask: *const [[u16; 2]; 2], + mask: &[[[u16; 2]; 2]; 32], u: *mut BD::Pixel, v: *mut BD::Pixel, ls: ptrdiff_t, @@ -499,14 +500,16 @@ unsafe fn filter_plane_rows_uv( ) { let dsp: *const Rav1dDSPContext = (*f).dsp; let mut off_l: ptrdiff_t = 0 as c_int as ptrdiff_t; - for (y, lvl) in (starty4..endy4).zip(lvl.chunks(b4_stride as usize)) { - if !(have_top == 0 && y == 0) { + + // block1 + // filter edges between rows (e.g. ------) + // block2 + for (y, lvl) in (starty4 as usize..endy4 as usize).zip(lvl.chunks(b4_stride as usize)) { + if !(!have_top && y == 0) { let vmask: [u32; 3] = [ - (*mask.offset(y as isize))[0][0] as c_uint - | ((*mask.offset(y as isize))[0][1] as c_uint) << (16 >> ss_hor), - (*mask.offset(y as isize))[1][0] as c_uint - | ((*mask.offset(y as isize))[1][1] as c_uint) << (16 >> ss_hor), - 0 as c_int as u32, + mask[y][0][0] as u32 | (mask[y][0][1] as u32) << (16 >> ss_hor), + mask[y][1][0] as u32 | (mask[y][1][1] as u32) << (16 >> ss_hor), + 0, ]; (*dsp).lf.loop_filter_sb[1][1]( u.offset(off_l as isize).cast(), @@ -548,20 +551,18 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_cols( let sbsz = 32 >> is_sb64; let sbl2 = 5 - is_sb64; let halign = (*f).bh + 31 & !(31 as c_int); - let ss_ver = - ((*f).cur.p.layout as c_uint == Rav1dPixelLayout::I420 as c_int as c_uint) as c_int; - let ss_hor = - ((*f).cur.p.layout as c_uint != Rav1dPixelLayout::I444 as c_int as c_uint) as c_int; + let ss_ver = ((*f).cur.p.layout == Rav1dPixelLayout::I420) as c_int; + let ss_hor = ((*f).cur.p.layout != Rav1dPixelLayout::I444) as c_int; let vmask = 16 >> ss_ver; let hmask = 16 >> ss_hor; let vmax: c_uint = (1 as c_uint) << vmask; let hmax: c_uint = (1 as c_uint) << hmask; let endy4: c_uint = (starty4 + cmp::min((*f).h4 - sby * sbsz, sbsz)) as c_uint; let uv_endy4: c_uint = endy4.wrapping_add(ss_ver as c_uint) >> ss_ver; - let mut lpf_y: *const u8 = &mut *(*((*f).lf.tx_lpf_right_edge).as_ptr().offset(0)) - .offset((sby << sbl2) as isize) as *mut u8; - let mut lpf_uv: *const u8 = &mut *(*((*f).lf.tx_lpf_right_edge).as_ptr().offset(1)) - .offset((sby << sbl2 - ss_ver) as isize) as *mut u8; + let mut lpf_y: *const u8 = + &mut *(*f).lf.tx_lpf_right_edge[0].offset((sby << sbl2) as isize) as *mut u8; + let mut lpf_uv: *const u8 = + &mut *(*f).lf.tx_lpf_right_edge[1].offset((sby << sbl2 - ss_ver) as isize) as *mut u8; let frame_hdr = &***(*f).frame_hdr.as_ref().unwrap(); let mut tile_col = 1; loop { @@ -569,58 +570,36 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_cols( if x << sbl2 >= (*f).bw { break; } - let bx4 = if x & is_sb64 != 0 { - 16 as c_int - } else { - 0 as c_int - }; + let bx4 = if x & is_sb64 != 0 { 16 } else { 0 }; let cbx4 = bx4 >> ss_hor; x >>= is_sb64; - let y_hmask: *mut [u16; 2] = - ((*lflvl.offset(x as isize)).filter_y[0][bx4 as usize]).as_mut_ptr(); - let mut y: c_uint = starty4 as c_uint; - let mut mask: c_uint = ((1 as c_int) << y) as c_uint; - while y < endy4 { - let sidx = (mask >= 0x10000 as c_uint) as c_int; - let smask: c_uint = mask >> (sidx << 4); - let idx = 2 as c_int - * ((*y_hmask.offset(2))[sidx as usize] as c_uint & smask != 0) as c_int - + ((*y_hmask.offset(1))[sidx as usize] as c_uint & smask != 0) as c_int; - let ref mut fresh0 = (*y_hmask.offset(2))[sidx as usize]; - *fresh0 = (*fresh0 as c_uint & !smask) as u16; - let ref mut fresh1 = (*y_hmask.offset(1))[sidx as usize]; - *fresh1 = (*fresh1 as c_uint & !smask) as u16; - let ref mut fresh2 = (*y_hmask.offset(0))[sidx as usize]; - *fresh2 = (*fresh2 as c_uint & !smask) as u16; - let ref mut fresh3 = (*y_hmask.offset(cmp::min( - idx, - *lpf_y.offset(y.wrapping_sub(starty4 as c_uint) as isize) as c_int, - ) as isize))[sidx as usize]; - *fresh3 = (*fresh3 as c_uint | smask) as u16; - y = y.wrapping_add(1); + let y_hmask = &mut (*lflvl.offset(x as isize)).filter_y[0][bx4 as usize]; + let mut mask = (1 << starty4) as u32; + for i in 0..endy4 as usize - starty4 as usize { + let sidx = (mask >= 0x10000 as c_uint) as usize; + let smask = (mask >> (sidx << 4)) as u16; + let idx = 2 * (y_hmask[2][sidx] & smask != 0) as usize + + (y_hmask[1][sidx] & smask != 0) as usize; + + y_hmask[2][sidx] &= !smask; + y_hmask[1][sidx] &= !smask; + y_hmask[0][sidx] &= !smask; + y_hmask[cmp::min(idx, *lpf_y.add(i) as usize)][sidx] |= smask; + mask <<= 1; } - if (*f).cur.p.layout as c_uint != Rav1dPixelLayout::I400 as c_int as c_uint { - let uv_hmask: *mut [u16; 2] = - ((*lflvl.offset(x as isize)).filter_uv[0][cbx4 as usize]).as_mut_ptr(); - let mut y_0: c_uint = (starty4 >> ss_ver) as c_uint; - let mut uv_mask: c_uint = ((1 as c_int) << y_0) as c_uint; - while y_0 < uv_endy4 { - let sidx_0 = (uv_mask >= vmax) as c_int; - let smask_0: c_uint = uv_mask >> (sidx_0 << 4 - ss_ver); - let idx_0 = - ((*uv_hmask.offset(1))[sidx_0 as usize] as c_uint & smask_0 != 0) as c_int; - let ref mut fresh4 = (*uv_hmask.offset(1))[sidx_0 as usize]; - *fresh4 = (*fresh4 as c_uint & !smask_0) as u16; - let ref mut fresh5 = (*uv_hmask.offset(0))[sidx_0 as usize]; - *fresh5 = (*fresh5 as c_uint & !smask_0) as u16; - let ref mut fresh6 = (*uv_hmask.offset(cmp::min( - idx_0, - *lpf_uv.offset(y_0.wrapping_sub((starty4 >> ss_ver) as c_uint) as isize) - as c_int, - ) as isize))[sidx_0 as usize]; - *fresh6 = (*fresh6 as c_uint | smask_0) as u16; - y_0 = y_0.wrapping_add(1); + if (*f).cur.p.layout != Rav1dPixelLayout::I400 { + let uv_hmask = &mut (*lflvl.offset(x as isize)).filter_uv[0][cbx4 as usize]; + let mut uv_mask = (1 << (starty4 >> ss_ver)) as u32; + for i in 0..(uv_endy4 - (starty4 >> ss_ver) as u32) as usize { + let sidx = (uv_mask >= vmax) as usize; + let smask = (uv_mask >> (sidx << 4 - ss_ver)) as u16; + let idx = (uv_hmask[1][sidx] & smask != 0) as usize; + + uv_hmask[1][sidx] &= !smask; + uv_hmask[0][sidx] &= !smask; + uv_hmask[cmp::min(idx, *lpf_uv.add(i) as usize)][sidx] |= smask; + uv_mask <<= 1; } } @@ -628,82 +607,68 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_cols( lpf_uv = lpf_uv.offset((halign >> ss_ver) as isize); tile_col += 1; } + + // fix lpf strength at tile row boundaries if start_of_tile_row != 0 { let mut a: *const BlockContext; - x = 0 as c_int; a = &mut *((*f).a).offset(((*f).sb128w * (start_of_tile_row - 1)) as isize) as *mut BlockContext; - while x < (*f).sb128w { - let y_vmask: *mut [u16; 2] = - ((*lflvl.offset(x as isize)).filter_y[1][starty4 as usize]).as_mut_ptr(); + for x in 0..(*f).sb128w { + let y_vmask = &mut ((*lflvl.offset(x as isize)).filter_y[1][starty4 as usize]); let w: c_uint = cmp::min(32 as c_int, (*f).w4 - (x << 5)) as c_uint; - let mut mask_0: c_uint = 1 as c_int as c_uint; - let mut i: c_uint = 0 as c_int as c_uint; - while i < w { - let sidx_1 = (mask_0 >= 0x10000 as c_uint) as c_int; - let smask_1: c_uint = mask_0 >> (sidx_1 << 4); - let idx_1 = 2 as c_int - * ((*y_vmask.offset(2))[sidx_1 as usize] as c_uint & smask_1 != 0) as c_int - + ((*y_vmask.offset(1))[sidx_1 as usize] as c_uint & smask_1 != 0) as c_int; - let ref mut fresh7 = (*y_vmask.offset(2))[sidx_1 as usize]; - *fresh7 = (*fresh7 as c_uint & !smask_1) as u16; - let ref mut fresh8 = (*y_vmask.offset(1))[sidx_1 as usize]; - *fresh8 = (*fresh8 as c_uint & !smask_1) as u16; - let ref mut fresh9 = (*y_vmask.offset(0))[sidx_1 as usize]; - *fresh9 = (*fresh9 as c_uint & !smask_1) as u16; - let ref mut fresh10 = (*y_vmask - .offset(cmp::min(idx_1, (*a).tx_lpf_y[i as usize] as c_int) as isize)) - [sidx_1 as usize]; - *fresh10 = (*fresh10 as c_uint | smask_1) as u16; - mask_0 <<= 1; - i = i.wrapping_add(1); + let mut mask = 1u32; + for i in 0..w as usize { + let sidx = (mask >= 0x10000 as c_uint) as usize; + let smask = (mask >> (sidx << 4)) as u16; + let idx = 2 * (y_vmask[2][sidx] & smask != 0) as usize + + (y_vmask[1][sidx] & smask != 0) as usize; + + y_vmask[2][sidx] &= !smask; + y_vmask[1][sidx] &= !smask; + y_vmask[0][sidx] &= !smask; + y_vmask[cmp::min(idx, (*a).tx_lpf_y[i as usize] as usize)][sidx] |= smask; + + mask <<= 1; } - if (*f).cur.p.layout as c_uint != Rav1dPixelLayout::I400 as c_int as c_uint { + + if (*f).cur.p.layout != Rav1dPixelLayout::I400 { let cw: c_uint = w.wrapping_add(ss_hor as c_uint) >> ss_hor; - let uv_vmask: *mut [u16; 2] = ((*lflvl.offset(x as isize)).filter_uv[1] - [(starty4 >> ss_ver) as usize]) - .as_mut_ptr(); - let mut uv_mask_0: c_uint = 1 as c_int as c_uint; - let mut i_0: c_uint = 0 as c_int as c_uint; - while i_0 < cw { - let sidx_2 = (uv_mask_0 >= hmax) as c_int; - let smask_2: c_uint = uv_mask_0 >> (sidx_2 << 4 - ss_hor); - let idx_2 = - ((*uv_vmask.offset(1))[sidx_2 as usize] as c_uint & smask_2 != 0) as c_int; - let ref mut fresh11 = (*uv_vmask.offset(1))[sidx_2 as usize]; - *fresh11 = (*fresh11 as c_uint & !smask_2) as u16; - let ref mut fresh12 = (*uv_vmask.offset(0))[sidx_2 as usize]; - *fresh12 = (*fresh12 as c_uint & !smask_2) as u16; - let ref mut fresh13 = (*uv_vmask - .offset(cmp::min(idx_2, (*a).tx_lpf_uv[i_0 as usize] as c_int) as isize)) - [sidx_2 as usize]; - *fresh13 = (*fresh13 as c_uint | smask_2) as u16; - uv_mask_0 <<= 1; - i_0 = i_0.wrapping_add(1); + let uv_vmask = + &mut (*lflvl.offset(x as isize)).filter_uv[1][(starty4 >> ss_ver) as usize]; + let mut uv_mask = 1u32; + for i in 0..cw as usize { + let sidx = (uv_mask >= hmax) as usize; + let smask = (uv_mask >> (sidx << 4 - ss_hor)) as u16; + let idx = (uv_vmask[1][sidx as usize] & smask != 0) as usize; + + uv_vmask[1][sidx] &= !smask; + uv_vmask[0][sidx] &= !smask; + uv_vmask[cmp::min(idx, (*a).tx_lpf_uv[i] as usize)][sidx] |= smask; + + uv_mask <<= 1; } } - x += 1; a = a.offset(1); } } let mut ptr: *mut BD::Pixel; let level_ptr = &(*f).lf.level[((*f).b4_stride * sby as isize * sbsz as isize) as usize..]; ptr = p[0]; - have_left = 0 as c_int; + have_left = false; for (x, level_ptr) in (0..(*f).sb128w).zip(level_ptr.chunks(32)) { filter_plane_cols_y::( f, have_left, level_ptr, (*f).b4_stride, - ((*lflvl.offset(x as isize)).filter_y[0]).as_mut_ptr() as *const [[u16; 2]; 3], + &(*lflvl.offset(x as isize)).filter_y[0], ptr, (*f).cur.stride[0], cmp::min(32 as c_int, (*f).w4 - x * 32), starty4, endy4 as c_int, ); - have_left = 1 as c_int; + have_left = true; ptr = ptr.offset(128); } if frame_hdr.loopfilter.level_u == 0 && frame_hdr.loopfilter.level_v == 0 { @@ -711,7 +676,7 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_cols( } let mut uv_off: ptrdiff_t; let level_ptr = &(*f).lf.level[((*f).b4_stride * (sby * sbsz >> ss_ver) as isize) as usize..]; - have_left = 0 as c_int; + have_left = false; uv_off = 0; for (x, level_ptr) in (0..(*f).sb128w).zip(level_ptr.chunks(32 >> ss_hor)) { filter_plane_cols_uv::( @@ -719,7 +684,7 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_cols( have_left, level_ptr, (*f).b4_stride, - ((*lflvl.offset(x as isize)).filter_uv[0]).as_mut_ptr() as *const [[u16; 2]; 2], + &(*lflvl.offset(x as isize)).filter_uv[0], &mut *p[1].offset(uv_off as isize), &mut *p[2].offset(uv_off as isize), (*f).cur.stride[1], @@ -728,7 +693,7 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_cols( uv_endy4 as c_int, ss_ver, ); - have_left = 1 as c_int; + have_left = true; uv_off += 128 >> ss_hor; } } @@ -740,7 +705,7 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_rows( sby: c_int, ) { // Don't filter outside the frame - let have_top = (sby > 0) as c_int; + let have_top = sby > 0; let seq_hdr = &***(*f).seq_hdr.as_ref().unwrap(); let is_sb64 = (seq_hdr.sb128 == 0) as c_int; let starty4 = (sby & is_sb64) << 4; @@ -759,7 +724,7 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_rows( have_top, level_ptr, (*f).b4_stride, - ((*lflvl.offset(x as isize)).filter_y[1]).as_mut_ptr() as *const [[u16; 2]; 3], + &(*lflvl.offset(x as isize)).filter_y[1], ptr, (*f).cur.stride[0], cmp::min(32, (*f).w4 - x * 32), @@ -785,7 +750,7 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_rows( have_top, level_ptr, (*f).b4_stride, - ((*lflvl.offset(x as isize)).filter_uv[1]).as_mut_ptr() as *const [[u16; 2]; 2], + &(*lflvl.offset(x as isize)).filter_uv[1], &mut *p[1].offset(uv_off as isize), &mut *p[2].offset(uv_off as isize), (*f).cur.stride[1], diff --git a/src/recon.rs b/src/recon.rs index f45166102..c48a5ad7d 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -4519,7 +4519,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_deblock_rows( rav1d_loopfilter_sbrow_rows::(f, &p, mask, sby); } if seq_hdr.cdef != 0 || f.lf.restore_planes != 0 { - rav1d_copy_lpf::(c, f, p.as_ptr(), sby); + rav1d_copy_lpf::(c, f, &p, sby); } }