From 93787a729f13ce26b0894168540f03f8bb49191a Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 3 Aug 2023 13:22:27 -0700 Subject: [PATCH 1/4] `fn warp_affine_8x8_{c => rust}`: Deduplicate w/ generics. --- src/mc.rs | 87 +++++++++++++++++++++++++++++++++++++++++++ src/mc_tmpl_16.rs | 94 ++++++++--------------------------------------- src/mc_tmpl_8.rs | 92 ++++++++-------------------------------------- 3 files changed, 117 insertions(+), 156 deletions(-) diff --git a/src/mc.rs b/src/mc.rs index 6ee8e4228..3c2ef45ce 100644 --- a/src/mc.rs +++ b/src/mc.rs @@ -3,6 +3,7 @@ use std::iter; use crate::include::common::bitdepth::{AsPrimitive, BitDepth}; use crate::include::dav1d::headers::Dav1dFilterMode; use crate::src::tables::dav1d_mc_subpel_filters; +use crate::src::tables::dav1d_mc_warp_filter; use crate::src::tables::dav1d_obmc_masks; // TODO(kkysen) temporarily `pub` until `mc` callers are deduplicated @@ -896,3 +897,89 @@ pub unsafe fn w_mask_rust( } } } + +// TODO(kkysen) temporarily `pub` until `mc` callers are deduplicated +pub unsafe fn warp_affine_8x8_rust( + mut dst: *mut BD::Pixel, + dst_stride: libc::ptrdiff_t, + mut src: *const BD::Pixel, + src_stride: libc::ptrdiff_t, + abcd: *const i16, + mut mx: libc::c_int, + mut my: libc::c_int, + bd: BD, +) { + let intermediate_bits = bd.get_intermediate_bits(); + let mut mid: [i16; 120] = [0; 120]; + let mut mid_ptr: *mut i16 = mid.as_mut_ptr(); + src = src.offset(-((3 * BD::pxstride(src_stride as usize)) as isize)); + let mut y = 0; + while y < 15 { + let mut x = 0; + let mut tmx = mx; + while x < 8 { + let filter: *const i8 = + (dav1d_mc_warp_filter[(64 as libc::c_int + (tmx + 512 >> 10)) as usize]).as_ptr(); + *mid_ptr.offset(x as isize) = (*filter.offset(0) as libc::c_int + * (*src.offset((x - 3 * 1) as isize)).as_::() + + *filter.offset(1) as libc::c_int + * (*src.offset((x - 2 * 1) as isize)).as_::() + + *filter.offset(2) as libc::c_int + * (*src.offset((x - 1 * 1) as isize)).as_::() + + *filter.offset(3) as libc::c_int + * (*src.offset((x + 0 * 1) as isize)).as_::() + + *filter.offset(4) as libc::c_int + * (*src.offset((x + 1 * 1) as isize)).as_::() + + *filter.offset(5) as libc::c_int + * (*src.offset((x + 2 * 1) as isize)).as_::() + + *filter.offset(6) as libc::c_int + * (*src.offset((x + 3 * 1) as isize)).as_::() + + *filter.offset(7) as libc::c_int + * (*src.offset((x + 4 * 1) as isize)).as_::() + + ((1 as libc::c_int) << 7 - intermediate_bits >> 1) + >> 7 - intermediate_bits) as i16; + x += 1; + tmx += *abcd.offset(0) as libc::c_int; + } + src = src.offset(BD::pxstride(src_stride as usize) as isize); + mid_ptr = mid_ptr.offset(8); + y += 1; + mx += *abcd.offset(1) as libc::c_int; + } + mid_ptr = &mut *mid.as_mut_ptr().offset((3 * 8) as isize) as *mut i16; + let mut y_0 = 0; + while y_0 < 8 { + let mut x_0 = 0; + let mut tmy = my; + while x_0 < 8 { + let filter_0: *const i8 = + (dav1d_mc_warp_filter[(64 as libc::c_int + (tmy + 512 >> 10)) as usize]).as_ptr(); + *dst.offset(x_0 as isize) = bd.iclip_pixel( + *filter_0.offset(0) as libc::c_int + * *mid_ptr.offset((x_0 - 3 * 8) as isize) as libc::c_int + + *filter_0.offset(1) as libc::c_int + * *mid_ptr.offset((x_0 - 2 * 8) as isize) as libc::c_int + + *filter_0.offset(2) as libc::c_int + * *mid_ptr.offset((x_0 - 1 * 8) as isize) as libc::c_int + + *filter_0.offset(3) as libc::c_int + * *mid_ptr.offset((x_0 + 0 * 8) as isize) as libc::c_int + + *filter_0.offset(4) as libc::c_int + * *mid_ptr.offset((x_0 + 1 * 8) as isize) as libc::c_int + + *filter_0.offset(5) as libc::c_int + * *mid_ptr.offset((x_0 + 2 * 8) as isize) as libc::c_int + + *filter_0.offset(6) as libc::c_int + * *mid_ptr.offset((x_0 + 3 * 8) as isize) as libc::c_int + + *filter_0.offset(7) as libc::c_int + * *mid_ptr.offset((x_0 + 4 * 8) as isize) as libc::c_int + + ((1 as libc::c_int) << 7 + intermediate_bits >> 1) + >> 7 + intermediate_bits, + ); + x_0 += 1; + tmy += *abcd.offset(2) as libc::c_int; + } + mid_ptr = mid_ptr.offset(8); + dst = dst.offset(BD::pxstride(dst_stride as usize) as isize); + y_0 += 1; + my += *abcd.offset(3) as libc::c_int; + } +} diff --git a/src/mc_tmpl_16.rs b/src/mc_tmpl_16.rs index af547d754..65e2bac0c 100644 --- a/src/mc_tmpl_16.rs +++ b/src/mc_tmpl_16.rs @@ -3269,91 +3269,27 @@ unsafe extern "C" fn w_mask_420_c( bitdepth_max, ) } +use crate::src::mc::warp_affine_8x8_rust; unsafe extern "C" fn warp_affine_8x8_c( - mut dst: *mut pixel, + dst: *mut pixel, dst_stride: ptrdiff_t, - mut src: *const pixel, + src: *const pixel, src_stride: ptrdiff_t, abcd: *const int16_t, - mut mx: libc::c_int, - mut my: libc::c_int, + mx: libc::c_int, + my: libc::c_int, bitdepth_max: libc::c_int, ) { - let intermediate_bits = 14 as libc::c_int - (32 - clz(bitdepth_max as libc::c_uint)); - let mut mid: [int16_t; 120] = [0; 120]; - let mut mid_ptr: *mut int16_t = mid.as_mut_ptr(); - src = src.offset(-((3 * PXSTRIDE(src_stride)) as isize)); - let mut y = 0; - while y < 15 { - let mut x = 0; - let mut tmx = mx; - while x < 8 { - let filter: *const int8_t = - (dav1d_mc_warp_filter[(64 as libc::c_int + (tmx + 512 >> 10)) as usize]).as_ptr(); - *mid_ptr.offset(x as isize) = (*filter.offset(0) as libc::c_int - * *src.offset((x - 3 * 1) as isize) as libc::c_int - + *filter.offset(1) as libc::c_int - * *src.offset((x - 2 * 1) as isize) as libc::c_int - + *filter.offset(2) as libc::c_int - * *src.offset((x - 1 * 1) as isize) as libc::c_int - + *filter.offset(3) as libc::c_int - * *src.offset((x + 0 * 1) as isize) as libc::c_int - + *filter.offset(4) as libc::c_int - * *src.offset((x + 1 * 1) as isize) as libc::c_int - + *filter.offset(5) as libc::c_int - * *src.offset((x + 2 * 1) as isize) as libc::c_int - + *filter.offset(6) as libc::c_int - * *src.offset((x + 3 * 1) as isize) as libc::c_int - + *filter.offset(7) as libc::c_int - * *src.offset((x + 4 * 1) as isize) as libc::c_int - + ((1 as libc::c_int) << 7 - intermediate_bits >> 1) - >> 7 - intermediate_bits) as int16_t; - x += 1; - tmx += *abcd.offset(0) as libc::c_int; - } - src = src.offset(PXSTRIDE(src_stride) as isize); - mid_ptr = mid_ptr.offset(8); - y += 1; - mx += *abcd.offset(1) as libc::c_int; - } - mid_ptr = &mut *mid.as_mut_ptr().offset((3 * 8) as isize) as *mut int16_t; - let mut y_0 = 0; - while y_0 < 8 { - let mut x_0 = 0; - let mut tmy = my; - while x_0 < 8 { - let filter_0: *const int8_t = - (dav1d_mc_warp_filter[(64 as libc::c_int + (tmy + 512 >> 10)) as usize]).as_ptr(); - *dst.offset(x_0 as isize) = iclip( - *filter_0.offset(0) as libc::c_int - * *mid_ptr.offset((x_0 - 3 * 8) as isize) as libc::c_int - + *filter_0.offset(1) as libc::c_int - * *mid_ptr.offset((x_0 - 2 * 8) as isize) as libc::c_int - + *filter_0.offset(2) as libc::c_int - * *mid_ptr.offset((x_0 - 1 * 8) as isize) as libc::c_int - + *filter_0.offset(3) as libc::c_int - * *mid_ptr.offset((x_0 + 0 * 8) as isize) as libc::c_int - + *filter_0.offset(4) as libc::c_int - * *mid_ptr.offset((x_0 + 1 * 8) as isize) as libc::c_int - + *filter_0.offset(5) as libc::c_int - * *mid_ptr.offset((x_0 + 2 * 8) as isize) as libc::c_int - + *filter_0.offset(6) as libc::c_int - * *mid_ptr.offset((x_0 + 3 * 8) as isize) as libc::c_int - + *filter_0.offset(7) as libc::c_int - * *mid_ptr.offset((x_0 + 4 * 8) as isize) as libc::c_int - + ((1 as libc::c_int) << 7 + intermediate_bits >> 1) - >> 7 + intermediate_bits, - 0 as libc::c_int, - bitdepth_max, - ) as pixel; - x_0 += 1; - tmy += *abcd.offset(2) as libc::c_int; - } - mid_ptr = mid_ptr.offset(8); - dst = dst.offset(PXSTRIDE(dst_stride) as isize); - y_0 += 1; - my += *abcd.offset(3) as libc::c_int; - } + warp_affine_8x8_rust( + dst, + dst_stride, + src, + src_stride, + abcd, + mx, + my, + BitDepth16::new(bitdepth_max as u16), + ) } unsafe extern "C" fn warp_affine_8x8t_c( mut tmp: *mut int16_t, diff --git a/src/mc_tmpl_8.rs b/src/mc_tmpl_8.rs index 36fa3c563..5b66ef230 100644 --- a/src/mc_tmpl_8.rs +++ b/src/mc_tmpl_8.rs @@ -3131,88 +3131,26 @@ unsafe extern "C" fn w_mask_420_c( ) { w_mask_c(dst, dst_stride, tmp1, tmp2, w, h, mask, sign, true, true) } +use crate::src::mc::warp_affine_8x8_rust; unsafe extern "C" fn warp_affine_8x8_c( - mut dst: *mut pixel, + dst: *mut pixel, dst_stride: ptrdiff_t, - mut src: *const pixel, + src: *const pixel, src_stride: ptrdiff_t, abcd: *const int16_t, - mut mx: libc::c_int, - mut my: libc::c_int, + mx: libc::c_int, + my: libc::c_int, ) { - let intermediate_bits = 4; - let mut mid: [int16_t; 120] = [0; 120]; - let mut mid_ptr: *mut int16_t = mid.as_mut_ptr(); - src = src.offset(-((3 * src_stride) as isize)); - let mut y = 0; - while y < 15 { - let mut x = 0; - let mut tmx = mx; - while x < 8 { - let filter: *const int8_t = - (dav1d_mc_warp_filter[(64 as libc::c_int + (tmx + 512 >> 10)) as usize]).as_ptr(); - *mid_ptr.offset(x as isize) = (*filter.offset(0) as libc::c_int - * *src.offset((x - 3 * 1) as isize) as libc::c_int - + *filter.offset(1) as libc::c_int - * *src.offset((x - 2 * 1) as isize) as libc::c_int - + *filter.offset(2) as libc::c_int - * *src.offset((x - 1 * 1) as isize) as libc::c_int - + *filter.offset(3) as libc::c_int - * *src.offset((x + 0 * 1) as isize) as libc::c_int - + *filter.offset(4) as libc::c_int - * *src.offset((x + 1 * 1) as isize) as libc::c_int - + *filter.offset(5) as libc::c_int - * *src.offset((x + 2 * 1) as isize) as libc::c_int - + *filter.offset(6) as libc::c_int - * *src.offset((x + 3 * 1) as isize) as libc::c_int - + *filter.offset(7) as libc::c_int - * *src.offset((x + 4 * 1) as isize) as libc::c_int - + ((1 as libc::c_int) << 7 - intermediate_bits >> 1) - >> 7 - intermediate_bits) as int16_t; - x += 1; - tmx += *abcd.offset(0) as libc::c_int; - } - src = src.offset(src_stride as isize); - mid_ptr = mid_ptr.offset(8); - y += 1; - mx += *abcd.offset(1) as libc::c_int; - } - mid_ptr = &mut *mid.as_mut_ptr().offset((3 * 8) as isize) as *mut int16_t; - let mut y_0 = 0; - while y_0 < 8 { - let mut x_0 = 0; - let mut tmy = my; - while x_0 < 8 { - let filter_0: *const int8_t = - (dav1d_mc_warp_filter[(64 as libc::c_int + (tmy + 512 >> 10)) as usize]).as_ptr(); - *dst.offset(x_0 as isize) = iclip_u8( - *filter_0.offset(0) as libc::c_int - * *mid_ptr.offset((x_0 - 3 * 8) as isize) as libc::c_int - + *filter_0.offset(1) as libc::c_int - * *mid_ptr.offset((x_0 - 2 * 8) as isize) as libc::c_int - + *filter_0.offset(2) as libc::c_int - * *mid_ptr.offset((x_0 - 1 * 8) as isize) as libc::c_int - + *filter_0.offset(3) as libc::c_int - * *mid_ptr.offset((x_0 + 0 * 8) as isize) as libc::c_int - + *filter_0.offset(4) as libc::c_int - * *mid_ptr.offset((x_0 + 1 * 8) as isize) as libc::c_int - + *filter_0.offset(5) as libc::c_int - * *mid_ptr.offset((x_0 + 2 * 8) as isize) as libc::c_int - + *filter_0.offset(6) as libc::c_int - * *mid_ptr.offset((x_0 + 3 * 8) as isize) as libc::c_int - + *filter_0.offset(7) as libc::c_int - * *mid_ptr.offset((x_0 + 4 * 8) as isize) as libc::c_int - + ((1 as libc::c_int) << 7 + intermediate_bits >> 1) - >> 7 + intermediate_bits, - ) as pixel; - x_0 += 1; - tmy += *abcd.offset(2) as libc::c_int; - } - mid_ptr = mid_ptr.offset(8); - dst = dst.offset(dst_stride as isize); - y_0 += 1; - my += *abcd.offset(3) as libc::c_int; - } + warp_affine_8x8_rust( + dst, + dst_stride, + src, + src_stride, + abcd, + mx, + my, + BitDepth8::new(()), + ) } unsafe extern "C" fn warp_affine_8x8t_c( mut tmp: *mut int16_t, From f7754c3a17f8b52711661b618247a52d887f4033 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 3 Aug 2023 13:34:45 -0700 Subject: [PATCH 2/4] `fn warp_affine_8x8t_{c => rust}`: Deduplicate w/ generics. --- src/mc.rs | 85 +++++++++++++++++++++++++++++++++++++++++++ src/mc_tmpl_16.rs | 93 ++++++++--------------------------------------- src/mc_tmpl_8.rs | 92 ++++++++-------------------------------------- 3 files changed, 115 insertions(+), 155 deletions(-) diff --git a/src/mc.rs b/src/mc.rs index 3c2ef45ce..1f6406c0d 100644 --- a/src/mc.rs +++ b/src/mc.rs @@ -983,3 +983,88 @@ pub unsafe fn warp_affine_8x8_rust( my += *abcd.offset(3) as libc::c_int; } } + +// TODO(kkysen) temporarily `pub` until `mc` callers are deduplicated +pub unsafe fn warp_affine_8x8t_rust( + mut tmp: *mut i16, + tmp_stride: libc::ptrdiff_t, + mut src: *const BD::Pixel, + src_stride: libc::ptrdiff_t, + abcd: *const i16, + mut mx: libc::c_int, + mut my: libc::c_int, + bd: BD, +) { + let intermediate_bits = bd.get_intermediate_bits(); + let mut mid: [i16; 120] = [0; 120]; + let mut mid_ptr: *mut i16 = mid.as_mut_ptr(); + src = src.offset(-((3 * BD::pxstride(src_stride as usize)) as isize)); + let mut y = 0; + while y < 15 { + let mut x = 0; + let mut tmx = mx; + while x < 8 { + let filter: *const i8 = + (dav1d_mc_warp_filter[(64 as libc::c_int + (tmx + 512 >> 10)) as usize]).as_ptr(); + *mid_ptr.offset(x as isize) = (*filter.offset(0) as libc::c_int + * (*src.offset((x - 3 * 1) as isize)).as_::() + + *filter.offset(1) as libc::c_int + * (*src.offset((x - 2 * 1) as isize)).as_::() + + *filter.offset(2) as libc::c_int + * (*src.offset((x - 1 * 1) as isize)).as_::() + + *filter.offset(3) as libc::c_int + * (*src.offset((x + 0 * 1) as isize)).as_::() + + *filter.offset(4) as libc::c_int + * (*src.offset((x + 1 * 1) as isize)).as_::() + + *filter.offset(5) as libc::c_int + * (*src.offset((x + 2 * 1) as isize)).as_::() + + *filter.offset(6) as libc::c_int + * (*src.offset((x + 3 * 1) as isize)).as_::() + + *filter.offset(7) as libc::c_int + * (*src.offset((x + 4 * 1) as isize)).as_::() + + ((1 as libc::c_int) << 7 - intermediate_bits >> 1) + >> 7 - intermediate_bits) as i16; + x += 1; + tmx += *abcd.offset(0) as libc::c_int; + } + src = src.offset(BD::pxstride(src_stride as usize) as isize); + mid_ptr = mid_ptr.offset(8); + y += 1; + mx += *abcd.offset(1) as libc::c_int; + } + mid_ptr = &mut *mid.as_mut_ptr().offset((3 * 8) as isize) as *mut i16; + let mut y_0 = 0; + while y_0 < 8 { + let mut x_0 = 0; + let mut tmy = my; + while x_0 < 8 { + let filter_0: *const i8 = + (dav1d_mc_warp_filter[(64 as libc::c_int + (tmy + 512 >> 10)) as usize]).as_ptr(); + *tmp.offset(x_0 as isize) = ((*filter_0.offset(0) as libc::c_int + * *mid_ptr.offset((x_0 - 3 * 8) as isize) as libc::c_int + + *filter_0.offset(1) as libc::c_int + * *mid_ptr.offset((x_0 - 2 * 8) as isize) as libc::c_int + + *filter_0.offset(2) as libc::c_int + * *mid_ptr.offset((x_0 - 1 * 8) as isize) as libc::c_int + + *filter_0.offset(3) as libc::c_int + * *mid_ptr.offset((x_0 + 0 * 8) as isize) as libc::c_int + + *filter_0.offset(4) as libc::c_int + * *mid_ptr.offset((x_0 + 1 * 8) as isize) as libc::c_int + + *filter_0.offset(5) as libc::c_int + * *mid_ptr.offset((x_0 + 2 * 8) as isize) as libc::c_int + + *filter_0.offset(6) as libc::c_int + * *mid_ptr.offset((x_0 + 3 * 8) as isize) as libc::c_int + + *filter_0.offset(7) as libc::c_int + * *mid_ptr.offset((x_0 + 4 * 8) as isize) as libc::c_int + + ((1 as libc::c_int) << 7 >> 1) + >> 7) + - i32::from(BD::PREP_BIAS)) as i16; + x_0 += 1; + tmy += *abcd.offset(2) as libc::c_int; + } + mid_ptr = mid_ptr.offset(8); + tmp = tmp.offset(tmp_stride as isize); + y_0 += 1; + my += *abcd.offset(3) as libc::c_int; + } +} diff --git a/src/mc_tmpl_16.rs b/src/mc_tmpl_16.rs index 65e2bac0c..eb95a214a 100644 --- a/src/mc_tmpl_16.rs +++ b/src/mc_tmpl_16.rs @@ -1845,7 +1845,6 @@ extern "C" { ); } -use crate::src::tables::dav1d_mc_warp_filter; use crate::src::tables::dav1d_resize_filter; pub type pixel = uint16_t; @@ -2049,7 +2048,6 @@ pub struct Dav1dMCDSPContext { pub emu_edge: emu_edge_fn, pub resize: resize_fn, } -use crate::include::common::attributes::clz; use crate::include::common::intops::iclip; #[inline] unsafe extern "C" fn PXSTRIDE(x: ptrdiff_t) -> ptrdiff_t { @@ -3291,88 +3289,27 @@ unsafe extern "C" fn warp_affine_8x8_c( BitDepth16::new(bitdepth_max as u16), ) } +use crate::src::mc::warp_affine_8x8t_rust; unsafe extern "C" fn warp_affine_8x8t_c( - mut tmp: *mut int16_t, + tmp: *mut int16_t, tmp_stride: ptrdiff_t, - mut src: *const pixel, + src: *const pixel, src_stride: ptrdiff_t, abcd: *const int16_t, - mut mx: libc::c_int, - mut my: libc::c_int, + mx: libc::c_int, + my: libc::c_int, bitdepth_max: libc::c_int, ) { - let intermediate_bits = 14 as libc::c_int - (32 - clz(bitdepth_max as libc::c_uint)); - let mut mid: [int16_t; 120] = [0; 120]; - let mut mid_ptr: *mut int16_t = mid.as_mut_ptr(); - src = src.offset(-((3 * PXSTRIDE(src_stride)) as isize)); - let mut y = 0; - while y < 15 { - let mut x = 0; - let mut tmx = mx; - while x < 8 { - let filter: *const int8_t = - (dav1d_mc_warp_filter[(64 as libc::c_int + (tmx + 512 >> 10)) as usize]).as_ptr(); - *mid_ptr.offset(x as isize) = (*filter.offset(0) as libc::c_int - * *src.offset((x - 3 * 1) as isize) as libc::c_int - + *filter.offset(1) as libc::c_int - * *src.offset((x - 2 * 1) as isize) as libc::c_int - + *filter.offset(2) as libc::c_int - * *src.offset((x - 1 * 1) as isize) as libc::c_int - + *filter.offset(3) as libc::c_int - * *src.offset((x + 0 * 1) as isize) as libc::c_int - + *filter.offset(4) as libc::c_int - * *src.offset((x + 1 * 1) as isize) as libc::c_int - + *filter.offset(5) as libc::c_int - * *src.offset((x + 2 * 1) as isize) as libc::c_int - + *filter.offset(6) as libc::c_int - * *src.offset((x + 3 * 1) as isize) as libc::c_int - + *filter.offset(7) as libc::c_int - * *src.offset((x + 4 * 1) as isize) as libc::c_int - + ((1 as libc::c_int) << 7 - intermediate_bits >> 1) - >> 7 - intermediate_bits) as int16_t; - x += 1; - tmx += *abcd.offset(0) as libc::c_int; - } - src = src.offset(PXSTRIDE(src_stride) as isize); - mid_ptr = mid_ptr.offset(8); - y += 1; - mx += *abcd.offset(1) as libc::c_int; - } - mid_ptr = &mut *mid.as_mut_ptr().offset((3 * 8) as isize) as *mut int16_t; - let mut y_0 = 0; - while y_0 < 8 { - let mut x_0 = 0; - let mut tmy = my; - while x_0 < 8 { - let filter_0: *const int8_t = - (dav1d_mc_warp_filter[(64 as libc::c_int + (tmy + 512 >> 10)) as usize]).as_ptr(); - *tmp.offset(x_0 as isize) = ((*filter_0.offset(0) as libc::c_int - * *mid_ptr.offset((x_0 - 3 * 8) as isize) as libc::c_int - + *filter_0.offset(1) as libc::c_int - * *mid_ptr.offset((x_0 - 2 * 8) as isize) as libc::c_int - + *filter_0.offset(2) as libc::c_int - * *mid_ptr.offset((x_0 - 1 * 8) as isize) as libc::c_int - + *filter_0.offset(3) as libc::c_int - * *mid_ptr.offset((x_0 + 0 * 8) as isize) as libc::c_int - + *filter_0.offset(4) as libc::c_int - * *mid_ptr.offset((x_0 + 1 * 8) as isize) as libc::c_int - + *filter_0.offset(5) as libc::c_int - * *mid_ptr.offset((x_0 + 2 * 8) as isize) as libc::c_int - + *filter_0.offset(6) as libc::c_int - * *mid_ptr.offset((x_0 + 3 * 8) as isize) as libc::c_int - + *filter_0.offset(7) as libc::c_int - * *mid_ptr.offset((x_0 + 4 * 8) as isize) as libc::c_int - + ((1 as libc::c_int) << 7 >> 1) - >> 7) - - 8192) as int16_t; - x_0 += 1; - tmy += *abcd.offset(2) as libc::c_int; - } - mid_ptr = mid_ptr.offset(8); - tmp = tmp.offset(tmp_stride as isize); - y_0 += 1; - my += *abcd.offset(3) as libc::c_int; - } + warp_affine_8x8t_rust( + tmp, + tmp_stride, + src, + src_stride, + abcd, + mx, + my, + BitDepth16::new(bitdepth_max as u16), + ) } unsafe extern "C" fn emu_edge_c( bw: intptr_t, diff --git a/src/mc_tmpl_8.rs b/src/mc_tmpl_8.rs index 5b66ef230..c1c907856 100644 --- a/src/mc_tmpl_8.rs +++ b/src/mc_tmpl_8.rs @@ -1816,7 +1816,6 @@ extern "C" { ); } -use crate::src::tables::dav1d_mc_warp_filter; use crate::src::tables::dav1d_resize_filter; pub type pixel = uint8_t; @@ -3152,87 +3151,26 @@ unsafe extern "C" fn warp_affine_8x8_c( BitDepth8::new(()), ) } +use crate::src::mc::warp_affine_8x8t_rust; unsafe extern "C" fn warp_affine_8x8t_c( - mut tmp: *mut int16_t, + tmp: *mut int16_t, tmp_stride: ptrdiff_t, - mut src: *const pixel, + src: *const pixel, src_stride: ptrdiff_t, abcd: *const int16_t, - mut mx: libc::c_int, - mut my: libc::c_int, + mx: libc::c_int, + my: libc::c_int, ) { - let intermediate_bits = 4; - let mut mid: [int16_t; 120] = [0; 120]; - let mut mid_ptr: *mut int16_t = mid.as_mut_ptr(); - src = src.offset(-((3 * src_stride) as isize)); - let mut y = 0; - while y < 15 { - let mut x = 0; - let mut tmx = mx; - while x < 8 { - let filter: *const int8_t = - (dav1d_mc_warp_filter[(64 as libc::c_int + (tmx + 512 >> 10)) as usize]).as_ptr(); - *mid_ptr.offset(x as isize) = (*filter.offset(0) as libc::c_int - * *src.offset((x - 3 * 1) as isize) as libc::c_int - + *filter.offset(1) as libc::c_int - * *src.offset((x - 2 * 1) as isize) as libc::c_int - + *filter.offset(2) as libc::c_int - * *src.offset((x - 1 * 1) as isize) as libc::c_int - + *filter.offset(3) as libc::c_int - * *src.offset((x + 0 * 1) as isize) as libc::c_int - + *filter.offset(4) as libc::c_int - * *src.offset((x + 1 * 1) as isize) as libc::c_int - + *filter.offset(5) as libc::c_int - * *src.offset((x + 2 * 1) as isize) as libc::c_int - + *filter.offset(6) as libc::c_int - * *src.offset((x + 3 * 1) as isize) as libc::c_int - + *filter.offset(7) as libc::c_int - * *src.offset((x + 4 * 1) as isize) as libc::c_int - + ((1 as libc::c_int) << 7 - intermediate_bits >> 1) - >> 7 - intermediate_bits) as int16_t; - x += 1; - tmx += *abcd.offset(0) as libc::c_int; - } - src = src.offset(src_stride as isize); - mid_ptr = mid_ptr.offset(8); - y += 1; - mx += *abcd.offset(1) as libc::c_int; - } - mid_ptr = &mut *mid.as_mut_ptr().offset((3 * 8) as isize) as *mut int16_t; - let mut y_0 = 0; - while y_0 < 8 { - let mut x_0 = 0; - let mut tmy = my; - while x_0 < 8 { - let filter_0: *const int8_t = - (dav1d_mc_warp_filter[(64 as libc::c_int + (tmy + 512 >> 10)) as usize]).as_ptr(); - *tmp.offset(x_0 as isize) = ((*filter_0.offset(0) as libc::c_int - * *mid_ptr.offset((x_0 - 3 * 8) as isize) as libc::c_int - + *filter_0.offset(1) as libc::c_int - * *mid_ptr.offset((x_0 - 2 * 8) as isize) as libc::c_int - + *filter_0.offset(2) as libc::c_int - * *mid_ptr.offset((x_0 - 1 * 8) as isize) as libc::c_int - + *filter_0.offset(3) as libc::c_int - * *mid_ptr.offset((x_0 + 0 * 8) as isize) as libc::c_int - + *filter_0.offset(4) as libc::c_int - * *mid_ptr.offset((x_0 + 1 * 8) as isize) as libc::c_int - + *filter_0.offset(5) as libc::c_int - * *mid_ptr.offset((x_0 + 2 * 8) as isize) as libc::c_int - + *filter_0.offset(6) as libc::c_int - * *mid_ptr.offset((x_0 + 3 * 8) as isize) as libc::c_int - + *filter_0.offset(7) as libc::c_int - * *mid_ptr.offset((x_0 + 4 * 8) as isize) as libc::c_int - + ((1 as libc::c_int) << 7 >> 1) - >> 7) - - 0) as int16_t; - x_0 += 1; - tmy += *abcd.offset(2) as libc::c_int; - } - mid_ptr = mid_ptr.offset(8); - tmp = tmp.offset(tmp_stride as isize); - y_0 += 1; - my += *abcd.offset(3) as libc::c_int; - } + warp_affine_8x8t_rust( + tmp, + tmp_stride, + src, + src_stride, + abcd, + mx, + my, + BitDepth8::new(()), + ) } unsafe extern "C" fn emu_edge_c( bw: intptr_t, From bf88f22d36357a5db47773539ecf178c5362405f Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 3 Aug 2023 14:37:15 -0700 Subject: [PATCH 3/4] `fn emu_edge_{c => rust}`: Deduplicate w/ generics. --- src/mc.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++++ src/mc_tmpl_16.rs | 85 ++--------------------------------------- src/mc_tmpl_8.rs | 79 ++------------------------------------ 3 files changed, 104 insertions(+), 156 deletions(-) diff --git a/src/mc.rs b/src/mc.rs index 1f6406c0d..fab9ea12b 100644 --- a/src/mc.rs +++ b/src/mc.rs @@ -1,6 +1,7 @@ use std::iter; use crate::include::common::bitdepth::{AsPrimitive, BitDepth}; +use crate::include::common::intops::iclip; use crate::include::dav1d::headers::Dav1dFilterMode; use crate::src::tables::dav1d_mc_subpel_filters; use crate::src::tables::dav1d_mc_warp_filter; @@ -1068,3 +1069,98 @@ pub unsafe fn warp_affine_8x8t_rust( my += *abcd.offset(3) as libc::c_int; } } + +// TODO(kkysen) temporarily `pub` until `mc` callers are deduplicated +pub unsafe fn emu_edge_rust( + bw: libc::intptr_t, + bh: libc::intptr_t, + iw: libc::intptr_t, + ih: libc::intptr_t, + x: libc::intptr_t, + y: libc::intptr_t, + mut dst: *mut BD::Pixel, + dst_stride: libc::ptrdiff_t, + mut r#ref: *const BD::Pixel, + ref_stride: libc::ptrdiff_t, +) { + r#ref = r#ref.offset( + iclip(y as libc::c_int, 0 as libc::c_int, ih as libc::c_int - 1) as isize + * BD::pxstride(ref_stride as usize) as isize + + iclip(x as libc::c_int, 0 as libc::c_int, iw as libc::c_int - 1) as isize, + ); + let left_ext = iclip(-x as libc::c_int, 0 as libc::c_int, bw as libc::c_int - 1); + let right_ext = iclip( + (x + bw - iw) as libc::c_int, + 0 as libc::c_int, + bw as libc::c_int - 1, + ); + if !(((left_ext + right_ext) as isize) < bw) { + unreachable!(); + } + let top_ext = iclip(-y as libc::c_int, 0 as libc::c_int, bh as libc::c_int - 1); + let bottom_ext = iclip( + (y + bh - ih) as libc::c_int, + 0 as libc::c_int, + bh as libc::c_int - 1, + ); + if !(((top_ext + bottom_ext) as isize) < bh) { + unreachable!(); + } + let mut blk: *mut BD::Pixel = + dst.offset((top_ext as isize * BD::pxstride(dst_stride as usize) as isize) as isize); + let center_w = (bw - left_ext as isize - right_ext as isize) as libc::c_int; + let center_h = (bh - top_ext as isize - bottom_ext as isize) as libc::c_int; + let mut y_0 = 0; + while y_0 < center_h { + BD::pixel_copy( + std::slice::from_raw_parts_mut(blk.offset(left_ext as isize), center_w as usize), + std::slice::from_raw_parts(r#ref, center_w as usize), + center_w as usize, + ); + if left_ext != 0 { + BD::pixel_set( + std::slice::from_raw_parts_mut(blk, left_ext as usize), + *blk.offset(left_ext as isize), + left_ext as usize, + ); + } + if right_ext != 0 { + BD::pixel_set( + std::slice::from_raw_parts_mut( + blk.offset(left_ext as isize).offset(center_w as isize), + right_ext as usize, + ), + *blk.offset((left_ext + center_w - 1) as isize), + right_ext as usize, + ); + } + r#ref = r#ref.offset(BD::pxstride(ref_stride as usize) as isize); + blk = blk.offset(BD::pxstride(dst_stride as usize) as isize); + y_0 += 1; + } + blk = dst.offset((top_ext as isize * BD::pxstride(dst_stride as usize) as isize) as isize); + let mut y_1 = 0; + while y_1 < top_ext { + BD::pixel_copy( + std::slice::from_raw_parts_mut(dst, bw as usize), + std::slice::from_raw_parts(blk, bw as usize), + bw as usize, + ); + dst = dst.offset(BD::pxstride(dst_stride as usize) as isize); + y_1 += 1; + } + dst = dst.offset((center_h as isize * BD::pxstride(dst_stride as usize) as isize) as isize); + let mut y_2 = 0; + while y_2 < bottom_ext { + BD::pixel_copy( + std::slice::from_raw_parts_mut(dst, bw as usize), + std::slice::from_raw_parts( + dst.offset(-(BD::pxstride(dst_stride as usize) as isize)), + bw as usize, + ), + bw as usize, + ); + dst = dst.offset(BD::pxstride(dst_stride as usize) as isize); + y_2 += 1; + } +} diff --git a/src/mc_tmpl_16.rs b/src/mc_tmpl_16.rs index eb95a214a..debe6b308 100644 --- a/src/mc_tmpl_16.rs +++ b/src/mc_tmpl_16.rs @@ -2056,14 +2056,6 @@ unsafe extern "C" fn PXSTRIDE(x: ptrdiff_t) -> ptrdiff_t { } return x >> 1; } -#[inline] -unsafe extern "C" fn pixel_set(dst: *mut pixel, val: libc::c_int, num: libc::c_int) { - let mut n = 0; - while n < num { - *dst.offset(n as isize) = val as pixel; - n += 1; - } -} use crate::src::mc::prep_8tap_rust; use crate::src::mc::prep_8tap_scaled_rust; use crate::src::mc::put_8tap_rust; @@ -3311,6 +3303,7 @@ unsafe extern "C" fn warp_affine_8x8t_c( BitDepth16::new(bitdepth_max as u16), ) } +use crate::src::mc::emu_edge_rust; unsafe extern "C" fn emu_edge_c( bw: intptr_t, bh: intptr_t, @@ -3318,82 +3311,12 @@ unsafe extern "C" fn emu_edge_c( ih: intptr_t, x: intptr_t, y: intptr_t, - mut dst: *mut pixel, + dst: *mut pixel, dst_stride: ptrdiff_t, - mut r#ref: *const pixel, + r#ref: *const pixel, ref_stride: ptrdiff_t, ) { - r#ref = r#ref.offset( - iclip(y as libc::c_int, 0 as libc::c_int, ih as libc::c_int - 1) as isize - * PXSTRIDE(ref_stride) - + iclip(x as libc::c_int, 0 as libc::c_int, iw as libc::c_int - 1) as isize, - ); - let left_ext = iclip(-x as libc::c_int, 0 as libc::c_int, bw as libc::c_int - 1); - let right_ext = iclip( - (x + bw - iw) as libc::c_int, - 0 as libc::c_int, - bw as libc::c_int - 1, - ); - if !(((left_ext + right_ext) as isize) < bw) { - unreachable!(); - } - let top_ext = iclip(-y as libc::c_int, 0 as libc::c_int, bh as libc::c_int - 1); - let bottom_ext = iclip( - (y + bh - ih) as libc::c_int, - 0 as libc::c_int, - bh as libc::c_int - 1, - ); - if !(((top_ext + bottom_ext) as isize) < bh) { - unreachable!(); - } - let mut blk: *mut pixel = dst.offset((top_ext as isize * PXSTRIDE(dst_stride)) as isize); - let center_w = (bw - left_ext as isize - right_ext as isize) as libc::c_int; - let center_h = (bh - top_ext as isize - bottom_ext as isize) as libc::c_int; - let mut y_0 = 0; - while y_0 < center_h { - memcpy( - blk.offset(left_ext as isize) as *mut libc::c_void, - r#ref as *const libc::c_void, - (center_w << 1) as libc::c_ulong, - ); - if left_ext != 0 { - pixel_set(blk, *blk.offset(left_ext as isize) as libc::c_int, left_ext); - } - if right_ext != 0 { - pixel_set( - blk.offset(left_ext as isize).offset(center_w as isize), - *blk.offset((left_ext + center_w - 1) as isize) as libc::c_int, - right_ext, - ); - } - r#ref = r#ref.offset(PXSTRIDE(ref_stride) as isize); - blk = blk.offset(PXSTRIDE(dst_stride) as isize); - y_0 += 1; - } - blk = dst.offset((top_ext as isize * PXSTRIDE(dst_stride)) as isize); - let mut y_1 = 0; - while y_1 < top_ext { - memcpy( - dst as *mut libc::c_void, - blk as *const libc::c_void, - (bw << 1) as libc::c_ulong, - ); - dst = dst.offset(PXSTRIDE(dst_stride) as isize); - y_1 += 1; - } - dst = dst.offset((center_h as isize * PXSTRIDE(dst_stride)) as isize); - let mut y_2 = 0; - while y_2 < bottom_ext { - memcpy( - dst as *mut libc::c_void, - &mut *dst.offset( - -(PXSTRIDE as unsafe extern "C" fn(ptrdiff_t) -> ptrdiff_t)(dst_stride) as isize, - ) as *mut pixel as *const libc::c_void, - (bw << 1) as libc::c_ulong, - ); - dst = dst.offset(PXSTRIDE(dst_stride) as isize); - y_2 += 1; - } + emu_edge_rust::(bw, bh, iw, ih, x, y, dst, dst_stride, r#ref, ref_stride) } unsafe extern "C" fn resize_c( mut dst: *mut pixel, diff --git a/src/mc_tmpl_8.rs b/src/mc_tmpl_8.rs index c1c907856..78fb5b4b3 100644 --- a/src/mc_tmpl_8.rs +++ b/src/mc_tmpl_8.rs @@ -3172,6 +3172,7 @@ unsafe extern "C" fn warp_affine_8x8t_c( BitDepth8::new(()), ) } +use crate::src::mc::emu_edge_rust; unsafe extern "C" fn emu_edge_c( bw: intptr_t, bh: intptr_t, @@ -3179,84 +3180,12 @@ unsafe extern "C" fn emu_edge_c( ih: intptr_t, x: intptr_t, y: intptr_t, - mut dst: *mut pixel, + dst: *mut pixel, dst_stride: ptrdiff_t, - mut r#ref: *const pixel, + r#ref: *const pixel, ref_stride: ptrdiff_t, ) { - r#ref = r#ref.offset( - (iclip(y as libc::c_int, 0 as libc::c_int, ih as libc::c_int - 1) as isize * ref_stride - + iclip(x as libc::c_int, 0 as libc::c_int, iw as libc::c_int - 1) as isize) - as isize, - ); - let left_ext = iclip(-x as libc::c_int, 0 as libc::c_int, bw as libc::c_int - 1); - let right_ext = iclip( - (x + bw - iw) as libc::c_int, - 0 as libc::c_int, - bw as libc::c_int - 1, - ); - if !(((left_ext + right_ext) as isize) < bw) { - unreachable!(); - } - let top_ext = iclip(-y as libc::c_int, 0 as libc::c_int, bh as libc::c_int - 1); - let bottom_ext = iclip( - (y + bh - ih) as libc::c_int, - 0 as libc::c_int, - bh as libc::c_int - 1, - ); - if !(((top_ext + bottom_ext) as isize) < bh) { - unreachable!(); - } - let mut blk: *mut pixel = dst.offset((top_ext as isize * dst_stride) as isize); - let center_w = (bw - left_ext as isize - right_ext as isize) as libc::c_int; - let center_h = (bh - top_ext as isize - bottom_ext as isize) as libc::c_int; - let mut y_0 = 0; - while y_0 < center_h { - memcpy( - blk.offset(left_ext as isize) as *mut libc::c_void, - r#ref as *const libc::c_void, - center_w as libc::c_ulong, - ); - if left_ext != 0 { - memset( - blk as *mut libc::c_void, - *blk.offset(left_ext as isize) as libc::c_int, - left_ext as libc::c_ulong, - ); - } - if right_ext != 0 { - memset( - blk.offset(left_ext as isize).offset(center_w as isize) as *mut libc::c_void, - *blk.offset((left_ext + center_w - 1) as isize) as libc::c_int, - right_ext as libc::c_ulong, - ); - } - r#ref = r#ref.offset(ref_stride as isize); - blk = blk.offset(dst_stride as isize); - y_0 += 1; - } - blk = dst.offset((top_ext as isize * dst_stride) as isize); - let mut y_1 = 0; - while y_1 < top_ext { - memcpy( - dst as *mut libc::c_void, - blk as *const libc::c_void, - bw as libc::c_ulong, - ); - dst = dst.offset(dst_stride as isize); - y_1 += 1; - } - dst = dst.offset((center_h as isize * dst_stride) as isize); - let mut y_2 = 0; - while y_2 < bottom_ext { - memcpy( - dst as *mut libc::c_void, - &mut *dst.offset(-dst_stride as isize) as *mut pixel as *const libc::c_void, - bw as libc::c_ulong, - ); - dst = dst.offset(dst_stride as isize); - y_2 += 1; - } + emu_edge_rust::(bw, bh, iw, ih, x, y, dst, dst_stride, r#ref, ref_stride) } unsafe extern "C" fn resize_c( mut dst: *mut pixel, From 0e349c26666761009e7387de04a4ed0c6088b8e2 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 3 Aug 2023 14:44:47 -0700 Subject: [PATCH 4/4] `fn resize_{c => rust}`: Deduplicate w/ generics. --- src/mc.rs | 62 ++++++++++++++++++++++++++++++++++++++ src/mc_tmpl_16.rs | 77 ++++++++++------------------------------------- src/mc_tmpl_8.rs | 69 ++++++++++-------------------------------- 3 files changed, 94 insertions(+), 114 deletions(-) diff --git a/src/mc.rs b/src/mc.rs index fab9ea12b..178025ee8 100644 --- a/src/mc.rs +++ b/src/mc.rs @@ -6,6 +6,7 @@ use crate::include::dav1d::headers::Dav1dFilterMode; use crate::src::tables::dav1d_mc_subpel_filters; use crate::src::tables::dav1d_mc_warp_filter; use crate::src::tables::dav1d_obmc_masks; +use crate::src::tables::dav1d_resize_filter; // TODO(kkysen) temporarily `pub` until `mc` callers are deduplicated #[inline(never)] @@ -1164,3 +1165,64 @@ pub unsafe fn emu_edge_rust( y_2 += 1; } } + +// TODO(kkysen) temporarily `pub` until `mc` callers are deduplicated +pub unsafe fn resize_rust( + mut dst: *mut BD::Pixel, + dst_stride: libc::ptrdiff_t, + mut src: *const BD::Pixel, + src_stride: libc::ptrdiff_t, + dst_w: libc::c_int, + mut h: libc::c_int, + src_w: libc::c_int, + dx: libc::c_int, + mx0: libc::c_int, + bd: BD, +) { + loop { + let mut mx = mx0; + let mut src_x = -(1 as libc::c_int); + let mut x = 0; + while x < dst_w { + let F: *const i8 = (dav1d_resize_filter[(mx >> 8) as usize]).as_ptr(); + *dst.offset(x as isize) = bd.iclip_pixel( + -(*F.offset(0) as libc::c_int + * (*src.offset(iclip(src_x - 3, 0 as libc::c_int, src_w - 1) as isize)) + .as_::() + + *F.offset(1) as libc::c_int + * (*src.offset(iclip(src_x - 2, 0 as libc::c_int, src_w - 1) as isize)) + .as_::() + + *F.offset(2) as libc::c_int + * (*src.offset(iclip(src_x - 1, 0 as libc::c_int, src_w - 1) as isize)) + .as_::() + + *F.offset(3) as libc::c_int + * (*src.offset(iclip(src_x + 0, 0 as libc::c_int, src_w - 1) as isize)) + .as_::() + + *F.offset(4) as libc::c_int + * (*src.offset(iclip(src_x + 1, 0 as libc::c_int, src_w - 1) as isize)) + .as_::() + + *F.offset(5) as libc::c_int + * (*src.offset(iclip(src_x + 2, 0 as libc::c_int, src_w - 1) as isize)) + .as_::() + + *F.offset(6) as libc::c_int + * (*src.offset(iclip(src_x + 3, 0 as libc::c_int, src_w - 1) as isize)) + .as_::() + + *F.offset(7) as libc::c_int + * (*src.offset(iclip(src_x + 4, 0 as libc::c_int, src_w - 1) as isize)) + .as_::()) + + 64 + >> 7, + ); + mx += dx; + src_x += mx >> 14; + mx &= 0x3fff as libc::c_int; + x += 1; + } + dst = dst.offset(BD::pxstride(dst_stride as usize) as isize); + src = src.offset(BD::pxstride(src_stride as usize) as isize); + h -= 1; + if !(h != 0) { + break; + } + } +} diff --git a/src/mc_tmpl_16.rs b/src/mc_tmpl_16.rs index debe6b308..1c022d50c 100644 --- a/src/mc_tmpl_16.rs +++ b/src/mc_tmpl_16.rs @@ -1845,8 +1845,6 @@ extern "C" { ); } -use crate::src::tables::dav1d_resize_filter; - pub type pixel = uint16_t; use crate::include::dav1d::headers::DAV1D_FILTER_8TAP_REGULAR; @@ -2048,14 +2046,6 @@ pub struct Dav1dMCDSPContext { pub emu_edge: emu_edge_fn, pub resize: resize_fn, } -use crate::include::common::intops::iclip; -#[inline] -unsafe extern "C" fn PXSTRIDE(x: ptrdiff_t) -> ptrdiff_t { - if x & 1 != 0 { - unreachable!(); - } - return x >> 1; -} use crate::src::mc::prep_8tap_rust; use crate::src::mc::prep_8tap_scaled_rust; use crate::src::mc::put_8tap_rust; @@ -3318,66 +3308,31 @@ unsafe extern "C" fn emu_edge_c( ) { emu_edge_rust::(bw, bh, iw, ih, x, y, dst, dst_stride, r#ref, ref_stride) } +use crate::src::mc::resize_rust; unsafe extern "C" fn resize_c( - mut dst: *mut pixel, + dst: *mut pixel, dst_stride: ptrdiff_t, - mut src: *const pixel, + src: *const pixel, src_stride: ptrdiff_t, dst_w: libc::c_int, - mut h: libc::c_int, + h: libc::c_int, src_w: libc::c_int, dx: libc::c_int, mx0: libc::c_int, bitdepth_max: libc::c_int, ) { - loop { - let mut mx = mx0; - let mut src_x = -(1 as libc::c_int); - let mut x = 0; - while x < dst_w { - let F: *const int8_t = (dav1d_resize_filter[(mx >> 8) as usize]).as_ptr(); - *dst.offset(x as isize) = iclip( - -(*F.offset(0) as libc::c_int - * *src.offset(iclip(src_x - 3, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(1) as libc::c_int - * *src.offset(iclip(src_x - 2, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(2) as libc::c_int - * *src.offset(iclip(src_x - 1, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(3) as libc::c_int - * *src.offset(iclip(src_x + 0, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(4) as libc::c_int - * *src.offset(iclip(src_x + 1, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(5) as libc::c_int - * *src.offset(iclip(src_x + 2, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(6) as libc::c_int - * *src.offset(iclip(src_x + 3, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(7) as libc::c_int - * *src.offset(iclip(src_x + 4, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int) - + 64 - >> 7, - 0 as libc::c_int, - bitdepth_max, - ) as pixel; - mx += dx; - src_x += mx >> 14; - mx &= 0x3fff as libc::c_int; - x += 1; - } - dst = dst.offset(PXSTRIDE(dst_stride) as isize); - src = src.offset(PXSTRIDE(src_stride) as isize); - h -= 1; - if !(h != 0) { - break; - } - } + resize_rust( + dst, + dst_stride, + src, + src_stride, + dst_w, + h, + src_w, + dx, + mx0, + BitDepth16::new(bitdepth_max as u16), + ) } #[cfg(feature = "asm")] diff --git a/src/mc_tmpl_8.rs b/src/mc_tmpl_8.rs index 78fb5b4b3..1672a8ba1 100644 --- a/src/mc_tmpl_8.rs +++ b/src/mc_tmpl_8.rs @@ -1816,8 +1816,6 @@ extern "C" { ); } -use crate::src::tables::dav1d_resize_filter; - pub type pixel = uint8_t; use crate::include::dav1d::headers::DAV1D_FILTER_8TAP_REGULAR; @@ -2008,8 +2006,6 @@ pub struct Dav1dMCDSPContext { pub emu_edge: emu_edge_fn, pub resize: resize_fn, } -use crate::include::common::intops::iclip; -use crate::include::common::intops::iclip_u8; use crate::src::mc::prep_8tap_rust; use crate::src::mc::prep_8tap_scaled_rust; use crate::src::mc::put_8tap_rust; @@ -3187,63 +3183,30 @@ unsafe extern "C" fn emu_edge_c( ) { emu_edge_rust::(bw, bh, iw, ih, x, y, dst, dst_stride, r#ref, ref_stride) } +use crate::src::mc::resize_rust; unsafe extern "C" fn resize_c( - mut dst: *mut pixel, + dst: *mut pixel, dst_stride: ptrdiff_t, - mut src: *const pixel, + src: *const pixel, src_stride: ptrdiff_t, dst_w: libc::c_int, - mut h: libc::c_int, + h: libc::c_int, src_w: libc::c_int, dx: libc::c_int, mx0: libc::c_int, ) { - loop { - let mut mx = mx0; - let mut src_x = -(1 as libc::c_int); - let mut x = 0; - while x < dst_w { - let F: *const int8_t = (dav1d_resize_filter[(mx >> 8) as usize]).as_ptr(); - *dst.offset(x as isize) = iclip_u8( - -(*F.offset(0) as libc::c_int - * *src.offset(iclip(src_x - 3, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(1) as libc::c_int - * *src.offset(iclip(src_x - 2, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(2) as libc::c_int - * *src.offset(iclip(src_x - 1, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(3) as libc::c_int - * *src.offset(iclip(src_x + 0, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(4) as libc::c_int - * *src.offset(iclip(src_x + 1, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(5) as libc::c_int - * *src.offset(iclip(src_x + 2, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(6) as libc::c_int - * *src.offset(iclip(src_x + 3, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int - + *F.offset(7) as libc::c_int - * *src.offset(iclip(src_x + 4, 0 as libc::c_int, src_w - 1) as isize) - as libc::c_int) - + 64 - >> 7, - ) as pixel; - mx += dx; - src_x += mx >> 14; - mx &= 0x3fff as libc::c_int; - x += 1; - } - dst = dst.offset(dst_stride as isize); - src = src.offset(src_stride as isize); - h -= 1; - if !(h != 0) { - break; - } - } + resize_rust( + dst, + dst_stride, + src, + src_stride, + dst_w, + h, + src_w, + dx, + mx0, + BitDepth8::new(()), + ) } #[cfg(all(feature = "asm", any(target_arch = "x86", target_arch = "x86_64")))]