|
3 | 3 | //! [Lossless spec](https://developers.google.com/speed/webp/docs/webp_lossless_bitstream_specification)
|
4 | 4 | //!
|
5 | 5 |
|
6 |
| -use std::{io::Read, mem}; |
| 6 | +use std::io::BufRead; |
| 7 | +use std::mem; |
7 | 8 |
|
8 | 9 | use crate::decoder::DecodingError;
|
9 | 10 | use crate::lossless_transform::{
|
@@ -69,7 +70,7 @@ pub(crate) struct LosslessDecoder<R> {
|
69 | 70 | height: u16,
|
70 | 71 | }
|
71 | 72 |
|
72 |
| -impl<R: Read> LosslessDecoder<R> { |
| 73 | +impl<R: BufRead> LosslessDecoder<R> { |
73 | 74 | /// Create a new decoder
|
74 | 75 | pub(crate) fn new(r: R) -> LosslessDecoder<R> {
|
75 | 76 | LosslessDecoder {
|
@@ -525,6 +526,9 @@ impl<R: Read> LosslessDecoder<R> {
|
525 | 526 | let green = code as u8;
|
526 | 527 | let red = tree[RED].read_symbol(&mut self.bit_reader)? as u8;
|
527 | 528 | 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 | + } |
528 | 532 | let alpha = tree[ALPHA].read_symbol(&mut self.bit_reader)? as u8;
|
529 | 533 |
|
530 | 534 | data[index * 4] = red;
|
@@ -682,73 +686,39 @@ pub(crate) struct BitReader<R> {
|
682 | 686 | reader: R,
|
683 | 687 | buffer: u64,
|
684 | 688 | nbits: u8,
|
685 |
| - lookahead: u64, |
686 |
| - lookahead_bits: u8, |
687 | 689 | }
|
688 | 690 |
|
689 |
| -impl<R: Read> BitReader<R> { |
| 691 | +impl<R: BufRead> BitReader<R> { |
690 | 692 | fn new(reader: R) -> Self {
|
691 | 693 | Self {
|
692 | 694 | reader,
|
693 | 695 | buffer: 0,
|
694 | 696 | nbits: 0,
|
695 |
| - lookahead: 0, |
696 |
| - lookahead_bits: 0, |
697 | 697 | }
|
698 | 698 | }
|
699 | 699 |
|
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 |
| - |
708 | 700 | /// Fills the buffer with bits from the input stream.
|
709 | 701 | ///
|
710 | 702 | /// After this function, the internal buffer will contain 64-bits or have reached the end of
|
711 | 703 | /// the input stream.
|
712 | 704 | 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); |
727 | 705 | debug_assert!(self.nbits < 64);
|
728 | 706 |
|
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()?; |
744 | 719 | }
|
745 |
| - bytes_read += n; |
746 | 720 | }
|
747 | 721 |
|
748 |
| - self.lookahead = u64::from_le_bytes(bytes); |
749 |
| - self.lookahead_bits = (bytes_read * 8) as u8; |
750 |
| - self.apply_lookahead(); |
751 |
| - |
752 | 722 | Ok(())
|
753 | 723 | }
|
754 | 724 |
|
@@ -778,7 +748,9 @@ impl<R: Read> BitReader<R> {
|
778 | 748 | debug_assert!(num as usize <= 8 * mem::size_of::<T>());
|
779 | 749 | debug_assert!(num <= 32);
|
780 | 750 |
|
781 |
| - self.fill()?; |
| 751 | + if self.nbits < num { |
| 752 | + self.fill()?; |
| 753 | + } |
782 | 754 | let value = self.peek(num) as u32;
|
783 | 755 | self.consume(num)?;
|
784 | 756 |
|
|
0 commit comments