X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fvpcommon.rs;fp=nihav-duck%2Fsrc%2Fcodecs%2Fvpcommon.rs;h=8ea6a47afe67b2130a529541f4224be9bc45a8a7;hb=8d8ddfe10445b9561fb36e5e25980fe3fb95c2ea;hp=cac264b8c51301060a45e860085799f26a19ceed;hpb=3567fcdbce66c242daa0dcc3c1d2e5f06844e8ab;p=nihav.git diff --git a/nihav-duck/src/codecs/vpcommon.rs b/nihav-duck/src/codecs/vpcommon.rs index cac264b..8ea6a47 100644 --- a/nihav-duck/src/codecs/vpcommon.rs +++ b/nihav-duck/src/codecs/vpcommon.rs @@ -186,3 +186,30 @@ pub fn vp_add_block_dc(coeffs: &mut [i16; 64], bx: usize, by: usize, plane: usiz off += frm.stride[plane]; } } + +pub fn vp31_loop_filter(data: &mut [u8], mut off: usize, step: usize, stride: usize, + len: usize, loop_str: i16) { + for _ in 0..len { + let a = data[off - step * 2] as i16; + let b = data[off - step] as i16; + let c = data[off] as i16; + let d = data[off + step] as i16; + let mut diff = ((a - d) + 3 * (c - b) + 4) >> 3; + if diff.abs() >= 2 * loop_str { + diff = 0; + } else if diff.abs() >= loop_str { + if diff < 0 { + diff = -diff - 2 * loop_str; + } else { + diff = -diff + 2 * loop_str; + } + } + if diff != 0 { + data[off - step] = (b + diff).max(0).min(255) as u8; + data[off] = (c - diff).max(0).min(255) as u8; + } + + off += stride; + } +} +