cheep-crator-2/vendor/gif/benches/rgb_frame.rs

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();
}