Skip to content

Commit

Permalink
Make PNG format decoder correctly handle cases where nbit is 0
Browse files Browse the repository at this point in the history
  • Loading branch information
noritada committed Aug 11, 2024
1 parent e2ebfad commit 5176bc2
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 7 deletions.
7 changes: 2 additions & 5 deletions src/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@ use crate::{
complex::ComplexPackingDecodeError,
png::PngDecodeError,
run_length::RunLengthEncodingDecodeError,
simple::{
SimplePackingDecodeError, SimplePackingDecodeIterator,
SimplePackingDecodeIteratorWrapper,
},
simple::{SimplePackingDecodeError, SimplePackingDecodeIteratorWrapper},
},
error::*,
reader::Grib2Read,
Expand Down Expand Up @@ -186,7 +183,7 @@ enum Grib2SubmessageDecoderIteratorWrapper<T0, T2, T3, T40, T41> {
Template40(PhantomData<T40>),
#[cfg(not(target_arch = "wasm32"))]
Template40(SimplePackingDecodeIteratorWrapper<T40>),
Template41(SimplePackingDecodeIterator<T41>),
Template41(SimplePackingDecodeIteratorWrapper<T41>),
Template200(std::vec::IntoIter<f32>),
}

Expand Down
19 changes: 17 additions & 2 deletions src/decoder/png.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use crate::{
decoder::{
param::SimplePackingParam, simple::SimplePackingDecodeIterator, stream::NBitwiseIterator,
param::SimplePackingParam,
simple::{SimplePackingDecodeIterator, SimplePackingDecodeIteratorWrapper},
stream::{FixedValueIterator, NBitwiseIterator},
},
DecodeError, Grib2SubmessageDecoder, GribError,
};
Expand All @@ -13,7 +15,7 @@ pub enum PngDecodeError {

pub(crate) fn decode(
target: &Grib2SubmessageDecoder,
) -> Result<SimplePackingDecodeIterator<impl Iterator<Item = u32> + '_>, GribError> {
) -> Result<SimplePackingDecodeIteratorWrapper<impl Iterator<Item = u32> + '_>, GribError> {
let sect5_data = &target.sect5_payload;
let param = SimplePackingParam::from_buf(&sect5_data[6..16])?;

Expand All @@ -23,6 +25,18 @@ pub(crate) fn decode(
)))
})?;

if param.nbit == 0 {
eprintln!(
"WARNING: nbit = 0 for PNG decoder is not tested.
Please report your data and help us develop the library."
);
let decoder = SimplePackingDecodeIteratorWrapper::FixedValue(FixedValueIterator::new(
param.zero_bit_reference_value(),
target.num_points_encoded,
));
return Ok(decoder);
};

if param.nbit != 16 {
eprintln!(
"WARNING: nbit != 16 for PNG decoder is not tested.
Expand All @@ -32,6 +46,7 @@ pub(crate) fn decode(

let iter = NBitwiseIterator::new(buf, usize::from(param.nbit));
let iter = SimplePackingDecodeIterator::new(iter, &param);
let iter = SimplePackingDecodeIteratorWrapper::SimplePacking(iter);
Ok(iter)
}

Expand Down

0 comments on commit 5176bc2

Please sign in to comment.