pict-rs/src/discover/ffmpeg/tests.rs

242 lines
6.1 KiB
Rust
Raw Normal View History

use crate::formats::{
AlphaCodec, AnimationFormat, ImageFormat, ImageInput, InputFile, InputVideoFormat, Mp4Codec,
WebmAlphaCodec, WebmCodec,
};
2023-07-13 19:34:40 +00:00
use super::{Discovery, FfMpegDiscovery, PixelFormatOutput};
2023-07-13 19:34:40 +00:00
fn details_tests() -> [(&'static str, Option<Discovery>); 13] {
2023-07-13 19:34:40 +00:00
[
(
"animated_webp",
Some(Discovery {
input: InputFile::Animation(AnimationFormat::Webp),
2023-07-13 19:34:40 +00:00
width: 0,
height: 0,
frames: None,
}),
),
(
"animated_avif",
Some(Discovery {
input: InputFile::Animation(AnimationFormat::Avif),
width: 112,
height: 112,
frames: None,
}),
),
2023-07-13 19:34:40 +00:00
(
"apng",
Some(Discovery {
input: InputFile::Animation(AnimationFormat::Apng),
2023-07-13 19:34:40 +00:00
width: 112,
height: 112,
frames: Some(27),
}),
),
(
"avif",
Some(Discovery {
input: InputFile::Animation(AnimationFormat::Avif),
width: 1200,
height: 1387,
2023-07-13 19:34:40 +00:00
frames: None,
}),
),
(
"gif",
Some(Discovery {
input: InputFile::Animation(AnimationFormat::Gif),
width: 112,
height: 112,
frames: Some(27),
}),
),
(
"jpeg",
Some(Discovery {
input: InputFile::Image(ImageInput {
format: ImageFormat::Jpeg,
needs_reorient: false,
}),
width: 1663,
height: 1247,
frames: None,
}),
),
(
"jxl",
Some(Discovery {
input: InputFile::Image(ImageInput {
format: ImageFormat::Jxl,
needs_reorient: false,
}),
width: 0,
height: 0,
frames: None,
2023-07-13 19:34:40 +00:00
}),
),
(
"mp4",
Some(Discovery {
input: InputFile::Video(InputVideoFormat::Mp4 {
video_codec: Mp4Codec::H264,
audio_codec: None,
}),
width: 1426,
height: 834,
frames: Some(105),
}),
),
(
"mp4_av1",
Some(Discovery {
input: InputFile::Video(InputVideoFormat::Mp4 {
video_codec: Mp4Codec::Av1,
audio_codec: None,
}),
width: 112,
height: 112,
frames: Some(27),
2023-07-13 19:34:40 +00:00
}),
),
(
"png",
Some(Discovery {
input: InputFile::Image(ImageInput {
format: ImageFormat::Png,
needs_reorient: false,
}),
2023-07-13 19:34:40 +00:00
width: 450,
height: 401,
frames: None,
}),
),
(
"webm",
Some(Discovery {
input: InputFile::Video(InputVideoFormat::Webm {
video_codec: WebmCodec::Alpha(AlphaCodec {
alpha: false,
codec: WebmAlphaCodec::Vp9,
}),
audio_codec: None,
}),
width: 112,
height: 112,
frames: Some(27),
2023-07-13 19:34:40 +00:00
}),
),
(
"webm_av1",
Some(Discovery {
input: InputFile::Video(InputVideoFormat::Webm {
video_codec: WebmCodec::Av1,
audio_codec: None,
}),
2023-07-13 19:34:40 +00:00
width: 112,
height: 112,
frames: Some(27),
}),
),
(
"webp",
Some(Discovery {
input: InputFile::Image(ImageInput {
format: ImageFormat::Webp,
needs_reorient: false,
}),
width: 1200,
height: 1387,
2023-07-13 19:34:40 +00:00
frames: None,
}),
),
]
}
#[test]
fn parse_discovery() {
for (case, expected) in details_tests() {
let string = std::fs::read_to_string(format!(
"./src/discover/ffmpeg/ffprobe_6_0_{case}_details.json"
))
.expect("Read file");
let json: FfMpegDiscovery = serde_json::from_str(&string).expect("Valid json");
let (output, _) = super::parse_discovery(json).expect("Parsed details");
2023-07-13 19:34:40 +00:00
assert_eq!(output, expected);
}
}
const ALPHA_PIXEL_FORMATS: &[&str] = &[
"pal8",
"argb",
"rgba",
"abgr",
"bgra",
"yuva420p",
"ya8",
"yuva422p",
"yuva444p",
"yuva420p9be",
"yuva420p9le",
"yuva422p9be",
"yuva422p9le",
"yuva444p9be",
"yuva444p9le",
"yuva420p10be",
"yuva420p10le",
"yuva422p10be",
"yuva422p10le",
"yuva444p10be",
"yuva444p10le",
"yuva420p16be",
"yuva420p16le",
"yuva422p16be",
"yuva422p16le",
"yuva444p16be",
"yuva444p16le",
"rgba64be",
"rgba64le",
"bgra64be",
"bgra64le",
"ya16be",
"ya16le",
"gbrap",
"gbrap16be",
"gbrap16le",
"ayuv64le",
"ayuv64be",
"gbrap12be",
"gbrap12le",
"gbrap10be",
"gbrap10le",
"gbrapf32be",
"gbrapf32le",
"yuva422p12be",
"yuva422p12le",
"yuva444p12be",
"yuva444p12le",
"vuya",
"rgbaf16be",
"rgbaf16le",
"rgbaf32be",
"rgbaf32le",
];
#[test]
fn parse_pixel_formats() {
let formats = std::fs::read_to_string("./src/discover/ffmpeg/ffprobe_6_0_pixel_formats.json")
.expect("Read file");
let json: PixelFormatOutput = serde_json::from_str(&formats).expect("Valid json");
let output = super::parse_pixel_formats(json);
for format in ALPHA_PIXEL_FORMATS {
assert!(output.contains(*format), "Doesn't contain {format}");
}
}