diff --git a/include/dav1d/dav1d.rs b/include/dav1d/dav1d.rs index de823ba83..7b8612942 100644 --- a/include/dav1d/dav1d.rs +++ b/include/dav1d/dav1d.rs @@ -13,19 +13,37 @@ pub type Dav1dContext = Rav1dContext; pub type Dav1dRef = Rav1dRef; pub type Dav1dInloopFilterType = c_uint; -pub const DAV1D_INLOOPFILTER_ALL: Dav1dInloopFilterType = 7; -pub const DAV1D_INLOOPFILTER_RESTORATION: Dav1dInloopFilterType = 4; -pub const DAV1D_INLOOPFILTER_CDEF: Dav1dInloopFilterType = 2; -pub const DAV1D_INLOOPFILTER_DEBLOCK: Dav1dInloopFilterType = 1; -pub const DAV1D_INLOOPFILTER_NONE: Dav1dInloopFilterType = 0; - -pub(crate) type Rav1dInloopFilterType = c_uint; -pub(crate) const RAV1D_INLOOPFILTER_ALL: Rav1dInloopFilterType = DAV1D_INLOOPFILTER_ALL; -pub(crate) const RAV1D_INLOOPFILTER_RESTORATION: Rav1dInloopFilterType = - DAV1D_INLOOPFILTER_RESTORATION; -pub(crate) const RAV1D_INLOOPFILTER_CDEF: Rav1dInloopFilterType = DAV1D_INLOOPFILTER_CDEF; -pub(crate) const RAV1D_INLOOPFILTER_DEBLOCK: Rav1dInloopFilterType = DAV1D_INLOOPFILTER_DEBLOCK; -pub(crate) const _RAV1D_INLOOPFILTER_NONE: Rav1dInloopFilterType = DAV1D_INLOOPFILTER_NONE; +pub const DAV1D_INLOOPFILTER_ALL: Dav1dInloopFilterType = + Rav1dInloopFilterType::all().bits() as Dav1dInloopFilterType; +pub const DAV1D_INLOOPFILTER_NONE: Dav1dInloopFilterType = + Rav1dInloopFilterType::empty().bits() as Dav1dInloopFilterType; +pub const DAV1D_INLOOPFILTER_DEBLOCK: Dav1dInloopFilterType = + Rav1dInloopFilterType::DEBLOCK.bits() as Dav1dInloopFilterType; +pub const DAV1D_INLOOPFILTER_CDEF: Dav1dInloopFilterType = + Rav1dInloopFilterType::CDEF.bits() as Dav1dInloopFilterType; +pub const DAV1D_INLOOPFILTER_RESTORATION: Dav1dInloopFilterType = + Rav1dInloopFilterType::RESTORATION.bits() as Dav1dInloopFilterType; + +bitflags! { + #[derive(Clone, Copy, PartialEq, Eq, Hash, Default)] + pub(crate) struct Rav1dInloopFilterType: u8 { + const DEBLOCK = 1 << 1; + const CDEF = 1 << 2; + const RESTORATION = 1 << 3; + } +} + +impl From for Dav1dInloopFilterType { + fn from(value: Rav1dInloopFilterType) -> Self { + value.bits().into() + } +} + +impl From for Rav1dInloopFilterType { + fn from(value: Dav1dInloopFilterType) -> Self { + Self::from_bits_retain(value as u8) + } +} pub type Dav1dDecodeFrameType = c_uint; pub const DAV1D_DECODEFRAMETYPE_KEY: Dav1dDecodeFrameType = 3; @@ -142,7 +160,7 @@ impl TryFrom for Rav1dSettings { logger: logger.into(), strict_std_compliance: strict_std_compliance != 0, output_invisible_frames: output_invisible_frames != 0, - inloop_filters, + inloop_filters: inloop_filters.into(), decode_frame_type, }) } @@ -175,7 +193,7 @@ impl From for Dav1dSettings { logger: logger.into(), strict_std_compliance: strict_std_compliance as c_int, output_invisible_frames: output_invisible_frames as c_int, - inloop_filters, + inloop_filters: inloop_filters.into(), decode_frame_type, reserved: Default::default(), } diff --git a/src/lib.rs b/src/lib.rs index 12e26559b..03b004d03 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,10 +9,10 @@ use crate::include::dav1d::data::Rav1dData; use crate::include::dav1d::dav1d::Dav1dContext; use crate::include::dav1d::dav1d::Dav1dEventFlags; use crate::include::dav1d::dav1d::Dav1dSettings; +use crate::include::dav1d::dav1d::Rav1dInloopFilterType; use crate::include::dav1d::dav1d::Rav1dSettings; use crate::include::dav1d::dav1d::RAV1D_DECODEFRAMETYPE_ALL; use crate::include::dav1d::dav1d::RAV1D_DECODEFRAMETYPE_KEY; -use crate::include::dav1d::dav1d::RAV1D_INLOOPFILTER_ALL; use crate::include::dav1d::headers::DRav1d; use crate::include::dav1d::headers::Dav1dSequenceHeader; use crate::include::dav1d::headers::Rav1dFilmGrainData; @@ -133,7 +133,7 @@ impl Default for Rav1dSettings { logger: Default::default(), strict_std_compliance: false, output_invisible_frames: false, - inloop_filters: RAV1D_INLOOPFILTER_ALL, + inloop_filters: Rav1dInloopFilterType::all(), decode_frame_type: RAV1D_DECODEFRAMETYPE_ALL, } } diff --git a/src/recon.rs b/src/recon.rs index d10b5dfd7..6d491c44e 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -7,9 +7,7 @@ use crate::include::common::dump::coef_dump; use crate::include::common::dump::hex_dump; use crate::include::common::intops::apply_sign64; use crate::include::common::intops::iclip; -use crate::include::dav1d::dav1d::RAV1D_INLOOPFILTER_CDEF; -use crate::include::dav1d::dav1d::RAV1D_INLOOPFILTER_DEBLOCK; -use crate::include::dav1d::dav1d::RAV1D_INLOOPFILTER_RESTORATION; +use crate::include::dav1d::dav1d::Rav1dInloopFilterType; use crate::include::dav1d::headers::Rav1dPixelLayout; use crate::include::dav1d::headers::Rav1dWarpedMotionParams; use crate::include::dav1d::headers::RAV1D_WM_TYPE_TRANSLATION; @@ -4523,7 +4521,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_deblock_cols( sby: c_int, ) { let frame_hdr = &***f.frame_hdr.as_ref().unwrap(); - if c.inloop_filters as c_uint & RAV1D_INLOOPFILTER_DEBLOCK as c_int as c_uint == 0 + if !c.inloop_filters.contains(Rav1dInloopFilterType::DEBLOCK) || frame_hdr.loopfilter.level_y[0] == 0 && frame_hdr.loopfilter.level_y[1] == 0 { return; @@ -4574,7 +4572,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_deblock_rows( let mask: *mut Av1Filter = (f.lf.mask).offset(((sby >> (seq_hdr.sb128 == 0) as c_int) * f.sb128w) as isize); let frame_hdr = &***f.frame_hdr.as_ref().unwrap(); - if c.inloop_filters as c_uint & RAV1D_INLOOPFILTER_DEBLOCK as c_int as c_uint != 0 + if c.inloop_filters.contains(Rav1dInloopFilterType::DEBLOCK) && (frame_hdr.loopfilter.level_y[0] != 0 || frame_hdr.loopfilter.level_y[1] != 0) { rav1d_loopfilter_sbrow_rows::(f, &p, mask, sby); @@ -4590,7 +4588,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_cdef( tc: &mut Rav1dTaskContext, sby: c_int, ) { - if c.inloop_filters as c_uint & RAV1D_INLOOPFILTER_CDEF as c_int as c_uint == 0 { + if !c.inloop_filters.contains(Rav1dInloopFilterType::CDEF) { return; } let sbsz = f.sb_step; @@ -4642,14 +4640,11 @@ pub(crate) unsafe fn rav1d_filter_sbrow_resize( let ss_ver = (f.cur.p.layout as c_uint == Rav1dPixelLayout::I420 as c_int as c_uint) as c_int; let p: [*const BD::Pixel; 3] = [ (f.lf.p[0] as *mut BD::Pixel) - .offset((y as isize * BD::pxstride(f.cur.stride[0] as usize) as isize) as isize) - as *const BD::Pixel, - (f.lf.p[1] as *mut BD::Pixel).offset( - (y as isize * BD::pxstride(f.cur.stride[1] as usize) as isize >> ss_ver) as isize, - ) as *const BD::Pixel, - (f.lf.p[2] as *mut BD::Pixel).offset( - (y as isize * BD::pxstride(f.cur.stride[1] as usize) as isize >> ss_ver) as isize, - ) as *const BD::Pixel, + .offset(y as isize * BD::pxstride(f.cur.stride[0] as usize) as isize), + (f.lf.p[1] as *mut BD::Pixel) + .offset(y as isize * BD::pxstride(f.cur.stride[1] as usize) as isize >> ss_ver), + (f.lf.p[2] as *mut BD::Pixel) + .offset(y as isize * BD::pxstride(f.cur.stride[1] as usize) as isize >> ss_ver), ]; let sr_p: [*mut BD::Pixel; 3] = [ (f.lf.sr_p[0] as *mut BD::Pixel) @@ -4704,7 +4699,10 @@ pub(crate) unsafe fn rav1d_filter_sbrow_lr( _t: &mut Rav1dTaskContext, sby: c_int, ) { - if c.inloop_filters as c_uint & RAV1D_INLOOPFILTER_RESTORATION as c_int as c_uint == 0 { + if !c + .inloop_filters + .contains(Rav1dInloopFilterType::RESTORATION) + { return; } let y = sby * f.sb_step * 4;