X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-itu%2Fsrc%2Fcodecs%2Fh264%2Ftypes.rs;fp=nihav-itu%2Fsrc%2Fcodecs%2Fh264%2Ftypes.rs;h=4cc1fca3b880085b2b7c216eff38e4eb156ac311;hp=00aa72e3e2d963bb17886f61f34c0c65f976986f;hb=754ab49a62c862e8c6e66ec88bb7ad626247140e;hpb=ef19a9351d2cae4bfedcf2acb7b0edb06ee131d5 diff --git a/nihav-itu/src/codecs/h264/types.rs b/nihav-itu/src/codecs/h264/types.rs index 00aa72e..4cc1fca 100644 --- a/nihav-itu/src/codecs/h264/types.rs +++ b/nihav-itu/src/codecs/h264/types.rs @@ -551,7 +551,7 @@ impl SliceState { if cur_cc || top_cc { self.deblock[y * 4 + x] |= 0x20; } else { - if mvdiff4(cur_mv[0], top_mv[0]) || mvdiff4(cur_mv[1], top_mv[1]) || !frefs.cmp_refs(cur_ref, top_ref) { + if mvdiff4(cur_mv, top_mv) || !frefs.cmp_refs(cur_ref, top_ref) { self.deblock[y * 4 + x] |= 0x10; } } @@ -574,7 +574,7 @@ impl SliceState { } else if cur_cc || left_cc { self.deblock[y * 4 + x] |= 2; } else { - if mvdiff4(cur_mv[0], left_mv[0]) || mvdiff4(cur_mv[1], left_mv[1]) || !frefs.cmp_refs(cur_ref, left_ref) { + if mvdiff4(cur_mv, left_mv) || !frefs.cmp_refs(cur_ref, left_ref) { self.deblock[y * 4 + x] |= 1; } } @@ -917,7 +917,27 @@ impl SliceState { } } -fn mvdiff4(mv1: MV, mv2: MV) -> bool { - let mv = mv1 - mv2; - (mv.x.abs() >= 4) || (mv.y.abs() >= 4) +#[cfg(not(target_arch="x86_64"))] +fn mvdiff4(mv1: &[MV; 2], mv2: &[MV; 2]) -> bool { + let mvd0 = mv1[0] - mv2[0]; + let mvd1 = mv1[1] - mv2[1]; + (mvd0.x.abs() >= 4) || (mvd0.y.abs() >= 4) || (mvd1.x.abs() >= 4) || (mvd1.y.abs() >= 4) +} + +#[cfg(target_arch="x86_64")] +fn mvdiff4(mv1: &[MV; 2], mv2: &[MV; 2]) -> bool { + unsafe { + let mut flag = false; + let ptr = std::mem::transmute::<*const MV, *const u64>(mv1.as_ptr()); + let mut m0 = *ptr; + let ptr = std::mem::transmute::<*const MV, *const u64>(mv2.as_ptr()); + let mut m1 = *ptr; + for _ in 0..4 { + let tmp = m0.wrapping_sub(m1) as u16; + flag |= tmp.wrapping_add(3) > 6; + m0 >>= 16; + m1 >>= 16; + } + flag + } }