X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fvpcommon.rs;h=05b07d19eadda854fef417aa8a4c267c387cfcac;hb=23eeced96736873d96bcdab904cd21244643ed99;hp=8ea6a47afe67b2130a529541f4224be9bc45a8a7;hpb=8d8ddfe10445b9561fb36e5e25980fe3fb95c2ea;p=nihav.git diff --git a/nihav-duck/src/codecs/vpcommon.rs b/nihav-duck/src/codecs/vpcommon.rs index 8ea6a47..05b07d1 100644 --- a/nihav-duck/src/codecs/vpcommon.rs +++ b/nihav-duck/src/codecs/vpcommon.rs @@ -1,4 +1,5 @@ use nihav_core::codecs::*; +use nihav_core::codecs::blockdsp::*; #[derive(Clone,Copy,Debug,PartialEq)] #[allow(dead_code)] @@ -213,3 +214,38 @@ pub fn vp31_loop_filter(data: &mut [u8], mut off: usize, step: usize, stride: us } } +pub fn vp_copy_block(dst: &mut NASimpleVideoFrame, src: NAVideoBufferRef, comp: usize, + dx: usize, dy: usize, mv_x: i16, mv_y: i16, + preborder: usize, postborder: usize, loop_str: i16, + mode: usize, interp: &[BlkInterpFunc], mut mc_buf: NAVideoBufferRef) +{ + let sx = (dx as isize) + (mv_x as isize); + let sy = (dy as isize) + (mv_y as isize); + if ((sx | sy) & 7) == 0 { + copy_block(dst, src, comp, dx, dy, mv_x, mv_y, 8, 8, preborder, postborder, mode, interp); + return; + } + let pre = preborder.max(2); + let post = postborder.max(1); + let bsize = 8 + pre + post; + let src_x = sx - (pre as isize); + let src_y = sy - (pre as isize); + { + let mut tmp_buf = NASimpleVideoFrame::from_video_buf(&mut mc_buf).unwrap(); + copy_block(&mut tmp_buf, src, comp, 0, 0, src_x as i16, src_y as i16, + bsize, bsize, 0, 0, 0, interp); + if (sy & 7) != 0 { + let foff = (8 - (sy & 7)) as usize; + let off = (pre + foff) * tmp_buf.stride[comp]; + vp31_loop_filter(tmp_buf.data, off, tmp_buf.stride[comp], 1, bsize, loop_str); + } + if (sx & 7) != 0 { + let foff = (8 - (sx & 7)) as usize; + let off = pre + foff; + vp31_loop_filter(tmp_buf.data, off, 1, tmp_buf.stride[comp], bsize, loop_str); + } + } + let dxoff = (pre as i16) - (dx as i16); + let dyoff = (pre as i16) - (dy as i16); + copy_block(dst, mc_buf, comp, dx, dy, dxoff, dyoff, 8, 8, preborder, postborder, 0/* mode*/, interp); +}