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
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
];
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);
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) {
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;