#![allow(
clippy::unwrap_used,
clippy::expect_used,
clippy::print_stderr,
reason = "test modules may unwrap / print"
)]
use super::*;
use crate::VideoInputPreference;
use mediaway_common::Rational;
const fn tiny_h264_cfg() -> VideoEncoderConfig {
VideoEncoderConfig {
codec: mediaway_common::CodecKind::H264,
width: 64,
height: 64,
time_base: Rational::new(1, 30),
bitrate_bps: 500_000,
pixel_format: mediaway_common::PixelFormat::Nv12,
input: VideoInputPreference::CpuUploadOk,
gpu_device: None,
}
}
#[test]
fn open_unsupported_codec_returns_unsupported_without_hardware() {
let mut cfg = tiny_h264_cfg();
cfg.codec = mediaway_common::CodecKind::Av1;
assert!(matches!(
LinuxVideoEncoder::open(&cfg),
Err(EncodeError::Unsupported)
));
}
#[test]
fn open_zero_copy_gpu_returns_unsupported_without_hardware() {
let mut cfg = tiny_h264_cfg();
cfg.input = VideoInputPreference::ZeroCopyGpu;
assert!(matches!(
LinuxVideoEncoder::open(&cfg),
Err(EncodeError::Unsupported)
));
}
#[test]
fn open_h264_cpu_upload_or_skip_without_hw() {
let cfg = tiny_h264_cfg();
let mut enc = match LinuxVideoEncoder::open(&cfg) {
Ok(e) => e,
Err(e) => {
eprintln!("skip: LinuxVideoEncoder::open failed ({e:?}) — no VA-API display?");
return;
}
};
let nv12_len = 64 * 64 + (64 * 64) / 2;
let frame = VideoFrame {
pts: 0,
duration: 1,
width: 64,
height: 64,
format: mediaway_common::PixelFormat::Nv12,
storage: mediaway_common::VideoFrameStorage::Cpu {
data: Bytes::from(vec![0u8; nv12_len]),
},
};
if let Err(e) = enc.push_frame(&frame) {
eprintln!("skip: push_frame failed ({e:?})");
return;
}
let _ = enc.flush();
let mut packets = 0usize;
while let Ok(Some(p)) = enc.poll_packet() {
assert!(!p.payload.is_empty());
packets += 1;
}
eprintln!("LinuxVideoEncoder packets={packets}");
}