From 3123fc570381cf12d2547817c378fa9f169c8e36 Mon Sep 17 00:00:00 2001 From: Kevin Mehall Date: Wed, 6 Nov 2019 11:15:17 -0800 Subject: [PATCH 1/5] Add support for IDCT downscaling Currently only adds 1/8 scale because the 1x1 IDCT is trivial, but this adds the infrastructure to easily support the others. --- src/decoder.rs | 31 +++++++++++++++++++++---------- src/idct.rs | 9 ++++++++- src/parser.rs | 11 ++++++++--- src/upsampler.rs | 2 +- src/worker/immediate.rs | 25 +++++++++++++++---------- 5 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index 5c52fbe7..0e38e85a 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -50,6 +50,7 @@ pub struct ImageInfo { /// JPEG decoder pub struct Decoder { reader: R, + scale: usize, frame: Option, dc_huffman_tables: Vec>, @@ -70,8 +71,15 @@ pub struct Decoder { impl Decoder { /// Creates a new `Decoder` using the reader `reader`. pub fn new(reader: R) -> Decoder { + Decoder::new_scaled(reader, 8) + } + + /// Creates a new `Decoder` using the reader `reader` that scales + /// down the image by a factor of `scale/8`. + pub fn new_scaled(reader: R, scale: usize) -> Decoder { Decoder { reader: reader, + scale: scale, frame: None, dc_huffman_tables: vec![None, None, None, None], ac_huffman_tables: vec![None, None, None, None], @@ -100,8 +108,8 @@ impl Decoder { }; Some(ImageInfo { - width: frame.image_size.width, - height: frame.image_size.height, + width: frame.output_size.width, + height: frame.output_size.height, pixel_format: pixel_format, }) }, @@ -153,7 +161,7 @@ impl Decoder { return Err(Error::Unsupported(UnsupportedFeature::Hierarchical)); } - let frame = parse_sof(&mut self.reader, marker)?; + let frame = parse_sof(&mut self.reader, marker, self.scale)?; let component_count = frame.components.len(); if frame.is_differential { @@ -329,7 +337,7 @@ impl Decoder { } let frame = self.frame.as_ref().unwrap(); - compute_image(&frame.components, &planes, frame.image_size, self.is_jfif, self.color_transform) + compute_image(&frame.components, &planes, frame.output_size, self.is_jfif, self.color_transform) } fn read_marker(&mut self) -> Result { @@ -436,7 +444,7 @@ impl Decoder { let x = (block_num % blocks_per_row) as u16; let y = (block_num / blocks_per_row) as u16; - if x * 8 >= component.size.width || y * 8 >= component.size.height { + if x * component.dct_scale as u16 >= component.size.width || y * component.dct_scale as u16 >= component.size.height { continue; } @@ -762,12 +770,15 @@ fn compute_image(components: &[Component], return Ok(data[0].clone()) } - let mut buffer = vec![0u8; component.size.width as usize * component.size.height as usize]; - let line_stride = component.block_size.width as usize * 8; + let width = component.size.width as usize; + let height = component.size.height as usize; + + let mut buffer = vec![0u8; width * height]; + let line_stride = width * component.dct_scale; - for y in 0 .. component.size.height as usize { - for x in 0 .. component.size.width as usize { - buffer[y * component.size.width as usize + x] = data[0][y * line_stride + x]; + for y in 0 .. width { + for x in 0 .. height { + buffer[y * width + x] = data[0][y * line_stride + x]; } } diff --git a/src/idct.rs b/src/idct.rs index 374ee7a6..64f7caf3 100644 --- a/src/idct.rs +++ b/src/idct.rs @@ -2,8 +2,15 @@ // One example is tests/crashtest/images/imagetestsuite/b0b8914cc5f7a6eff409f16d8cc236c5.jpg // That's why wrapping operators are needed. +pub fn dequantize_and_idct_block_1x1(coefficients: &[i16], quantization_table: &[u16; 64], _output_linestride: usize, output: &mut [u8]) { + debug_assert_eq!(coefficients.len(), 64); + + let s0 = (coefficients[0] as i32 * quantization_table[0] as i32).wrapping_add(128 * 8) / 8; + output[0] = stbi_clamp(s0); +} + // This is based on stb_image's 'stbi__idct_block'. -pub fn dequantize_and_idct_block(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { +pub fn dequantize_and_idct_block_8x8(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { debug_assert_eq!(coefficients.len(), 64); let mut temp = [0i32; 64]; diff --git a/src/parser.rs b/src/parser.rs index 039a75c8..b9737260 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -34,6 +34,7 @@ pub struct FrameInfo { pub precision: u8, pub image_size: Dimensions, + pub output_size: Dimensions, pub mcu_size: Dimensions, pub components: Vec, } @@ -58,6 +59,8 @@ pub struct Component { pub quantization_table_index: usize, + pub dct_scale: usize, + pub size: Dimensions, pub block_size: Dimensions, } @@ -104,7 +107,7 @@ fn skip_bytes(reader: &mut R, length: usize) -> Result<()> { } // Section B.2.2 -pub fn parse_sof(reader: &mut R, marker: Marker) -> Result { +pub fn parse_sof(reader: &mut R, marker: Marker, scale: usize) -> Result { let length = read_length(reader, marker)?; if length <= 6 { @@ -201,6 +204,7 @@ pub fn parse_sof(reader: &mut R, marker: Marker) -> Result { horizontal_sampling_factor: horizontal_sampling_factor, vertical_sampling_factor: vertical_sampling_factor, quantization_table_index: quantization_table_index as usize, + dct_scale: scale, size: Dimensions {width: 0, height: 0}, block_size: Dimensions {width: 0, height: 0}, }); @@ -214,8 +218,8 @@ pub fn parse_sof(reader: &mut R, marker: Marker) -> Result { }; for component in &mut components { - component.size.width = (width as f32 * (component.horizontal_sampling_factor as f32 / h_max as f32)).ceil() as u16; - component.size.height = (height as f32 * (component.vertical_sampling_factor as f32 / v_max as f32)).ceil() as u16; + component.size.width = (width as f32 * component.horizontal_sampling_factor as f32 * component.dct_scale as f32 / (h_max as f32 * 8.0)).ceil() as u16; + component.size.height = (height as f32 * component.vertical_sampling_factor as f32 * component.dct_scale as f32 / (v_max as f32 * 8.0)).ceil() as u16; component.block_size.width = mcu_size.width * component.horizontal_sampling_factor as u16; component.block_size.height = mcu_size.height * component.vertical_sampling_factor as u16; @@ -228,6 +232,7 @@ pub fn parse_sof(reader: &mut R, marker: Marker) -> Result { entropy_coding: entropy_coding, precision: precision, image_size: Dimensions {width: width, height: height}, + output_size: Dimensions {width: (width as f32 * scale as f32 / 8.0).ceil() as u16, height: (height as f32 * scale as f32 / 8.0).ceil() as u16}, mcu_size: mcu_size, components: components, }) diff --git a/src/upsampler.rs b/src/upsampler.rs index 61b15c4f..31224a5c 100644 --- a/src/upsampler.rs +++ b/src/upsampler.rs @@ -29,7 +29,7 @@ impl Upsampler { upsampler: upsampler, width: component.size.width as usize, height: component.size.height as usize, - row_stride: component.block_size.width as usize * 8, + row_stride: component.block_size.width as usize * component.dct_scale, }); } diff --git a/src/worker/immediate.rs b/src/worker/immediate.rs index fd140485..355822e0 100644 --- a/src/worker/immediate.rs +++ b/src/worker/immediate.rs @@ -1,6 +1,6 @@ use decoder::MAX_COMPONENTS; use error::Result; -use idct::dequantize_and_idct_block; +use idct::{ dequantize_and_idct_block_8x8, dequantize_and_idct_block_1x1 }; use std::mem; use std::sync::Arc; use parser::Component; @@ -26,7 +26,7 @@ impl ImmediateWorker { assert!(self.results[data.index].is_empty()); self.offsets[data.index] = 0; - self.results[data.index].resize(data.component.block_size.width as usize * data.component.block_size.height as usize * 64, 0u8); + self.results[data.index].resize(data.component.block_size.width as usize * data.component.block_size.height as usize * data.component.dct_scale * data.component.dct_scale, 0u8); self.components[data.index] = Some(data.component); self.quantization_tables[data.index] = Some(data.quantization_table); } @@ -36,20 +36,25 @@ impl ImmediateWorker { let component = self.components[index].as_ref().unwrap(); let quantization_table = self.quantization_tables[index].as_ref().unwrap(); let block_count = component.block_size.width as usize * component.vertical_sampling_factor as usize; - let line_stride = component.block_size.width as usize * 8; + let line_stride = component.block_size.width as usize * component.dct_scale; assert_eq!(data.len(), block_count * 64); for i in 0..block_count { - let x = (i % component.block_size.width as usize) * 8; - let y = (i / component.block_size.width as usize) * 8; - dequantize_and_idct_block(&data[i * 64..(i + 1) * 64], - quantization_table, - line_stride, - &mut self.results[index][self.offsets[index] + y * line_stride + x..]); + let x = (i % component.block_size.width as usize) * component.dct_scale; + let y = (i / component.block_size.width as usize) * component.dct_scale; + + let coefficients = &data[i * 64..(i + 1) * 64]; + let output = &mut self.results[index][self.offsets[index] + y * line_stride + x..]; + + match component.dct_scale { + 8 => dequantize_and_idct_block_8x8(coefficients, quantization_table, line_stride, output), + 1 => dequantize_and_idct_block_1x1(coefficients, quantization_table, line_stride, output), + _ => unimplemented!(), + } } - self.offsets[index] += data.len(); + self.offsets[index] += block_count * component.dct_scale * component.dct_scale; } pub fn get_result_immediate(&mut self, index: usize) -> Vec { mem::replace(&mut self.results[index], Vec::new()) From cb876654f7dd7e78eb1c8b4796bd4e3422d8995b Mon Sep 17 00:00:00 2001 From: Kevin Mehall Date: Thu, 7 Nov 2019 13:43:56 -0800 Subject: [PATCH 2/5] Add 4x4 and 8x8 IDCT --- src/idct.rs | 104 +++++++++++++++++++++++++++++++++++++--- src/worker/immediate.rs | 4 +- 2 files changed, 100 insertions(+), 8 deletions(-) diff --git a/src/idct.rs b/src/idct.rs index 64f7caf3..bb25126e 100644 --- a/src/idct.rs +++ b/src/idct.rs @@ -2,13 +2,6 @@ // One example is tests/crashtest/images/imagetestsuite/b0b8914cc5f7a6eff409f16d8cc236c5.jpg // That's why wrapping operators are needed. -pub fn dequantize_and_idct_block_1x1(coefficients: &[i16], quantization_table: &[u16; 64], _output_linestride: usize, output: &mut [u8]) { - debug_assert_eq!(coefficients.len(), 64); - - let s0 = (coefficients[0] as i32 * quantization_table[0] as i32).wrapping_add(128 * 8) / 8; - output[0] = stbi_clamp(s0); -} - // This is based on stb_image's 'stbi__idct_block'. pub fn dequantize_and_idct_block_8x8(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { debug_assert_eq!(coefficients.len(), 64); @@ -162,6 +155,103 @@ pub fn dequantize_and_idct_block_8x8(coefficients: &[i16], quantization_table: & } } +// 4x4 and 2x2 IDCT based on Rakesh Dugad and Narendra Ahuja: "A Fast Scheme for Image Size Change in the Compressed Domain" (2001). +// http://sylvana.net/jpegcrop/jidctred/ +pub fn dequantize_and_idct_block_4x4(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { + debug_assert_eq!(coefficients.len(), 64); + let mut temp = [0i32; 4*4]; + + const CONST_BITS: u32 = 12; + const PASS1_BITS: u32 = 2; + const FINAL_BITS: u32 = CONST_BITS + PASS1_BITS + 3; + + // columns + for i in 0 .. 4 { + let s0 = coefficients[i + 8*0] as i32 * quantization_table[i + 8*0] as i32; + let s1 = coefficients[i + 8*1] as i32 * quantization_table[i + 8*1] as i32; + let s2 = coefficients[i + 8*2] as i32 * quantization_table[i + 8*2] as i32; + let s3 = coefficients[i + 8*3] as i32 * quantization_table[i + 8*3] as i32; + + let x0 = s0.wrapping_add(s2).wrapping_shl(PASS1_BITS); + let x2 = s0.wrapping_sub(s2).wrapping_shl(PASS1_BITS); + + let p1 = s1.wrapping_add(s3).wrapping_mul(stbi_f2f(0.541196100)); + let t0 = p1.wrapping_add(s3.wrapping_mul(stbi_f2f(-1.847759065))).wrapping_add(512).wrapping_shr(CONST_BITS - PASS1_BITS); + let t2 = p1.wrapping_add(s1.wrapping_mul(stbi_f2f( 0.765366865))).wrapping_add(512).wrapping_shr(CONST_BITS - PASS1_BITS); + + temp[i + 4*0] = x0.wrapping_add(t2); + temp[i + 4*3] = x0.wrapping_sub(t2); + temp[i + 4*1] = x2.wrapping_add(t0); + temp[i + 4*2] = x2.wrapping_sub(t0); + } + + for i in 0 .. 4 { + let s0 = temp[i * 4 + 0]; + let s1 = temp[i * 4 + 1]; + let s2 = temp[i * 4 + 2]; + let s3 = temp[i * 4 + 3]; + + let x0 = s0.wrapping_add(s2).wrapping_shl(CONST_BITS); + let x2 = s0.wrapping_sub(s2).wrapping_shl(CONST_BITS); + + let p1 = s1.wrapping_add(s3).wrapping_mul(stbi_f2f(0.541196100)); + let t0 = p1.wrapping_add(s3.wrapping_mul(stbi_f2f(-1.847759065))); + let t2 = p1.wrapping_add(s1.wrapping_mul(stbi_f2f(0.765366865))); + + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + let x0 = x0.wrapping_add((1 << (FINAL_BITS - 1)) + (128 << FINAL_BITS)); + let x2 = x2.wrapping_add((1 << (FINAL_BITS - 1)) + (128 << FINAL_BITS)); + + output[i * output_linestride + 0] = stbi_clamp(x0.wrapping_add(t2).wrapping_shr(FINAL_BITS)); + output[i * output_linestride + 3] = stbi_clamp(x0.wrapping_sub(t2).wrapping_shr(FINAL_BITS)); + output[i * output_linestride + 1] = stbi_clamp(x2.wrapping_add(t0).wrapping_shr(FINAL_BITS)); + output[i * output_linestride + 2] = stbi_clamp(x2.wrapping_sub(t0).wrapping_shr(FINAL_BITS)); + } +} + +pub fn dequantize_and_idct_block_2x2(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { + debug_assert_eq!(coefficients.len(), 64); + + const SCALE_BITS: u32 = 3; + + // Column 0 + let s00 = coefficients[8*0] as i32 * quantization_table[8*0] as i32; + let s10 = coefficients[8*1] as i32 * quantization_table[8*1] as i32; + + let x0 = s00.wrapping_add(s10); + let x2 = s00.wrapping_sub(s10); + + // Column 1 + let s01 = coefficients[8*0+1] as i32 * quantization_table[8*0+1] as i32; + let s11 = coefficients[8*1+1] as i32 * quantization_table[8*1+1] as i32; + + let x1 = s01.wrapping_add(s11); + let x3 = s01.wrapping_sub(s11); + + let x0 = x0.wrapping_add((1 << (SCALE_BITS-1)) + (128 << SCALE_BITS)); + let x2 = x2.wrapping_add((1 << (SCALE_BITS-1)) + (128 << SCALE_BITS)); + + // Row 0 + output[0] = stbi_clamp(x0.wrapping_add(x1).wrapping_shr(SCALE_BITS)); + output[1] = stbi_clamp(x0.wrapping_sub(x1).wrapping_shr(SCALE_BITS)); + + // Row 1 + output[output_linestride + 0] = stbi_clamp(x2.wrapping_add(x3).wrapping_shr(SCALE_BITS)); + output[output_linestride + 1] = stbi_clamp(x2.wrapping_sub(x3).wrapping_shr(SCALE_BITS)); +} + +pub fn dequantize_and_idct_block_1x1(coefficients: &[i16], quantization_table: &[u16; 64], _output_linestride: usize, output: &mut [u8]) { + debug_assert_eq!(coefficients.len(), 64); + + let s0 = (coefficients[0] as i32 * quantization_table[0] as i32).wrapping_add(128 * 8) / 8; + output[0] = stbi_clamp(s0); +} + // take a -128..127 value and stbi__clamp it and convert to 0..255 fn stbi_clamp(x: i32) -> u8 { diff --git a/src/worker/immediate.rs b/src/worker/immediate.rs index 355822e0..686bfa1d 100644 --- a/src/worker/immediate.rs +++ b/src/worker/immediate.rs @@ -1,6 +1,6 @@ use decoder::MAX_COMPONENTS; use error::Result; -use idct::{ dequantize_and_idct_block_8x8, dequantize_and_idct_block_1x1 }; +use idct::{ dequantize_and_idct_block_8x8, dequantize_and_idct_block_4x4, dequantize_and_idct_block_2x2, dequantize_and_idct_block_1x1 }; use std::mem; use std::sync::Arc; use parser::Component; @@ -49,6 +49,8 @@ impl ImmediateWorker { match component.dct_scale { 8 => dequantize_and_idct_block_8x8(coefficients, quantization_table, line_stride, output), + 4 => dequantize_and_idct_block_4x4(coefficients, quantization_table, line_stride, output), + 2 => dequantize_and_idct_block_2x2(coefficients, quantization_table, line_stride, output), 1 => dequantize_and_idct_block_1x1(coefficients, quantization_table, line_stride, output), _ => unimplemented!(), } From 85adaf51d3a659cdcf6ff27c7e2ad3045cc9eb8d Mon Sep 17 00:00:00 2001 From: Kevin Mehall Date: Wed, 13 Nov 2019 13:36:00 -0800 Subject: [PATCH 3/5] Improve API for IDCT scaling --- src/decoder.rs | 25 +++++++++++++++------ src/idct.rs | 50 +++++++++++++++++++++++++++++++++++++---- src/parser.rs | 6 ++++- src/worker/immediate.rs | 10 ++------- 4 files changed, 71 insertions(+), 20 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index 0e38e85a..f503064b 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -50,7 +50,7 @@ pub struct ImageInfo { /// JPEG decoder pub struct Decoder { reader: R, - scale: usize, + requested_size: Option, frame: Option, dc_huffman_tables: Vec>, @@ -71,15 +71,26 @@ pub struct Decoder { impl Decoder { /// Creates a new `Decoder` using the reader `reader`. pub fn new(reader: R) -> Decoder { - Decoder::new_scaled(reader, 8) + Decoder::init(reader, None) } - /// Creates a new `Decoder` using the reader `reader` that scales - /// down the image by a factor of `scale/8`. - pub fn new_scaled(reader: R, scale: usize) -> Decoder { + /// Creates a new `Decoder` using the reader `reader` that returns a + /// scaled image that is equal to or larger than the requested size in at + /// least one axis, or the full size of the image if the requested size is + /// larger. + /// + /// This efficiently scales down the image by one of a fixed set of + /// available ratios during decoding. To generate a thumbnail of an + /// exact size, pass the desired size or larger and then scale to the + /// final size using a traditional resampling algorithm. + pub fn scaled(reader: R, requested_width: u16, requested_height: u16) -> Decoder { + Decoder::init(reader, Some(Dimensions{ width: requested_width, height: requested_height })) + } + + fn init(reader: R, requested_size: Option) -> Decoder { Decoder { reader: reader, - scale: scale, + requested_size, frame: None, dc_huffman_tables: vec![None, None, None, None], ac_huffman_tables: vec![None, None, None, None], @@ -161,7 +172,7 @@ impl Decoder { return Err(Error::Unsupported(UnsupportedFeature::Hierarchical)); } - let frame = parse_sof(&mut self.reader, marker, self.scale)?; + let frame = parse_sof(&mut self.reader, marker, self.requested_size)?; let component_count = frame.components.len(); if frame.is_differential { diff --git a/src/idct.rs b/src/idct.rs index bb25126e..b9205f65 100644 --- a/src/idct.rs +++ b/src/idct.rs @@ -1,9 +1,51 @@ // Malicious JPEG files can cause operations in the idct to overflow. // One example is tests/crashtest/images/imagetestsuite/b0b8914cc5f7a6eff409f16d8cc236c5.jpg // That's why wrapping operators are needed. +use crate::parser::Dimensions; + +pub fn choose_idct_size(full_size: Dimensions, requested_size: Dimensions) -> usize { + fn scaled(len: u16, scale: usize) -> u16 { ((len as u32 * scale as u32 - 1) / 8 + 1) as u16 } + + for &scale in &[1, 2, 4] { + if scaled(full_size.width, scale) >= requested_size.width || scaled(full_size.height, scale) >= requested_size.height { + return scale; + } + } + + return 8; +} + +#[test] +fn test_choose_idct_size() { + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 200, height: 200}), 1); + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 500, height: 500}), 1); + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 684, height: 456}), 1); + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 999, height: 456}), 1); + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 684, height: 999}), 1); + assert_eq!(choose_idct_size(Dimensions{width: 500, height: 333}, Dimensions{width: 63, height: 42}), 1); + + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 685, height: 999}), 2); + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 1000, height: 1000}), 2); + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 1400, height: 1400}), 4); + + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 5472, height: 3648}), 8); + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 16384, height: 16384}), 8); + assert_eq!(choose_idct_size(Dimensions{width: 1, height: 1}, Dimensions{width: 65535, height: 65535}), 8); + assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 16384, height: 16384}), 8); +} + +pub fn dequantize_and_idct_block(scale: usize, coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { + match scale { + 8 => dequantize_and_idct_block_8x8(coefficients, quantization_table, output_linestride, output), + 4 => dequantize_and_idct_block_4x4(coefficients, quantization_table, output_linestride, output), + 2 => dequantize_and_idct_block_2x2(coefficients, quantization_table, output_linestride, output), + 1 => dequantize_and_idct_block_1x1(coefficients, quantization_table, output_linestride, output), + _ => panic!("Unsupported IDCT scale {}/8", scale), + } +} // This is based on stb_image's 'stbi__idct_block'. -pub fn dequantize_and_idct_block_8x8(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { +fn dequantize_and_idct_block_8x8(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { debug_assert_eq!(coefficients.len(), 64); let mut temp = [0i32; 64]; @@ -157,7 +199,7 @@ pub fn dequantize_and_idct_block_8x8(coefficients: &[i16], quantization_table: & // 4x4 and 2x2 IDCT based on Rakesh Dugad and Narendra Ahuja: "A Fast Scheme for Image Size Change in the Compressed Domain" (2001). // http://sylvana.net/jpegcrop/jidctred/ -pub fn dequantize_and_idct_block_4x4(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { +fn dequantize_and_idct_block_4x4(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { debug_assert_eq!(coefficients.len(), 64); let mut temp = [0i32; 4*4]; @@ -214,7 +256,7 @@ pub fn dequantize_and_idct_block_4x4(coefficients: &[i16], quantization_table: & } } -pub fn dequantize_and_idct_block_2x2(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { +fn dequantize_and_idct_block_2x2(coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { debug_assert_eq!(coefficients.len(), 64); const SCALE_BITS: u32 = 3; @@ -245,7 +287,7 @@ pub fn dequantize_and_idct_block_2x2(coefficients: &[i16], quantization_table: & output[output_linestride + 1] = stbi_clamp(x2.wrapping_sub(x3).wrapping_shr(SCALE_BITS)); } -pub fn dequantize_and_idct_block_1x1(coefficients: &[i16], quantization_table: &[u16; 64], _output_linestride: usize, output: &mut [u8]) { +fn dequantize_and_idct_block_1x1(coefficients: &[i16], quantization_table: &[u16; 64], _output_linestride: usize, output: &mut [u8]) { debug_assert_eq!(coefficients.len(), 64); let s0 = (coefficients[0] as i32 * quantization_table[0] as i32).wrapping_add(128 * 8) / 8; diff --git a/src/parser.rs b/src/parser.rs index b9737260..9ed97096 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -107,7 +107,7 @@ fn skip_bytes(reader: &mut R, length: usize) -> Result<()> { } // Section B.2.2 -pub fn parse_sof(reader: &mut R, marker: Marker, scale: usize) -> Result { +pub fn parse_sof(reader: &mut R, marker: Marker, requested_size: Option) -> Result { let length = read_length(reader, marker)?; if length <= 6 { @@ -159,6 +159,10 @@ pub fn parse_sof(reader: &mut R, marker: Marker, scale: usize) -> Resul return Err(Error::Format("zero width in frame header".to_owned())); } + let scale = if let Some(req) = requested_size { + crate::idct::choose_idct_size(Dimensions { width, height }, req) + } else { 8 }; + let component_count = reader.read_u8()?; if component_count == 0 { diff --git a/src/worker/immediate.rs b/src/worker/immediate.rs index 686bfa1d..7e512d2e 100644 --- a/src/worker/immediate.rs +++ b/src/worker/immediate.rs @@ -1,6 +1,6 @@ use decoder::MAX_COMPONENTS; use error::Result; -use idct::{ dequantize_and_idct_block_8x8, dequantize_and_idct_block_4x4, dequantize_and_idct_block_2x2, dequantize_and_idct_block_1x1 }; +use idct::dequantize_and_idct_block; use std::mem; use std::sync::Arc; use parser::Component; @@ -47,13 +47,7 @@ impl ImmediateWorker { let coefficients = &data[i * 64..(i + 1) * 64]; let output = &mut self.results[index][self.offsets[index] + y * line_stride + x..]; - match component.dct_scale { - 8 => dequantize_and_idct_block_8x8(coefficients, quantization_table, line_stride, output), - 4 => dequantize_and_idct_block_4x4(coefficients, quantization_table, line_stride, output), - 2 => dequantize_and_idct_block_2x2(coefficients, quantization_table, line_stride, output), - 1 => dequantize_and_idct_block_1x1(coefficients, quantization_table, line_stride, output), - _ => unimplemented!(), - } + dequantize_and_idct_block(component.dct_scale, coefficients, quantization_table, line_stride, output); } self.offsets[index] += block_count * component.dct_scale * component.dct_scale; From d28ea6ff5ff721ee40f4a8c97d6c870bc2bfc8ec Mon Sep 17 00:00:00 2001 From: Kevin Mehall Date: Wed, 13 Nov 2019 17:51:58 -0800 Subject: [PATCH 4/5] Add ref tests for IDCT scaling The reference images were generated with djpeg: djpeg -scale 1/8 tests/reftest/images/rgb.jpg | convert - tests/reftest/images/rgb_63x42.png djpeg -scale 2/8 tests/reftest/images/rgb.jpg | convert - tests/reftest/images/rgb_125x84.png djpeg -scale 4/8 tests/reftest/images/rgb.jpg | convert - tests/reftest/images/rgb_250x167.png --- tests/reftest/images/rgb_125x84.png | Bin 0 -> 26305 bytes tests/reftest/images/rgb_250x167.png | Bin 0 -> 103629 bytes tests/reftest/images/rgb_63x42.png | Bin 0 -> 6854 bytes tests/reftest/mod.rs | 23 +++++++++++++++++++++-- 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tests/reftest/images/rgb_125x84.png create mode 100644 tests/reftest/images/rgb_250x167.png create mode 100644 tests/reftest/images/rgb_63x42.png diff --git a/tests/reftest/images/rgb_125x84.png b/tests/reftest/images/rgb_125x84.png new file mode 100644 index 0000000000000000000000000000000000000000..c3bd2b7f0bd75ee36c674c5f2bd33d53757bdaf7 GIT binary patch literal 26305 zcmV)eK&HQmP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8xW!OnXK~#9!CHncBB#iZ)_wMk1{!GG z1OW;JDT@a!^6resJNwv@XFO|5*2uQTvNSqqNhC#)6b}#}hz0>P z(2YK;ySnSls;tU8GcxWs;(g!!!T-kh`+@)L-~Q`2zVXK~OV(GHe(`Vprd6W7L(iZ1 zcOTw7xO-o-i~sPS|JuzPw|d9@3y(Znt(p%HAN;F-_CNluzwlYuhG@~-*y!ZCIZ@l?e-J_k0&;3MM=cCEs zjc7V=`EO+X7?_Osx{PLInug1d0J3sg~0_=(BE`9E2 z|M9Ee`05}2r+=qt%H`*u`NU^`TE~U&y!!Re{P@pqJ-B!4#+3(mw}0jD{!f4Xi$C`B zKlM+4@V)=5-YAcTsa-05`P*;){lE3MW#0SE-}(K2@(=#`J3siN=U#mF(dT~Z?3ww& z;lcVN&tHH4hlAdOrAIzVk$U6Wdkc#;WAy5kALe}g-s|7rICti;r$6znuY9FGqdfW2 zFCXu<9&Ua2^o5JVUJ!?^wKL~VIztR$plPN*nLK*=W8eDf@2{PGj3tR-s*hbb_u6Y; z>7Q)brNvrpW_sF)qYNQYDA?~^d3AC5bZurfij(iZ`pwqC{YNf+^su>KpDwRncnTwZ z;&%ZmQq=+=nFM|khSM{(Z+z{Kr>3Sek%g0h=b>phPrmT9VdzKxwtZhtW7oOp}#>l>$+4m#tIiG{TVKpeMZc!Rr1m<7RT*zY-I+Z*=XawC)3 zWEjjZuI4ODvdP6uPw#9!Xts8xBw+#w0i|N;)W)gdB#)x-iKm{@+_G-F2*R~<&-A+O zdppM`hr0?zPPw|aaq8NQ8&Nz&5T7}-@{7OpbB%@5X_D}qZ{EE6?pv?_=imM9%^O!2 zmzSRX@Y81>JM-wdHBCiC0<2j8!6-_KrDB#vw{N~%n=+0%om#c-jeXtJYZaGEo+Swc ztl2yfP!@_a2b;Hk^EZCuKm4ozx!>u|EN%SMFa7-DsnwF}mMiY&tvej~mRsN1JNV|G z{q`q5^~pc~^Y5-LRUUul@|jboW)~Jw7>)|XlEfh8&I>R7?9zPWYhU_To12?OSAG1s zkJRTDZ(RT8-u(}_l-{HpL?gi1a5&uFJ+jJE&69h&SxFd&D%BN@bO&9} z3)}6(rKN^jo!{Hp!21Igq^WJ;cZdU6x&XeJ&**niWO?&HsI6bxB6u=~7BRVUTMt# z^I!kGyui(yP_lLbdil(X8tH{M&DSH;VncH?R0(U)5I@mY25Md#%0AqG@0ydANCR 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 literal 0 HcmV?d00001 diff --git a/tests/reftest/images/rgb_63x42.png b/tests/reftest/images/rgb_63x42.png new file mode 100644 index 0000000000000000000000000000000000000000..a50b9238fe0dfa0403b18ee62c99dbb59bdde6ea GIT binary patch literal 6854 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

u=SMH0XpF< z@qqq+2HF)yw5bD87=H06P%~8Q(}(_@OG_U@H6TTVH+s*>?xDetw(ZW-^X}iZwx;Zc zMs6<|2p{DZ(e$SUqwd{mayOr;OH3wD^pp8 zeF|Z*xHO>IRB*Xi~h? z7Y{EeV15)6pj8hH`S;62Z+drTRP##Fw7#gmm3G3L8Z9xAjH|z14mk5<%X1*<@lE4E zKj8p47ZjCwqizH)I0V-*`v=5CeOdCLFpin;og~`U< zrQGc6+!h&?nNXs%eaH(9j46c^XIi=4RF zJ*v)E>JuAc^7b4w8eq9}FlY6@mpa~46gjvS91=Vp)k%+&U#iZ^?g`=yN-CEaZy429 z4a)%%7!X8kSbI4RB-9)6RrSG?$Or+L#Euc=t#V{M)S_T%Xv$sIe*?pD54RF0hXdol zr+fxfCa{tVlL^&gWIeU#{=GzW(>U;ogkcj?ATzVx=a$URv?jLo80}k04B;mc^t-RMf^qC+!qpg4# z^d)jqn@_|;cnA)$5nZT`@2a`8!5Z@ES*G>+I}y>)6NnLk$5dJZ0ynvAR&ofV3qwx&|4Fczp?#g@EyP#v4zb)>Tt)X3yuf&?Z{R`M{hsAw<0PUI-v%}(AE=jG57 zhTBw>R?8J5@Yu|a(@V=D1=vcY+Qdlr?)*hL)B?R1ljOM|ywqC&K)kcb;cL^V^6~+< z-gmW6`%7`RA|j%h)X!n1ej+)WI%V(wy?$7I6^(uEZG0Uh?7SWR0YDHWAkHfwz$*aO w2MI`kMI?kpxj`Ta5NLs7B<%kX+&%4KjzRxFp(mut decoder: jpeg::Decoder, path: &Path, ref_path: &Path) { let mut data = decoder.decode().expect(&format!("failed to decode file: {:?}", path)); let info = decoder.info().unwrap(); let mut pixel_format = info.pixel_format; @@ -27,7 +46,7 @@ fn reftest_file(path: &Path) { pixel_format = jpeg::PixelFormat::RGB24; } - let ref_file = File::open(path.with_extension("png")).unwrap(); + let ref_file = File::open(ref_path).unwrap(); let (ref_info, mut ref_reader) = png::Decoder::new(ref_file).read_info().expect("png failed to read info"); assert_eq!(ref_info.width, info.width as u32); From 12920df36309c86368ad330444ed66c5e1e857b9 Mon Sep 17 00:00:00 2001 From: Kevin Mehall Date: Mon, 25 Nov 2019 14:21:33 -0800 Subject: [PATCH 5/5] Set scale factor with a decoder method, rather than constructor. --- src/decoder.rs | 38 +++++++++++++-------------- src/idct.rs | 4 +-- src/parser.rs | 62 ++++++++++++++++++++++++++++---------------- tests/reftest/mod.rs | 4 ++- 4 files changed, 63 insertions(+), 45 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index a2fb562d..69c9f0c1 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -50,7 +50,6 @@ pub struct ImageInfo { /// JPEG decoder pub struct Decoder { reader: R, - requested_size: Option, frame: Option, dc_huffman_tables: Vec>, @@ -71,26 +70,8 @@ pub struct Decoder { impl Decoder { /// Creates a new `Decoder` using the reader `reader`. pub fn new(reader: R) -> Decoder { - Decoder::init(reader, None) - } - - /// Creates a new `Decoder` using the reader `reader` that returns a - /// scaled image that is equal to or larger than the requested size in at - /// least one axis, or the full size of the image if the requested size is - /// larger. - /// - /// This efficiently scales down the image by one of a fixed set of - /// available ratios during decoding. To generate a thumbnail of an - /// exact size, pass the desired size or larger and then scale to the - /// final size using a traditional resampling algorithm. - pub fn scaled(reader: R, requested_width: u16, requested_height: u16) -> Decoder { - Decoder::init(reader, Some(Dimensions{ width: requested_width, height: requested_height })) - } - - fn init(reader: R, requested_size: Option) -> Decoder { Decoder { reader: reader, - requested_size, frame: None, dc_huffman_tables: vec![None, None, None, None], ac_huffman_tables: vec![None, None, None, None], @@ -135,6 +116,23 @@ impl Decoder { self.decode_internal(true).map(|_| ()) } + /// Configure the decoder to scale the image during decoding. + /// + /// This efficiently scales the image by the smallest supported scale + /// factor that produces an image larger than or equal to the requested + /// size in at least one axis. The currently implemented scale factors + /// are 1/8, 1/4, 1/2 and 1. + /// + /// To generate a thumbnail of an exact size, pass the desired size and + /// then scale to the final size using a traditional resampling algorithm. + pub fn scale(&mut self, requested_width: u16, requested_height: u16) -> Result<(u16, u16)> { + self.read_info()?; + let frame = self.frame.as_mut().unwrap(); + let idct_size = crate::idct::choose_idct_size(frame.image_size, Dimensions{ width: requested_width, height: requested_height }); + frame.update_idct_size(idct_size); + Ok((frame.output_size.width, frame.output_size.height)) + } + /// Decodes the image and returns the decoded pixels if successful. pub fn decode(&mut self) -> Result> { self.decode_internal(false) @@ -172,7 +170,7 @@ impl Decoder { return Err(Error::Unsupported(UnsupportedFeature::Hierarchical)); } - let frame = parse_sof(&mut self.reader, marker, self.requested_size)?; + let frame = parse_sof(&mut self.reader, marker)?; let component_count = frame.components.len(); if frame.is_differential { diff --git a/src/idct.rs b/src/idct.rs index b9205f65..7d12fca0 100644 --- a/src/idct.rs +++ b/src/idct.rs @@ -3,7 +3,7 @@ // That's why wrapping operators are needed. use crate::parser::Dimensions; -pub fn choose_idct_size(full_size: Dimensions, requested_size: Dimensions) -> usize { +pub(crate) fn choose_idct_size(full_size: Dimensions, requested_size: Dimensions) -> usize { fn scaled(len: u16, scale: usize) -> u16 { ((len as u32 * scale as u32 - 1) / 8 + 1) as u16 } for &scale in &[1, 2, 4] { @@ -34,7 +34,7 @@ fn test_choose_idct_size() { assert_eq!(choose_idct_size(Dimensions{width: 5472, height: 3648}, Dimensions{width: 16384, height: 16384}), 8); } -pub fn dequantize_and_idct_block(scale: usize, coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { +pub(crate) fn dequantize_and_idct_block(scale: usize, coefficients: &[i16], quantization_table: &[u16; 64], output_linestride: usize, output: &mut [u8]) { match scale { 8 => dequantize_and_idct_block_8x8(coefficients, quantization_table, output_linestride, output), 4 => dequantize_and_idct_block_4x4(coefficients, quantization_table, output_linestride, output), diff --git a/src/parser.rs b/src/parser.rs index 9ed97096..4c28b9e9 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -82,6 +82,21 @@ pub enum AdobeColorTransform { YCCK, } +impl FrameInfo { + pub(crate) fn update_idct_size(&mut self, idct_size: usize) { + for component in &mut self.components { + component.dct_scale = idct_size; + } + + update_component_sizes(self.image_size, &mut self.components); + + self.output_size = Dimensions { + width: (self.image_size.width as f32 * idct_size as f32 / 8.0).ceil() as u16, + height: (self.image_size.height as f32 * idct_size as f32 / 8.0).ceil() as u16 + }; + } +} + fn read_length(reader: &mut R, marker: Marker) -> Result { assert!(marker.has_length()); @@ -107,7 +122,7 @@ fn skip_bytes(reader: &mut R, length: usize) -> Result<()> { } // Section B.2.2 -pub fn parse_sof(reader: &mut R, marker: Marker, requested_size: Option) -> Result { +pub fn parse_sof(reader: &mut R, marker: Marker) -> Result { let length = read_length(reader, marker)?; if length <= 6 { @@ -159,10 +174,6 @@ pub fn parse_sof(reader: &mut R, marker: Marker, requested_size: Option return Err(Error::Format("zero width in frame header".to_owned())); } - let scale = if let Some(req) = requested_size { - crate::idct::choose_idct_size(Dimensions { width, height }, req) - } else { 8 }; - let component_count = reader.read_u8()?; if component_count == 0 { @@ -208,38 +219,45 @@ pub fn parse_sof(reader: &mut R, marker: Marker, requested_size: Option horizontal_sampling_factor: horizontal_sampling_factor, vertical_sampling_factor: vertical_sampling_factor, quantization_table_index: quantization_table_index as usize, - dct_scale: scale, + dct_scale: 8, size: Dimensions {width: 0, height: 0}, block_size: Dimensions {width: 0, height: 0}, }); } + let mcu_size = update_component_sizes(Dimensions { width, height }, &mut components); + + Ok(FrameInfo { + is_baseline: is_baseline, + is_differential: is_differential, + coding_process: coding_process, + entropy_coding: entropy_coding, + precision: precision, + image_size: Dimensions { width, height }, + output_size: Dimensions { width, height }, + mcu_size, + components: components, + }) +} + +fn update_component_sizes(size: Dimensions, components: &mut [Component]) -> Dimensions { let h_max = components.iter().map(|c| c.horizontal_sampling_factor).max().unwrap(); let v_max = components.iter().map(|c| c.vertical_sampling_factor).max().unwrap(); + let mcu_size = Dimensions { - width: (width as f32 / (h_max as f32 * 8.0)).ceil() as u16, - height: (height as f32 / (v_max as f32 * 8.0)).ceil() as u16, + width: (size.width as f32 / (h_max as f32 * 8.0)).ceil() as u16, + height: (size.height as f32 / (v_max as f32 * 8.0)).ceil() as u16, }; - for component in &mut components { - component.size.width = (width as f32 * component.horizontal_sampling_factor as f32 * component.dct_scale as f32 / (h_max as f32 * 8.0)).ceil() as u16; - component.size.height = (height as f32 * component.vertical_sampling_factor as f32 * component.dct_scale as f32 / (v_max as f32 * 8.0)).ceil() as u16; + for component in components { + component.size.width = (size.width as f32 * component.horizontal_sampling_factor as f32 * component.dct_scale as f32 / (h_max as f32 * 8.0)).ceil() as u16; + component.size.height = (size.height as f32 * component.vertical_sampling_factor as f32 * component.dct_scale as f32 / (v_max as f32 * 8.0)).ceil() as u16; component.block_size.width = mcu_size.width * component.horizontal_sampling_factor as u16; component.block_size.height = mcu_size.height * component.vertical_sampling_factor as u16; } - Ok(FrameInfo { - is_baseline: is_baseline, - is_differential: is_differential, - coding_process: coding_process, - entropy_coding: entropy_coding, - precision: precision, - image_size: Dimensions {width: width, height: height}, - output_size: Dimensions {width: (width as f32 * scale as f32 / 8.0).ceil() as u16, height: (height as f32 * scale as f32 / 8.0).ceil() as u16}, - mcu_size: mcu_size, - components: components, - }) + mcu_size } // Section B.2.3 diff --git a/tests/reftest/mod.rs b/tests/reftest/mod.rs index 8acb0ff1..54f13709 100644 --- a/tests/reftest/mod.rs +++ b/tests/reftest/mod.rs @@ -32,7 +32,9 @@ fn reftest_file(path: &Path) { fn reftest_scaled_file(path: &Path, width: u16, height: u16, ref_path: &Path) { let file = File::open(path).unwrap(); - let decoder = jpeg::Decoder::scaled(file, width, height); + let mut decoder = jpeg::Decoder::new(file); + decoder.read_info().unwrap(); + decoder.scale(width, height).unwrap(); reftest_decoder(decoder, path, &ref_path); }