zoomvtools 1.1.0

Video motion vector analysis utilities in pure Rust
Documentation
#[cfg(all(target_arch = "x86_64", feature = "avx2"))]
mod avx2;
mod rust;

#[cfg(test)]
mod tests;

use std::num::NonZeroUsize;

use crate::util::Pixel;

pub type LimitChangesFn = unsafe fn(
    dest: *mut u8,
    dest_stride_bytes: NonZeroUsize,
    src: *const u8,
    src_stride_bytes: NonZeroUsize,
    width: NonZeroUsize,
    height: NonZeroUsize,
    limit: u16,
);

#[must_use]
#[inline]
pub fn select_limit_changes<T: Pixel>() -> LimitChangesFn {
    #[cfg(all(target_arch = "x86_64", feature = "avx2", feature = "experimental"))]
    if crate::util::has_avx2() {
        return match std::mem::size_of::<T>() {
            // TODO: 10% slower than scalar on test machine
            1 => avx2::limit_changes_u8,
            // TODO: 10% slower than scalar on test machine
            2 => avx2::limit_changes_u16,
            _ => unreachable!(),
        };
    }

    rust::limit_changes::<T>
}