Skip to content

Commit ee0e0a3

Browse files
committed
Require BufRead
1 parent 9a13428 commit ee0e0a3

File tree

4 files changed

+31
-59
lines changed

4 files changed

+31
-59
lines changed

src/decoder.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use byteorder_lite::{LittleEndian, ReadBytesExt};
22
use quick_error::quick_error;
33

44
use std::collections::HashMap;
5-
use std::io::{self, BufReader, Cursor, Read, Seek};
5+
use std::io::{self, BufRead, BufReader, Cursor, Read, Seek};
66
use std::num::NonZeroU16;
77
use std::ops::Range;
88

@@ -276,7 +276,7 @@ pub struct WebPDecoder<R> {
276276
chunks: HashMap<WebPRiffChunk, Range<u64>>,
277277
}
278278

279-
impl<R: Read + Seek> WebPDecoder<R> {
279+
impl<R: BufRead + Seek> WebPDecoder<R> {
280280
/// Create a new WebPDecoder from the reader `r`. The decoder performs many small reads, so the
281281
/// reader should be buffered.
282282
pub fn new(r: R) -> Result<WebPDecoder<R>, DecodingError> {
@@ -849,10 +849,10 @@ impl<R: Read + Seek> WebPDecoder<R> {
849849
}
850850
}
851851

852-
pub(crate) fn range_reader<R: Read + Seek>(
852+
pub(crate) fn range_reader<R: BufRead + Seek>(
853853
mut r: R,
854854
range: Range<u64>,
855-
) -> Result<impl Read, DecodingError> {
855+
) -> Result<impl BufRead, DecodingError> {
856856
r.seek(io::SeekFrom::Start(range.start))?;
857857
Ok(r.take(range.end - range.start))
858858
}

src/extended.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::lossless::LosslessDecoder;
22
use crate::decoder::DecodingError;
33
use byteorder_lite::ReadBytesExt;
4-
use std::io::Read;
4+
use std::io::{BufRead, Read};
55

66
#[derive(Debug, Clone)]
77
pub(crate) struct WebPExtendedInfo {
@@ -264,7 +264,7 @@ pub(crate) enum FilteringMethod {
264264
Gradient,
265265
}
266266

267-
pub(crate) fn read_alpha_chunk<R: Read>(
267+
pub(crate) fn read_alpha_chunk<R: BufRead>(
268268
reader: &mut R,
269269
width: u16,
270270
height: u16,

src/huffman.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::io::Read;
1+
use std::io::BufRead;
22

33
use crate::decoder::DecodingError;
44

@@ -184,7 +184,7 @@ impl HuffmanTree {
184184
}
185185

186186
#[inline(never)]
187-
fn read_symbol_slowpath<R: Read>(
187+
fn read_symbol_slowpath<R: BufRead>(
188188
tree: &[HuffmanTreeNode],
189189
mut v: usize,
190190
bit_reader: &mut BitReader<R>,
@@ -211,7 +211,7 @@ impl HuffmanTree {
211211
///
212212
/// You must call call `bit_reader.fill()` before calling this function or it may erroroneosly
213213
/// detect the end of the stream and return a bitstream error.
214-
pub(crate) fn read_symbol<R: Read>(
214+
pub(crate) fn read_symbol<R: BufRead>(
215215
&self,
216216
bit_reader: &mut BitReader<R>,
217217
) -> Result<u16, DecodingError> {

src/lossless.rs

Lines changed: 22 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
//! [Lossless spec](https://developers.google.com/speed/webp/docs/webp_lossless_bitstream_specification)
44
//!
55
6-
use std::{io::Read, mem};
6+
use std::io::BufRead;
7+
use std::mem;
78

89
use crate::decoder::DecodingError;
910
use crate::lossless_transform::{
@@ -69,7 +70,7 @@ pub(crate) struct LosslessDecoder<R> {
6970
height: u16,
7071
}
7172

72-
impl<R: Read> LosslessDecoder<R> {
73+
impl<R: BufRead> LosslessDecoder<R> {
7374
/// Create a new decoder
7475
pub(crate) fn new(r: R) -> LosslessDecoder<R> {
7576
LosslessDecoder {
@@ -525,6 +526,9 @@ impl<R: Read> LosslessDecoder<R> {
525526
let green = code as u8;
526527
let red = tree[RED].read_symbol(&mut self.bit_reader)? as u8;
527528
let blue = tree[BLUE].read_symbol(&mut self.bit_reader)? as u8;
529+
if self.bit_reader.nbits < 15 {
530+
self.bit_reader.fill()?;
531+
}
528532
let alpha = tree[ALPHA].read_symbol(&mut self.bit_reader)? as u8;
529533

530534
data[index * 4] = red;
@@ -682,73 +686,39 @@ pub(crate) struct BitReader<R> {
682686
reader: R,
683687
buffer: u64,
684688
nbits: u8,
685-
lookahead: u64,
686-
lookahead_bits: u8,
687689
}
688690

689-
impl<R: Read> BitReader<R> {
691+
impl<R: BufRead> BitReader<R> {
690692
fn new(reader: R) -> Self {
691693
Self {
692694
reader,
693695
buffer: 0,
694696
nbits: 0,
695-
lookahead: 0,
696-
lookahead_bits: 0,
697697
}
698698
}
699699

700-
fn apply_lookahead(&mut self) {
701-
let num = self.lookahead_bits.min(64 - self.nbits);
702-
self.buffer |= self.lookahead << self.nbits;
703-
self.nbits += num;
704-
self.lookahead = self.lookahead.checked_shr(num as u32).unwrap_or(0);
705-
self.lookahead_bits -= num;
706-
}
707-
708700
/// Fills the buffer with bits from the input stream.
709701
///
710702
/// After this function, the internal buffer will contain 64-bits or have reached the end of
711703
/// the input stream.
712704
pub(crate) fn fill(&mut self) -> Result<(), DecodingError> {
713-
// Check whether the buffer is already full.
714-
if self.nbits == 64 {
715-
return Ok(());
716-
}
717-
718-
// Apply the lookahead bits if there are any.
719-
if self.lookahead_bits > 0 {
720-
self.apply_lookahead();
721-
if self.nbits == 64 {
722-
return Ok(());
723-
}
724-
}
725-
726-
debug_assert!(self.lookahead_bits == 0);
727705
debug_assert!(self.nbits < 64);
728706

729-
// Read from the input stream.
730-
let mut bytes_read = 0;
731-
let mut bytes = [0; 8];
732-
while bytes_read < 8 {
733-
let n = self.reader.read(&mut bytes[bytes_read..])?;
734-
if n == 0 {
735-
if bytes_read == 0 {
736-
return Ok(());
737-
}
738-
739-
// Technically, a `read` implementation can write bytes to the buffer even if it
740-
// returns 0, so we need to zero out the remaining bytes to ensure that the buffer
741-
// is properly initialized.
742-
bytes[bytes_read..].fill(0);
743-
break;
707+
let mut buf = self.reader.fill_buf()?;
708+
if buf.len() >= 8 {
709+
let lookahead = u64::from_le_bytes(buf[..8].try_into().unwrap());
710+
self.reader.consume(usize::from((63 - self.nbits) / 8));
711+
self.buffer |= lookahead << self.nbits;
712+
self.nbits |= 56;
713+
} else {
714+
while buf.len() > 0 && self.nbits < 56 {
715+
self.buffer |= u64::from(buf[0]) << self.nbits;
716+
self.nbits += 8;
717+
self.reader.consume(1);
718+
buf = self.reader.fill_buf()?;
744719
}
745-
bytes_read += n;
746720
}
747721

748-
self.lookahead = u64::from_le_bytes(bytes);
749-
self.lookahead_bits = (bytes_read * 8) as u8;
750-
self.apply_lookahead();
751-
752722
Ok(())
753723
}
754724

@@ -778,7 +748,9 @@ impl<R: Read> BitReader<R> {
778748
debug_assert!(num as usize <= 8 * mem::size_of::<T>());
779749
debug_assert!(num <= 32);
780750

781-
self.fill()?;
751+
if self.nbits < num {
752+
self.fill()?;
753+
}
782754
let value = self.peek(num) as u32;
783755
self.consume(num)?;
784756

0 commit comments

Comments
 (0)