| 1 | use alloc::borrow::ToOwned; |
| 2 | use alloc::vec; |
| 3 | use alloc::vec::Vec; |
| 4 | use core::iter; |
| 5 | use std::io::Read; |
| 6 | use crate::read_u8; |
| 7 | use crate::error::{Error, Result}; |
| 8 | use crate::marker::Marker; |
| 9 | use crate::parser::ScanInfo; |
| 10 | |
| 11 | const LUT_BITS: u8 = 8; |
| 12 | |
| 13 | #[derive (Debug)] |
| 14 | pub struct HuffmanDecoder { |
| 15 | bits: u64, |
| 16 | num_bits: u8, |
| 17 | marker: Option<Marker>, |
| 18 | } |
| 19 | |
| 20 | impl HuffmanDecoder { |
| 21 | pub fn new() -> HuffmanDecoder { |
| 22 | HuffmanDecoder { |
| 23 | bits: 0, |
| 24 | num_bits: 0, |
| 25 | marker: None, |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | // Section F.2.2.3 |
| 30 | // Figure F.16 |
| 31 | pub fn decode<R: Read>(&mut self, reader: &mut R, table: &HuffmanTable) -> Result<u8> { |
| 32 | if self.num_bits < 16 { |
| 33 | self.read_bits(reader)?; |
| 34 | } |
| 35 | |
| 36 | let (value, size) = table.lut[self.peek_bits(LUT_BITS) as usize]; |
| 37 | |
| 38 | if size > 0 { |
| 39 | self.consume_bits(size); |
| 40 | Ok(value) |
| 41 | } |
| 42 | else { |
| 43 | let bits = self.peek_bits(16); |
| 44 | |
| 45 | for i in LUT_BITS .. 16 { |
| 46 | let code = (bits >> (15 - i)) as i32; |
| 47 | |
| 48 | if code <= table.maxcode[i as usize] { |
| 49 | self.consume_bits(i + 1); |
| 50 | |
| 51 | let index = (code + table.delta[i as usize]) as usize; |
| 52 | return Ok(table.values[index]); |
| 53 | } |
| 54 | } |
| 55 | |
| 56 | Err(Error::Format("failed to decode huffman code" .to_owned())) |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | pub fn decode_fast_ac<R: Read>(&mut self, reader: &mut R, table: &HuffmanTable) -> Result<Option<(i16, u8)>> { |
| 61 | if let Some(ref ac_lut) = table.ac_lut { |
| 62 | if self.num_bits < LUT_BITS { |
| 63 | self.read_bits(reader)?; |
| 64 | } |
| 65 | |
| 66 | let (value, run_size) = ac_lut[self.peek_bits(LUT_BITS) as usize]; |
| 67 | |
| 68 | if run_size != 0 { |
| 69 | let run = run_size >> 4; |
| 70 | let size = run_size & 0x0f; |
| 71 | |
| 72 | self.consume_bits(size); |
| 73 | return Ok(Some((value, run))); |
| 74 | } |
| 75 | } |
| 76 | |
| 77 | Ok(None) |
| 78 | } |
| 79 | |
| 80 | #[inline ] |
| 81 | pub fn get_bits<R: Read>(&mut self, reader: &mut R, count: u8) -> Result<u16> { |
| 82 | if self.num_bits < count { |
| 83 | self.read_bits(reader)?; |
| 84 | } |
| 85 | |
| 86 | let bits = self.peek_bits(count); |
| 87 | self.consume_bits(count); |
| 88 | |
| 89 | Ok(bits) |
| 90 | } |
| 91 | |
| 92 | #[inline ] |
| 93 | pub fn receive_extend<R: Read>(&mut self, reader: &mut R, count: u8) -> Result<i16> { |
| 94 | let value = self.get_bits(reader, count)?; |
| 95 | Ok(extend(value, count)) |
| 96 | } |
| 97 | |
| 98 | pub fn reset(&mut self) { |
| 99 | self.bits = 0; |
| 100 | self.num_bits = 0; |
| 101 | } |
| 102 | |
| 103 | pub fn take_marker<R: Read>(&mut self, reader: &mut R) -> Result<Option<Marker>> { |
| 104 | self.read_bits(reader).map(|_| self.marker.take()) |
| 105 | } |
| 106 | |
| 107 | #[inline ] |
| 108 | fn peek_bits(&mut self, count: u8) -> u16 { |
| 109 | debug_assert!(count <= 16); |
| 110 | debug_assert!(self.num_bits >= count); |
| 111 | |
| 112 | ((self.bits >> (64 - count)) & ((1 << count) - 1)) as u16 |
| 113 | } |
| 114 | |
| 115 | #[inline ] |
| 116 | fn consume_bits(&mut self, count: u8) { |
| 117 | debug_assert!(self.num_bits >= count); |
| 118 | |
| 119 | self.bits <<= count as usize; |
| 120 | self.num_bits -= count; |
| 121 | } |
| 122 | |
| 123 | fn read_bits<R: Read>(&mut self, reader: &mut R) -> Result<()> { |
| 124 | while self.num_bits <= 56 { |
| 125 | // Fill with zero bits if we have reached the end. |
| 126 | let byte = match self.marker { |
| 127 | Some(_) => 0, |
| 128 | None => read_u8(reader)?, |
| 129 | }; |
| 130 | |
| 131 | if byte == 0xFF { |
| 132 | let mut next_byte = read_u8(reader)?; |
| 133 | |
| 134 | // Check for byte stuffing. |
| 135 | if next_byte != 0x00 { |
| 136 | // We seem to have reached the end of entropy-coded data and encountered a |
| 137 | // marker. Since we can't put data back into the reader, we have to continue |
| 138 | // reading to identify the marker so we can pass it on. |
| 139 | |
| 140 | // Section B.1.1.2 |
| 141 | // "Any marker may optionally be preceded by any number of fill bytes, which are bytes assigned code X’FF’." |
| 142 | while next_byte == 0xFF { |
| 143 | next_byte = read_u8(reader)?; |
| 144 | } |
| 145 | |
| 146 | match next_byte { |
| 147 | 0x00 => return Err(Error::Format("FF 00 found where marker was expected" .to_owned())), |
| 148 | _ => self.marker = Some(Marker::from_u8(next_byte).unwrap()), |
| 149 | } |
| 150 | |
| 151 | continue; |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | self.bits |= (byte as u64) << (56 - self.num_bits); |
| 156 | self.num_bits += 8; |
| 157 | } |
| 158 | |
| 159 | Ok(()) |
| 160 | } |
| 161 | } |
| 162 | |
| 163 | // Section F.2.2.1 |
| 164 | // Figure F.12 |
| 165 | fn extend(value: u16, count: u8) -> i16 { |
| 166 | let vt: u16 = 1 << (count as u16 - 1); |
| 167 | |
| 168 | if value < vt { |
| 169 | value as i16 + (-1 << count as i16) + 1 |
| 170 | } else { |
| 171 | value as i16 |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | #[derive (Clone, Copy, Debug, PartialEq)] |
| 176 | pub enum HuffmanTableClass { |
| 177 | DC, |
| 178 | AC, |
| 179 | } |
| 180 | |
| 181 | pub struct HuffmanTable { |
| 182 | values: Vec<u8>, |
| 183 | delta: [i32; 16], |
| 184 | maxcode: [i32; 16], |
| 185 | |
| 186 | lut: [(u8, u8); 1 << LUT_BITS], |
| 187 | ac_lut: Option<[(i16, u8); 1 << LUT_BITS]>, |
| 188 | } |
| 189 | |
| 190 | impl HuffmanTable { |
| 191 | pub fn new(bits: &[u8; 16], values: &[u8], class: HuffmanTableClass) -> Result<HuffmanTable> { |
| 192 | let (huffcode, huffsize) = derive_huffman_codes(bits)?; |
| 193 | |
| 194 | // Section F.2.2.3 |
| 195 | // Figure F.15 |
| 196 | // delta[i] is set to VALPTR(I) - MINCODE(I) |
| 197 | let mut delta = [0i32; 16]; |
| 198 | let mut maxcode = [-1i32; 16]; |
| 199 | let mut j = 0; |
| 200 | |
| 201 | for i in 0 .. 16 { |
| 202 | if bits[i] != 0 { |
| 203 | delta[i] = j as i32 - huffcode[j] as i32; |
| 204 | j += bits[i] as usize; |
| 205 | maxcode[i] = huffcode[j - 1] as i32; |
| 206 | } |
| 207 | } |
| 208 | |
| 209 | // Build a lookup table for faster decoding. |
| 210 | let mut lut = [(0u8, 0u8); 1 << LUT_BITS]; |
| 211 | |
| 212 | for (i, &size) in huffsize.iter().enumerate().filter(|&(_, &size)| size <= LUT_BITS) { |
| 213 | let bits_remaining = LUT_BITS - size; |
| 214 | let start = (huffcode[i] << bits_remaining) as usize; |
| 215 | |
| 216 | let val = (values[i], size); |
| 217 | for b in &mut lut[start..][..1 << bits_remaining] { |
| 218 | *b = val; |
| 219 | } |
| 220 | } |
| 221 | |
| 222 | // Build a lookup table for small AC coefficients which both decodes the value and does the |
| 223 | // equivalent of receive_extend. |
| 224 | let ac_lut = match class { |
| 225 | HuffmanTableClass::DC => None, |
| 226 | HuffmanTableClass::AC => { |
| 227 | let mut table = [(0i16, 0u8); 1 << LUT_BITS]; |
| 228 | |
| 229 | for (i, &(value, size)) in lut.iter().enumerate() { |
| 230 | let run_length = value >> 4; |
| 231 | let magnitude_category = value & 0x0f; |
| 232 | |
| 233 | if magnitude_category > 0 && size + magnitude_category <= LUT_BITS { |
| 234 | let unextended_ac_value = (((i << size) & ((1 << LUT_BITS) - 1)) >> (LUT_BITS - magnitude_category)) as u16; |
| 235 | let ac_value = extend(unextended_ac_value, magnitude_category); |
| 236 | |
| 237 | table[i] = (ac_value, (run_length << 4) | (size + magnitude_category)); |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | Some(table) |
| 242 | }, |
| 243 | }; |
| 244 | |
| 245 | Ok(HuffmanTable { |
| 246 | values: values.to_vec(), |
| 247 | delta, |
| 248 | maxcode, |
| 249 | lut, |
| 250 | ac_lut, |
| 251 | }) |
| 252 | } |
| 253 | } |
| 254 | |
| 255 | // Section C.2 |
| 256 | fn derive_huffman_codes(bits: &[u8; 16]) -> Result<(Vec<u16>, Vec<u8>)> { |
| 257 | // Figure C.1 |
| 258 | let huffsize = bits.iter() |
| 259 | .enumerate() |
| 260 | .fold(Vec::new(), |mut acc, (i, &value)| { |
| 261 | acc.extend(iter::repeat((i + 1) as u8).take(value as usize)); |
| 262 | acc |
| 263 | }); |
| 264 | |
| 265 | // Figure C.2 |
| 266 | let mut huffcode = vec![0u16; huffsize.len()]; |
| 267 | let mut code_size = huffsize[0]; |
| 268 | let mut code = 0u32; |
| 269 | |
| 270 | for (i, &size) in huffsize.iter().enumerate() { |
| 271 | while code_size < size { |
| 272 | code <<= 1; |
| 273 | code_size += 1; |
| 274 | } |
| 275 | |
| 276 | if code >= (1u32 << size) { |
| 277 | return Err(Error::Format("bad huffman code length" .to_owned())); |
| 278 | } |
| 279 | |
| 280 | huffcode[i] = code as u16; |
| 281 | code += 1; |
| 282 | } |
| 283 | |
| 284 | Ok((huffcode, huffsize)) |
| 285 | } |
| 286 | |
| 287 | // https://www.loc.gov/preservation/digital/formats/fdd/fdd000063.shtml |
| 288 | // "Avery Lee, writing in the rec.video.desktop newsgroup in 2001, commented that "MJPEG, or at |
| 289 | // least the MJPEG in AVIs having the MJPG fourcc, is restricted JPEG with a fixed -- and |
| 290 | // *omitted* -- Huffman table. The JPEG must be YCbCr colorspace, it must be 4:2:2, and it must |
| 291 | // use basic Huffman encoding, not arithmetic or progressive.... You can indeed extract the |
| 292 | // MJPEG frames and decode them with a regular JPEG decoder, but you have to prepend the DHT |
| 293 | // segment to them, or else the decoder won't have any idea how to decompress the data. |
| 294 | // The exact table necessary is given in the OpenDML spec."" |
| 295 | pub fn fill_default_mjpeg_tables(scan: &ScanInfo, |
| 296 | dc_huffman_tables: &mut[Option<HuffmanTable>], |
| 297 | ac_huffman_tables: &mut[Option<HuffmanTable>]) { |
| 298 | // Section K.3.3 |
| 299 | |
| 300 | if dc_huffman_tables[0].is_none() && scan.dc_table_indices.iter().any(|&i| i == 0) { |
| 301 | // Table K.3 |
| 302 | dc_huffman_tables[0] = Some(HuffmanTable::new( |
| 303 | &[0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], |
| 304 | &[0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B], HuffmanTableClass::DC).unwrap()); |
| 305 | } |
| 306 | if dc_huffman_tables[1].is_none() && scan.dc_table_indices.iter().any(|&i| i == 1) { |
| 307 | // Table K.4 |
| 308 | dc_huffman_tables[1] = Some(HuffmanTable::new( |
| 309 | &[0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00], |
| 310 | &[0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B], HuffmanTableClass::DC).unwrap()); |
| 311 | } |
| 312 | if ac_huffman_tables[0].is_none() && scan.ac_table_indices.iter().any(|&i| i == 0) { |
| 313 | // Table K.5 |
| 314 | ac_huffman_tables[0] = Some(HuffmanTable::new( |
| 315 | &[0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D], |
| 316 | &[0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, |
| 317 | 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, |
| 318 | 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, |
| 319 | 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, |
| 320 | 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, |
| 321 | 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, |
| 322 | 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, |
| 323 | 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, |
| 324 | 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, |
| 325 | 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, |
| 326 | 0xF9, 0xFA |
| 327 | ], HuffmanTableClass::AC).unwrap()); |
| 328 | } |
| 329 | if ac_huffman_tables[1].is_none() && scan.ac_table_indices.iter().any(|&i| i == 1) { |
| 330 | // Table K.6 |
| 331 | ac_huffman_tables[1] = Some(HuffmanTable::new( |
| 332 | &[0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77], |
| 333 | &[0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, |
| 334 | 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, |
| 335 | 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, |
| 336 | 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, |
| 337 | 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, |
| 338 | 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, |
| 339 | 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, |
| 340 | 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, |
| 341 | 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, |
| 342 | 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, |
| 343 | 0xF9, 0xFA |
| 344 | ], HuffmanTableClass::AC).unwrap()); |
| 345 | } |
| 346 | } |
| 347 | |