cfg_if::cfg_if! {
if #[cfg(nasm_x86_64)] {
use crate::asm::x86::sad_plane::*;
} else {
use self::rust::*;
}
}
use v_frame::plane::Plane;
use crate::cpu_features::CpuFeatureLevel;
use crate::util::{CastFromPrimitive, Pixel};
pub(crate) mod rust {
use super::*;
use crate::cpu_features::CpuFeatureLevel;
#[inline]
pub(crate) fn sad_plane_internal<T: Pixel>(
src: &Plane<T>, dst: &Plane<T>, _cpu: CpuFeatureLevel,
) -> u64 {
debug_assert!(src.cfg.width == dst.cfg.width);
let width = src.cfg.width;
src
.rows_iter()
.zip(dst.rows_iter())
.map(|(src, dst)| {
let src = src.get(..width).unwrap_or(src);
let dst = dst.get(..width).unwrap_or(dst);
src
.iter()
.zip(dst.iter())
.map(|(&p1, &p2)| {
(i16::cast_from(p1) - i16::cast_from(p2)).unsigned_abs() as u32
})
.sum::<u32>() as u64
})
.sum()
}
}
pub(crate) fn sad_plane<T: Pixel>(
src: &Plane<T>, dst: &Plane<T>, cpu: CpuFeatureLevel,
) -> u64 {
sad_plane_internal(src, dst, cpu)
}