Skip to main content

zrip_core/fse/
mod.rs

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_ACCURACY_LOG: u8 = 9;
92pub const ML_MAX_ACCURACY_LOG: u8 = 9;
93pub const OF_MAX_ACCURACY_LOG: u8 = 8;
94
95pub const LL_MAX_SYMBOL: u8 = 35;
96pub const ML_MAX_SYMBOL: u8 = 52;
97pub const OF_MAX_SYMBOL: u8 = 31;
98
99pub const LL_DEFAULT_ACCURACY: u8 = 6;
100pub const ML_DEFAULT_ACCURACY: u8 = 6;
101pub const OF_DEFAULT_ACCURACY: u8 = 5;
102
103pub static LL_DEFAULT_DIST: [i16; 36] = [
104    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,
105    -1, -1, -1, -1,
106];
107
108pub static ML_DEFAULT_DIST: [i16; 53] = [
109    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,
110    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
111];
112
113pub static OF_DEFAULT_DIST: [i16; 29] = [
114    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,
115];
116
117pub static LL_BITS_TABLE: [u8; 36] = [
118    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,
119    12, 13, 14, 15, 16,
120];
121
122pub static LL_BASELINE_TABLE: [u32; 36] = [
123    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,
124    128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536,
125];
126
127pub static ML_BITS_TABLE: [u8; 53] = [
128    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,
129    1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
130];
131
132pub static ML_BASELINE_TABLE: [u32; 53] = [
133    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,
134    28, 29, 30, 31, 32, 33, 34, 35, 37, 39, 41, 43, 47, 51, 59, 67, 83, 99, 131, 259, 515, 1027,
135    2051, 4099, 8195, 16387, 32771, 65539,
136];