use std::{path::Path, process, sync::Arc};
use avio::{FramePool, VecPool, VideoDecoder};
fn main() {
let mut args = std::env::args().skip(1);
let mut input = None::<String>;
let mut pool_size: usize = 8;
while let Some(flag) = args.next() {
match flag.as_str() {
"--input" | "-i" => input = Some(args.next().unwrap_or_default()),
"--pool-size" => {
let v = args.next().unwrap_or_default();
pool_size = v.parse().unwrap_or(8);
}
other => {
eprintln!("Unknown flag: {other}");
process::exit(1);
}
}
}
let input = input.unwrap_or_else(|| {
eprintln!("Usage: frame_pool_usage --input <file> [--pool-size N]");
process::exit(1);
});
let in_name = Path::new(&input)
.file_name()
.and_then(|n| n.to_str())
.unwrap_or(&input);
let pool: Arc<VecPool> = VecPool::new(pool_size);
println!(
"Pool created: capacity={} available={}",
pool.capacity(),
pool.available()
);
let pool_as_trait: Arc<dyn FramePool> = pool.clone();
let mut decoder = match VideoDecoder::open(&input).frame_pool(pool_as_trait).build() {
Ok(d) => d,
Err(e) => {
eprintln!("Error opening decoder: {e}");
process::exit(1);
}
};
println!(
"Input: {in_name} {}×{} codec={}",
decoder.width(),
decoder.height(),
decoder.stream_info().codec_name()
);
println!("Decoding (pool-size={pool_size})...");
println!();
let mut count: u64 = 0;
let report_interval = 30;
loop {
match decoder.decode_one() {
Ok(Some(frame)) => {
count += 1;
if count.is_multiple_of(report_interval) {
println!(" frame={count:>5} pool.available()={}", pool.available());
}
drop(frame);
}
Ok(None) => break,
Err(e) => {
eprintln!("Decode error: {e}");
process::exit(1);
}
}
}
println!();
println!(
"Done. {count} frames decoded. pool.capacity()={} pool.available()={}",
pool.capacity(),
pool.available()
);
}