Skip to content

Commit c6169f6

Browse files
committed
Allow decoding with bad spectral selection end
In non progressive mode the spectral selection end must be 63 but some encoder set all progressive mode related information to 0.
1 parent ab6d326 commit c6169f6

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

src/parser.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ pub fn parse_sos<R: Read>(reader: &mut R, frame: &FrameInfo) -> Result<ScanInfo>
366366
}
367367

368368
let spectral_selection_start = read_u8(reader)?;
369-
let spectral_selection_end = read_u8(reader)?;
369+
let mut spectral_selection_end = read_u8(reader)?;
370370

371371
let byte = read_u8(reader)?;
372372
let successive_approximation_high = byte >> 4;
@@ -393,6 +393,9 @@ pub fn parse_sos<R: Read>(reader: &mut R, frame: &FrameInfo) -> Result<ScanInfo>
393393
}
394394
}
395395
else {
396+
if spectral_selection_end == 0 {
397+
spectral_selection_end = 63;
398+
}
396399
if spectral_selection_start != 0 || spectral_selection_end != 63 {
397400
return Err(Error::Format("spectral selection is not allowed in non-progressive scan".to_owned()));
398401
}
@@ -568,12 +571,12 @@ pub fn parse_app<R: Read>(reader: &mut R, marker: Marker) -> Result<Option<AppDa
568571
if length >= 6 {
569572
let mut buffer = [0u8; 6];
570573
reader.read_exact(&mut buffer)?;
571-
bytes_read = buffer.len();
572-
574+
bytes_read = buffer.len();
575+
573576
// https://web.archive.org/web/20190624045241if_/http://www.cipa.jp:80/std/documents/e/DC-008-Translation-2019-E.pdf
574577
// 4.5.4 Basic Structure of JPEG Compressed Data
575578
if &buffer == b"Exif\x00\x00" {
576-
let mut data = vec![0; length - bytes_read];
579+
let mut data = vec![0; length - bytes_read];
577580
reader.read_exact(&mut data)?;
578581
bytes_read += data.len();
579582
result = Some(AppData::Exif(data));

0 commit comments

Comments
 (0)