74 lines
2.4 KiB
Rust
74 lines
2.4 KiB
Rust
|
use std::fs;
|
||
|
|
||
|
use criterion::{Criterion, Throughput};
|
||
|
use gif::{Encoder, Frame, Repeat};
|
||
|
use png;
|
||
|
|
||
|
const DIR: &str = "benches/samples";
|
||
|
|
||
|
fn main()
|
||
|
{
|
||
|
let mut c = Criterion::default().configure_from_args();
|
||
|
let mut group = c.benchmark_group("rgb_frame");
|
||
|
|
||
|
let dir = fs::read_dir(DIR).expect("Cant'r read dir:\n{}");
|
||
|
|
||
|
for path in dir {
|
||
|
let path = path.expect("Can't read path:\n{}").path();
|
||
|
if path.extension().unwrap() != "png" {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
let mut reader = {
|
||
|
let input = fs::File::open(&path).unwrap();
|
||
|
let decoder = png::Decoder::new(input);
|
||
|
decoder.read_info().unwrap()
|
||
|
};
|
||
|
|
||
|
let mut buf = vec![0; reader.output_buffer_size()];
|
||
|
let info = reader.next_frame(&mut buf).unwrap();
|
||
|
|
||
|
let (w, h, size) = {
|
||
|
// could use try_into().unwrap() but probably no need
|
||
|
(info.width as u16, info.height as u16, info.buffer_size())
|
||
|
};
|
||
|
|
||
|
//size might have to be adjusted for large images
|
||
|
group
|
||
|
.sample_size(50)
|
||
|
.throughput(Throughput::Bytes(size as u64))
|
||
|
.bench_function(path.file_name().unwrap().to_str().unwrap(),
|
||
|
|b| {
|
||
|
match info.color_type {
|
||
|
png::ColorType::Rgb => b.iter(|| {
|
||
|
Frame::from_rgb_speed(w, h, &mut buf[..size], 30)
|
||
|
}),
|
||
|
png::ColorType::Rgba => b.iter(|| {
|
||
|
Frame::from_rgba_speed(w, h, &mut buf[..size], 30)
|
||
|
}),
|
||
|
c => {
|
||
|
println!("Image has wrong color type: {:?}", c);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// actually write the image as a singe frame gif... while MSE can be used
|
||
|
// for quality check, it might not be as good as visual inspection
|
||
|
let mut encoder = {
|
||
|
let output = fs::File::create(path.with_extension("gif")).unwrap();
|
||
|
Encoder::new(output, w, h, &[]).unwrap()
|
||
|
};
|
||
|
encoder.set_repeat(Repeat::Finite(0)).unwrap();
|
||
|
|
||
|
let frame = match info.color_type {
|
||
|
png::ColorType::Rgb => Frame::from_rgb(w, h, &mut buf[..size]),
|
||
|
png::ColorType::Rgba => Frame::from_rgba(w, h, &mut buf[..size]),
|
||
|
_ => continue,
|
||
|
};
|
||
|
|
||
|
encoder.write_frame(&frame).unwrap();
|
||
|
}
|
||
|
group.finish();
|
||
|
c.final_summary();
|
||
|
}
|