#![allow(clippy::unwrap_used, reason = "allow in test files")]
#![allow(clippy::undocumented_unsafe_blocks, reason = "allow in test files")]
#![allow(clippy::indexing_slicing, reason = "allow in test files")]
use std::num::{NonZeroU8, NonZeroUsize};
use super::*;
use crate::params::{ReduceFilter, Subpel, SubpelMethod};
fn create_test_mvplane(
width: usize,
height: usize,
pel: Subpel,
hpad: usize,
vpad: usize,
bits_per_sample: u8,
plane_offset: usize,
pitch: usize,
) -> MVPlane {
MVPlane::new(
NonZeroUsize::new(width).unwrap(),
NonZeroUsize::new(height).unwrap(),
pel,
hpad,
vpad,
NonZeroU8::new(bits_per_sample).unwrap(),
plane_offset,
NonZeroUsize::new(pitch).unwrap(),
)
.unwrap()
}
#[test]
fn mvplane_new_basic() {
let plane = create_test_mvplane(64, 48, Subpel::Full, 8, 8, 8, 0, 80);
assert_eq!(plane.width.get(), 64);
assert_eq!(plane.height.get(), 48);
assert_eq!(plane.padded_width.get(), 80); assert_eq!(plane.padded_height.get(), 64); assert_eq!(plane.hpad, 8);
assert_eq!(plane.vpad, 8);
assert_eq!(plane.stride.get(), 80);
assert_eq!(plane.pel, Subpel::Full);
assert_eq!(plane.bits_per_sample.get(), 8);
assert!(!plane.is_padded);
assert!(!plane.is_refined);
assert!(!plane.is_filled);
assert_eq!(plane.subpel_window_offsets.len(), 1);
assert_eq!(plane.subpel_window_offsets[0], 0);
}
#[test]
fn mvplane_new_half_pel() {
let plane = create_test_mvplane(32, 24, Subpel::Half, 4, 4, 8, 100, 40);
assert_eq!(plane.pel, Subpel::Half);
assert_eq!(plane.hpad_pel, 8); assert_eq!(plane.vpad_pel, 8);
assert_eq!(plane.subpel_window_offsets.len(), 4);
assert_eq!(plane.subpel_window_offsets[0], 100);
let padded_height = 32; let expected_offset_1 = 100 + 40 * padded_height;
assert_eq!(plane.subpel_window_offsets[1], expected_offset_1);
}
#[test]
fn mvplane_new_quarter_pel() {
let plane = create_test_mvplane(16, 16, Subpel::Quarter, 2, 2, 16, 0, 24);
assert_eq!(plane.pel, Subpel::Quarter);
assert_eq!(plane.hpad_pel, 8); assert_eq!(plane.vpad_pel, 8);
assert_eq!(plane.subpel_window_offsets.len(), 16);
}
#[test]
fn mvplane_new_with_plane_offset() {
let plane_offset = 1000;
let plane = create_test_mvplane(8, 8, Subpel::Half, 2, 2, 8, plane_offset, 12);
for offset in &plane.subpel_window_offsets {
assert!(*offset >= plane_offset);
}
assert_eq!(plane.subpel_window_offsets[0], plane_offset);
}
#[test]
fn mvplane_fill_plane_basic() {
let mut plane = create_test_mvplane(4, 4, Subpel::Full, 2, 2, 8, 0, 8);
let src_data = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
let src_pitch = NonZeroUsize::new(4).unwrap();
let total_size =
plane.stride.get() * (plane.height.get() + 2 * plane.vpad) + plane.offset_padding;
let mut dest = vec![0u8; total_size];
assert!(!plane.is_filled);
plane.fill_plane(&src_data, src_pitch, &mut dest);
assert!(plane.is_filled);
let offset = plane.subpel_window_offsets[0] + plane.offset_padding;
for row in 0..4 {
for col in 0..4 {
let src_index = row * 4 + col;
let dest_index = offset + row * plane.stride.get() + col;
assert_eq!(dest[dest_index], src_data[src_index]);
}
}
}
#[test]
fn mvplane_fill_plane_already_filled() {
let mut plane = create_test_mvplane(2, 2, Subpel::Full, 1, 1, 8, 0, 4);
let src_data = vec![1u8, 2, 3, 4];
let src_pitch = NonZeroUsize::new(2).unwrap();
let total_size =
plane.stride.get() * (plane.height.get() + 2 * plane.vpad) + plane.offset_padding;
let mut dest = vec![0u8; total_size];
plane.fill_plane(&src_data, src_pitch, &mut dest);
assert!(plane.is_filled);
let offset = plane.subpel_window_offsets[0] + plane.offset_padding;
dest[offset] = 99;
let src_data2 = vec![10u8, 20, 30, 40];
plane.fill_plane(&src_data2, src_pitch, &mut dest);
assert_eq!(dest[offset], 99);
}
#[test]
fn mvplane_fill_plane_different_pitch() {
let mut plane = create_test_mvplane(3, 2, Subpel::Full, 1, 1, 8, 0, 5);
let src_data = vec![1u8, 2, 3, 0, 4, 5, 6, 0]; let src_pitch = NonZeroUsize::new(4).unwrap();
let total_size =
plane.stride.get() * (plane.height.get() + 2 * plane.vpad) + plane.offset_padding;
let mut dest = vec![0u8; total_size];
plane.fill_plane(&src_data, src_pitch, &mut dest);
let offset = plane.subpel_window_offsets[0] + plane.offset_padding;
assert_eq!(dest[offset], 1);
assert_eq!(dest[offset + 1], 2);
assert_eq!(dest[offset + 2], 3);
assert_eq!(dest[offset + plane.stride.get()], 4);
assert_eq!(dest[offset + plane.stride.get() + 1], 5);
assert_eq!(dest[offset + plane.stride.get() + 2], 6);
}
#[test]
fn mvplane_refine_ext_full_pel() {
let mut plane = create_test_mvplane(4, 4, Subpel::Full, 2, 2, 8, 0, 8);
let src_2x = vec![0u8; 32]; let src_2x_pitch = NonZeroUsize::new(8).unwrap();
let mut dest = vec![0u8; 128];
assert!(!plane.is_refined);
plane.refine_ext(&src_2x, src_2x_pitch, true, &mut dest);
assert!(plane.is_refined);
}
#[test]
fn mvplane_refine_ext_half_pel() {
let mut plane = create_test_mvplane(2, 2, Subpel::Half, 1, 1, 8, 0, 4);
let src_2x = vec![0u8; 16]; let src_2x_pitch = NonZeroUsize::new(4).unwrap();
let mut dest = vec![0u8; 64];
assert!(!plane.is_refined);
plane.refine_ext(&src_2x, src_2x_pitch, true, &mut dest);
assert!(plane.is_refined);
}
#[test]
fn mvplane_refine_ext_quarter_pel() {
let mut plane = create_test_mvplane(1, 1, Subpel::Quarter, 1, 1, 8, 0, 3);
let src_2x = vec![0u8; 16]; let src_2x_pitch = NonZeroUsize::new(4).unwrap();
let buffer_size = plane.subpel_window_offsets.iter().max().unwrap_or(&0)
+ plane.stride.get() * (plane.height.get() + 2 * plane.vpad) * 2;
let mut dest = vec![0u8; buffer_size];
assert!(!plane.is_refined);
plane.refine_ext(&src_2x, src_2x_pitch, true, &mut dest);
assert!(plane.is_refined);
}
#[test]
fn mvplane_refine_ext_already_refined() {
let mut plane = create_test_mvplane(2, 2, Subpel::Half, 1, 1, 8, 0, 4);
let src_2x = vec![0u8; 16];
let src_2x_pitch = NonZeroUsize::new(4).unwrap();
let buffer_size = plane.subpel_window_offsets.iter().max().unwrap_or(&0)
+ plane.stride.get() * (plane.height.get() + 2 * plane.vpad) * 2;
let mut dest = vec![0u8; buffer_size];
plane.refine_ext(&src_2x, src_2x_pitch, true, &mut dest);
assert!(plane.is_refined);
plane.refine_ext(&src_2x, src_2x_pitch, true, &mut dest);
assert!(plane.is_refined);
}
#[test]
fn mvplane_reduce_to_already_filled() {
let plane = create_test_mvplane(8, 8, Subpel::Full, 2, 2, 8, 0, 12);
let mut reduced_plane = create_test_mvplane(4, 4, Subpel::Full, 1, 1, 8, 0, 6);
reduced_plane.is_filled = true;
let src = vec![0u8; 144]; let mut dest = vec![0u8; 36]; let dest_copy = dest.clone();
plane.reduce_to(
&mut reduced_plane,
ReduceFilter::Average,
&mut dest,
&src,
NonZeroUsize::new(6).unwrap(),
NonZeroUsize::new(12).unwrap(),
NonZeroUsize::new(4).unwrap(),
NonZeroUsize::new(4).unwrap(),
);
assert!(reduced_plane.is_filled);
assert!(dest == dest_copy);
}
#[test]
fn mvplane_reduce_to_basic() {
let plane = create_test_mvplane(4, 4, Subpel::Full, 1, 1, 8, 0, 6);
let mut reduced_plane = create_test_mvplane(2, 2, Subpel::Full, 1, 1, 8, 0, 4);
let mut src = vec![0u8; 36]; for i in 0..36 {
src[i] = (i % 256) as u8;
}
let mut dest = vec![0u8; 16];
assert!(!reduced_plane.is_filled);
plane.reduce_to(
&mut reduced_plane,
ReduceFilter::Average,
&mut dest,
&src,
NonZeroUsize::new(4).unwrap(),
NonZeroUsize::new(6).unwrap(),
NonZeroUsize::new(2).unwrap(),
NonZeroUsize::new(2).unwrap(),
);
assert!(reduced_plane.is_filled);
}
#[test]
fn mvplane_reduce_to_different_filters() {
let plane = create_test_mvplane(4, 2, Subpel::Full, 0, 0, 8, 0, 4);
let src = vec![1u8, 2, 3, 4, 5, 6, 7, 8];
let mut dest = vec![0u8; 4];
for filter in [
ReduceFilter::Average,
ReduceFilter::Triangle,
ReduceFilter::Bilinear,
ReduceFilter::Quadratic,
ReduceFilter::Cubic,
] {
let mut reduced_plane = create_test_mvplane(2, 1, Subpel::Full, 0, 0, 8, 0, 2);
plane.reduce_to(
&mut reduced_plane,
filter,
&mut dest,
&src,
NonZeroUsize::new(2).unwrap(),
NonZeroUsize::new(4).unwrap(),
NonZeroUsize::new(2).unwrap(),
NonZeroUsize::new(1).unwrap(),
);
assert!(reduced_plane.is_filled);
}
}
#[test]
fn mvplane_pad_basic() {
let mut plane = create_test_mvplane(2, 2, Subpel::Full, 1, 1, 8, 0, 4);
let total_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let mut src = vec![0u8; total_size];
let start_offset = plane.stride.get() * plane.vpad + plane.hpad;
src[start_offset] = 1;
src[start_offset + 1] = 2;
src[start_offset + plane.stride.get()] = 3;
src[start_offset + plane.stride.get() + 1] = 4;
assert!(!plane.is_padded);
plane.pad(&mut src);
assert!(plane.is_padded);
assert_eq!(src[plane.hpad], 1); assert_eq!(src[plane.hpad + 1], 2);
assert_eq!(src[start_offset - 1], 1); }
#[test]
fn mvplane_pad_already_padded() {
let mut plane = create_test_mvplane(2, 2, Subpel::Full, 1, 1, 8, 0, 4);
let total_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let mut src = vec![0u8; total_size];
plane.pad(&mut src);
assert!(plane.is_padded);
src[0] = 99;
plane.pad(&mut src);
assert_eq!(src[0], 99);
}
#[test]
fn mvplane_refine_full_pel() {
let mut plane = create_test_mvplane(4, 4, Subpel::Full, 2, 2, 8, 0, 8);
let total_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let mut plane_data = vec![0u8; total_size];
assert!(!plane.is_refined);
plane.refine(SubpelMethod::Bilinear, &mut plane_data);
assert!(plane.is_refined);
}
#[test]
fn mvplane_refine_half_pel() {
let mut plane = create_test_mvplane(4, 4, Subpel::Half, 2, 2, 8, 0, 8);
let max_offset = plane.subpel_window_offsets.iter().max().unwrap_or(&0);
let window_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let total_size = max_offset + window_size + 1000; let mut plane_data = vec![1u8; total_size];
assert!(!plane.is_refined);
plane.refine(SubpelMethod::Bilinear, &mut plane_data);
assert!(plane.is_refined);
}
#[test]
fn mvplane_refine_quarter_pel() {
let mut plane = create_test_mvplane(4, 4, Subpel::Quarter, 2, 2, 8, 0, 8);
let max_offset = plane.subpel_window_offsets.iter().max().unwrap_or(&0);
let window_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let total_size = max_offset + window_size + 1000; let mut plane_data = vec![1u8; total_size];
assert!(!plane.is_refined);
plane.refine(SubpelMethod::Bicubic, &mut plane_data);
assert!(plane.is_refined);
}
#[test]
fn mvplane_refine_different_subpel_methods() {
for subpel_method in [
SubpelMethod::Bilinear,
SubpelMethod::Bicubic,
SubpelMethod::Wiener,
] {
let mut plane = create_test_mvplane(4, 4, Subpel::Half, 2, 2, 8, 0, 8);
let max_offset = plane.subpel_window_offsets.iter().max().unwrap_or(&0);
let window_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let total_size = max_offset + window_size + 1000; let mut plane_data = vec![1u8; total_size];
assert!(!plane.is_refined);
plane.refine(subpel_method, &mut plane_data);
assert!(plane.is_refined);
}
}
#[test]
fn mvplane_refine_already_refined() {
let mut plane = create_test_mvplane(4, 4, Subpel::Half, 2, 2, 8, 0, 8);
let max_offset = plane.subpel_window_offsets.iter().max().unwrap_or(&0);
let window_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let total_size = max_offset + window_size + 1000; let mut plane_data = vec![1u8; total_size];
plane.refine(SubpelMethod::Bilinear, &mut plane_data);
assert!(plane.is_refined);
if plane.subpel_window_offsets.len() > 1 {
plane_data[plane.subpel_window_offsets[1]] = 99;
plane.refine(SubpelMethod::Bicubic, &mut plane_data);
assert_eq!(plane_data[plane.subpel_window_offsets[1]], 99);
}
}
#[test]
fn mvplane_constructor_valid_bits() {
for bits in [8, 10, 12, 16] {
let result = MVPlane::new(
NonZeroUsize::new(4).unwrap(),
NonZeroUsize::new(4).unwrap(),
Subpel::Full,
2,
2,
NonZeroU8::new(bits).unwrap(),
0,
NonZeroUsize::new(8).unwrap(),
);
assert!(result.is_ok(), "Failed for {} bits per sample", bits);
}
}
#[test]
fn mvplane_offset_calculations() {
let plane = create_test_mvplane(8, 6, Subpel::Half, 4, 3, 8, 100, 16);
assert_eq!(plane.offset_padding, 52);
assert_eq!(plane.subpel_window_offsets[0], 100);
let padded_height = 6 + 2 * 3; let window_spacing = padded_height * 16;
assert_eq!(plane.subpel_window_offsets[1], 100 + window_spacing);
assert_eq!(plane.subpel_window_offsets[2], 100 + 2 * window_spacing);
assert_eq!(plane.subpel_window_offsets[3], 100 + 3 * window_spacing);
}
#[test]
fn plane_height_luma_level_0() {
let src_height = NonZeroUsize::new(100).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 8;
let result = plane_height_luma(src_height, 0, y_ratio_uv, vpad);
assert_eq!(result.get(), 100);
}
#[test]
fn plane_height_luma_downscaling() {
let src_height = NonZeroUsize::new(200).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 4;
let result_level_1 = plane_height_luma(src_height, 1, y_ratio_uv, vpad);
assert_eq!(result_level_1.get(), 100);
let result_level_2 = plane_height_luma(src_height, 2, y_ratio_uv, vpad);
assert_eq!(result_level_2.get(), 50);
}
#[test]
fn plane_height_luma_with_large_vpad() {
let src_height = NonZeroUsize::new(200).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 8;
let result = plane_height_luma(src_height, 1, y_ratio_uv, vpad);
assert_eq!(result.get(), 100);
}
#[test]
fn plane_height_luma_multiple_levels() {
let src_height = NonZeroUsize::new(1600).unwrap();
let y_ratio_uv = NonZeroU8::new(1).unwrap(); let vpad = 0;
let result_1 = plane_height_luma(src_height, 1, y_ratio_uv, vpad);
assert_eq!(result_1.get(), 800);
let result_2 = plane_height_luma(src_height, 2, y_ratio_uv, vpad);
assert_eq!(result_2.get(), 400);
let result_3 = plane_height_luma(src_height, 3, y_ratio_uv, vpad);
assert_eq!(result_3.get(), 200);
}
#[test]
fn plane_height_luma_4_2_0_format() {
let src_height = NonZeroUsize::new(480).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap(); let vpad = 0;
let result_1 = plane_height_luma(src_height, 1, y_ratio_uv, vpad);
assert_eq!(result_1.get(), 240);
let result_2 = plane_height_luma(src_height, 2, y_ratio_uv, vpad);
assert_eq!(result_2.get(), 120);
}
#[test]
fn plane_width_luma_level_0() {
let src_width = NonZeroUsize::new(100).unwrap();
let x_ratio_uv = NonZeroU8::new(2).unwrap();
let hpad = 8;
let result = plane_width_luma(src_width, 0, x_ratio_uv, hpad);
assert_eq!(result.get(), 100);
}
#[test]
fn plane_width_luma_downscaling() {
let src_width = NonZeroUsize::new(400).unwrap();
let x_ratio_uv = NonZeroU8::new(2).unwrap();
let hpad = 1;
let result_level_1 = plane_width_luma(src_width, 1, x_ratio_uv, hpad);
assert_eq!(result_level_1.get(), 200);
let result_level_2 = plane_width_luma(src_width, 2, x_ratio_uv, hpad);
assert_eq!(result_level_2.get(), 100);
}
#[test]
fn plane_width_luma_with_large_hpad() {
let src_width = NonZeroUsize::new(400).unwrap();
let x_ratio_uv = NonZeroU8::new(2).unwrap();
let hpad = 4;
let result = plane_width_luma(src_width, 1, x_ratio_uv, hpad);
assert_eq!(result.get(), 200);
}
#[test]
fn plane_width_luma_4_4_4_format() {
let src_width = NonZeroUsize::new(1920).unwrap();
let x_ratio_uv = NonZeroU8::new(1).unwrap(); let hpad = 0;
let result_1 = plane_width_luma(src_width, 1, x_ratio_uv, hpad);
assert_eq!(result_1.get(), 960);
let result_2 = plane_width_luma(src_width, 2, x_ratio_uv, hpad);
assert_eq!(result_2.get(), 480);
}
#[test]
fn plane_width_luma_4_2_0_format() {
let src_width = NonZeroUsize::new(640).unwrap();
let x_ratio_uv = NonZeroU8::new(2).unwrap(); let hpad = 1;
let result_1 = plane_width_luma(src_width, 1, x_ratio_uv, hpad);
assert_eq!(result_1.get(), 320);
let result_2 = plane_width_luma(src_width, 2, x_ratio_uv, hpad);
assert_eq!(result_2.get(), 160);
}
#[test]
fn plane_super_offset_level_0() {
let src_height = NonZeroUsize::new(100).unwrap();
let plane_pitch = NonZeroUsize::new(120).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 8;
let offset_luma = plane_super_offset(
false,
src_height,
0,
Subpel::Full,
vpad,
plane_pitch,
y_ratio_uv,
);
let offset_chroma = plane_super_offset(
true,
src_height,
0,
Subpel::Full,
vpad,
plane_pitch,
y_ratio_uv,
);
assert_eq!(offset_luma, 0);
assert_eq!(offset_chroma, 0);
}
#[test]
fn plane_super_offset_level_1_luma() {
let src_height = NonZeroUsize::new(100).unwrap();
let plane_pitch = NonZeroUsize::new(120).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 8;
let pel = Subpel::Full;
let offset = plane_super_offset(false, src_height, 1, pel, vpad, plane_pitch, y_ratio_uv);
assert_eq!(offset, 13920);
}
#[test]
fn plane_super_offset_level_1_chroma() {
let src_height = NonZeroUsize::new(100).unwrap();
let plane_pitch = NonZeroUsize::new(120).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 8;
let pel = Subpel::Full;
let offset = plane_super_offset(true, src_height, 1, pel, vpad, plane_pitch, y_ratio_uv);
assert_eq!(offset, 13920);
}
#[test]
fn plane_super_offset_half_pel() {
let src_height = NonZeroUsize::new(100).unwrap();
let plane_pitch = NonZeroUsize::new(120).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 8;
let pel = Subpel::Half;
let offset = plane_super_offset(false, src_height, 1, pel, vpad, plane_pitch, y_ratio_uv);
assert_eq!(offset, 55680);
}
#[test]
fn plane_super_offset_quarter_pel() {
let src_height = NonZeroUsize::new(100).unwrap();
let plane_pitch = NonZeroUsize::new(120).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 8;
let pel = Subpel::Quarter;
let offset = plane_super_offset(false, src_height, 1, pel, vpad, plane_pitch, y_ratio_uv);
assert_eq!(offset, 222720);
}
#[test]
fn plane_super_offset_multiple_levels() {
let src_height = NonZeroUsize::new(200).unwrap();
let plane_pitch = NonZeroUsize::new(240).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 4;
let pel = Subpel::Full;
let offset = plane_super_offset(false, src_height, 2, pel, vpad, plane_pitch, y_ratio_uv);
assert_eq!(offset, 75840);
}
#[test]
fn plane_super_offset_chroma_vs_luma() {
let src_height = NonZeroUsize::new(200).unwrap();
let plane_pitch = NonZeroUsize::new(240).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap();
let vpad = 4;
let pel = Subpel::Full;
let offset_luma = plane_super_offset(false, src_height, 2, pel, vpad, plane_pitch, y_ratio_uv);
let offset_chroma = plane_super_offset(true, src_height, 2, pel, vpad, plane_pitch, y_ratio_uv);
assert_eq!(offset_luma, offset_chroma);
}
#[test]
fn plane_super_offset_realistic_video_dimensions() {
let src_height = NonZeroUsize::new(1080).unwrap();
let plane_pitch = NonZeroUsize::new(1920).unwrap();
let y_ratio_uv = NonZeroU8::new(2).unwrap(); let vpad = 16;
let pel = Subpel::Quarter;
let offset = plane_super_offset(false, src_height, 1, pel, vpad, plane_pitch, y_ratio_uv);
assert_eq!(offset, 34_160_640);
}
#[test]
fn plane_height_width_consistency() {
let src_dim = NonZeroUsize::new(320).unwrap();
let ratio_uv = NonZeroU8::new(2).unwrap();
let pad = 8;
let height = plane_height_luma(src_dim, 1, ratio_uv, pad);
let width = plane_width_luma(src_dim, 1, ratio_uv, pad);
assert_eq!(height, width);
}
#[test]
fn mvplane_refine_no_clones_performance() {
let mut plane = create_test_mvplane(64, 64, Subpel::Quarter, 8, 8, 8, 0, 80);
let max_offset = plane.subpel_window_offsets.iter().max().unwrap_or(&0);
let window_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let total_size = max_offset + window_size + 1000; let mut plane_data = vec![42u8; total_size];
for (i, val) in plane_data.iter_mut().enumerate() {
*val = (i % 256) as u8;
}
assert!(!plane.is_refined);
plane.refine(SubpelMethod::Bilinear, &mut plane_data);
assert!(plane.is_refined);
let original_pattern_intact = plane_data
.iter()
.enumerate()
.all(|(i, &val)| val == (i % 256) as u8);
assert!(
!original_pattern_intact,
"Refinement should have modified the data"
);
}
#[test]
fn mvplane_refine_different_pel_methods_no_clones() {
for pel in [Subpel::Half, Subpel::Quarter] {
for method in [
SubpelMethod::Bilinear,
SubpelMethod::Bicubic,
SubpelMethod::Wiener,
] {
let mut plane = create_test_mvplane(16, 16, pel, 4, 4, 8, 0, 24);
let max_offset = plane.subpel_window_offsets.iter().max().unwrap_or(&0);
let window_size = plane.stride.get() * (plane.height.get() + 2 * plane.vpad);
let total_size = max_offset + window_size + 1000;
let mut plane_data = vec![100u8; total_size];
assert!(!plane.is_refined);
plane.refine(method, &mut plane_data);
assert!(plane.is_refined);
}
}
}