X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fvp7dsp.rs;h=bf21d62e9957bd806facf27d5501214deb7eef5b;hb=2949bcfa141c1f25b9b1b4d5c346acc9cc3b0a2a;hp=7341d660ee34bd242278a46542009cd2803213ec;hpb=587a6d789be865f24bd31ef65aabf1b9d5809965;p=nihav.git diff --git a/nihav-duck/src/codecs/vp7dsp.rs b/nihav-duck/src/codecs/vp7dsp.rs index 7341d66..bf21d62 100644 --- a/nihav-duck/src/codecs/vp7dsp.rs +++ b/nihav-duck/src/codecs/vp7dsp.rs @@ -1,5 +1,5 @@ use nihav_core::frame::*; -use nihav_core::codecs::blockdsp::edge_emu; +use nihav_codec_support::codecs::blockdsp::edge_emu; fn clip_u8(val: i16) -> u8 { val.max(0).min(255) as u8 @@ -58,7 +58,7 @@ impl Default for IPredContext { const DCT_COEFFS: [i32; 16] = [ 23170, 23170, 23170, 23170, 30274, 12540, -12540, -30274, - 23170, -23170, -23170, 23170, + 23170, -23170, -23170, 23170, 12540, -30274, 30274, -12540 ]; @@ -582,7 +582,7 @@ fn mc_block(dst: &mut [u8], doff: usize, dstride: usize, xpos: usize, ypos: usiz let ref_y = (ypos as isize) + ((mvy >> 3) as isize) - (EDGE_PRE as isize); let (src, sstride) = if (ref_x < 0) || (ref_x + bsize > wa) || (ref_y < 0) || (ref_y + bsize > ha) { - edge_emu(&reffrm, ref_x, ref_y, bsize as usize, bsize as usize, mc_buf, 32, plane); + edge_emu(&reffrm, ref_x, ref_y, bsize as usize, bsize as usize, mc_buf, 32, plane, 0); (mc_buf as &[u8], 32) } else { let off = reffrm.get_offset(plane); @@ -623,10 +623,19 @@ pub fn mc_block_special(dst: &mut [u8], doff: usize, dstride: usize, xpos: usize let (w, h) = reffrm.get_dimensions(plane); let wa = if plane == 0 { ((w + 15) & !15) } else { ((w + 7) & !7) } as isize; let ha = if plane == 0 { ((h + 15) & !15) } else { ((h + 7) & !7) } as isize; - let start_x = (xpos as isize) - (EDGE_PRE as isize) * xstep; - let end_x = (xpos as isize) + ((size + EDGE_POST) as isize) * xstep; - let start_y = (ypos as isize) - (EDGE_PRE as isize) * ymul; - let end_y = (ypos as isize) + ((size + EDGE_POST) as isize) * ymul; + let mut start_x = (xpos as isize) + ((mvx >> 3) as isize) - (EDGE_PRE as isize); + let mut end_x = (xpos as isize) + ((mvx >> 3) as isize) + ((size + EDGE_POST) as isize); + if xstep < 0 { + start_x -= (size + EDGE_POST) as isize; + } else if xstep > 0 { + end_x += (size as isize) * xstep; + } + let mut start_y = (ypos as isize) + ((mvy >> 3) as isize) - (EDGE_PRE as isize) * ymul; + let mut end_y = (ypos as isize) + ((mvy >> 3) as isize) + ((size + EDGE_POST) as isize) * ymul; + if ymul == 0 { + start_y -= EDGE_PRE as isize; + end_y += (EDGE_POST + 1) as isize; + } let off = reffrm.get_offset(plane); let stride = reffrm.get_stride(plane); let (src, sstride) = if (start_x >= 0) && (end_x <= wa) && (start_y >= 0) && (end_y <= ha) { @@ -638,7 +647,7 @@ pub fn mc_block_special(dst: &mut [u8], doff: usize, dstride: usize, xpos: usize let bw = size + EDGE_PRE + EDGE_POST + add; let bh = (end_y - start_y) as usize; let bo = if xstep >= 0 { 0 } else { add }; - edge_emu(&reffrm, start_x + (bo as isize), start_y, bw, bh, mc_buf, 128, plane); + edge_emu(&reffrm, start_x + (bo as isize), start_y, bw, bh, mc_buf, 128, plane, 0); (&mc_buf[bo..], (128 + xstep) as usize) }; let mx = (mvx & 7) as usize;