Skip to content

Commit 7666d6d

Browse files
committed
Remove byteorder dep
With Rust 1.34 as the MSRV, from_be_bytes which was stabilized in 1.32 can be used. byteorder was only used for converting two Big Endian bytes into a u16.
1 parent 97742b3 commit 7666d6d

File tree

5 files changed

+41
-31
lines changed

5 files changed

+41
-31
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ license = "MIT / Apache-2.0"
1111
exclude = ["tests/*"]
1212

1313
[dependencies]
14-
byteorder = "1.0"
1514
rayon = { version = "1.0", optional = true }
1615

1716
[dev-dependencies]

src/decoder.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use byteorder::ReadBytesExt;
1+
use crate::read_u8;
22
use error::{Error, Result, UnsupportedFeature};
33
use huffman::{fill_default_mjpeg_tables, HuffmanDecoder, HuffmanTable};
44
use marker::Marker;
@@ -154,7 +154,7 @@ impl<R: Read> Decoder<R> {
154154
// The metadata has already been read.
155155
return Ok(Vec::new());
156156
}
157-
else if self.frame.is_none() && (self.reader.read_u8()? != 0xFF || Marker::from_u8(self.reader.read_u8()?) != Some(Marker::SOI)) {
157+
else if self.frame.is_none() && (read_u8(&mut self.reader)? != 0xFF || Marker::from_u8(read_u8(&mut self.reader)?) != Some(Marker::SOI)) {
158158
return Err(Error::Format("first two bytes are not an SOI marker".to_owned()));
159159
}
160160

@@ -381,19 +381,19 @@ impl<R: Read> Decoder<R> {
381381
// libjpeg allows this though and there are images in the wild utilising it, so we are
382382
// forced to support this behavior.
383383
// Sony Ericsson P990i is an example of a device which produce this sort of JPEGs.
384-
while self.reader.read_u8()? != 0xFF {}
384+
while read_u8(&mut self.reader)? != 0xFF {}
385385

386386
// Section B.1.1.2
387387
// All markers are assigned two-byte codes: an X’FF’ byte followed by a
388388
// byte which is not equal to 0 or X’FF’ (see Table B.1). Any marker may
389389
// optionally be preceded by any number of fill bytes, which are bytes
390390
// assigned code X’FF’.
391-
let mut byte = self.reader.read_u8()?;
391+
let mut byte = read_u8(&mut self.reader)?;
392392

393393
// Section B.1.1.2
394394
// "Any marker may optionally be preceded by any number of fill bytes, which are bytes assigned code X’FF’."
395395
while byte == 0xFF {
396-
byte = self.reader.read_u8()?;
396+
byte = read_u8(&mut self.reader)?;
397397
}
398398

399399
if byte != 0x00 && byte != 0xFF {

src/huffman.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use byteorder::ReadBytesExt;
1+
use crate::read_u8;
22
use error::{Error, Result};
33
use marker::Marker;
44
use parser::ScanInfo;
@@ -121,11 +121,11 @@ impl HuffmanDecoder {
121121
// Fill with zero bits if we have reached the end.
122122
let byte = match self.marker {
123123
Some(_) => 0,
124-
None => reader.read_u8()?,
124+
None => read_u8(reader)?,
125125
};
126126

127127
if byte == 0xFF {
128-
let mut next_byte = reader.read_u8()?;
128+
let mut next_byte = read_u8(reader)?;
129129

130130
// Check for byte stuffing.
131131
if next_byte != 0x00 {
@@ -136,7 +136,7 @@ impl HuffmanDecoder {
136136
// Section B.1.1.2
137137
// "Any marker may optionally be preceded by any number of fill bytes, which are bytes assigned code X’FF’."
138138
while next_byte == 0xFF {
139-
next_byte = reader.read_u8()?;
139+
next_byte = read_u8(reader)?;
140140
}
141141

142142
match next_byte {

src/lib.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#![deny(missing_docs)]
3030
#![forbid(unsafe_code)]
3131

32-
extern crate byteorder;
3332
#[cfg(feature="rayon")]
3433
extern crate rayon;
3534

@@ -44,3 +43,15 @@ mod marker;
4443
mod parser;
4544
mod upsampler;
4645
mod worker;
46+
47+
fn read_u8<R: std::io::Read>(reader: &mut R) -> std::io::Result<u8> {
48+
let mut buf = [0];
49+
reader.read_exact(&mut buf)?;
50+
Ok(buf[0])
51+
}
52+
53+
fn read_u16_from_be<R: std::io::Read>(reader: &mut R) -> std::io::Result<u16> {
54+
let mut buf = [0, 0];
55+
reader.read_exact(&mut buf)?;
56+
Ok(u16::from_be_bytes(buf))
57+
}

src/parser.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use byteorder::{BigEndian, ReadBytesExt};
1+
use crate::{read_u16_from_be, read_u8};
22
use error::{Error, Result, UnsupportedFeature};
33
use huffman::{HuffmanTable, HuffmanTableClass};
44
use marker::Marker;
@@ -103,7 +103,7 @@ fn read_length<R: Read>(reader: &mut R, marker: Marker) -> Result<usize> {
103103
assert!(marker.has_length());
104104

105105
// length is including itself.
106-
let length = reader.read_u16::<BigEndian>()? as usize;
106+
let length = usize::from(read_u16_from_be(reader)?);
107107

108108
if length < 2 {
109109
return Err(Error::Format(format!("encountered {:?} with invalid length {}", marker, length)));
@@ -149,7 +149,7 @@ pub fn parse_sof<R: Read>(reader: &mut R, marker: Marker) -> Result<FrameInfo> {
149149
_ => panic!(),
150150
};
151151

152-
let precision = reader.read_u8()?;
152+
let precision = read_u8(reader)?;
153153

154154
match precision {
155155
8 => {},
@@ -165,8 +165,8 @@ pub fn parse_sof<R: Read>(reader: &mut R, marker: Marker) -> Result<FrameInfo> {
165165
},
166166
}
167167

168-
let height = reader.read_u16::<BigEndian>()?;
169-
let width = reader.read_u16::<BigEndian>()?;
168+
let height = read_u16_from_be(reader)?;
169+
let width = read_u16_from_be(reader)?;
170170

171171
// height:
172172
// "Value 0 indicates that the number of lines shall be defined by the DNL marker and
@@ -179,7 +179,7 @@ pub fn parse_sof<R: Read>(reader: &mut R, marker: Marker) -> Result<FrameInfo> {
179179
return Err(Error::Format("zero width in frame header".to_owned()));
180180
}
181181

182-
let component_count = reader.read_u8()?;
182+
let component_count = read_u8(reader)?;
183183

184184
if component_count == 0 {
185185
return Err(Error::Format("zero component count in frame header".to_owned()));
@@ -195,14 +195,14 @@ pub fn parse_sof<R: Read>(reader: &mut R, marker: Marker) -> Result<FrameInfo> {
195195
let mut components: Vec<Component> = Vec::with_capacity(component_count as usize);
196196

197197
for _ in 0 .. component_count {
198-
let identifier = reader.read_u8()?;
198+
let identifier = read_u8(reader)?;
199199

200200
// Each component's identifier must be unique.
201201
if components.iter().any(|c| c.identifier == identifier) {
202202
return Err(Error::Format(format!("duplicate frame component identifier {}", identifier)));
203203
}
204204

205-
let byte = reader.read_u8()?;
205+
let byte = read_u8(reader)?;
206206
let horizontal_sampling_factor = byte >> 4;
207207
let vertical_sampling_factor = byte & 0x0f;
208208

@@ -213,7 +213,7 @@ pub fn parse_sof<R: Read>(reader: &mut R, marker: Marker) -> Result<FrameInfo> {
213213
return Err(Error::Format(format!("invalid vertical sampling factor {}", vertical_sampling_factor)));
214214
}
215215

216-
let quantization_table_index = reader.read_u8()?;
216+
let quantization_table_index = read_u8(reader)?;
217217

218218
if quantization_table_index > 3 || (coding_process == CodingProcess::Lossless && quantization_table_index != 0) {
219219
return Err(Error::Format(format!("invalid quantization table index {}", quantization_table_index)));
@@ -301,7 +301,7 @@ pub fn parse_sos<R: Read>(reader: &mut R, frame: &FrameInfo) -> Result<ScanInfo>
301301
return Err(Error::Format("zero length in SOS".to_owned()));
302302
}
303303

304-
let component_count = reader.read_u8()?;
304+
let component_count = read_u8(reader)?;
305305

306306
if component_count == 0 || component_count > 4 {
307307
return Err(Error::Format(format!("invalid component count {} in scan header", component_count)));
@@ -316,7 +316,7 @@ pub fn parse_sos<R: Read>(reader: &mut R, frame: &FrameInfo) -> Result<ScanInfo>
316316
let mut ac_table_indices = Vec::with_capacity(component_count as usize);
317317

318318
for _ in 0 .. component_count {
319-
let identifier = reader.read_u8()?;
319+
let identifier = read_u8(reader)?;
320320

321321
let component_index = match frame.components.iter().position(|c| c.identifier == identifier) {
322322
Some(value) => value,
@@ -333,7 +333,7 @@ pub fn parse_sos<R: Read>(reader: &mut R, frame: &FrameInfo) -> Result<ScanInfo>
333333
return Err(Error::Format("the scan component order does not follow the order in the frame header".to_owned()));
334334
}
335335

336-
let byte = reader.read_u8()?;
336+
let byte = read_u8(reader)?;
337337
let dc_table_index = byte >> 4;
338338
let ac_table_index = byte & 0x0f;
339339

@@ -357,10 +357,10 @@ pub fn parse_sos<R: Read>(reader: &mut R, frame: &FrameInfo) -> Result<ScanInfo>
357357
return Err(Error::Format("scan with more than one component and more than 10 blocks per MCU".to_owned()));
358358
}
359359

360-
let spectral_selection_start = reader.read_u8()?;
361-
let spectral_selection_end = reader.read_u8()?;
360+
let spectral_selection_start = read_u8(reader)?;
361+
let spectral_selection_end = read_u8(reader)?;
362362

363-
let byte = reader.read_u8()?;
363+
let byte = read_u8(reader)?;
364364
let successive_approximation_high = byte >> 4;
365365
let successive_approximation_low = byte & 0x0f;
366366

@@ -413,7 +413,7 @@ pub fn parse_dqt<R: Read>(reader: &mut R) -> Result<[Option<[u16; 64]>; 4]> {
413413

414414
// Each DQT segment may contain multiple quantization tables.
415415
while length > 0 {
416-
let byte = reader.read_u8()?;
416+
let byte = read_u8(reader)?;
417417
let precision = (byte >> 4) as usize;
418418
let index = (byte & 0x0f) as usize;
419419

@@ -439,8 +439,8 @@ pub fn parse_dqt<R: Read>(reader: &mut R) -> Result<[Option<[u16; 64]>; 4]> {
439439

440440
for item in table.iter_mut() {
441441
*item = match precision {
442-
0 => reader.read_u8()? as u16,
443-
1 => reader.read_u16::<BigEndian>()?,
442+
0 => u16::from(read_u8(reader)?),
443+
1 => read_u16_from_be(reader)?,
444444
_ => unreachable!(),
445445
};
446446
}
@@ -464,7 +464,7 @@ pub fn parse_dht<R: Read>(reader: &mut R, is_baseline: Option<bool>) -> Result<(
464464

465465
// Each DHT segment may contain multiple huffman tables.
466466
while length > 17 {
467-
let byte = reader.read_u8()?;
467+
let byte = read_u8(reader)?;
468468
let class = byte >> 4;
469469
let index = (byte & 0x0f) as usize;
470470

@@ -520,7 +520,7 @@ pub fn parse_dri<R: Read>(reader: &mut R) -> Result<u16> {
520520
return Err(Error::Format("DRI with invalid length".to_owned()));
521521
}
522522

523-
Ok(reader.read_u16::<BigEndian>()?)
523+
Ok(read_u16_from_be(reader)?)
524524
}
525525

526526
// Section B.2.4.5

0 commit comments

Comments
 (0)