1 | /* |
2 | * Copyright (c) 2023. |
3 | * |
4 | * This software is free software; |
5 | * |
6 | * You can redistribute it or modify it under terms of the MIT, Apache License or Zlib license |
7 | */ |
8 | |
9 | //! This file contains a single struct `HuffmanTable` that |
10 | //! stores Huffman tables needed during `BitStream` decoding. |
11 | #![allow (clippy::similar_names, clippy::module_name_repetitions)] |
12 | |
13 | use alloc::string::ToString; |
14 | |
15 | use crate::errors::DecodeErrors; |
16 | |
17 | /// Determines how many bits of lookahead we have for our bitstream decoder. |
18 | |
19 | pub const HUFF_LOOKAHEAD: u8 = 9; |
20 | |
21 | /// A struct which contains necessary tables for decoding a JPEG |
22 | /// huffman encoded bitstream |
23 | |
24 | pub struct HuffmanTable { |
25 | // element `[0]` of each array is unused |
26 | /// largest code of length k |
27 | pub(crate) maxcode: [i32; 18], |
28 | /// offset for codes of length k |
29 | /// Answers the question, where do code-lengths of length k end |
30 | /// Element 0 is unused |
31 | pub(crate) offset: [i32; 18], |
32 | /// lookup table for fast decoding |
33 | /// |
34 | /// top bits above HUFF_LOOKAHEAD contain the code length. |
35 | /// |
36 | /// Lower (8) bits contain the symbol in order of increasing code length. |
37 | pub(crate) lookup: [i32; 1 << HUFF_LOOKAHEAD], |
38 | |
39 | /// A table which can be used to decode small AC coefficients and |
40 | /// do an equivalent of receive_extend |
41 | pub(crate) ac_lookup: Option<[i16; 1 << HUFF_LOOKAHEAD]>, |
42 | |
43 | /// Directly represent contents of a JPEG DHT marker |
44 | /// |
45 | /// \# number of symbols with codes of length `k` bits |
46 | // bits[0] is unused |
47 | /// Symbols in order of increasing code length |
48 | pub(crate) values: [u8; 256] |
49 | } |
50 | |
51 | impl HuffmanTable { |
52 | pub fn new( |
53 | codes: &[u8; 17], values: [u8; 256], is_dc: bool, is_progressive: bool |
54 | ) -> Result<HuffmanTable, DecodeErrors> { |
55 | let too_long_code = (i32::from(HUFF_LOOKAHEAD) + 1) << HUFF_LOOKAHEAD; |
56 | let mut p = HuffmanTable { |
57 | maxcode: [0; 18], |
58 | offset: [0; 18], |
59 | lookup: [too_long_code; 1 << HUFF_LOOKAHEAD], |
60 | values, |
61 | ac_lookup: None |
62 | }; |
63 | |
64 | p.make_derived_table(is_dc, is_progressive, codes)?; |
65 | |
66 | Ok(p) |
67 | } |
68 | |
69 | /// Create a new huffman tables with values that aren't fixed |
70 | /// used by fill_mjpeg_tables |
71 | pub fn new_unfilled( |
72 | codes: &[u8; 17], values: &[u8], is_dc: bool, is_progressive: bool |
73 | ) -> Result<HuffmanTable, DecodeErrors> { |
74 | let mut buf = [0; 256]; |
75 | buf[..values.len()].copy_from_slice(values); |
76 | HuffmanTable::new(codes, buf, is_dc, is_progressive) |
77 | } |
78 | |
79 | /// Compute derived values for a Huffman table |
80 | /// |
81 | /// This routine performs some validation checks on the table |
82 | #[allow ( |
83 | clippy::cast_possible_truncation, |
84 | clippy::cast_possible_wrap, |
85 | clippy::cast_sign_loss, |
86 | clippy::too_many_lines, |
87 | clippy::needless_range_loop |
88 | )] |
89 | fn make_derived_table( |
90 | &mut self, is_dc: bool, _is_progressive: bool, bits: &[u8; 17] |
91 | ) -> Result<(), DecodeErrors> { |
92 | // build a list of code size |
93 | let mut huff_size = [0; 257]; |
94 | // Huffman code lengths |
95 | let mut huff_code: [u32; 257] = [0; 257]; |
96 | // figure C.1 make table of Huffman code length for each symbol |
97 | let mut p = 0; |
98 | |
99 | for l in 1..=16 { |
100 | let mut i = i32::from(bits[l]); |
101 | // table overrun is checked before ,so we dont need to check |
102 | while i != 0 { |
103 | huff_size[p] = l as u8; |
104 | p += 1; |
105 | i -= 1; |
106 | } |
107 | } |
108 | |
109 | huff_size[p] = 0; |
110 | |
111 | let num_symbols = p; |
112 | // Generate the codes themselves |
113 | // We also validate that the counts represent a legal Huffman code tree |
114 | let mut code = 0; |
115 | let mut si = i32::from(huff_size[0]); |
116 | |
117 | p = 0; |
118 | |
119 | while huff_size[p] != 0 { |
120 | while i32::from(huff_size[p]) == si { |
121 | huff_code[p] = code; |
122 | code += 1; |
123 | p += 1; |
124 | } |
125 | // maximum code of length si, pre-shifted by 16-k bits |
126 | self.maxcode[si as usize] = (code << (16 - si)) as i32; |
127 | // code is now 1 more than the last code used for code-length si; but |
128 | // it must still fit in si bits, since no code is allowed to be all ones. |
129 | if (code as i32) >= (1 << si) { |
130 | return Err(DecodeErrors::HuffmanDecode("Bad Huffman Table" .to_string())); |
131 | } |
132 | |
133 | code <<= 1; |
134 | si += 1; |
135 | } |
136 | |
137 | // Figure F.15 generate decoding tables for bit-sequential decoding |
138 | p = 0; |
139 | |
140 | for l in 0..=16 { |
141 | if bits[l] == 0 { |
142 | // -1 if no codes of this length |
143 | self.maxcode[l] = -1; |
144 | } else { |
145 | // offset[l]=codes[index of 1st symbol of code length l |
146 | // minus minimum code of length l] |
147 | self.offset[l] = (p as i32) - (huff_code[p]) as i32; |
148 | p += usize::from(bits[l]); |
149 | } |
150 | } |
151 | |
152 | self.offset[17] = 0; |
153 | // we ensure that decode terminates |
154 | self.maxcode[17] = 0x000F_FFFF; |
155 | |
156 | /* |
157 | * Compute lookahead tables to speed up decoding. |
158 | * First we set all the table entries to 0(left justified), indicating "too long"; |
159 | * (Note too long was set during initialization) |
160 | * then we iterate through the Huffman codes that are short enough and |
161 | * fill in all the entries that correspond to bit sequences starting |
162 | * with that code. |
163 | */ |
164 | |
165 | p = 0; |
166 | |
167 | for l in 1..=HUFF_LOOKAHEAD { |
168 | for _ in 1..=i32::from(bits[usize::from(l)]) { |
169 | // l -> Current code length, |
170 | // p => Its index in self.code and self.values |
171 | // Generate left justified code followed by all possible bit sequences |
172 | let mut look_bits = (huff_code[p] as usize) << (HUFF_LOOKAHEAD - l); |
173 | |
174 | for _ in 0..1 << (HUFF_LOOKAHEAD - l) { |
175 | self.lookup[look_bits] = |
176 | (i32::from(l) << HUFF_LOOKAHEAD) | i32::from(self.values[p]); |
177 | look_bits += 1; |
178 | } |
179 | |
180 | p += 1; |
181 | } |
182 | } |
183 | // build an ac table that does an equivalent of decode and receive_extend |
184 | if !is_dc { |
185 | let mut fast = [255; 1 << HUFF_LOOKAHEAD]; |
186 | // Iterate over number of symbols |
187 | for i in 0..num_symbols { |
188 | // get code size for an item |
189 | let s = huff_size[i]; |
190 | |
191 | if s <= HUFF_LOOKAHEAD { |
192 | // if it's lower than what we need for our lookup table create the table |
193 | let c = (huff_code[i] << (HUFF_LOOKAHEAD - s)) as usize; |
194 | let m = (1 << (HUFF_LOOKAHEAD - s)) as usize; |
195 | |
196 | for j in 0..m { |
197 | fast[c + j] = i as i16; |
198 | } |
199 | } |
200 | } |
201 | |
202 | // build a table that decodes both magnitude and value of small ACs in |
203 | // one go. |
204 | let mut fast_ac = [0; 1 << HUFF_LOOKAHEAD]; |
205 | |
206 | for i in 0..(1 << HUFF_LOOKAHEAD) { |
207 | let fast_v = fast[i]; |
208 | |
209 | if fast_v < 255 { |
210 | // get symbol value from AC table |
211 | let rs = self.values[fast_v as usize]; |
212 | // shift by 4 to get run length |
213 | let run = i16::from((rs >> 4) & 15); |
214 | // get magnitude bits stored at the lower 3 bits |
215 | let mag_bits = i16::from(rs & 15); |
216 | // length of the bit we've read |
217 | let len = i16::from(huff_size[fast_v as usize]); |
218 | |
219 | if mag_bits != 0 && (len + mag_bits) <= i16::from(HUFF_LOOKAHEAD) { |
220 | // magnitude code followed by receive_extend code |
221 | let mut k = (((i as i16) << len) & ((1 << HUFF_LOOKAHEAD) - 1)) |
222 | >> (i16::from(HUFF_LOOKAHEAD) - mag_bits); |
223 | let m = 1 << (mag_bits - 1); |
224 | |
225 | if k < m { |
226 | k += (!0_i16 << mag_bits) + 1; |
227 | }; |
228 | |
229 | // if result is small enough fit into fast ac table |
230 | if (-128..=127).contains(&k) { |
231 | fast_ac[i] = (k << 8) + (run << 4) + (len + mag_bits); |
232 | } |
233 | } |
234 | } |
235 | } |
236 | self.ac_lookup = Some(fast_ac); |
237 | } |
238 | |
239 | // Validate symbols as being reasonable |
240 | // For AC tables, we make no check, but accept all byte values 0..255 |
241 | // For DC tables, we require symbols to be in range 0..15 |
242 | if is_dc { |
243 | for i in 0..num_symbols { |
244 | let sym = self.values[i]; |
245 | |
246 | if sym > 15 { |
247 | return Err(DecodeErrors::HuffmanDecode("Bad Huffman Table" .to_string())); |
248 | } |
249 | } |
250 | } |
251 | |
252 | Ok(()) |
253 | } |
254 | } |
255 | |