1use std::io::{self, prelude::*};
5
6pub struct BitReader {
7 buf: Vec<u8>,
8 pos: usize,
9}
10
11impl BitReader {
12 pub fn new(buf: Vec<u8>) -> Self {
13 Self { buf, pos: 0 }
14 }
15
16 #[inline(always)]
18 pub fn read_bit(&mut self) -> bool {
19 let bit = (self.buf[self.pos >> 3] & (1 << (self.pos & 7))) != 0;
20 self.pos += 1;
21 bit
22 }
23
24 pub fn read_bits(&mut self, dst: &mut [u8], len: usize) {
26 for bit in 0..len {
27 let byte = &mut dst[bit >> 3];
28 let shift = bit & 7;
29 *byte = (*byte & !(1 << shift)) | (u8::from(self.read_bit()) << shift);
30 }
31 }
32
33 pub fn read_int(&mut self, max: u32) -> u32 {
35 let mut value = 0;
36 let mut mask = 1;
37
38 while (value + mask) < max && mask != 0 {
39 if self.read_bit() {
40 value |= mask;
41 }
42 mask *= 2;
43 }
44
45 value
46 }
47
48 pub fn read_int_packed(&mut self) -> u32 {
50 let mut value = 0;
85
86 for i in 0..5 {
87 let has_next = self.read_bit();
88 let mut part = 0;
89 for bit_shift in 0..7 {
90 part |= (self.read_bit() as u32) << bit_shift;
91 }
92 value |= part << (7 * i);
93 if !has_next {
94 break;
95 }
96 }
97
98 value
99 }
100
101 pub fn eat_byte_align(&mut self) {
103 self.pos = (self.pos + 7) & !0x07;
104 }
105
106 pub fn read_int_vector_packed(&mut self) -> (i32, i32, i32) {
108 (self.rivp_item(), self.rivp_item(), self.rivp_item())
109 }
110
111 #[inline(always)]
112 fn rivp_item(&mut self) -> i32 {
113 let value = self.read_int_packed();
114 (value >> 1) as i32 * if value & 1 != 0 { 1 } else { -1 }
115 }
116
117 pub fn read_positive_int_vector_packed(&mut self) -> (u32, u32, u32) {
119 (
120 self.read_int_packed(),
121 self.read_int_packed(),
122 self.read_int_packed(),
123 )
124 }
125}
126
127impl Read for BitReader {
128 fn read(&mut self, dst: &mut [u8]) -> io::Result<usize> {
129 self.read_bits(dst, dst.len() * 8);
130 Ok(dst.len())
131 }
132}