zoomvtools 2.0.0

Video motion vector analysis utilities in pure Rust
Documentation
#![allow(clippy::unwrap_used, reason = "allow in test files")]

use std::num::{NonZeroU8, NonZeroUsize};

use crate::params::{MotionFlags, Subpel};

use super::MVAnalysisData;

fn sample_analysis_data() -> MVAnalysisData {
    MVAnalysisData {
        blk_size_x: NonZeroUsize::new(8).unwrap(),
        blk_size_y: NonZeroUsize::new(8).unwrap(),
        pel: Subpel::Half,
        level_count: 3,
        delta_frame: 1,
        is_backward: true,
        motion_flags: MotionFlags::USE_CHROMA_MOTION,
        width: NonZeroUsize::new(640).unwrap(),
        height: NonZeroUsize::new(480).unwrap(),
        overlap_x: 2,
        overlap_y: 2,
        blk_x: NonZeroUsize::new(80).unwrap(),
        blk_y: NonZeroUsize::new(60).unwrap(),
        bits_per_sample: NonZeroU8::new(10).unwrap(),
        y_ratio_uv: NonZeroU8::new(2).unwrap(),
        x_ratio_uv: NonZeroU8::new(2).unwrap(),
        h_padding: 16,
        v_padding: 16,
    }
}

#[test]
fn bytes_round_trip_through_from_bytes() {
    let data = sample_analysis_data();

    let decoded = MVAnalysisData::from_bytes(&data.bytes(), "Analyse", "vectors").unwrap();

    assert_eq!(decoded.blk_size_x, data.blk_size_x);
    assert_eq!(decoded.blk_size_y, data.blk_size_y);
    assert_eq!(decoded.pel, data.pel);
    assert_eq!(decoded.level_count, data.level_count);
    assert_eq!(decoded.delta_frame, data.delta_frame);
    assert_eq!(decoded.is_backward, data.is_backward);
    assert_eq!(decoded.motion_flags, data.motion_flags);
    assert_eq!(decoded.width, data.width);
    assert_eq!(decoded.height, data.height);
    assert_eq!(decoded.overlap_x, data.overlap_x);
    assert_eq!(decoded.overlap_y, data.overlap_y);
    assert_eq!(decoded.blk_x, data.blk_x);
    assert_eq!(decoded.blk_y, data.blk_y);
    assert_eq!(decoded.bits_per_sample, data.bits_per_sample);
    assert_eq!(decoded.y_ratio_uv, data.y_ratio_uv);
    assert_eq!(decoded.x_ratio_uv, data.x_ratio_uv);
    assert_eq!(decoded.h_padding, data.h_padding);
    assert_eq!(decoded.v_padding, data.v_padding);
}

#[test]
fn from_bytes_rejects_wrong_size() {
    let err = MVAnalysisData::from_bytes(&[0u8; 4], "Analyse", "vectors").unwrap_err();

    assert!(err.to_string().contains("has wrong size"));
}