use ffmpeg::{format, media};
use ffmpeg_next as ffmpeg;
use mediadecode_ffmpeg::{Backend, Frame, VideoDecoder};
const SAMPLE_ENV: &str = "HWDECODE_SAMPLE_VIDEO";
#[test]
#[ignore = "requires HWDECODE_SAMPLE_VIDEO and a working hardware backend"]
fn auto_probe_picks_hardware_backend() {
let path = std::env::var_os(SAMPLE_ENV).unwrap_or_else(|| panic!("{SAMPLE_ENV} not set"));
ffmpeg::init().expect("ffmpeg init");
let mut input = format::input(&path).expect("open input");
let stream = input
.streams()
.best(media::Type::Video)
.expect("video stream");
let stream_index = stream.index();
let mut decoder = VideoDecoder::open(stream.parameters()).expect("open decoder");
eprintln!("auto-probe optimistic backend = {:?}", decoder.backend());
let mut frame = Frame::empty().expect("alloc frame");
let mut got_frame = false;
let log_first = |frame: &Frame, decoder: &VideoDecoder| {
eprintln!(
"first frame: backend={:?} {}x{} pix_fmt={:?}",
decoder.backend(),
frame.width(),
frame.height(),
frame.pix_fmt()
);
};
'outer: for (s, packet) in input.packets() {
if s.index() != stream_index {
continue;
}
loop {
match decoder.send_packet(&packet) {
Ok(()) => break,
Err(mediadecode_ffmpeg::Error::Ffmpeg(ffmpeg::Error::Other { errno }))
if errno == ffmpeg::error::EAGAIN =>
{
match decoder.receive_frame(&mut frame) {
Ok(()) => {
got_frame = true;
log_first(&frame, &decoder);
break 'outer;
}
Err(mediadecode_ffmpeg::Error::Ffmpeg(ffmpeg::Error::Other { errno }))
if errno == ffmpeg::error::EAGAIN =>
{
}
Err(e) => panic!("receive_frame (drain): {e}"),
}
}
Err(e) => panic!("send_packet: {e}"),
}
}
match decoder.receive_frame(&mut frame) {
Ok(()) => {
got_frame = true;
log_first(&frame, &decoder);
break;
}
Err(mediadecode_ffmpeg::Error::Ffmpeg(ffmpeg::Error::Other { errno }))
if errno == ffmpeg::error::EAGAIN =>
{
continue;
}
Err(e) => panic!("receive_frame: {e}"),
}
}
assert!(got_frame, "no frames decoded");
let backend = decoder.backend();
assert!(
matches!(
backend,
Backend::VideoToolbox | Backend::Vaapi | Backend::Cuda | Backend::D3d11va
),
"expected HW backend, got {backend:?}"
);
}