From 3dc3224afc46ca954af55ce5fe71303aca46ed6d Mon Sep 17 00:00:00 2001 From: Nicole L Date: Tue, 22 Aug 2023 10:47:07 -0700 Subject: [PATCH] `struct Dav1dLoopFilterDSPContext`: Deduplicate and type-erase fn pointers (#377) --- lib.rs | 1 + src/cdef_apply_tmpl_16.rs | 19 +- src/cdef_apply_tmpl_8.rs | 18 +- src/cdf.rs | 18 +- src/decode.rs | 18 +- src/lf_apply_tmpl_16.rs | 43 ++--- src/lf_apply_tmpl_8.rs | 48 ++--- src/lib.rs | 19 +- src/log.rs | 18 +- src/loopfilter.rs | 379 ++++++++++++++++++++++++++++++++++++++ src/loopfilter_tmpl_16.rs | 324 ++++++++++++-------------------- src/loopfilter_tmpl_8.rs | 279 +++++++++------------------- src/lr_apply_tmpl_16.rs | 19 +- src/lr_apply_tmpl_8.rs | 18 +- src/obu.rs | 18 +- src/picture.rs | 18 +- src/recon_tmpl_16.rs | 19 +- src/recon_tmpl_8.rs | 18 +- src/thread_task.rs | 18 +- 19 files changed, 625 insertions(+), 687 deletions(-) create mode 100644 src/loopfilter.rs diff --git a/lib.rs b/lib.rs index 748dcacea..0ab0c79bd 100644 --- a/lib.rs +++ b/lib.rs @@ -91,6 +91,7 @@ pub mod src { pub mod lf_mask; pub mod lib; pub mod log; + pub mod loopfilter; #[cfg(feature = "bitdepth_16")] pub mod loopfilter_tmpl_16; #[cfg(feature = "bitdepth_8")] diff --git a/src/cdef_apply_tmpl_16.rs b/src/cdef_apply_tmpl_16.rs index e1e1fd1a2..72b9342a2 100644 --- a/src/cdef_apply_tmpl_16.rs +++ b/src/cdef_apply_tmpl_16.rs @@ -96,7 +96,6 @@ use crate::src::align::Align16; use crate::src::internal::Dav1dFrameContext_frame_thread; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::levels::Av1Block; use crate::src::refmvs::refmvs_frame; @@ -246,23 +245,7 @@ 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; -#[derive(Copy, Clone)] -#[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - libc::c_int, - ) -> (), ->; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; #[derive(Copy, Clone)] #[repr(C)] pub struct Dav1dInvTxfmDSPContext { diff --git a/src/cdef_apply_tmpl_8.rs b/src/cdef_apply_tmpl_8.rs index 3d422f955..8e3984dcb 100644 --- a/src/cdef_apply_tmpl_8.rs +++ b/src/cdef_apply_tmpl_8.rs @@ -97,7 +97,6 @@ use crate::src::align::Align16; use crate::src::internal::Dav1dFrameContext_frame_thread; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::levels::Av1Block; use crate::src::refmvs::refmvs_frame; @@ -247,22 +246,7 @@ 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; -#[derive(Copy, Clone)] -#[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; #[derive(Copy, Clone)] #[repr(C)] pub struct Dav1dInvTxfmDSPContext { diff --git a/src/cdf.rs b/src/cdf.rs index d68f7a79d..9619a35e2 100644 --- a/src/cdf.rs +++ b/src/cdf.rs @@ -97,7 +97,6 @@ use crate::src::align::Align16; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; pub type pixel = (); -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::Dav1dFrameContext_frame_thread; @@ -343,25 +342,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut libc::c_void, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/decode.rs b/src/decode.rs index 0cd6671ec..dd2b6429b 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -322,7 +322,6 @@ use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; pub type pixel = (); use crate::src::internal::Dav1dFrameContext_frame_thread; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::lf_mask::Av1Restoration; use crate::src::lf_mask::Av1RestorationUnit; pub type coef = (); @@ -515,25 +514,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut libc::c_void, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/lf_apply_tmpl_16.rs b/src/lf_apply_tmpl_16.rs index dc0f3fd46..90d1e1ad8 100644 --- a/src/lf_apply_tmpl_16.rs +++ b/src/lf_apply_tmpl_16.rs @@ -91,7 +91,6 @@ use crate::include::dav1d::headers::Dav1dSequenceHeader; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::Dav1dFrameContext_frame_thread; @@ -236,26 +235,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } @@ -902,8 +885,8 @@ unsafe extern "C" fn filter_plane_cols_y( hmask[2] = (*mask.offset(x as isize))[2][1] as uint32_t; } hmask[3] = 0 as libc::c_int as uint32_t; - ((*dsp).lf.loop_filter_sb[0][0]).expect("non-null function pointer")( - &mut *dst.offset((x * 4) as isize), + (*dsp).lf.loop_filter_sb[0][0]( + dst.offset((x * 4) as isize).cast(), ls, hmask.as_mut_ptr(), &*(*lvl.offset(x as isize)).as_ptr().offset(0) as *const uint8_t @@ -943,8 +926,8 @@ unsafe extern "C" fn filter_plane_rows_y( | ((*mask.offset(y as isize))[2][1] as libc::c_uint) << 16, 0 as libc::c_int as uint32_t, ]; - ((*dsp).lf.loop_filter_sb[0][1]).expect("non-null function pointer")( - dst, + (*dsp).lf.loop_filter_sb[0][1]( + dst.cast(), ls, vmask.as_ptr(), &*(*lvl.offset(0)).as_ptr().offset(1) as *const uint8_t as *const [uint8_t; 4], @@ -993,8 +976,8 @@ unsafe extern "C" fn filter_plane_cols_uv( hmask[1] = (*mask.offset(x as isize))[1][1] as uint32_t; } hmask[2] = 0 as libc::c_int as uint32_t; - ((*dsp).lf.loop_filter_sb[1][0]).expect("non-null function pointer")( - &mut *u.offset((x * 4) as isize), + (*dsp).lf.loop_filter_sb[1][0]( + u.offset((x * 4) as isize).cast(), ls, hmask.as_mut_ptr(), &*(*lvl.offset(x as isize)).as_ptr().offset(2) as *const uint8_t @@ -1004,8 +987,8 @@ unsafe extern "C" fn filter_plane_cols_uv( endy4 - starty4, (*f).bitdepth_max, ); - ((*dsp).lf.loop_filter_sb[1][0]).expect("non-null function pointer")( - &mut *v.offset((x * 4) as isize), + (*dsp).lf.loop_filter_sb[1][0]( + v.offset((x * 4) as isize).cast(), ls, hmask.as_mut_ptr(), &*(*lvl.offset(x as isize)).as_ptr().offset(3) as *const uint8_t @@ -1046,8 +1029,8 @@ unsafe extern "C" fn filter_plane_rows_uv( | ((*mask.offset(y as isize))[1][1] as libc::c_uint) << (16 >> ss_hor), 0 as libc::c_int as uint32_t, ]; - ((*dsp).lf.loop_filter_sb[1][1]).expect("non-null function pointer")( - &mut *u.offset(off_l as isize), + (*dsp).lf.loop_filter_sb[1][1]( + u.offset(off_l as isize).cast(), ls, vmask.as_ptr(), &*(*lvl.offset(0)).as_ptr().offset(2) as *const uint8_t as *const [uint8_t; 4], @@ -1056,8 +1039,8 @@ unsafe extern "C" fn filter_plane_rows_uv( w, (*f).bitdepth_max, ); - ((*dsp).lf.loop_filter_sb[1][1]).expect("non-null function pointer")( - &mut *v.offset(off_l as isize), + (*dsp).lf.loop_filter_sb[1][1]( + v.offset(off_l as isize).cast(), ls, vmask.as_ptr(), &*(*lvl.offset(0)).as_ptr().offset(3) as *const uint8_t as *const [uint8_t; 4], diff --git a/src/lf_apply_tmpl_8.rs b/src/lf_apply_tmpl_8.rs index 3dd3e5389..a87fe63ba 100644 --- a/src/lf_apply_tmpl_8.rs +++ b/src/lf_apply_tmpl_8.rs @@ -92,7 +92,6 @@ use crate::include::dav1d::headers::Dav1dSequenceHeader; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::Dav1dFrameContext_frame_thread; @@ -237,25 +236,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } @@ -852,8 +836,8 @@ unsafe extern "C" fn filter_plane_cols_y( hmask[2] = (*mask.offset(x as isize))[2][1] as uint32_t; } hmask[3] = 0 as libc::c_int as uint32_t; - ((*dsp).lf.loop_filter_sb[0][0]).expect("non-null function pointer")( - &mut *dst.offset((x * 4) as isize), + (*dsp).lf.loop_filter_sb[0][0]( + dst.offset((x * 4) as isize).cast(), ls, hmask.as_mut_ptr(), &*(*lvl.offset(x as isize)).as_ptr().offset(0) as *const uint8_t @@ -861,6 +845,7 @@ unsafe extern "C" fn filter_plane_cols_y( b4_stride, &(*f).lf.lim_lut.0, endy4 - starty4, + 8, ); } x += 1; @@ -892,14 +877,15 @@ unsafe extern "C" fn filter_plane_rows_y( | ((*mask.offset(y as isize))[2][1] as libc::c_uint) << 16, 0 as libc::c_int as uint32_t, ]; - ((*dsp).lf.loop_filter_sb[0][1]).expect("non-null function pointer")( - dst, + (*dsp).lf.loop_filter_sb[0][1]( + dst.cast(), ls, vmask.as_ptr(), &*(*lvl.offset(0)).as_ptr().offset(1) as *const uint8_t as *const [uint8_t; 4], b4_stride, &(*f).lf.lim_lut.0, w, + 8, ); } y += 1; @@ -941,8 +927,8 @@ unsafe extern "C" fn filter_plane_cols_uv( hmask[1] = (*mask.offset(x as isize))[1][1] as uint32_t; } hmask[2] = 0 as libc::c_int as uint32_t; - ((*dsp).lf.loop_filter_sb[1][0]).expect("non-null function pointer")( - &mut *u.offset((x * 4) as isize), + (*dsp).lf.loop_filter_sb[1][0]( + u.offset((x * 4) as isize).cast(), ls, hmask.as_mut_ptr(), &*(*lvl.offset(x as isize)).as_ptr().offset(2) as *const uint8_t @@ -950,9 +936,10 @@ unsafe extern "C" fn filter_plane_cols_uv( b4_stride, &(*f).lf.lim_lut.0, endy4 - starty4, + 8, ); - ((*dsp).lf.loop_filter_sb[1][0]).expect("non-null function pointer")( - &mut *v.offset((x * 4) as isize), + (*dsp).lf.loop_filter_sb[1][0]( + v.offset((x * 4) as isize).cast(), ls, hmask.as_mut_ptr(), &*(*lvl.offset(x as isize)).as_ptr().offset(3) as *const uint8_t @@ -960,6 +947,7 @@ unsafe extern "C" fn filter_plane_cols_uv( b4_stride, &(*f).lf.lim_lut.0, endy4 - starty4, + 8, ); } x += 1; @@ -992,23 +980,25 @@ unsafe extern "C" fn filter_plane_rows_uv( | ((*mask.offset(y as isize))[1][1] as libc::c_uint) << (16 >> ss_hor), 0 as libc::c_int as uint32_t, ]; - ((*dsp).lf.loop_filter_sb[1][1]).expect("non-null function pointer")( - &mut *u.offset(off_l as isize), + (*dsp).lf.loop_filter_sb[1][1]( + u.offset(off_l as isize).cast(), ls, vmask.as_ptr(), &*(*lvl.offset(0)).as_ptr().offset(2) as *const uint8_t as *const [uint8_t; 4], b4_stride, &(*f).lf.lim_lut.0, w, + 8, ); - ((*dsp).lf.loop_filter_sb[1][1]).expect("non-null function pointer")( - &mut *v.offset(off_l as isize), + (*dsp).lf.loop_filter_sb[1][1]( + v.offset(off_l as isize).cast(), ls, vmask.as_ptr(), &*(*lvl.offset(0)).as_ptr().offset(3) as *const uint8_t as *const [uint8_t; 4], b4_stride, &(*f).lf.lim_lut.0, w, + 8, ); } y += 1; diff --git a/src/lib.rs b/src/lib.rs index 3a1d807c2..7d8c62eda 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -233,25 +233,8 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; - -#[derive(Copy, Clone)] -#[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut libc::c_void, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -use crate::src::lf_mask::Av1FilterLUT; #[derive(Copy, Clone)] #[repr(C)] pub struct Dav1dInvTxfmDSPContext { diff --git a/src/log.rs b/src/log.rs index edd857e6b..36036982e 100644 --- a/src/log.rs +++ b/src/log.rs @@ -106,26 +106,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut libc::c_void, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -use crate::src::lf_mask::Av1FilterLUT; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/loopfilter.rs b/src/loopfilter.rs new file mode 100644 index 000000000..5cbda68ee --- /dev/null +++ b/src/loopfilter.rs @@ -0,0 +1,379 @@ +use crate::include::stddef::ptrdiff_t; +use crate::include::stdint::uint32_t; +use crate::include::stdint::uint8_t; +use crate::src::lf_mask::Av1FilterLUT; + +pub type pixel = libc::c_void; + +pub type loopfilter_sb_fn = unsafe extern "C" fn( + *mut pixel, + ptrdiff_t, + *const uint32_t, + *const [uint8_t; 4], + ptrdiff_t, + *const Av1FilterLUT, + libc::c_int, + libc::c_int, +) -> (); + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct Dav1dLoopFilterDSPContext { + pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], +} + +// TODO(legare): Temporarily pub until init fns have been deduplicated. +#[cfg(all( + feature = "asm", + feature = "bitdepth_8", + any(target_arch = "x86", target_arch = "x86_64"), +))] +extern "C" { + pub(crate) fn dav1d_lpf_v_sb_uv_8bpc_avx512icl( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_uv_8bpc_avx512icl( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_y_8bpc_avx512icl( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_y_8bpc_avx512icl( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_uv_8bpc_avx2( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_uv_8bpc_avx2( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_y_8bpc_avx2( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_y_8bpc_avx2( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_uv_8bpc_ssse3( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_uv_8bpc_ssse3( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_y_8bpc_ssse3( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_y_8bpc_ssse3( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); +} + +// TODO(legare): Temporarily pub until init fns have been deduplicated. +#[cfg(all( + feature = "asm", + feature = "bitdepth_8", + any(target_arch = "arm", target_arch = "aarch64") +))] +extern "C" { + pub(crate) fn dav1d_lpf_h_sb_uv_8bpc_neon( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_y_8bpc_neon( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_y_8bpc_neon( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_uv_8bpc_neon( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); +} + +// TODO(legare): Temporarily pub until init fns are deduplicated. +#[cfg(all( + feature = "asm", + feature = "bitdepth_16", + any(target_arch = "x86", target_arch = "x86_64"), +))] +extern "C" { + pub(crate) fn dav1d_lpf_v_sb_uv_16bpc_avx512icl( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_uv_16bpc_avx512icl( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_y_16bpc_avx512icl( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_y_16bpc_avx512icl( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_uv_16bpc_avx2( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_uv_16bpc_avx2( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_y_16bpc_avx2( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_y_16bpc_avx2( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_uv_16bpc_ssse3( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_uv_16bpc_ssse3( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_y_16bpc_ssse3( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_y_16bpc_ssse3( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); +} + +// TODO(legare): Temporarily pub until init fns are deduplicated. +#[cfg(all( + feature = "asm", + feature = "bitdepth_16", + any(target_arch = "arm", target_arch = "aarch64"), +))] +extern "C" { + pub(crate) fn dav1d_lpf_v_sb_uv_16bpc_neon( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_uv_16bpc_neon( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_v_sb_y_16bpc_neon( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); + pub(crate) fn dav1d_lpf_h_sb_y_16bpc_neon( + dst: *mut pixel, + stride: ptrdiff_t, + mask: *const uint32_t, + lvl: *const [uint8_t; 4], + lvl_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, + ); +} diff --git a/src/loopfilter_tmpl_16.rs b/src/loopfilter_tmpl_16.rs index d7040ec9a..38fbae6c4 100644 --- a/src/loopfilter_tmpl_16.rs +++ b/src/loopfilter_tmpl_16.rs @@ -4,196 +4,12 @@ use ::libc; #[cfg(feature = "asm")] use cfg_if::cfg_if; -#[cfg(all(feature = "asm", any(target_arch = "x86", target_arch = "x86_64")))] -extern "C" { - fn dav1d_lpf_v_sb_uv_16bpc_avx512icl( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_h_sb_uv_16bpc_avx512icl( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_v_sb_y_16bpc_avx512icl( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_h_sb_y_16bpc_avx512icl( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_v_sb_uv_16bpc_avx2( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_h_sb_uv_16bpc_avx2( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_v_sb_y_16bpc_avx2( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_h_sb_y_16bpc_avx2( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_v_sb_uv_16bpc_ssse3( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_h_sb_uv_16bpc_ssse3( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_v_sb_y_16bpc_ssse3( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_h_sb_y_16bpc_ssse3( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); -} - -#[cfg(all(feature = "asm", any(target_arch = "arm", target_arch = "aarch64")))] -extern "C" { - fn dav1d_lpf_v_sb_uv_16bpc_neon( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_h_sb_uv_16bpc_neon( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_v_sb_y_16bpc_neon( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); - fn dav1d_lpf_h_sb_y_16bpc_neon( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - bitdepth_max: libc::c_int, - ); -} - pub type pixel = uint16_t; -use crate::src::lf_mask::Av1FilterLUT; -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} use crate::include::common::attributes::clz; use crate::include::common::intops::iclip; use crate::include::common::intops::imin; +use crate::src::lf_mask::Av1FilterLUT; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; #[inline] unsafe extern "C" fn PXSTRIDE(x: ptrdiff_t) -> ptrdiff_t { if x & 1 != 0 { @@ -379,7 +195,28 @@ unsafe extern "C" fn loop_filter( dst = dst.offset(stridea as isize); } } -unsafe extern "C" fn loop_filter_h_sb128y_c( +unsafe extern "C" fn loop_filter_h_sb128y_c_erased( + dst: *mut libc::c_void, + stride: ptrdiff_t, + vmask: *const uint32_t, + l: *const [uint8_t; 4], + b4_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + h: libc::c_int, + bitdepth_max: libc::c_int, +) { + loop_filter_h_sb128y_rust( + dst.cast(), + stride, + vmask, + l, + b4_stride, + lut, + h, + bitdepth_max, + ); +} +unsafe extern "C" fn loop_filter_h_sb128y_rust( mut dst: *mut pixel, stride: ptrdiff_t, vmask: *const uint32_t, @@ -424,7 +261,28 @@ unsafe extern "C" fn loop_filter_h_sb128y_c( l = l.offset(b4_stride as isize); } } -unsafe extern "C" fn loop_filter_v_sb128y_c( +unsafe extern "C" fn loop_filter_v_sb128y_c_erased( + dst: *mut libc::c_void, + stride: ptrdiff_t, + vmask: *const uint32_t, + l: *const [uint8_t; 4], + b4_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, +) { + loop_filter_v_sb128y_rust( + dst.cast(), + stride, + vmask, + l, + b4_stride, + lut, + w, + bitdepth_max, + ); +} +unsafe extern "C" fn loop_filter_v_sb128y_rust( mut dst: *mut pixel, stride: ptrdiff_t, vmask: *const uint32_t, @@ -469,7 +327,28 @@ unsafe extern "C" fn loop_filter_v_sb128y_c( l = l.offset(1); } } -unsafe extern "C" fn loop_filter_h_sb128uv_c( +unsafe extern "C" fn loop_filter_h_sb128uv_c_erased( + dst: *mut libc::c_void, + stride: ptrdiff_t, + vmask: *const uint32_t, + l: *const [uint8_t; 4], + b4_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + h: libc::c_int, + bitdepth_max: libc::c_int, +) { + loop_filter_h_sb128uv_rust( + dst.cast(), + stride, + vmask, + l, + b4_stride, + lut, + h, + bitdepth_max, + ) +} +unsafe extern "C" fn loop_filter_h_sb128uv_rust( mut dst: *mut pixel, stride: ptrdiff_t, vmask: *const uint32_t, @@ -510,7 +389,28 @@ unsafe extern "C" fn loop_filter_h_sb128uv_c( l = l.offset(b4_stride as isize); } } -unsafe extern "C" fn loop_filter_v_sb128uv_c( +unsafe extern "C" fn loop_filter_v_sb128uv_c_erased( + dst: *mut libc::c_void, + stride: ptrdiff_t, + vmask: *const uint32_t, + l: *const [uint8_t; 4], + b4_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + bitdepth_max: libc::c_int, +) { + loop_filter_v_sb128uv_rust( + dst.cast(), + stride, + vmask, + l, + b4_stride, + lut, + w, + bitdepth_max, + ) +} +unsafe extern "C" fn loop_filter_v_sb128uv_rust( mut dst: *mut pixel, stride: ptrdiff_t, vmask: *const uint32_t, @@ -559,6 +459,8 @@ use crate::src::cpu::dav1d_get_cpu_flags; #[inline(always)] unsafe extern "C" fn loop_filter_dsp_init_x86(c: *mut Dav1dLoopFilterDSPContext) { use crate::src::x86::cpu::*; + // TODO(legare): Temporarily import until init fns are deduplicated. + use crate::src::loopfilter::*; let flags = dav1d_get_cpu_flags(); @@ -566,10 +468,10 @@ unsafe extern "C" fn loop_filter_dsp_init_x86(c: *mut Dav1dLoopFilterDSPContext) return; } - (*c).loop_filter_sb[0][0] = Some(dav1d_lpf_h_sb_y_16bpc_ssse3); - (*c).loop_filter_sb[0][1] = Some(dav1d_lpf_v_sb_y_16bpc_ssse3); - (*c).loop_filter_sb[1][0] = Some(dav1d_lpf_h_sb_uv_16bpc_ssse3); - (*c).loop_filter_sb[1][1] = Some(dav1d_lpf_v_sb_uv_16bpc_ssse3); + (*c).loop_filter_sb[0][0] = dav1d_lpf_h_sb_y_16bpc_ssse3; + (*c).loop_filter_sb[0][1] = dav1d_lpf_v_sb_y_16bpc_ssse3; + (*c).loop_filter_sb[1][0] = dav1d_lpf_h_sb_uv_16bpc_ssse3; + (*c).loop_filter_sb[1][1] = dav1d_lpf_v_sb_uv_16bpc_ssse3; #[cfg(target_arch = "x86_64")] { @@ -577,19 +479,19 @@ unsafe extern "C" fn loop_filter_dsp_init_x86(c: *mut Dav1dLoopFilterDSPContext) return; } - (*c).loop_filter_sb[0][0] = Some(dav1d_lpf_h_sb_y_16bpc_avx2); - (*c).loop_filter_sb[0][1] = Some(dav1d_lpf_v_sb_y_16bpc_avx2); - (*c).loop_filter_sb[1][0] = Some(dav1d_lpf_h_sb_uv_16bpc_avx2); - (*c).loop_filter_sb[1][1] = Some(dav1d_lpf_v_sb_uv_16bpc_avx2); + (*c).loop_filter_sb[0][0] = dav1d_lpf_h_sb_y_16bpc_avx2; + (*c).loop_filter_sb[0][1] = dav1d_lpf_v_sb_y_16bpc_avx2; + (*c).loop_filter_sb[1][0] = dav1d_lpf_h_sb_uv_16bpc_avx2; + (*c).loop_filter_sb[1][1] = dav1d_lpf_v_sb_uv_16bpc_avx2; if flags & DAV1D_X86_CPU_FLAG_AVX512ICL == 0 { return; } - (*c).loop_filter_sb[0][0] = Some(dav1d_lpf_h_sb_y_16bpc_avx512icl); - (*c).loop_filter_sb[0][1] = Some(dav1d_lpf_v_sb_y_16bpc_avx512icl); - (*c).loop_filter_sb[1][0] = Some(dav1d_lpf_h_sb_uv_16bpc_avx512icl); - (*c).loop_filter_sb[1][1] = Some(dav1d_lpf_v_sb_uv_16bpc_avx512icl); + (*c).loop_filter_sb[0][0] = dav1d_lpf_h_sb_y_16bpc_avx512icl; + (*c).loop_filter_sb[0][1] = dav1d_lpf_v_sb_y_16bpc_avx512icl; + (*c).loop_filter_sb[1][0] = dav1d_lpf_h_sb_uv_16bpc_avx512icl; + (*c).loop_filter_sb[1][1] = dav1d_lpf_v_sb_uv_16bpc_avx512icl; } } @@ -597,6 +499,8 @@ unsafe extern "C" fn loop_filter_dsp_init_x86(c: *mut Dav1dLoopFilterDSPContext) #[inline(always)] unsafe extern "C" fn loop_filter_dsp_init_arm(c: *mut Dav1dLoopFilterDSPContext) { use crate::src::arm::cpu::DAV1D_ARM_CPU_FLAG_NEON; + // TODO(legare): Temporarily import until init fns are deduplicated. + use crate::src::loopfilter::*; let flags = dav1d_get_cpu_flags(); @@ -604,19 +508,19 @@ unsafe extern "C" fn loop_filter_dsp_init_arm(c: *mut Dav1dLoopFilterDSPContext) return; } - (*c).loop_filter_sb[0][0] = Some(dav1d_lpf_h_sb_y_16bpc_neon); - (*c).loop_filter_sb[0][1] = Some(dav1d_lpf_v_sb_y_16bpc_neon); - (*c).loop_filter_sb[1][0] = Some(dav1d_lpf_h_sb_uv_16bpc_neon); - (*c).loop_filter_sb[1][1] = Some(dav1d_lpf_v_sb_uv_16bpc_neon); + (*c).loop_filter_sb[0][0] = dav1d_lpf_h_sb_y_16bpc_neon; + (*c).loop_filter_sb[0][1] = dav1d_lpf_v_sb_y_16bpc_neon; + (*c).loop_filter_sb[1][0] = dav1d_lpf_h_sb_uv_16bpc_neon; + (*c).loop_filter_sb[1][1] = dav1d_lpf_v_sb_uv_16bpc_neon; } #[no_mangle] #[cold] pub unsafe extern "C" fn dav1d_loop_filter_dsp_init_16bpc(c: *mut Dav1dLoopFilterDSPContext) { - (*c).loop_filter_sb[0][0] = Some(loop_filter_h_sb128y_c); - (*c).loop_filter_sb[0][1] = Some(loop_filter_v_sb128y_c); - (*c).loop_filter_sb[1][0] = Some(loop_filter_h_sb128uv_c); - (*c).loop_filter_sb[1][1] = Some(loop_filter_v_sb128uv_c); + (*c).loop_filter_sb[0][0] = loop_filter_h_sb128y_c_erased; + (*c).loop_filter_sb[0][1] = loop_filter_v_sb128y_c_erased; + (*c).loop_filter_sb[1][0] = loop_filter_h_sb128uv_c_erased; + (*c).loop_filter_sb[1][1] = loop_filter_v_sb128uv_c_erased; #[cfg(feature = "asm")] cfg_if! { diff --git a/src/loopfilter_tmpl_8.rs b/src/loopfilter_tmpl_8.rs index 74ffb12a4..cd21218ac 100644 --- a/src/loopfilter_tmpl_8.rs +++ b/src/loopfilter_tmpl_8.rs @@ -4,179 +4,12 @@ use ::libc; #[cfg(feature = "asm")] use cfg_if::cfg_if; -#[cfg(all(feature = "asm", any(target_arch = "x86", target_arch = "x86_64")))] -extern "C" { - fn dav1d_lpf_v_sb_uv_8bpc_avx512icl( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_h_sb_uv_8bpc_avx512icl( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_v_sb_y_8bpc_avx512icl( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_h_sb_y_8bpc_avx512icl( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_v_sb_uv_8bpc_avx2( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_h_sb_uv_8bpc_avx2( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_v_sb_y_8bpc_avx2( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_h_sb_y_8bpc_avx2( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_v_sb_uv_8bpc_ssse3( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_h_sb_uv_8bpc_ssse3( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_v_sb_y_8bpc_ssse3( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_h_sb_y_8bpc_ssse3( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); -} - -#[cfg(all(feature = "asm", any(target_arch = "arm", target_arch = "aarch64")))] -extern "C" { - fn dav1d_lpf_h_sb_uv_8bpc_neon( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_v_sb_y_8bpc_neon( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_h_sb_y_8bpc_neon( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); - fn dav1d_lpf_v_sb_uv_8bpc_neon( - dst: *mut pixel, - stride: ptrdiff_t, - mask: *const uint32_t, - lvl: *const [uint8_t; 4], - lvl_stride: ptrdiff_t, - lut: *const Av1FilterLUT, - w: libc::c_int, - ); -} - pub type pixel = uint8_t; -use crate::src::lf_mask::Av1FilterLUT; -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} use crate::include::common::intops::iclip; use crate::include::common::intops::iclip_u8; use crate::include::common::intops::imin; +use crate::src::lf_mask::Av1FilterLUT; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; #[inline(never)] unsafe extern "C" fn loop_filter( mut dst: *mut pixel, @@ -351,7 +184,21 @@ unsafe extern "C" fn loop_filter( dst = dst.offset(stridea as isize); } } -unsafe extern "C" fn loop_filter_h_sb128y_c( + +unsafe extern "C" fn loop_filter_h_sb128y_c_erased( + dst: *mut libc::c_void, + stride: ptrdiff_t, + vmask: *const uint32_t, + l: *const [uint8_t; 4], + b4_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + h: libc::c_int, + _bitdepth_max: libc::c_int, +) { + loop_filter_h_sb128y_rust(dst.cast(), stride, vmask, l, b4_stride, lut, h) +} + +unsafe fn loop_filter_h_sb128y_rust( mut dst: *mut pixel, stride: ptrdiff_t, vmask: *const uint32_t, @@ -394,7 +241,21 @@ unsafe extern "C" fn loop_filter_h_sb128y_c( l = l.offset(b4_stride as isize); } } -unsafe extern "C" fn loop_filter_v_sb128y_c( + +unsafe extern "C" fn loop_filter_v_sb128y_c_erased( + dst: *mut libc::c_void, + stride: ptrdiff_t, + vmask: *const uint32_t, + l: *const [uint8_t; 4], + b4_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + _bitdepth_max: libc::c_int, +) { + loop_filter_v_sb128y_rust(dst.cast(), stride, vmask, l, b4_stride, lut, w); +} + +unsafe fn loop_filter_v_sb128y_rust( mut dst: *mut pixel, stride: ptrdiff_t, vmask: *const uint32_t, @@ -437,7 +298,21 @@ unsafe extern "C" fn loop_filter_v_sb128y_c( l = l.offset(1); } } -unsafe extern "C" fn loop_filter_h_sb128uv_c( + +unsafe extern "C" fn loop_filter_h_sb128uv_c_erased( + dst: *mut libc::c_void, + stride: ptrdiff_t, + vmask: *const uint32_t, + l: *const [uint8_t; 4], + b4_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + h: libc::c_int, + _bitdepth_max: libc::c_int, +) { + loop_filter_h_sb128uv_rust(dst.cast(), stride, vmask, l, b4_stride, lut, h) +} + +unsafe fn loop_filter_h_sb128uv_rust( mut dst: *mut pixel, stride: ptrdiff_t, vmask: *const uint32_t, @@ -476,7 +351,21 @@ unsafe extern "C" fn loop_filter_h_sb128uv_c( l = l.offset(b4_stride as isize); } } -unsafe extern "C" fn loop_filter_v_sb128uv_c( + +unsafe extern "C" fn loop_filter_v_sb128uv_c_erased( + dst: *mut libc::c_void, + stride: ptrdiff_t, + vmask: *const uint32_t, + l: *const [uint8_t; 4], + b4_stride: ptrdiff_t, + lut: *const Av1FilterLUT, + w: libc::c_int, + _bitdepth_max: libc::c_int, +) { + loop_filter_v_sb128uv_rust(dst.cast(), stride, vmask, l, b4_stride, lut, w) +} + +unsafe extern "C" fn loop_filter_v_sb128uv_rust( mut dst: *mut pixel, stride: ptrdiff_t, vmask: *const uint32_t, @@ -523,6 +412,8 @@ use crate::src::cpu::dav1d_get_cpu_flags; #[inline(always)] unsafe extern "C" fn loop_filter_dsp_init_x86(c: *mut Dav1dLoopFilterDSPContext) { use crate::src::x86::cpu::*; + // TODO(legare): Temporary import until init fns are deduplicated. + use crate::src::loopfilter::*; let flags = dav1d_get_cpu_flags(); @@ -530,10 +421,10 @@ unsafe extern "C" fn loop_filter_dsp_init_x86(c: *mut Dav1dLoopFilterDSPContext) return; } - (*c).loop_filter_sb[0][0] = Some(dav1d_lpf_h_sb_y_8bpc_ssse3); - (*c).loop_filter_sb[0][1] = Some(dav1d_lpf_v_sb_y_8bpc_ssse3); - (*c).loop_filter_sb[1][0] = Some(dav1d_lpf_h_sb_uv_8bpc_ssse3); - (*c).loop_filter_sb[1][1] = Some(dav1d_lpf_v_sb_uv_8bpc_ssse3); + (*c).loop_filter_sb[0][0] = dav1d_lpf_h_sb_y_8bpc_ssse3; + (*c).loop_filter_sb[0][1] = dav1d_lpf_v_sb_y_8bpc_ssse3; + (*c).loop_filter_sb[1][0] = dav1d_lpf_h_sb_uv_8bpc_ssse3; + (*c).loop_filter_sb[1][1] = dav1d_lpf_v_sb_uv_8bpc_ssse3; #[cfg(target_arch = "x86_64")] { @@ -541,19 +432,19 @@ unsafe extern "C" fn loop_filter_dsp_init_x86(c: *mut Dav1dLoopFilterDSPContext) return; } - (*c).loop_filter_sb[0][0] = Some(dav1d_lpf_h_sb_y_8bpc_avx2); - (*c).loop_filter_sb[0][1] = Some(dav1d_lpf_v_sb_y_8bpc_avx2); - (*c).loop_filter_sb[1][0] = Some(dav1d_lpf_h_sb_uv_8bpc_avx2); - (*c).loop_filter_sb[1][1] = Some(dav1d_lpf_v_sb_uv_8bpc_avx2); + (*c).loop_filter_sb[0][0] = dav1d_lpf_h_sb_y_8bpc_avx2; + (*c).loop_filter_sb[0][1] = dav1d_lpf_v_sb_y_8bpc_avx2; + (*c).loop_filter_sb[1][0] = dav1d_lpf_h_sb_uv_8bpc_avx2; + (*c).loop_filter_sb[1][1] = dav1d_lpf_v_sb_uv_8bpc_avx2; if flags & DAV1D_X86_CPU_FLAG_AVX512ICL == 0 { return; } - (*c).loop_filter_sb[0][0] = Some(dav1d_lpf_h_sb_y_8bpc_avx512icl); - (*c).loop_filter_sb[0][1] = Some(dav1d_lpf_v_sb_y_8bpc_avx512icl); - (*c).loop_filter_sb[1][0] = Some(dav1d_lpf_h_sb_uv_8bpc_avx512icl); - (*c).loop_filter_sb[1][1] = Some(dav1d_lpf_v_sb_uv_8bpc_avx512icl); + (*c).loop_filter_sb[0][0] = dav1d_lpf_h_sb_y_8bpc_avx512icl; + (*c).loop_filter_sb[0][1] = dav1d_lpf_v_sb_y_8bpc_avx512icl; + (*c).loop_filter_sb[1][0] = dav1d_lpf_h_sb_uv_8bpc_avx512icl; + (*c).loop_filter_sb[1][1] = dav1d_lpf_v_sb_uv_8bpc_avx512icl; } } @@ -561,6 +452,8 @@ unsafe extern "C" fn loop_filter_dsp_init_x86(c: *mut Dav1dLoopFilterDSPContext) #[inline(always)] unsafe extern "C" fn loop_filter_dsp_init_arm(c: *mut Dav1dLoopFilterDSPContext) { use crate::src::arm::cpu::DAV1D_ARM_CPU_FLAG_NEON; + // TODO(legare): Temporary import until init fns are deduplicated. + use crate::src::loopfilter::*; let flags = dav1d_get_cpu_flags(); @@ -568,19 +461,19 @@ unsafe extern "C" fn loop_filter_dsp_init_arm(c: *mut Dav1dLoopFilterDSPContext) return; } - (*c).loop_filter_sb[0][0] = Some(dav1d_lpf_h_sb_y_8bpc_neon); - (*c).loop_filter_sb[0][1] = Some(dav1d_lpf_v_sb_y_8bpc_neon); - (*c).loop_filter_sb[1][0] = Some(dav1d_lpf_h_sb_uv_8bpc_neon); - (*c).loop_filter_sb[1][1] = Some(dav1d_lpf_v_sb_uv_8bpc_neon); + (*c).loop_filter_sb[0][0] = dav1d_lpf_h_sb_y_8bpc_neon; + (*c).loop_filter_sb[0][1] = dav1d_lpf_v_sb_y_8bpc_neon; + (*c).loop_filter_sb[1][0] = dav1d_lpf_h_sb_uv_8bpc_neon; + (*c).loop_filter_sb[1][1] = dav1d_lpf_v_sb_uv_8bpc_neon; } #[no_mangle] #[cold] pub unsafe extern "C" fn dav1d_loop_filter_dsp_init_8bpc(c: *mut Dav1dLoopFilterDSPContext) { - (*c).loop_filter_sb[0][0] = Some(loop_filter_h_sb128y_c); - (*c).loop_filter_sb[0][1] = Some(loop_filter_v_sb128y_c); - (*c).loop_filter_sb[1][0] = Some(loop_filter_h_sb128uv_c); - (*c).loop_filter_sb[1][1] = Some(loop_filter_v_sb128uv_c); + (*c).loop_filter_sb[0][0] = loop_filter_h_sb128y_c_erased; + (*c).loop_filter_sb[0][1] = loop_filter_v_sb128y_c_erased; + (*c).loop_filter_sb[1][0] = loop_filter_h_sb128uv_c_erased; + (*c).loop_filter_sb[1][1] = loop_filter_v_sb128uv_c_erased; #[cfg(feature = "asm")] cfg_if! { diff --git a/src/lr_apply_tmpl_16.rs b/src/lr_apply_tmpl_16.rs index e838fffc5..a5bc707b5 100644 --- a/src/lr_apply_tmpl_16.rs +++ b/src/lr_apply_tmpl_16.rs @@ -99,7 +99,6 @@ use crate::src::align::Align16; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::Dav1dFrameContext_frame_thread; use crate::src::lf_mask::Av1RestorationUnit; @@ -245,6 +244,7 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::looprestorationfilter_fn; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; use crate::src::looprestoration::LooprestorationParams; @@ -255,23 +255,6 @@ use crate::src::looprestoration::LR_HAVE_RIGHT; use crate::src::looprestoration::LR_HAVE_TOP; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/lr_apply_tmpl_8.rs b/src/lr_apply_tmpl_8.rs index 663ae8bd3..4fd6c6881 100644 --- a/src/lr_apply_tmpl_8.rs +++ b/src/lr_apply_tmpl_8.rs @@ -100,7 +100,6 @@ use crate::src::align::Align16; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::Dav1dFrameContext_frame_thread; use crate::src::lf_mask::Av1RestorationUnit; @@ -246,6 +245,7 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::looprestorationfilter_fn; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; use crate::src::looprestoration::LooprestorationParams; @@ -256,22 +256,6 @@ use crate::src::looprestoration::LR_HAVE_RIGHT; use crate::src::looprestoration::LR_HAVE_TOP; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/obu.rs b/src/obu.rs index e6913eecd..523a5f391 100644 --- a/src/obu.rs +++ b/src/obu.rs @@ -171,7 +171,6 @@ use libc::pthread_cond_t; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; pub type pixel = (); -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::Dav1dFrameContext_frame_thread; @@ -324,25 +323,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut libc::c_void, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/picture.rs b/src/picture.rs index 470b47861..d8dc867cc 100644 --- a/src/picture.rs +++ b/src/picture.rs @@ -105,7 +105,6 @@ use crate::include::dav1d::headers::Dav1dSequenceHeader; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; pub type pixel = (); -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::Dav1dFrameContext_frame_thread; @@ -257,25 +256,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut libc::c_void, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/recon_tmpl_16.rs b/src/recon_tmpl_16.rs index b596d1fc8..521cb5ffd 100644 --- a/src/recon_tmpl_16.rs +++ b/src/recon_tmpl_16.rs @@ -165,7 +165,6 @@ use crate::src::internal::Dav1dFrameContext_lf; use crate::src::levels::mv; use crate::src::levels::Av1Block; use crate::src::lf_mask::Av1Filter; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::env::BlockContext; use crate::src::refmvs::refmvs_block; @@ -319,26 +318,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/recon_tmpl_8.rs b/src/recon_tmpl_8.rs index bc925dd66..338c64f8f 100644 --- a/src/recon_tmpl_8.rs +++ b/src/recon_tmpl_8.rs @@ -159,7 +159,6 @@ use crate::include::dav1d::headers::Dav1dSequenceHeader; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::CodedBlockInfo; use crate::src::internal::Dav1dFrameContext_frame_thread; @@ -318,25 +317,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut pixel, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], } diff --git a/src/thread_task.rs b/src/thread_task.rs index dffa84230..0e81e3c92 100644 --- a/src/thread_task.rs +++ b/src/thread_task.rs @@ -166,7 +166,6 @@ use libc::pthread_cond_t; use crate::src::internal::Dav1dFrameContext_lf; use crate::src::lf_mask::Av1Filter; pub type pixel = (); -use crate::src::lf_mask::Av1FilterLUT; use crate::src::internal::Dav1dFrameContext_frame_thread; @@ -313,25 +312,10 @@ pub struct Dav1dDSPContext { pub lr: Dav1dLoopRestorationDSPContext, } use crate::src::cdef::Dav1dCdefDSPContext; +use crate::src::loopfilter::Dav1dLoopFilterDSPContext; use crate::src::looprestoration::Dav1dLoopRestorationDSPContext; #[derive(Copy, Clone)] #[repr(C)] -pub struct Dav1dLoopFilterDSPContext { - pub loop_filter_sb: [[loopfilter_sb_fn; 2]; 2], -} -pub type loopfilter_sb_fn = Option< - unsafe extern "C" fn( - *mut libc::c_void, - ptrdiff_t, - *const uint32_t, - *const [uint8_t; 4], - ptrdiff_t, - *const Av1FilterLUT, - libc::c_int, - ) -> (), ->; -#[derive(Copy, Clone)] -#[repr(C)] pub struct Dav1dInvTxfmDSPContext { pub itxfm_add: [[itxfm_fn; 17]; 19], }