Skip to content

Commit 92350c7

Browse files
author
HeroicKatora
authored
Merge pull request #175 from okaneco/byteorder
Remove byteorder dep
2 parents bc18ecf + 7666d6d commit 92350c7

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;
@@ -191,7 +191,7 @@ impl<R: Read> Decoder<R> {
191191
// The metadata has already been read.
192192
return Ok(Vec::new());
193193
}
194-
else if self.frame.is_none() && (self.reader.read_u8()? != 0xFF || Marker::from_u8(self.reader.read_u8()?) != Some(Marker::SOI)) {
194+
else if self.frame.is_none() && (read_u8(&mut self.reader)? != 0xFF || Marker::from_u8(read_u8(&mut self.reader)?) != Some(Marker::SOI)) {
195195
return Err(Error::Format("first two bytes are not an SOI marker".to_owned()));
196196
}
197197

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

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

431431
// Section B.1.1.2
432432
// "Any marker may optionally be preceded by any number of fill bytes, which are bytes assigned code X’FF’."
433433
while byte == 0xFF {
434-
byte = self.reader.read_u8()?;
434+
byte = read_u8(&mut self.reader)?;
435435
}
436436

437437
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;
@@ -110,7 +110,7 @@ fn read_length<R: Read>(reader: &mut R, marker: Marker) -> Result<usize> {
110110
assert!(marker.has_length());
111111

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

115115
if length < 2 {
116116
return Err(Error::Format(format!("encountered {:?} with invalid length {}", marker, length)));
@@ -156,7 +156,7 @@ pub fn parse_sof<R: Read>(reader: &mut R, marker: Marker) -> Result<FrameInfo> {
156156
_ => panic!(),
157157
};
158158

159-
let precision = reader.read_u8()?;
159+
let precision = read_u8(reader)?;
160160

161161
match precision {
162162
8 => {},
@@ -172,8 +172,8 @@ pub fn parse_sof<R: Read>(reader: &mut R, marker: Marker) -> Result<FrameInfo> {
172172
},
173173
}
174174

175-
let height = reader.read_u16::<BigEndian>()?;
176-
let width = reader.read_u16::<BigEndian>()?;
175+
let height = read_u16_from_be(reader)?;
176+
let width = read_u16_from_be(reader)?;
177177

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

189-
let component_count = reader.read_u8()?;
189+
let component_count = read_u8(reader)?;
190190

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

204204
for _ in 0 .. component_count {
205-
let identifier = reader.read_u8()?;
205+
let identifier = read_u8(reader)?;
206206

207207
// Each component's identifier must be unique.
208208
if components.iter().any(|c| c.identifier == identifier) {
209209
return Err(Error::Format(format!("duplicate frame component identifier {}", identifier)));
210210
}
211211

212-
let byte = reader.read_u8()?;
212+
let byte = read_u8(reader)?;
213213
let horizontal_sampling_factor = byte >> 4;
214214
let vertical_sampling_factor = byte & 0x0f;
215215

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

223-
let quantization_table_index = reader.read_u8()?;
223+
let quantization_table_index = read_u8(reader)?;
224224

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

311-
let component_count = reader.read_u8()?;
311+
let component_count = read_u8(reader)?;
312312

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

325325
for _ in 0 .. component_count {
326-
let identifier = reader.read_u8()?;
326+
let identifier = read_u8(reader)?;
327327

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

343-
let byte = reader.read_u8()?;
343+
let byte = read_u8(reader)?;
344344
let dc_table_index = byte >> 4;
345345
let ac_table_index = byte & 0x0f;
346346

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

367-
let spectral_selection_start = reader.read_u8()?;
368-
let spectral_selection_end = reader.read_u8()?;
367+
let spectral_selection_start = read_u8(reader)?;
368+
let spectral_selection_end = read_u8(reader)?;
369369

370-
let byte = reader.read_u8()?;
370+
let byte = read_u8(reader)?;
371371
let successive_approximation_high = byte >> 4;
372372
let successive_approximation_low = byte & 0x0f;
373373

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

421421
// Each DQT segment may contain multiple quantization tables.
422422
while length > 0 {
423-
let byte = reader.read_u8()?;
423+
let byte = read_u8(reader)?;
424424
let precision = (byte >> 4) as usize;
425425
let index = (byte & 0x0f) as usize;
426426

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

447447
for item in table.iter_mut() {
448448
*item = match precision {
449-
0 => reader.read_u8()? as u16,
450-
1 => reader.read_u16::<BigEndian>()?,
449+
0 => u16::from(read_u8(reader)?),
450+
1 => read_u16_from_be(reader)?,
451451
_ => unreachable!(),
452452
};
453453
}
@@ -471,7 +471,7 @@ pub fn parse_dht<R: Read>(reader: &mut R, is_baseline: Option<bool>) -> Result<(
471471

472472
// Each DHT segment may contain multiple huffman tables.
473473
while length > 17 {
474-
let byte = reader.read_u8()?;
474+
let byte = read_u8(reader)?;
475475
let class = byte >> 4;
476476
let index = (byte & 0x0f) as usize;
477477

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

530-
Ok(reader.read_u16::<BigEndian>()?)
530+
Ok(read_u16_from_be(reader)?)
531531
}
532532

533533
// Section B.2.4.5

0 commit comments

Comments
 (0)