#![allow(clippy::useless_vec)]
use super::{util::le_encoded_u16_buf, *};
use std::{vec, vec::Vec};
fn p444_planes_10bit() -> (Vec<u16>, Vec<u16>, Vec<u16>) {
let y = le_encoded_u16_buf(&vec![64u16; 16 * 8]);
let u = le_encoded_u16_buf(&vec![512u16; 16 * 8]);
let v = le_encoded_u16_buf(&vec![512u16; 16 * 8]);
(y, u, v)
}
#[test]
fn yuv444p10_try_new_checked_accepts_in_range_samples() {
let (y, u, v) = p444_planes_10bit();
let f = Yuv444p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).expect("valid 10-bit");
assert_eq!(f.width(), 16);
assert_eq!(f.bits(), 10);
}
#[test]
fn yuv444p10_try_new_checked_accepts_max_valid_value() {
let y = le_encoded_u16_buf(&vec![1023u16; 16 * 8]);
let u = le_encoded_u16_buf(&vec![1023u16; 16 * 8]);
let v = le_encoded_u16_buf(&vec![1023u16; 16 * 8]);
Yuv444p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).expect("max valid passes");
}
#[test]
fn yuv444p10_try_new_checked_rejects_y_high_bit_set() {
let mut intended_y = vec![0u16; 16 * 8];
intended_y[2 * 16 + 9] = 0x8000;
let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&vec![512u16; 16 * 8]);
let v = le_encoded_u16_buf(&vec![512u16; 16 * 8]);
let e = Yuv444p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv444p10_try_new_checked_rejects_u_plane_sample_in_full_width_chroma() {
let mut intended_u = vec![512u16; 16 * 8];
intended_u[3 * 16 + 13] = 1024;
let y = le_encoded_u16_buf(&vec![0u16; 16 * 8]);
let u = le_encoded_u16_buf(&intended_u);
let v = le_encoded_u16_buf(&vec![512u16; 16 * 8]);
let e = Yuv444p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv444p10_try_new_checked_rejects_v_plane_sample() {
let intended_y = vec![0u16; 16 * 8];
let intended_u = vec![512u16; 16 * 8];
let mut intended_v = vec![512u16; 16 * 8];
intended_v[7 * 16 + 15] = 0xFFFF; let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&intended_u);
let v = le_encoded_u16_buf(&intended_v);
let e = Yuv444p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv444p14_try_new_checked_rejects_above_16383() {
let mut intended_y = vec![8192u16; 16 * 8];
intended_y[42] = 16384; let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&vec![8192u16; 16 * 8]);
let v = le_encoded_u16_buf(&vec![8192u16; 16 * 8]);
let e = Yuv444p14Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv444p16_try_new_checked_accepts_full_u16_range() {
let y = vec![65535u16; 16 * 8];
let u = vec![32768u16; 16 * 8];
let v = vec![32768u16; 16 * 8];
Yuv444p16Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16)
.expect("every u16 value is in range at 16 bits");
}
fn p440_planes_10bit() -> (Vec<u16>, Vec<u16>, Vec<u16>) {
let y = le_encoded_u16_buf(&vec![64u16; 16 * 8]);
let u = le_encoded_u16_buf(&vec![512u16; 16 * 4]);
let v = le_encoded_u16_buf(&vec![512u16; 16 * 4]);
(y, u, v)
}
#[test]
fn yuv440p10_try_new_checked_accepts_in_range_samples() {
let (y, u, v) = p440_planes_10bit();
let f = Yuv440p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).expect("valid 10-bit");
assert_eq!(f.width(), 16);
assert_eq!(f.bits(), 10);
}
#[test]
fn yuv440p10_try_new_checked_rejects_y_high_bit_set() {
let mut intended_y = vec![0u16; 16 * 8];
intended_y[2 * 16 + 9] = 0x8000;
let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&vec![512u16; 16 * 4]);
let v = le_encoded_u16_buf(&vec![512u16; 16 * 4]);
let e = Yuv440p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv440p10_try_new_checked_rejects_u_plane_sample_in_full_width_chroma() {
let mut intended_u = vec![512u16; 16 * 4];
intended_u[3 * 16 + 13] = 1024;
let y = le_encoded_u16_buf(&vec![0u16; 16 * 8]);
let u = le_encoded_u16_buf(&intended_u);
let v = le_encoded_u16_buf(&vec![512u16; 16 * 4]);
let e = Yuv440p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv440p10_try_new_checked_rejects_v_plane_sample() {
let intended_y = vec![0u16; 16 * 8];
let intended_u = vec![512u16; 16 * 4];
let mut intended_v = vec![512u16; 16 * 4];
intended_v[3 * 16 + 15] = 0xFFFF; let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&intended_u);
let v = le_encoded_u16_buf(&intended_v);
let e = Yuv440p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv440p12_try_new_checked_rejects_above_4095() {
let mut intended_y = vec![2048u16; 16 * 8];
intended_y[42] = 4096; let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&vec![2048u16; 16 * 4]);
let v = le_encoded_u16_buf(&vec![2048u16; 16 * 4]);
let e = Yuv440p12Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv444p10_try_new_checked_accepts_le_encoded_buffer_on_any_host() {
let intended_y = vec![1023u16; 16 * 8];
let intended_uv = vec![512u16; 16 * 8];
let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&intended_uv);
let v = le_encoded_u16_buf(&intended_uv);
Yuv444p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16)
.expect("LE-encoded valid yuv444p10le must be accepted on both LE and BE hosts");
}
#[test]
fn yuv444p14_try_new_checked_rejects_le_encoded_out_of_range_on_any_host() {
let intended_y = vec![8192u16; 16 * 8];
let intended_u = vec![8192u16; 16 * 8];
let mut intended_v = vec![8192u16; 16 * 8];
intended_v[3 * 16 + 11] = 16384;
let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&intended_u);
let v = le_encoded_u16_buf(&intended_v);
let e = Yuv444p14Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn yuv440p10_try_new_checked_accepts_le_encoded_buffer_on_any_host() {
let intended_y = vec![1023u16; 16 * 8];
let intended_uv = vec![512u16; 16 * 4];
let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&intended_uv);
let v = le_encoded_u16_buf(&intended_uv);
Yuv440p10Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16)
.expect("LE-encoded valid yuv440p10le must be accepted on both LE and BE hosts");
}
#[test]
fn yuv440p12_try_new_checked_rejects_le_encoded_out_of_range_on_any_host() {
let intended_y = vec![2048u16; 16 * 8];
let mut intended_u = vec![2048u16; 16 * 4];
intended_u[2 * 16 + 5] = 4096;
let intended_v = vec![2048u16; 16 * 4];
let y = le_encoded_u16_buf(&intended_y);
let u = le_encoded_u16_buf(&intended_u);
let v = le_encoded_u16_buf(&intended_v);
let e = Yuv440p12Frame::try_new_checked(&y, &u, &v, 16, 8, 16, 16, 16).unwrap_err();
assert!(matches!(e, Yuv420pFrame16Error::SampleOutOfRange(_)));
}
#[test]
fn p410_try_new_checked_accepts_le_encoded_buffer_on_any_host() {
let intended_y = vec![0xFFC0u16; 16 * 8];
let intended_uv = vec![0x8000u16; 32 * 8];
let y = le_encoded_u16_buf(&intended_y);
let uv = le_encoded_u16_buf(&intended_uv);
P410Frame::try_new_checked(&y, &uv, 16, 8, 16, 32)
.expect("LE-encoded valid P410 must be accepted on both LE and BE hosts");
}
#[test]
fn p410_try_new_checked_rejects_le_encoded_low_bits_on_any_host() {
let intended_y = vec![0xFFC0u16; 16 * 8];
let mut intended_uv = vec![0x8000u16; 32 * 8];
intended_uv[4 * 32 + 17] = 0x03FF;
let y = le_encoded_u16_buf(&intended_y);
let uv = le_encoded_u16_buf(&intended_uv);
let e = P410Frame::try_new_checked(&y, &uv, 16, 8, 16, 32).unwrap_err();
assert!(matches!(e, PnFrameError::SampleLowBitsSet(_)));
}