media_codec_bitstream/
reader.rs1use std::io::{Cursor, Error, ErrorKind, Read, Result, Seek, SeekFrom};
2
3use bitstream_io::{BigEndian, BitRead, Endianness, Integer};
4
5pub struct BitReader<R: Read, E: Endianness> {
6 inner: bitstream_io::BitReader<R, E>,
7 total_bits: usize,
8}
9
10impl<R: Read, E: Endianness> BitReader<R, E> {
11 #[inline]
13 pub fn new(reader: R) -> Self {
14 Self {
15 inner: bitstream_io::BitReader::new(reader),
16 total_bits: 0,
17 }
18 }
19
20 #[inline]
22 pub fn read_bit(&mut self) -> Result<bool> {
23 self.inner.read_bit()
24 }
25
26 #[inline]
28 pub fn read<const BITS: u32, T: Integer>(&mut self) -> Result<T> {
29 self.inner.read::<BITS, T>()
30 }
31
32 #[inline]
34 pub fn read_var<T: Integer>(&mut self, bits: u32) -> Result<T> {
35 self.inner.read_var(bits)
36 }
37
38 #[inline]
40 pub fn skip(&mut self, bits: u32) -> Result<()> {
41 self.inner.skip(bits)
42 }
43
44 #[inline]
46 pub fn byte_aligned(&self) -> bool {
47 self.inner.byte_aligned()
48 }
49
50 #[inline]
52 pub fn byte_align(&mut self) {
53 self.inner.byte_align()
54 }
55
56 #[inline]
58 pub fn read_bytes(&mut self, buf: &mut [u8]) -> Result<()> {
59 self.inner.read_bytes(buf)
60 }
61
62 #[inline]
64 pub fn read_to_vec(&mut self, bytes: usize) -> Result<Vec<u8>> {
65 self.inner.read_to_vec(bytes)
66 }
67
68 #[inline]
70 pub fn read_unary<const STOP_BIT: u8>(&mut self) -> Result<u32> {
71 self.inner.read_unary::<STOP_BIT>()
72 }
73}
74
75impl<R: Read + Seek, E: Endianness> BitReader<R, E> {
76 pub fn bits_left(&mut self) -> Result<usize> {
78 Ok(self.total_bits.saturating_sub(self.inner.position_in_bits()? as usize))
79 }
80}
81
82impl<'a, E: Endianness> BitReader<Cursor<&'a [u8]>, E> {
83 pub fn from_slice(data: &'a [u8]) -> Self {
85 Self {
86 inner: bitstream_io::BitReader::new(Cursor::new(data)),
87 total_bits: data.len() * 8,
88 }
89 }
90
91 pub fn remaining_slice(&mut self) -> &'a [u8] {
93 let cursor = self.inner.aligned_reader();
94 let pos = cursor.position() as usize;
95 let data = *cursor.get_ref();
96 &data[pos..]
97 }
98}
99
100impl<R: Read> BitReader<R, BigEndian> {
102 pub fn read_ue(&mut self) -> Result<u32> {
104 let leading_zeros = self.inner.read_unary::<1>()?;
106
107 if leading_zeros == 0 {
108 return Ok(0);
109 } else if leading_zeros <= 31 {
110 let suffix: u32 = self.inner.read_var(leading_zeros)?;
112 return Ok((1 << leading_zeros) - 1 + suffix);
113 }
114
115 Err(Error::new(ErrorKind::InvalidData, "Exp-Golomb code overflow"))
116 }
117
118 pub fn read_se(&mut self) -> Result<i32> {
120 let unsigned = self.read_ue()?;
121 Ok(((unsigned >> 1) as i32 + (unsigned & 1) as i32) * ((((unsigned & 1) as i32) << 1) - 1))
122 }
123}
124
125impl<R: Read + Seek, E: Endianness> BitReader<R, E> {
127 #[inline]
129 pub fn position_in_bits(&mut self) -> Result<u64> {
130 self.inner.position_in_bits()
131 }
132
133 #[inline]
135 pub fn seek_bits(&mut self, from: SeekFrom) -> Result<u64> {
136 self.inner.seek_bits(from)
137 }
138
139 pub fn peek<const BITS: u32, T: Integer>(&mut self) -> Result<T> {
141 let pos = self.inner.position_in_bits()?;
142 let value = self.inner.read::<BITS, T>()?;
143 self.inner.seek_bits(SeekFrom::Start(pos))?;
144 Ok(value)
145 }
146
147 pub fn peek_var<T: Integer>(&mut self, bits: u32) -> Result<T> {
149 let pos = self.inner.position_in_bits()?;
150 let value = self.inner.read_var(bits)?;
151 self.inner.seek_bits(SeekFrom::Start(pos))?;
152 Ok(value)
153 }
154
155 pub fn peek_bit(&mut self) -> Result<bool> {
157 let pos = self.inner.position_in_bits()?;
158 let value = self.inner.read_bit()?;
159 self.inner.seek_bits(SeekFrom::Start(pos))?;
160 Ok(value)
161 }
162}
163
164impl<R: Read + Seek> BitReader<R, BigEndian> {
166 pub fn peek_ue(&mut self) -> Result<u32> {
168 let pos = self.inner.position_in_bits()?;
169 let value = self.read_ue()?;
170 self.inner.seek_bits(SeekFrom::Start(pos))?;
171 Ok(value)
172 }
173
174 pub fn peek_se(&mut self) -> Result<i32> {
176 let pos = self.inner.position_in_bits()?;
177 let value = self.read_se()?;
178 self.inner.seek_bits(SeekFrom::Start(pos))?;
179 Ok(value)
180 }
181}