1use std::cmp::min;
9use std::io;
10
11use crate::io::ReadBytes;
12use crate::util::bits::*;
13
14fn end_of_bitstream_error<T>() -> io::Result<T> {
15 Err(io::Error::new(io::ErrorKind::Other, "unexpected end of bitstream"))
16}
17
18pub mod vlc {
19 use std::cmp::max;
22 use std::collections::{BTreeMap, VecDeque};
23 use std::io;
24
25 fn codebook_error<T>(desc: &'static str) -> io::Result<T> {
26 Err(io::Error::new(io::ErrorKind::Other, desc))
27 }
28
29 #[derive(Copy, Clone)]
32 pub enum BitOrder {
33 Verbatim,
36 Reverse,
39 }
40
41 pub trait CodebookEntry: Copy + Clone + Default {
43 type ValueType: Copy + From<u8>;
45 type OffsetType: Copy;
47
48 const JUMP_OFFSET_MAX: u32;
50
51 fn new_value(value: Self::ValueType, len: u8) -> Self;
53
54 fn new_jump(offset: u32, len: u8) -> Self;
56
57 fn is_value(&self) -> bool;
59
60 fn is_jump(&self) -> bool;
62
63 fn value(&self) -> Self::ValueType;
65
66 fn value_len(&self) -> u32;
68
69 fn jump_offset(&self) -> usize;
71
72 fn jump_len(&self) -> u32;
74 }
75
76 macro_rules! decl_entry {
77 (
78 #[doc = $expr:expr]
79 $name:ident, $value_type:ty, $offset_type:ty, $offset_max:expr, $jump_flag:expr
80 ) => {
81 #[doc = $expr]
82 #[derive(Copy, Clone, Default)]
83 pub struct $name($value_type, $offset_type);
84
85 impl CodebookEntry for $name {
86 type ValueType = $value_type;
87 type OffsetType = $offset_type;
88
89 const JUMP_OFFSET_MAX: u32 = $offset_max;
90
91 #[inline(always)]
92 fn new_value(value: Self::ValueType, len: u8) -> Self {
93 $name(value, len.into())
94 }
95
96 #[inline(always)]
97 fn new_jump(offset: u32, len: u8) -> Self {
98 $name(len.into(), $jump_flag | offset as Self::OffsetType)
99 }
100
101 #[inline(always)]
102 fn is_jump(&self) -> bool {
103 self.1 & $jump_flag != 0
104 }
105
106 #[inline(always)]
107 fn is_value(&self) -> bool {
108 self.1 & $jump_flag == 0
109 }
110
111 #[inline(always)]
112 fn value(&self) -> Self::ValueType {
113 debug_assert!(self.is_value());
114 self.0
115 }
116
117 #[inline(always)]
118 fn value_len(&self) -> u32 {
119 debug_assert!(self.is_value());
120 (self.1 & (!$jump_flag)).into()
121 }
122
123 #[inline(always)]
124 fn jump_offset(&self) -> usize {
125 debug_assert!(self.is_jump());
126 (self.1 & (!$jump_flag)) as usize
127 }
128
129 #[inline(always)]
130 fn jump_len(&self) -> u32 {
131 debug_assert!(self.is_jump());
132 self.0.into()
133 }
134 }
135 };
136 }
137
138 decl_entry!(
139 Entry8x8,
141 u8,
142 u8,
143 0x7f,
144 0x80
145 );
146
147 decl_entry!(
148 Entry8x16,
150 u8,
151 u16,
152 0x7fff,
153 0x8000
154 );
155
156 decl_entry!(
157 Entry8x32,
159 u8,
160 u32,
161 0x7fff_ffff,
162 0x8000_0000
163 );
164
165 decl_entry!(
166 Entry16x8,
168 u16,
169 u8,
170 0x7f,
171 0x80
172 );
173
174 decl_entry!(
175 Entry16x16,
177 u16,
178 u16,
179 0x7fff,
180 0x8000
181 );
182
183 decl_entry!(
184 Entry16x32,
186 u16,
187 u32,
188 0x7fff_ffff,
189 0x8000_0000
190 );
191
192 decl_entry!(
193 Entry32x8,
195 u32,
196 u8,
197 0x7fff,
198 0x80
199 );
200
201 decl_entry!(
202 Entry32x16,
204 u32,
205 u16,
206 0x7fff,
207 0x8000
208 );
209
210 decl_entry!(
211 Entry32x32,
213 u32,
214 u32,
215 0x7fff_ffff,
216 0x8000_0000
217 );
218
219 #[derive(Default)]
222 pub struct Codebook<E: CodebookEntry> {
223 pub table: Vec<E>,
224 pub max_code_len: u32,
225 pub init_block_len: u32,
226 }
227
228 impl<E: CodebookEntry> Codebook<E> {
229 pub fn is_empty(&self) -> bool {
231 self.table.is_empty()
232 }
233 }
234
235 #[derive(Default)]
236 struct CodebookValue<E: CodebookEntry> {
237 prefix: u16,
238 width: u8,
239 value: E::ValueType,
240 }
241
242 impl<E: CodebookEntry> CodebookValue<E> {
243 fn new(prefix: u16, width: u8, value: E::ValueType) -> Self {
244 CodebookValue { prefix, width, value }
245 }
246 }
247
248 #[derive(Default)]
249 struct CodebookBlock<E: CodebookEntry> {
250 width: u8,
251 nodes: BTreeMap<u16, usize>,
252 values: Vec<CodebookValue<E>>,
253 }
254
255 pub struct CodebookBuilder {
258 max_bits_per_block: u8,
259 bit_order: BitOrder,
260 is_sparse: bool,
261 }
262
263 impl CodebookBuilder {
264 pub fn new(bit_order: BitOrder) -> Self {
271 CodebookBuilder { max_bits_per_block: 4, bit_order, is_sparse: false }
272 }
273
274 pub fn new_sparse(bit_order: BitOrder) -> Self {
282 CodebookBuilder { max_bits_per_block: 4, bit_order, is_sparse: true }
283 }
284
285 pub fn bits_per_read(&mut self, max_bits_per_read: u8) -> &mut Self {
290 assert!(max_bits_per_read <= 16);
291 assert!(max_bits_per_read > 0);
292 self.max_bits_per_block = max_bits_per_read;
293 self
294 }
295
296 fn generate_lut<E: CodebookEntry>(
297 bit_order: BitOrder,
298 is_sparse: bool,
299 blocks: &[CodebookBlock<E>],
300 ) -> io::Result<Vec<E>> {
301 let mut table = Vec::new();
303
304 let mut queue = VecDeque::new();
305
306 let mut table_end = 0u32;
308
309 if !blocks.is_empty() {
310 queue.push_front(0);
312
313 let block = &blocks[0];
315 table.push(CodebookEntry::new_jump(1, block.width));
316 table_end += 1 + (1 << block.width);
317 }
318
319 while !queue.is_empty() {
321 let mut entry_count = 0;
323
324 let block_id = queue.pop_front().unwrap();
326
327 let block = &blocks[block_id];
329 let block_len = 1 << block.width;
330
331 let table_base = table.len();
333
334 table.resize(table_base + block_len, Default::default());
336
337 for (&child_block_prefix, &child_block_id) in block.nodes.iter() {
341 queue.push_back(child_block_id);
342
343 let child_block_width = blocks[child_block_id].width;
345
346 if table_end > E::JUMP_OFFSET_MAX {
348 return codebook_error("core (io): codebook overflow");
349 }
350
351 let offset = match bit_order {
353 BitOrder::Verbatim => child_block_prefix,
354 BitOrder::Reverse => {
355 child_block_prefix.reverse_bits().rotate_left(u32::from(block.width))
356 }
357 } as usize;
358
359 let jump_entry = CodebookEntry::new_jump(table_end, child_block_width);
361
362 table[table_base + offset] = jump_entry;
363
364 table_end += 1 << child_block_width;
366
367 entry_count += 1;
369 }
370
371 for value in block.values.iter() {
375 let num_dnc_bits = block.width - value.width;
377
378 let base_prefix = (value.prefix << num_dnc_bits) as usize;
380
381 let count = 1 << num_dnc_bits;
383
384 let value_entry = CodebookEntry::new_value(value.value, value.width);
386
387 match bit_order {
388 BitOrder::Verbatim => {
389 let start = table_base + base_prefix;
392 let end = start + count;
393
394 for entry in table[start..end].iter_mut() {
395 *entry = value_entry;
396 }
397 }
398 BitOrder::Reverse => {
399 let start = base_prefix;
401 let end = start + count;
402
403 for prefix in start..end {
404 let offset =
405 prefix.reverse_bits().rotate_left(u32::from(block.width));
406
407 table[table_base + offset] = value_entry;
408 }
409 }
410 }
411
412 entry_count += count;
414 }
415
416 if !is_sparse && entry_count != block_len {
419 return codebook_error("core (io): codebook is incomplete");
420 }
421 }
422
423 Ok(table)
424 }
425
426 pub fn make<E: CodebookEntry>(
433 &mut self,
434 code_words: &[u32],
435 code_lens: &[u8],
436 values: &[E::ValueType],
437 ) -> io::Result<Codebook<E>> {
438 assert!(code_words.len() == code_lens.len());
439 assert!(code_words.len() == values.len());
440
441 let mut blocks = Vec::<CodebookBlock<E>>::new();
442
443 let mut max_code_len = 0;
444
445 if !code_words.is_empty() {
447 let prefix_mask = !(!0 << self.max_bits_per_block);
448
449 blocks.push(Default::default());
451
452 for ((&code, &code_len), &value) in code_words.iter().zip(code_lens).zip(values) {
454 let mut parent_block_id = 0;
455 let mut len = code_len;
456
457 if code_len == 0 {
460 if self.is_sparse {
461 continue;
462 }
463 else {
464 return codebook_error("core (io): zero length codeword");
465 }
466 }
467
468 while len > self.max_bits_per_block {
469 len -= self.max_bits_per_block;
470
471 let prefix = ((code >> len) & prefix_mask) as u16;
472
473 if let Some(&block_id) = blocks[parent_block_id].nodes.get(&prefix) {
475 parent_block_id = block_id;
476 }
477 else {
478 let block_id = blocks.len();
480
481 let block = &mut blocks[parent_block_id];
482
483 block.nodes.insert(prefix, block_id);
484
485 block.width = self.max_bits_per_block;
488
489 blocks.push(Default::default());
491
492 parent_block_id = block_id;
493 }
494 }
495
496 let prefix = code & (prefix_mask >> (self.max_bits_per_block - len));
499
500 let block = &mut blocks[parent_block_id];
501
502 block.values.push(CodebookValue::new(prefix as u16, len, value));
504
505 block.width = max(block.width, len);
507
508 max_code_len = max(max_code_len, code_len);
510 }
511 }
512
513 let table = CodebookBuilder::generate_lut(self.bit_order, self.is_sparse, &blocks)?;
515
516 let init_block_len = table.first().map(|block| block.jump_len()).unwrap_or(0);
518
519 Ok(Codebook { table, max_code_len: u32::from(max_code_len), init_block_len })
520 }
521 }
522}
523
524mod private {
525 use std::io;
526
527 pub trait FetchBitsLtr {
528 fn fetch_bits(&mut self) -> io::Result<()>;
530
531 fn fetch_bits_partial(&mut self) -> io::Result<()>;
533
534 fn get_bits(&self) -> u64;
536
537 fn num_bits_left(&self) -> u32;
539
540 fn consume_bits(&mut self, num: u32);
542 }
543
544 pub trait FetchBitsRtl {
545 fn fetch_bits(&mut self) -> io::Result<()>;
547
548 fn fetch_bits_partial(&mut self) -> io::Result<()>;
550
551 fn get_bits(&self) -> u64;
553
554 fn num_bits_left(&self) -> u32;
556
557 fn consume_bits(&mut self, num: u32);
559 }
560}
561
562pub trait FiniteBitStream {
564 fn bits_left(&self) -> u64;
566}
567
568pub trait ReadBitsLtr: private::FetchBitsLtr {
570 #[inline(always)]
572 fn realign(&mut self) {
573 let skip = self.num_bits_left() & 0x7;
574 self.consume_bits(skip);
575 }
576
577 #[inline(always)]
579 fn ignore_bits(&mut self, mut num_bits: u32) -> io::Result<()> {
580 if num_bits <= self.num_bits_left() {
581 self.consume_bits(num_bits);
582 }
583 else {
584 while num_bits > self.num_bits_left() {
586 num_bits -= self.num_bits_left();
587 self.fetch_bits()?;
588 }
589
590 if num_bits > 0 {
591 self.consume_bits(num_bits - 1);
593 self.consume_bits(1);
594 }
595 }
596
597 Ok(())
598 }
599
600 #[inline(always)]
602 fn ignore_bit(&mut self) -> io::Result<()> {
603 self.ignore_bits(1)
604 }
605
606 #[inline(always)]
608 fn read_bool(&mut self) -> io::Result<bool> {
609 if self.num_bits_left() < 1 {
610 self.fetch_bits()?;
611 }
612
613 let bit = self.get_bits() & (1 << 63) != 0;
614
615 self.consume_bits(1);
616 Ok(bit)
617 }
618
619 #[inline(always)]
621 fn read_bit(&mut self) -> io::Result<u32> {
622 if self.num_bits_left() < 1 {
623 self.fetch_bits()?;
624 }
625
626 let bit = self.get_bits() >> 63;
627
628 self.consume_bits(1);
629
630 Ok(bit as u32)
631 }
632
633 #[inline(always)]
635 fn read_bits_leq32(&mut self, mut bit_width: u32) -> io::Result<u32> {
636 debug_assert!(bit_width <= u32::BITS);
637
638 let mut bits = (self.get_bits() >> u32::BITS) >> (u32::BITS - bit_width);
642
643 while bit_width > self.num_bits_left() {
644 bit_width -= self.num_bits_left();
645
646 self.fetch_bits()?;
647
648 bits |= self.get_bits() >> (u64::BITS - bit_width);
651 }
652
653 self.consume_bits(bit_width);
654
655 Ok(bits as u32)
656 }
657
658 #[inline(always)]
661 fn read_bits_leq32_signed(&mut self, bit_width: u32) -> io::Result<i32> {
662 let value = self.read_bits_leq32(bit_width)?;
663 Ok(sign_extend_leq32_to_i32(value, bit_width))
664 }
665
666 #[inline(always)]
668 fn read_bits_leq64(&mut self, mut bit_width: u32) -> io::Result<u64> {
669 debug_assert!(bit_width <= u64::BITS);
670
671 if bit_width == 0 {
676 Ok(0)
677 }
678 else {
679 let mut bits = self.get_bits() >> (u64::BITS - bit_width);
682
683 while bit_width > self.num_bits_left() {
684 bit_width -= self.num_bits_left();
685
686 self.fetch_bits()?;
687
688 bits |= self.get_bits() >> (u64::BITS - bit_width);
689 }
690
691 self.consume_bits(bit_width - 1);
693 self.consume_bits(1);
694
695 Ok(bits)
696 }
697 }
698
699 #[inline(always)]
702 fn read_bits_leq64_signed(&mut self, bit_width: u32) -> io::Result<i64> {
703 let value = self.read_bits_leq64(bit_width)?;
704 Ok(sign_extend_leq64_to_i64(value, bit_width))
705 }
706
707 #[inline(always)]
709 fn read_unary_zeros(&mut self) -> io::Result<u32> {
710 let mut num = 0;
711
712 loop {
713 let num_zeros = self.get_bits().leading_zeros();
715
716 if num_zeros >= self.num_bits_left() {
717 num += self.num_bits_left();
720 self.fetch_bits()?;
721 }
722 else {
723 num += num_zeros;
725
726 self.consume_bits(num_zeros);
730 self.consume_bits(1);
731
732 break;
734 }
735 }
736
737 Ok(num)
738 }
739
740 #[inline(always)]
742 fn read_unary_zeros_capped(&mut self, mut limit: u32) -> io::Result<u32> {
743 let mut num = 0;
744
745 loop {
746 let num_bits_left = self.num_bits_left();
748 let num_zeros = min(self.get_bits().leading_zeros(), num_bits_left);
749
750 if num_zeros >= limit {
751 num += limit;
753 self.consume_bits(limit);
754 break;
755 }
756 else {
757 limit -= num_zeros;
760 num += num_zeros;
761
762 if num_zeros < num_bits_left {
763 self.consume_bits(num_zeros);
766 self.consume_bits(1);
767 break;
768 }
769 }
770
771 self.fetch_bits()?;
772 }
773
774 Ok(num)
775 }
776
777 #[inline(always)]
779 fn read_unary_ones(&mut self) -> io::Result<u32> {
780 let mut num = 0;
782
783 loop {
784 let num_ones = self.get_bits().leading_ones();
785
786 if num_ones >= self.num_bits_left() {
787 num += self.num_bits_left();
788 self.fetch_bits()?;
789 }
790 else {
791 num += num_ones;
792
793 self.consume_bits(num_ones);
794 self.consume_bits(1);
795
796 break;
797 }
798 }
799
800 Ok(num)
801 }
802
803 #[inline(always)]
805 fn read_unary_ones_capped(&mut self, mut limit: u32) -> io::Result<u32> {
806 let mut num = 0;
808
809 loop {
810 let num_bits_left = self.num_bits_left();
811 let num_ones = min(self.get_bits().leading_ones(), num_bits_left);
812
813 if num_ones >= limit {
814 num += limit;
815 self.consume_bits(limit);
816 break;
817 }
818 else {
819 limit -= num_ones;
820 num += num_ones;
821
822 if num_ones < num_bits_left {
823 self.consume_bits(num_ones);
824 self.consume_bits(1);
825 break;
826 }
827 }
828
829 self.fetch_bits()?;
830 }
831
832 Ok(num)
833 }
834
835 #[inline(always)]
838 fn read_codebook<E: vlc::CodebookEntry>(
839 &mut self,
840 codebook: &vlc::Codebook<E>,
841 ) -> io::Result<(E::ValueType, u32)> {
842 if self.num_bits_left() < codebook.max_code_len {
845 self.fetch_bits_partial()?;
846 }
847
848 let num_bits_left = self.num_bits_left();
850
851 let mut bits = self.get_bits();
852
853 let mut block_len = codebook.init_block_len;
854 let mut entry = codebook.table[(bits >> (u64::BITS - block_len)) as usize + 1];
855
856 let mut consumed = 0;
857
858 while entry.is_jump() {
859 consumed += block_len;
861 bits <<= block_len;
862
863 if consumed > num_bits_left {
865 return end_of_bitstream_error();
866 }
867
868 block_len = entry.jump_len();
870
871 let index = bits >> (u64::BITS - block_len);
872
873 entry = codebook.table[entry.jump_offset() + index as usize];
875 }
876
877 consumed += entry.value_len();
879
880 if consumed > num_bits_left {
881 return end_of_bitstream_error();
882 }
883
884 self.consume_bits(consumed);
885
886 Ok((entry.value(), consumed))
887 }
888}
889
890pub struct BitStreamLtr<'a, B: ReadBytes> {
896 reader: &'a mut B,
897 bits: u64,
898 n_bits_left: u32,
899}
900
901impl<'a, B: ReadBytes> BitStreamLtr<'a, B> {
902 pub fn new(reader: &'a mut B) -> Self {
904 BitStreamLtr { reader, bits: 0, n_bits_left: 0 }
905 }
906}
907
908impl<'a, B: ReadBytes> private::FetchBitsLtr for BitStreamLtr<'a, B> {
909 #[inline(always)]
910 fn fetch_bits(&mut self) -> io::Result<()> {
911 self.bits = u64::from(self.reader.read_u8()?) << 56;
912 self.n_bits_left = u8::BITS;
913 Ok(())
914 }
915
916 #[inline(always)]
917 fn fetch_bits_partial(&mut self) -> io::Result<()> {
918 todo!()
919 }
920
921 #[inline(always)]
922 fn get_bits(&self) -> u64 {
923 self.bits
924 }
925
926 #[inline(always)]
927 fn num_bits_left(&self) -> u32 {
928 self.n_bits_left
929 }
930
931 #[inline(always)]
932 fn consume_bits(&mut self, num: u32) {
933 self.n_bits_left -= num;
934 self.bits <<= num;
935 }
936}
937
938impl<'a, B: ReadBytes> ReadBitsLtr for BitStreamLtr<'a, B> {}
939
940pub struct BitReaderLtr<'a> {
945 buf: &'a [u8],
946 bits: u64,
947 n_bits_left: u32,
948}
949
950impl<'a> BitReaderLtr<'a> {
951 pub fn new(buf: &'a [u8]) -> Self {
953 BitReaderLtr { buf, bits: 0, n_bits_left: 0 }
954 }
955}
956
957impl<'a> private::FetchBitsLtr for BitReaderLtr<'a> {
958 #[inline]
959 fn fetch_bits_partial(&mut self) -> io::Result<()> {
960 let mut buf = [0u8; std::mem::size_of::<u64>()];
961
962 let read_len = min(self.buf.len(), (u64::BITS - self.n_bits_left) as usize >> 3);
963
964 buf[..read_len].copy_from_slice(&self.buf[..read_len]);
965
966 self.buf = &self.buf[read_len..];
967
968 self.bits |= u64::from_be_bytes(buf) >> self.n_bits_left;
969 self.n_bits_left += (read_len as u32) << 3;
970
971 Ok(())
972 }
973
974 fn fetch_bits(&mut self) -> io::Result<()> {
975 let mut buf = [0u8; std::mem::size_of::<u64>()];
976
977 let read_len = min(self.buf.len(), std::mem::size_of::<u64>());
978
979 if read_len == 0 {
980 return end_of_bitstream_error();
981 }
982
983 buf[..read_len].copy_from_slice(&self.buf[..read_len]);
984
985 self.buf = &self.buf[read_len..];
986
987 self.bits = u64::from_be_bytes(buf);
988 self.n_bits_left = (read_len as u32) << 3;
989
990 Ok(())
991 }
992
993 #[inline(always)]
994 fn get_bits(&self) -> u64 {
995 self.bits
996 }
997
998 #[inline(always)]
999 fn num_bits_left(&self) -> u32 {
1000 self.n_bits_left
1001 }
1002
1003 #[inline(always)]
1004 fn consume_bits(&mut self, num: u32) {
1005 self.n_bits_left -= num;
1006 self.bits <<= num;
1007 }
1008}
1009
1010impl<'a> ReadBitsLtr for BitReaderLtr<'a> {}
1011
1012impl<'a> FiniteBitStream for BitReaderLtr<'a> {
1013 fn bits_left(&self) -> u64 {
1014 (8 * self.buf.len() as u64) + u64::from(self.n_bits_left)
1015 }
1016}
1017
1018pub trait ReadBitsRtl: private::FetchBitsRtl {
1020 #[inline(always)]
1022 fn realign(&mut self) {
1023 let skip = self.num_bits_left() & 0x7;
1024 self.consume_bits(skip);
1025 }
1026
1027 #[inline(always)]
1029 fn ignore_bits(&mut self, mut num_bits: u32) -> io::Result<()> {
1030 if num_bits <= self.num_bits_left() {
1031 self.consume_bits(num_bits);
1032 }
1033 else {
1034 while num_bits > self.num_bits_left() {
1036 num_bits -= self.num_bits_left();
1037 self.fetch_bits()?;
1038 }
1039
1040 if num_bits > 0 {
1041 self.consume_bits(num_bits - 1);
1043 self.consume_bits(1);
1044 }
1045 }
1046
1047 Ok(())
1048 }
1049
1050 #[inline(always)]
1052 fn ignore_bit(&mut self) -> io::Result<()> {
1053 self.ignore_bits(1)
1054 }
1055
1056 #[inline(always)]
1058 fn read_bool(&mut self) -> io::Result<bool> {
1059 if self.num_bits_left() < 1 {
1060 self.fetch_bits()?;
1061 }
1062
1063 let bit = (self.get_bits() & 1) == 1;
1064
1065 self.consume_bits(1);
1066 Ok(bit)
1067 }
1068
1069 #[inline(always)]
1071 fn read_bit(&mut self) -> io::Result<u32> {
1072 if self.num_bits_left() < 1 {
1073 self.fetch_bits()?;
1074 }
1075
1076 let bit = self.get_bits() & 1;
1077
1078 self.consume_bits(1);
1079
1080 Ok(bit as u32)
1081 }
1082
1083 #[inline(always)]
1085 fn read_bits_leq32(&mut self, bit_width: u32) -> io::Result<u32> {
1086 debug_assert!(bit_width <= u32::BITS);
1087
1088 let mut bits = self.get_bits();
1089 let mut bits_needed = bit_width;
1090
1091 while bits_needed > self.num_bits_left() {
1092 bits_needed -= self.num_bits_left();
1093
1094 self.fetch_bits()?;
1095
1096 bits |= self.get_bits() << (bit_width - bits_needed);
1097 }
1098
1099 self.consume_bits(bits_needed);
1100
1101 let mask = !(!0 << bit_width);
1103
1104 Ok((bits & mask) as u32)
1105 }
1106
1107 #[inline(always)]
1110 fn read_bits_leq32_signed(&mut self, bit_width: u32) -> io::Result<i32> {
1111 let value = self.read_bits_leq32(bit_width)?;
1112 Ok(sign_extend_leq32_to_i32(value, bit_width))
1113 }
1114
1115 #[inline(always)]
1117 fn read_bits_leq64(&mut self, bit_width: u32) -> io::Result<u64> {
1118 debug_assert!(bit_width <= u64::BITS);
1119
1120 if bit_width == 0 {
1125 Ok(0)
1126 }
1127 else {
1128 let mut bits = self.get_bits();
1129 let mut bits_needed = bit_width;
1130
1131 while bits_needed > self.num_bits_left() {
1132 bits_needed -= self.num_bits_left();
1133
1134 self.fetch_bits()?;
1135
1136 bits |= self.get_bits() << (bit_width - bits_needed);
1139 }
1140
1141 self.consume_bits(bits_needed - 1);
1143 self.consume_bits(1);
1144
1145 let mask = !((!0 << (bit_width - 1)) << 1);
1147
1148 Ok(bits & mask)
1149 }
1150 }
1151
1152 #[inline(always)]
1155 fn read_bits_leq64_signed(&mut self, bit_width: u32) -> io::Result<i64> {
1156 let value = self.read_bits_leq64(bit_width)?;
1157 Ok(sign_extend_leq64_to_i64(value, bit_width))
1158 }
1159
1160 #[inline(always)]
1162 fn read_unary_zeros(&mut self) -> io::Result<u32> {
1163 let mut num = 0;
1164
1165 loop {
1166 let num_zeros = self.get_bits().trailing_zeros();
1168
1169 if num_zeros >= self.num_bits_left() {
1170 num += self.num_bits_left();
1173 self.fetch_bits()?;
1174 }
1175 else {
1176 num += num_zeros;
1178
1179 self.consume_bits(num_zeros);
1183 self.consume_bits(1);
1184
1185 break;
1187 }
1188 }
1189
1190 Ok(num)
1191 }
1192
1193 #[inline(always)]
1195 fn read_unary_zeros_capped(&mut self, mut limit: u32) -> io::Result<u32> {
1196 let mut num = 0;
1197
1198 loop {
1199 let num_bits_left = self.num_bits_left();
1201 let num_zeros = min(self.get_bits().trailing_zeros(), num_bits_left);
1202
1203 if num_zeros >= limit {
1204 num += limit;
1206 self.consume_bits(limit);
1207 break;
1208 }
1209 else {
1210 limit -= num_zeros;
1213 num += num_zeros;
1214
1215 if num_zeros < num_bits_left {
1216 self.consume_bits(num_zeros);
1219 self.consume_bits(1);
1220 break;
1221 }
1222 }
1223
1224 self.fetch_bits()?;
1225 }
1226
1227 Ok(num)
1228 }
1229
1230 #[inline(always)]
1232 fn read_unary_ones(&mut self) -> io::Result<u32> {
1233 let mut num = 0;
1235
1236 loop {
1237 let num_ones = self.get_bits().trailing_ones();
1238
1239 if num_ones >= self.num_bits_left() {
1240 num += self.num_bits_left();
1241 self.fetch_bits()?;
1242 }
1243 else {
1244 num += num_ones;
1245
1246 self.consume_bits(num_ones);
1247 self.consume_bits(1);
1248
1249 break;
1250 }
1251 }
1252
1253 Ok(num)
1254 }
1255
1256 #[inline(always)]
1258 fn read_unary_ones_capped(&mut self, mut limit: u32) -> io::Result<u32> {
1259 let mut num = 0;
1261
1262 loop {
1263 let num_bits_left = self.num_bits_left();
1264 let num_ones = min(self.get_bits().trailing_ones(), num_bits_left);
1265
1266 if num_ones >= limit {
1267 num += limit;
1268 self.consume_bits(limit);
1269 break;
1270 }
1271 else {
1272 limit -= num_ones;
1273 num += num_ones;
1274
1275 if num_ones < num_bits_left {
1276 self.consume_bits(num_ones);
1277 self.consume_bits(1);
1278 break;
1279 }
1280 }
1281
1282 self.fetch_bits()?;
1283 }
1284
1285 Ok(num)
1286 }
1287
1288 #[inline(always)]
1289 fn read_codebook<E: vlc::CodebookEntry>(
1290 &mut self,
1291 codebook: &vlc::Codebook<E>,
1292 ) -> io::Result<(E::ValueType, u32)> {
1293 if self.num_bits_left() < codebook.max_code_len {
1294 self.fetch_bits_partial()?;
1295 }
1296
1297 let num_bits_left = self.num_bits_left();
1299
1300 let mut bits = self.get_bits();
1301
1302 let mut block_len = codebook.init_block_len;
1303 let mut entry = codebook.table[(bits & ((1 << block_len) - 1)) as usize + 1];
1304
1305 let mut consumed = 0;
1306
1307 while entry.is_jump() {
1308 consumed += block_len;
1310 bits >>= block_len;
1311
1312 if consumed > num_bits_left {
1314 return end_of_bitstream_error();
1315 }
1316
1317 block_len = entry.jump_len();
1319
1320 let index = bits & ((1 << block_len) - 1);
1321
1322 entry = codebook.table[entry.jump_offset() + index as usize];
1324 }
1325
1326 consumed += entry.value_len();
1328
1329 if consumed > num_bits_left {
1330 return end_of_bitstream_error();
1331 }
1332
1333 self.consume_bits(consumed);
1334
1335 Ok((entry.value(), consumed))
1336 }
1337}
1338
1339pub struct BitStreamRtl<'a, B: ReadBytes> {
1345 reader: &'a mut B,
1346 bits: u64,
1347 n_bits_left: u32,
1348}
1349
1350impl<'a, B: ReadBytes> BitStreamRtl<'a, B> {
1351 pub fn new(reader: &'a mut B) -> Self {
1353 BitStreamRtl { reader, bits: 0, n_bits_left: 0 }
1354 }
1355}
1356
1357impl<'a, B: ReadBytes> private::FetchBitsRtl for BitStreamRtl<'a, B> {
1358 #[inline(always)]
1359 fn fetch_bits(&mut self) -> io::Result<()> {
1360 self.bits = u64::from(self.reader.read_u8()?);
1361 self.n_bits_left = u8::BITS;
1362 Ok(())
1363 }
1364
1365 #[inline(always)]
1366 fn fetch_bits_partial(&mut self) -> io::Result<()> {
1367 todo!()
1368 }
1369
1370 #[inline(always)]
1371 fn get_bits(&self) -> u64 {
1372 self.bits
1373 }
1374
1375 #[inline(always)]
1376 fn num_bits_left(&self) -> u32 {
1377 self.n_bits_left
1378 }
1379
1380 #[inline(always)]
1381 fn consume_bits(&mut self, num: u32) {
1382 self.n_bits_left -= num;
1383 self.bits >>= num;
1384 }
1385}
1386
1387impl<'a, B: ReadBytes> ReadBitsRtl for BitStreamRtl<'a, B> {}
1388
1389pub struct BitReaderRtl<'a> {
1394 buf: &'a [u8],
1395 bits: u64,
1396 n_bits_left: u32,
1397}
1398
1399impl<'a> BitReaderRtl<'a> {
1400 pub fn new(buf: &'a [u8]) -> Self {
1402 BitReaderRtl { buf, bits: 0, n_bits_left: 0 }
1403 }
1404}
1405
1406impl<'a> private::FetchBitsRtl for BitReaderRtl<'a> {
1407 #[inline]
1408 fn fetch_bits_partial(&mut self) -> io::Result<()> {
1409 let mut buf = [0u8; std::mem::size_of::<u64>()];
1410
1411 let read_len = min(self.buf.len(), (u64::BITS - self.n_bits_left) as usize >> 3);
1412
1413 buf[..read_len].copy_from_slice(&self.buf[..read_len]);
1414
1415 self.buf = &self.buf[read_len..];
1416
1417 self.bits |= u64::from_le_bytes(buf) << self.n_bits_left;
1418 self.n_bits_left += (read_len as u32) << 3;
1419
1420 Ok(())
1421 }
1422
1423 fn fetch_bits(&mut self) -> io::Result<()> {
1424 let mut buf = [0u8; std::mem::size_of::<u64>()];
1425
1426 let read_len = min(self.buf.len(), std::mem::size_of::<u64>());
1427
1428 if read_len == 0 {
1429 return end_of_bitstream_error();
1430 }
1431
1432 buf[..read_len].copy_from_slice(&self.buf[..read_len]);
1433
1434 self.buf = &self.buf[read_len..];
1435
1436 self.bits = u64::from_le_bytes(buf);
1437 self.n_bits_left = (read_len as u32) << 3;
1438
1439 Ok(())
1440 }
1441
1442 #[inline(always)]
1443 fn get_bits(&self) -> u64 {
1444 self.bits
1445 }
1446
1447 #[inline(always)]
1448 fn num_bits_left(&self) -> u32 {
1449 self.n_bits_left
1450 }
1451
1452 #[inline(always)]
1453 fn consume_bits(&mut self, num: u32) {
1454 self.n_bits_left -= num;
1455 self.bits >>= num;
1456 }
1457}
1458
1459impl<'a> ReadBitsRtl for BitReaderRtl<'a> {}
1460
1461impl<'a> FiniteBitStream for BitReaderRtl<'a> {
1462 fn bits_left(&self) -> u64 {
1463 (8 * self.buf.len() as u64) + u64::from(self.n_bits_left)
1464 }
1465}
1466
1467#[cfg(test)]
1468mod tests {
1469 use super::vlc::{BitOrder, Codebook, CodebookBuilder, Entry8x8};
1470 use super::{BitReaderLtr, ReadBitsLtr};
1471 use super::{BitReaderRtl, ReadBitsRtl};
1472
1473 #[test]
1474 #[allow(clippy::bool_assert_comparison)]
1475 fn verify_bitstreamltr_ignore_bits() {
1476 let mut bs = BitReaderLtr::new(&[
1477 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, ]);
1481
1482 assert_eq!(bs.read_bool().unwrap(), true);
1483
1484 bs.ignore_bits(128).unwrap();
1485
1486 assert_eq!(bs.read_bool().unwrap(), true);
1487 assert_eq!(bs.read_bool().unwrap(), false);
1488 assert_eq!(bs.read_bool().unwrap(), false);
1489
1490 bs.ignore_bits(7).unwrap();
1491
1492 assert_eq!(bs.read_bool().unwrap(), true);
1493
1494 bs.ignore_bits(19).unwrap();
1495
1496 assert_eq!(bs.read_bool().unwrap(), true);
1497
1498 assert_eq!(bs.read_bool().unwrap(), false);
1499 assert_eq!(bs.read_bool().unwrap(), false);
1500 assert_eq!(bs.read_bool().unwrap(), false);
1501 assert_eq!(bs.read_bool().unwrap(), false);
1502
1503 bs.ignore_bits(24).unwrap();
1504
1505 assert_eq!(bs.read_bool().unwrap(), true);
1506 assert_eq!(bs.read_bool().unwrap(), false);
1507 assert_eq!(bs.read_bool().unwrap(), true);
1508 assert_eq!(bs.read_bool().unwrap(), false);
1509
1510 let mut bs = BitReaderLtr::new(&[0x00]);
1512
1513 assert!(bs.ignore_bits(0).is_ok());
1514
1515 let mut bs = BitReaderLtr::new(&[]);
1516
1517 assert!(bs.ignore_bits(0).is_ok());
1518 assert!(bs.ignore_bits(1).is_err());
1519
1520 let mut bs = BitReaderLtr::new(&[
1522 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ]);
1527
1528 assert!(bs.ignore_bits(64).is_ok());
1529 assert!(bs.ignore_bits(64).is_ok());
1530 assert!(bs.ignore_bits(32).is_ok());
1531 assert!(bs.ignore_bits(32).is_ok());
1532 assert!(bs.ignore_bits(64).is_ok());
1533 }
1534
1535 #[test]
1536 #[allow(clippy::bool_assert_comparison)]
1537 fn verify_bitstreamltr_read_bool() {
1538 let mut bs = BitReaderLtr::new(&[0b1010_1010]);
1540
1541 assert_eq!(bs.read_bool().unwrap(), true);
1542 assert_eq!(bs.read_bool().unwrap(), false);
1543 assert_eq!(bs.read_bool().unwrap(), true);
1544 assert_eq!(bs.read_bool().unwrap(), false);
1545 assert_eq!(bs.read_bool().unwrap(), true);
1546 assert_eq!(bs.read_bool().unwrap(), false);
1547 assert_eq!(bs.read_bool().unwrap(), true);
1548 assert_eq!(bs.read_bool().unwrap(), false);
1549
1550 let mut bs = BitReaderLtr::new(&[]);
1552
1553 assert!(bs.read_bool().is_err());
1554 }
1555
1556 #[test]
1557 fn verify_bitstreamltr_read_bit() {
1558 let mut bs = BitReaderLtr::new(&[0b1010_1010]);
1560
1561 assert_eq!(bs.read_bit().unwrap(), 1);
1562 assert_eq!(bs.read_bit().unwrap(), 0);
1563 assert_eq!(bs.read_bit().unwrap(), 1);
1564 assert_eq!(bs.read_bit().unwrap(), 0);
1565 assert_eq!(bs.read_bit().unwrap(), 1);
1566 assert_eq!(bs.read_bit().unwrap(), 0);
1567 assert_eq!(bs.read_bit().unwrap(), 1);
1568 assert_eq!(bs.read_bit().unwrap(), 0);
1569
1570 let mut bs = BitReaderLtr::new(&[]);
1572
1573 assert!(bs.read_bool().is_err());
1574 }
1575
1576 #[test]
1577 fn verify_bitstreamltr_read_bits_leq32() {
1578 let mut bs = BitReaderLtr::new(&[0b1010_0101, 0b0111_1110, 0b1101_0011]);
1580
1581 assert_eq!(bs.read_bits_leq32(4).unwrap(), 0b0000_0000_0000_1010);
1582 assert_eq!(bs.read_bits_leq32(4).unwrap(), 0b0000_0000_0000_0101);
1583 assert_eq!(bs.read_bits_leq32(13).unwrap(), 0b0000_1111_1101_1010);
1584 assert_eq!(bs.read_bits_leq32(3).unwrap(), 0b0000_0000_0000_0011);
1585
1586 let mut bs = BitReaderLtr::new(&[0xff, 0xff, 0xff, 0xff]);
1588
1589 assert_eq!(bs.read_bits_leq32(0).unwrap(), 0);
1590
1591 let mut bs = BitReaderLtr::new(&[0xff, 0xff, 0xff, 0xff, 0x01]);
1593
1594 assert_eq!(bs.read_bits_leq32(32).unwrap(), u32::MAX);
1595 assert_eq!(bs.read_bits_leq32(8).unwrap(), 0x01);
1596
1597 let mut bs = BitReaderLtr::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01]);
1599
1600 assert_eq!(bs.read_bits_leq32(32).unwrap(), u32::MAX);
1601 assert_eq!(bs.read_bits_leq32(32).unwrap(), u32::MAX);
1602 assert_eq!(bs.read_bits_leq32(8).unwrap(), 0x01);
1603
1604 let mut bs = BitReaderLtr::new(&[0xff]);
1606
1607 assert!(bs.read_bits_leq32(9).is_err());
1608 }
1609
1610 #[test]
1611 fn verify_bitstreamltr_read_bits_leq64() {
1612 let mut bs = BitReaderLtr::new(&[
1614 0x99, 0xaa, 0x55, 0xff, 0xff, 0x55, 0xaa, 0x99, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, ]);
1617
1618 assert_eq!(bs.read_bits_leq64(40).unwrap(), 0x99aa55ffff);
1619 assert_eq!(bs.read_bits_leq64(4).unwrap(), 0x05);
1620 assert_eq!(bs.read_bits_leq64(4).unwrap(), 0x05);
1621 assert_eq!(bs.read_bits_leq64(16).unwrap(), 0xaa99);
1622 assert_eq!(bs.read_bits_leq64(64).unwrap(), 0x1122334455667788);
1623
1624 let mut bs = BitReaderLtr::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
1626
1627 assert_eq!(bs.read_bits_leq64(0).unwrap(), 0);
1628
1629 let mut bs = BitReaderLtr::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01]);
1631
1632 assert_eq!(bs.read_bits_leq64(64).unwrap(), u64::MAX);
1633 assert_eq!(bs.read_bits_leq64(8).unwrap(), 0x01);
1634
1635 let mut bs = BitReaderLtr::new(&[0xff]);
1637
1638 assert!(bs.read_bits_leq64(9).is_err());
1639 }
1640
1641 #[test]
1642 fn verify_bitstreamltr_read_unary_zeros() {
1643 let mut bs =
1645 BitReaderLtr::new(&[0b0000_0001, 0b0001_0000, 0b0000_0000, 0b1000_0000, 0b1111_1011]);
1646
1647 assert_eq!(bs.read_unary_zeros().unwrap(), 7);
1648 assert_eq!(bs.read_unary_zeros().unwrap(), 3);
1649 assert_eq!(bs.read_unary_zeros().unwrap(), 12);
1650 assert_eq!(bs.read_unary_zeros().unwrap(), 7);
1651 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
1652 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
1653 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
1654 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
1655 assert_eq!(bs.read_unary_zeros().unwrap(), 1);
1656 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
1657
1658 let mut bs = BitReaderLtr::new(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]);
1660
1661 assert_eq!(bs.read_unary_zeros().unwrap(), 63);
1662
1663 let mut bs = BitReaderLtr::new(&[0x80]);
1665
1666 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
1667
1668 let mut bs = BitReaderLtr::new(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
1670
1671 assert!(bs.read_unary_zeros().is_err());
1672 }
1673
1674 #[test]
1675 fn verify_bitstreamltr_read_unary_zeros_capped() {
1676 let mut bs = BitReaderLtr::new(&[0b0000_0001, 0b0000_0001]);
1678
1679 assert_eq!(bs.read_unary_zeros_capped(8).unwrap(), 7);
1680 assert_eq!(bs.read_unary_zeros_capped(4).unwrap(), 4);
1681
1682 let mut bs = BitReaderLtr::new(&[
1684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ]);
1688
1689 assert_eq!(bs.read_unary_zeros_capped(96).unwrap(), 79);
1690 assert_eq!(bs.read_unary_zeros_capped(104).unwrap(), 104);
1691 }
1692
1693 #[test]
1694 fn verify_bitstreamltr_read_unary_ones() {
1695 let mut bs =
1697 BitReaderLtr::new(&[0b1111_1110, 0b1110_1111, 0b1111_1111, 0b0111_1111, 0b0000_0100]);
1698
1699 assert_eq!(bs.read_unary_ones().unwrap(), 7);
1700 assert_eq!(bs.read_unary_ones().unwrap(), 3);
1701 assert_eq!(bs.read_unary_ones().unwrap(), 12);
1702 assert_eq!(bs.read_unary_ones().unwrap(), 7);
1703 assert_eq!(bs.read_unary_ones().unwrap(), 0);
1704 assert_eq!(bs.read_unary_ones().unwrap(), 0);
1705 assert_eq!(bs.read_unary_ones().unwrap(), 0);
1706 assert_eq!(bs.read_unary_ones().unwrap(), 0);
1707 assert_eq!(bs.read_unary_ones().unwrap(), 1);
1708 assert_eq!(bs.read_unary_ones().unwrap(), 0);
1709
1710 let mut bs = BitReaderLtr::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe]);
1712
1713 assert_eq!(bs.read_unary_ones().unwrap(), 63);
1714
1715 let mut bs = BitReaderLtr::new(&[0x7f]);
1717
1718 assert_eq!(bs.read_unary_ones().unwrap(), 0);
1719
1720 let mut bs = BitReaderLtr::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
1722
1723 assert!(bs.read_unary_ones().is_err());
1724 }
1725
1726 #[test]
1727 fn verify_bitstreamltr_read_unary_ones_capped() {
1728 let mut bs = BitReaderLtr::new(&[0b1111_1110, 0b1111_1110]);
1730
1731 assert_eq!(bs.read_unary_ones_capped(8).unwrap(), 7);
1732 assert_eq!(bs.read_unary_ones_capped(4).unwrap(), 4);
1733
1734 let mut bs =
1735 BitReaderLtr::new(&[0b1111_1110, 0b1110_1111, 0b1111_1111, 0b0111_1111, 0b0000_0100]);
1736
1737 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 7);
1738 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 3);
1739 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 9); assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 3);
1741 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 7);
1742 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 0);
1743 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 0);
1744 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 0);
1745 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 0);
1746 assert_eq!(bs.read_unary_ones_capped(9).unwrap(), 1);
1747
1748 let mut bs = BitReaderLtr::new(&[
1750 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1751 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1752 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1753 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1754 ]);
1755
1756 assert_eq!(bs.read_unary_ones_capped(144).unwrap(), 143);
1757 assert_eq!(bs.read_unary_ones_capped(256).unwrap(), 256);
1758 }
1759
1760 fn generate_codebook(bit_order: BitOrder) -> (Codebook<Entry8x8>, Vec<u8>, &'static str) {
1761 #[rustfmt::skip]
1763 const CODE_WORDS: [u32; 25] = [
1764 0b001,
1765 0b111,
1766 0b010,
1767 0b1001,
1768 0b1101,
1769 0b0001,
1770 0b0111,
1771 0b1000,
1772 0b10110,
1773 0b10111,
1774 0b10101,
1775 0b10100,
1776 0b01100,
1777 0b000010,
1778 0b110000,
1779 0b000011,
1780 0b110001,
1781 0b000001,
1782 0b011010,
1783 0b000000,
1784 0b011011,
1785 0b1100111,
1786 0b1100110,
1787 0b1100101,
1788 0b1100100,
1789 ];
1790
1791 const CODE_LENS: [u8; 25] =
1792 [3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7];
1793
1794 const VALUES: [u8; 25] = [
1795 b'i', b' ', b'e', b't', b's', b'l', b'n', b'o', b'.', b'r', b'g', b'h', b'u', b'p',
1796 b'w', b',', b'f', b'y', b'm', b'v', b'a', b'd', b'b', b'c', b'T',
1797 ];
1798
1799 const DATA: [u8; 57] = [
1801 0xc9, 0x43, 0xbf, 0x48, 0xa7, 0xca, 0xbe, 0x64, 0x30, 0xf5, 0xdf, 0x31, 0xd9, 0xb6,
1802 0xb5, 0xbb, 0x6f, 0x9f, 0xa0, 0x15, 0xc1, 0xfa, 0x5e, 0xa2, 0xb8, 0x4a, 0xfb, 0x0f,
1803 0xe1, 0x93, 0xe6, 0x8a, 0xe8, 0x3e, 0x77, 0xe0, 0xd9, 0x92, 0xf5, 0xf8, 0xc5, 0xfb,
1804 0x37, 0xcc, 0x7c, 0x48, 0x8f, 0x33, 0xf0, 0x33, 0x4f, 0xb0, 0xd2, 0x9a, 0x17, 0xad,
1805 0x80,
1806 ];
1807
1808 const TEXT: &str = "This silence belongs to us... and every single person out \
1809 there, is waiting for us to fill it with something.";
1810
1811 let data = match bit_order {
1813 BitOrder::Verbatim => DATA.to_vec(),
1814 BitOrder::Reverse => DATA.iter().map(|&b| b.reverse_bits()).collect(),
1815 };
1816
1817 let mut builder = CodebookBuilder::new(bit_order);
1819 let codebook = builder.make::<Entry8x8>(&CODE_WORDS, &CODE_LENS, &VALUES).unwrap();
1820
1821 (codebook, data, TEXT)
1822 }
1823
1824 #[test]
1825 fn verify_bitstreamltr_read_codebook() {
1826 let (codebook, buf, text) = generate_codebook(BitOrder::Verbatim);
1827
1828 let mut bs = BitReaderLtr::new(&buf);
1829
1830 let decoded: Vec<u8> =
1831 (0..text.len()).into_iter().map(|_| bs.read_codebook(&codebook).unwrap().0).collect();
1832
1833 assert_eq!(text, std::str::from_utf8(&decoded).unwrap());
1834 }
1835
1836 #[test]
1839 #[allow(clippy::bool_assert_comparison)]
1840 fn verify_bitstreamrtl_ignore_bits() {
1841 let mut bs = BitReaderRtl::new(&[
1842 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x50, ]);
1846
1847 assert_eq!(bs.read_bool().unwrap(), true);
1848
1849 bs.ignore_bits(128).unwrap();
1850
1851 assert_eq!(bs.read_bool().unwrap(), true);
1852 assert_eq!(bs.read_bool().unwrap(), false);
1853 assert_eq!(bs.read_bool().unwrap(), false);
1854
1855 bs.ignore_bits(7).unwrap();
1856
1857 assert_eq!(bs.read_bool().unwrap(), true);
1858
1859 bs.ignore_bits(19).unwrap();
1860
1861 assert_eq!(bs.read_bool().unwrap(), true);
1862
1863 assert_eq!(bs.read_bool().unwrap(), false);
1864 assert_eq!(bs.read_bool().unwrap(), false);
1865 assert_eq!(bs.read_bool().unwrap(), false);
1866 assert_eq!(bs.read_bool().unwrap(), false);
1867
1868 bs.ignore_bits(24).unwrap();
1869
1870 assert_eq!(bs.read_bool().unwrap(), true);
1871 assert_eq!(bs.read_bool().unwrap(), false);
1872 assert_eq!(bs.read_bool().unwrap(), true);
1873 assert_eq!(bs.read_bool().unwrap(), false);
1874
1875 let mut bs = BitReaderRtl::new(&[0x00]);
1877
1878 assert!(bs.ignore_bits(0).is_ok());
1879
1880 let mut bs = BitReaderRtl::new(&[]);
1881
1882 assert!(bs.ignore_bits(0).is_ok());
1883 assert!(bs.ignore_bits(1).is_err());
1884
1885 let mut bs = BitReaderRtl::new(&[
1887 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ]);
1892
1893 assert!(bs.ignore_bits(64).is_ok());
1894 assert!(bs.ignore_bits(64).is_ok());
1895 assert!(bs.ignore_bits(32).is_ok());
1896 assert!(bs.ignore_bits(32).is_ok());
1897 assert!(bs.ignore_bits(64).is_ok());
1898 }
1899
1900 #[test]
1901 #[allow(clippy::bool_assert_comparison)]
1902 fn verify_bitstreamrtl_read_bool() {
1903 let mut bs = BitReaderRtl::new(&[0b1010_1010]);
1905
1906 assert_eq!(bs.read_bool().unwrap(), false);
1907 assert_eq!(bs.read_bool().unwrap(), true);
1908 assert_eq!(bs.read_bool().unwrap(), false);
1909 assert_eq!(bs.read_bool().unwrap(), true);
1910 assert_eq!(bs.read_bool().unwrap(), false);
1911 assert_eq!(bs.read_bool().unwrap(), true);
1912 assert_eq!(bs.read_bool().unwrap(), false);
1913 assert_eq!(bs.read_bool().unwrap(), true);
1914
1915 let mut bs = BitReaderRtl::new(&[]);
1917
1918 assert!(bs.read_bool().is_err());
1919 }
1920
1921 #[test]
1922 fn verify_bitstreamrtl_read_bit() {
1923 let mut bs = BitReaderRtl::new(&[0b1010_1010]);
1925
1926 assert_eq!(bs.read_bit().unwrap(), 0);
1927 assert_eq!(bs.read_bit().unwrap(), 1);
1928 assert_eq!(bs.read_bit().unwrap(), 0);
1929 assert_eq!(bs.read_bit().unwrap(), 1);
1930 assert_eq!(bs.read_bit().unwrap(), 0);
1931 assert_eq!(bs.read_bit().unwrap(), 1);
1932 assert_eq!(bs.read_bit().unwrap(), 0);
1933 assert_eq!(bs.read_bit().unwrap(), 1);
1934
1935 let mut bs = BitReaderRtl::new(&[]);
1937
1938 assert!(bs.read_bit().is_err());
1939 }
1940
1941 #[test]
1942 fn verify_bitstreamrtl_read_bits_leq32() {
1943 let mut bs = BitReaderRtl::new(&[0b1010_0101, 0b0111_1110, 0b1101_0011]);
1945
1946 assert_eq!(bs.read_bits_leq32(4).unwrap(), 0b0000_0000_0000_0101);
1947 assert_eq!(bs.read_bits_leq32(4).unwrap(), 0b0000_0000_0000_1010);
1948 assert_eq!(bs.read_bits_leq32(13).unwrap(), 0b0001_0011_0111_1110);
1949 assert_eq!(bs.read_bits_leq32(3).unwrap(), 0b0000_0000_0000_0110);
1950
1951 let mut bs = BitReaderRtl::new(&[0xff, 0xff, 0xff, 0xff]);
1953
1954 assert_eq!(bs.read_bits_leq32(0).unwrap(), 0);
1955
1956 let mut bs = BitReaderRtl::new(&[0xff, 0xff, 0xff, 0xff, 0x01]);
1958
1959 assert_eq!(bs.read_bits_leq32(32).unwrap(), u32::MAX);
1960 assert_eq!(bs.read_bits_leq32(8).unwrap(), 0x01);
1961
1962 let mut bs = BitReaderRtl::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01]);
1964
1965 assert_eq!(bs.read_bits_leq32(32).unwrap(), u32::MAX);
1966 assert_eq!(bs.read_bits_leq32(32).unwrap(), u32::MAX);
1967 assert_eq!(bs.read_bits_leq32(8).unwrap(), 0x01);
1968
1969 let mut bs = BitReaderRtl::new(&[0xff]);
1971
1972 assert!(bs.read_bits_leq32(9).is_err());
1973 }
1974
1975 #[test]
1976 fn verify_bitstreamrtl_read_bits_leq64() {
1977 let mut bs = BitReaderRtl::new(&[
1979 0x99, 0xaa, 0x55, 0xff, 0xff, 0x55, 0xaa, 0x99, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
1983 ]);
1984
1985 assert_eq!(bs.read_bits_leq64(40).unwrap(), 0xffff55aa99);
1986 assert_eq!(bs.read_bits_leq64(4).unwrap(), 0x05);
1987 assert_eq!(bs.read_bits_leq64(4).unwrap(), 0x05);
1988 assert_eq!(bs.read_bits_leq64(16).unwrap(), 0x99aa);
1989 assert_eq!(bs.read_bits_leq64(64).unwrap(), 0x8877665544332211);
1990 assert_eq!(bs.read_bits_leq64(32).unwrap(), 0x33221100);
1991 assert_eq!(bs.read_bits_leq64(64).unwrap(), 0x7766554433221100);
1992
1993 let mut bs = BitReaderRtl::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
1995
1996 assert_eq!(bs.read_bits_leq64(0).unwrap(), 0);
1997
1998 let mut bs = BitReaderRtl::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01]);
2000
2001 assert_eq!(bs.read_bits_leq64(64).unwrap(), u64::MAX);
2002 assert_eq!(bs.read_bits_leq64(8).unwrap(), 0x01);
2003
2004 let mut bs = BitReaderRtl::new(&[0xff]);
2006
2007 assert!(bs.read_bits_leq64(9).is_err());
2008 }
2009
2010 #[test]
2011 fn verify_bitstreamrtl_read_unary_zeros() {
2012 let mut bs =
2014 BitReaderRtl::new(&[0b1000_0000, 0b0000_1000, 0b0000_0000, 0b0000_0001, 0b1101_1111]);
2015
2016 assert_eq!(bs.read_unary_zeros().unwrap(), 7);
2017 assert_eq!(bs.read_unary_zeros().unwrap(), 3);
2018 assert_eq!(bs.read_unary_zeros().unwrap(), 12);
2019 assert_eq!(bs.read_unary_zeros().unwrap(), 7);
2020 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
2021 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
2022 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
2023 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
2024 assert_eq!(bs.read_unary_zeros().unwrap(), 1);
2025 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
2026
2027 let mut bs = BitReaderRtl::new(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]);
2029
2030 assert_eq!(bs.read_unary_zeros().unwrap(), 63);
2031
2032 let mut bs = BitReaderRtl::new(&[0x01]);
2034
2035 assert_eq!(bs.read_unary_zeros().unwrap(), 0);
2036
2037 let mut bs = BitReaderRtl::new(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
2039
2040 assert!(bs.read_unary_zeros().is_err());
2041 }
2042
2043 #[test]
2044 fn verify_bitstreamrtl_read_unary_zeros_capped() {
2045 let mut bs = BitReaderRtl::new(&[0b1000_0000, 0b1000_0000]);
2047
2048 assert_eq!(bs.read_unary_zeros_capped(8).unwrap(), 7);
2049 assert_eq!(bs.read_unary_zeros_capped(4).unwrap(), 4);
2050
2051 let mut bs = BitReaderRtl::new(&[
2053 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ]);
2059
2060 assert_eq!(bs.read_unary_zeros_capped(96).unwrap(), 79);
2061 assert_eq!(bs.read_unary_zeros_capped(163).unwrap(), 163);
2062 }
2063
2064 #[test]
2065 fn verify_bitstreamrtl_read_unary_ones() {
2066 let mut bs =
2068 BitReaderRtl::new(&[0b0111_1111, 0b1111_0111, 0b1111_1111, 0b1111_1110, 0b0010_0000]);
2069
2070 assert_eq!(bs.read_unary_ones().unwrap(), 7);
2071 assert_eq!(bs.read_unary_ones().unwrap(), 3);
2072 assert_eq!(bs.read_unary_ones().unwrap(), 12);
2073 assert_eq!(bs.read_unary_ones().unwrap(), 7);
2074 assert_eq!(bs.read_unary_ones().unwrap(), 0);
2075 assert_eq!(bs.read_unary_ones().unwrap(), 0);
2076 assert_eq!(bs.read_unary_ones().unwrap(), 0);
2077 assert_eq!(bs.read_unary_ones().unwrap(), 0);
2078 assert_eq!(bs.read_unary_ones().unwrap(), 1);
2079 assert_eq!(bs.read_unary_ones().unwrap(), 0);
2080
2081 let mut bs = BitReaderRtl::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f]);
2083
2084 assert_eq!(bs.read_unary_ones().unwrap(), 63);
2085
2086 let mut bs = BitReaderRtl::new(&[0xfe]);
2088
2089 assert_eq!(bs.read_unary_ones().unwrap(), 0);
2090
2091 let mut bs = BitReaderRtl::new(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
2093
2094 assert!(bs.read_unary_ones().is_err());
2095 }
2096
2097 #[test]
2098 fn verify_bitstreamrtl_read_unary_ones_capped() {
2099 let mut bs = BitReaderRtl::new(&[0b0111_1111, 0b0111_1111]);
2101
2102 assert_eq!(bs.read_unary_ones_capped(8).unwrap(), 7);
2103 assert_eq!(bs.read_unary_ones_capped(4).unwrap(), 4);
2104
2105 let mut bs = BitReaderRtl::new(&[
2107 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ]);
2113
2114 assert_eq!(bs.read_unary_ones_capped(96).unwrap(), 79);
2115 assert_eq!(bs.read_unary_ones_capped(163).unwrap(), 163);
2116 }
2117
2118 #[test]
2119 fn verify_bitstreamrtl_read_codebook() {
2120 let (codebook, buf, text) = generate_codebook(BitOrder::Reverse);
2123
2124 let mut bs = BitReaderRtl::new(&buf);
2125
2126 let decoded: Vec<u8> =
2127 (0..text.len()).into_iter().map(|_| bs.read_codebook(&codebook).unwrap().0).collect();
2128
2129 assert_eq!(text, std::str::from_utf8(&decoded).unwrap());
2130 }
2131}