From db8e6823104ae6d4eab333a8ca21ecda07a73546 Mon Sep 17 00:00:00 2001 From: Eugene Vert Date: Tue, 6 Jun 2023 14:49:23 +0300 Subject: [PATCH] jxl-frame: EC upsampling check --- crates/jxl-frame/src/lib.rs | 19 +++++++++++++++++++ crates/jxl-image/src/lib.rs | 5 ----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/crates/jxl-frame/src/lib.rs b/crates/jxl-frame/src/lib.rs index 0e389ed5..a84be841 100644 --- a/crates/jxl-frame/src/lib.rs +++ b/crates/jxl-frame/src/lib.rs @@ -97,6 +97,25 @@ impl<'a> Bundle<&'a ImageHeader> for Frame<'a> { return Err(jxl_bitstream::Error::ValidationFailed("lf_level out of range").into()); } + for (ec_upsampling, ec_info) in header + .ec_upsampling + .iter() + .zip(image_header.metadata.ec_info.iter()) + { + if ec_upsampling << ec_info.dim_shift < header.upsampling { + return Err(jxl_bitstream::Error::ValidationFailed( + "EC upsampling < color upsampling, which is invalid" + ).into() + ); + } + if ec_info.dim_shift <= 7 + header.group_size_shift { + return Err(jxl_bitstream::Error::ValidationFailed( + "dim_shift too large" + ).into() + ); + } + } + let toc = read_bits!(bitstream, Bundle(Toc), &header)?; let data = FrameData::new(&header); diff --git a/crates/jxl-image/src/lib.rs b/crates/jxl-image/src/lib.rs index a27e1826..fa21d443 100644 --- a/crates/jxl-image/src/lib.rs +++ b/crates/jxl-image/src/lib.rs @@ -231,12 +231,7 @@ impl Bundle for ExtraChannelInfo { let ty_id = read_bits!(bitstream, Enum(ExtraChannelTypeRaw))?; let bit_depth = BitDepth::parse(bitstream, ())?; - let dim_shift = read_bits!(bitstream, U32(0, 3, 4, 1 + u(3)))?; - if (1usize << dim_shift) > 8 { - return Err(jxl_bitstream::Error::ValidationFailed("dim_shift too large")) - } - let name = Name::parse(bitstream, ())?; let ty = match ty_id {