1#[cfg(feature = "alloc")]
2use alloc::vec::Vec;
3
4pub mod decode;
5pub mod encode;
6pub mod table_builder;
7
8#[derive(Clone, Copy)]
9pub struct FseDecodeEntry {
10 pub base_line: u16,
11 pub num_bits: u8,
12 pub symbol: u8,
13}
14
15#[derive(Clone, Copy)]
16#[repr(C)]
17pub struct FseSeqDecodeEntry {
18 pub base_line: u16,
19 pub num_bits: u8,
20 pub extra_bits: u8,
21 pub baseline_value: u32,
22}
23
24impl FseSeqDecodeEntry {
25 #[inline(always)]
26 pub fn symbol_value(
27 &self,
28 reader: &mut crate::bitstream::reader_reverse::ReverseBitReader,
29 ) -> u32 {
30 let extra = reader.read_bits_branchless(self.extra_bits);
31 self.baseline_value + extra
32 }
33}
34
35pub fn promote_ll_table(table: &[FseDecodeEntry]) -> Vec<FseSeqDecodeEntry> {
36 table
37 .iter()
38 .map(|e| FseSeqDecodeEntry {
39 base_line: e.base_line,
40 num_bits: e.num_bits,
41 extra_bits: LL_BITS_TABLE[e.symbol as usize],
42 baseline_value: LL_BASELINE_TABLE[e.symbol as usize],
43 })
44 .collect()
45}
46
47pub fn promote_ml_table(table: &[FseDecodeEntry]) -> Vec<FseSeqDecodeEntry> {
48 table
49 .iter()
50 .map(|e| FseSeqDecodeEntry {
51 base_line: e.base_line,
52 num_bits: e.num_bits,
53 extra_bits: ML_BITS_TABLE[e.symbol as usize],
54 baseline_value: ML_BASELINE_TABLE[e.symbol as usize],
55 })
56 .collect()
57}
58
59pub fn promote_of_table(table: &[FseDecodeEntry]) -> Vec<FseSeqDecodeEntry> {
60 table
61 .iter()
62 .map(|e| {
63 let code = e.symbol;
64 FseSeqDecodeEntry {
65 base_line: e.base_line,
66 num_bits: e.num_bits,
67 extra_bits: code,
68 baseline_value: 1u32 << code,
69 }
70 })
71 .collect()
72}
73
74#[derive(Clone)]
75pub struct FseEncodeEntry {
76 pub delta_nb_bits: u32,
77 pub delta_find_state: i16,
78 pub num_bits_out: u8,
79}
80
81#[derive(Clone)]
82pub struct FseTable {
83 pub entries: &'static [FseDecodeEntry],
84 pub accuracy_log: u8,
85}
86
87pub const MAX_SYMBOL: usize = 255;
88pub const MAX_TABLE_LOG: u8 = 12;
89pub const MIN_TABLE_LOG: u8 = 5;
90
91pub const LL_MAX_SYMBOL: u8 = 35;
92pub const ML_MAX_SYMBOL: u8 = 52;
93pub const OF_MAX_SYMBOL: u8 = 31;
94
95pub const LL_DEFAULT_ACCURACY: u8 = 6;
96pub const ML_DEFAULT_ACCURACY: u8 = 6;
97pub const OF_DEFAULT_ACCURACY: u8 = 5;
98
99pub static LL_DEFAULT_DIST: [i16; 36] = [
100 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1,
101 -1, -1, -1, -1,
102];
103
104pub static ML_DEFAULT_DIST: [i16; 53] = [
105 1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
106 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
107];
108
109pub static OF_DEFAULT_DIST: [i16; 29] = [
110 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
111];
112
113pub static LL_BITS_TABLE: [u8; 36] = [
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9, 10, 11,
115 12, 13, 14, 15, 16,
116];
117
118pub static LL_BASELINE_TABLE: [u32; 36] = [
119 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 28, 32, 40, 48, 64,
120 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536,
121];
122
123pub static ML_BITS_TABLE: [u8; 53] = [
124 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
125 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
126];
127
128pub static ML_BASELINE_TABLE: [u32; 53] = [
129 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
130 28, 29, 30, 31, 32, 33, 34, 35, 37, 39, 41, 43, 47, 51, 59, 67, 83, 99, 131, 259, 515, 1027,
131 2051, 4099, 8195, 16387, 32771, 65539,
132];