No longer error on out of range float input

This commit is contained in:
kageru 2020-04-13 13:03:41 +02:00
parent cde9f6656b
commit aabf0b770d
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
2 changed files with 10 additions and 25 deletions

@ -1,6 +1,6 @@
[package] [package]
name = "adaptivegrain-rs" name = "adaptivegrain-rs"
version = "0.2.1" version = "0.2.2"
authors = ["kageru"] authors = ["kageru"]
edition = "2018" edition = "2018"

@ -59,7 +59,7 @@ macro_rules! int_filter {
.iter_mut() .iter_mut()
.zip(src_frame.plane_row::<$type>(0, row)) .zip(src_frame.plane_row::<$type>(0, row))
{ {
let i = (src_pixel.clone() >> (depth - 8)) as usize; let i = (src_pixel >> (depth - 8)) as usize;
unsafe { unsafe {
ptr::write(pixel, lut[i].clone()); ptr::write(pixel, lut[i].clone());
} }
@ -75,15 +75,16 @@ fn filter_for_float(frame: &mut FrameRefMut, src_frame: FrameRef, average: f32,
.map(|x| get_mask_value(*x, average, luma_scaling)) .map(|x| get_mask_value(*x, average, luma_scaling))
.collect(); .collect();
for row in 0..frame.height(0) { for row in 0..frame.height(0) {
for (pixel, src_pixel) in frame frame
.plane_row_mut::<f32>(0, row) .plane_row_mut::<f32>(0, row)
.iter_mut() .iter_mut()
.zip(src_frame.plane_row::<f32>(0, row).iter()) .zip(src_frame.plane_row::<f32>(0, row))
{ .for_each(|(pixel, src_pixel)| unsafe {
unsafe { ptr::write(
ptr::write(pixel, lut[(src_pixel * 255.99f32) as usize]); pixel,
} lut[(src_pixel.min(1.0).max(0.0) * 255.99) as usize],
} );
});
} }
} }
@ -174,25 +175,9 @@ impl<'core> Filter<'core> for Mask<'core> {
} }
} }
SampleType::Float => { SampleType::Float => {
if let Err(e) = verify_input_range(&src_frame.props()) {
bail!(e);
}
filter_for_float(&mut frame, src_frame, average, self.luma_scaling); filter_for_float(&mut frame, src_frame, average, self.luma_scaling);
} }
} }
Ok(frame.into()) Ok(frame.into())
} }
} }
fn verify_input_range<'a>(props: &vapoursynth::map::MapRef<'a, 'a>) -> Result<(), String> {
let max = props.get::<f64>("PlaneStatsMax").unwrap_or(1.0);
let min = props.get::<f64>("PlaneStatsMin").unwrap_or(0.0);
if min < 0.0 || max > 1.0 {
return Err(format!(
"{}: found invalid input. Some pixels are outside of the valid range.
You probably used a filter that operates on limited range without clipping properly, e.g. edgefixer, before converting to float.
This can be fixed by clipping all pixels to (0, 1) with Expr or converting to an integer format.", PLUGIN_NAME
));
}
Ok(())
}