mirror of
https://github.com/exoticorn/upkr.git
synced 2026-01-20 19:46:42 +01:00
add remaining encoding config options + presets for x86 and z80
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
use crate::rans::{PROB_BITS, ONE_PROB};
|
||||
use crate::{
|
||||
rans::{ONE_PROB, PROB_BITS},
|
||||
Config,
|
||||
};
|
||||
|
||||
const INIT_PROB: u16 = 1 << (PROB_BITS - 1);
|
||||
const UPDATE_RATE: u32 = 4;
|
||||
@@ -7,6 +10,8 @@ const UPDATE_ADD: u32 = 8;
|
||||
#[derive(Clone)]
|
||||
pub struct ContextState {
|
||||
contexts: Vec<u8>,
|
||||
invert_bit_encoding: bool,
|
||||
simplified_prob_update: bool,
|
||||
}
|
||||
|
||||
pub struct Context<'a> {
|
||||
@@ -15,9 +20,11 @@ pub struct Context<'a> {
|
||||
}
|
||||
|
||||
impl ContextState {
|
||||
pub fn new(size: usize) -> ContextState {
|
||||
pub fn new(size: usize, config: &Config) -> ContextState {
|
||||
ContextState {
|
||||
contexts: vec![INIT_PROB as u8; size],
|
||||
invert_bit_encoding: config.invert_bit_encoding,
|
||||
simplified_prob_update: config.simplified_prob_update,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,10 +40,21 @@ impl<'a> Context<'a> {
|
||||
|
||||
pub fn update(&mut self, bit: bool) {
|
||||
let old = self.state.contexts[self.index];
|
||||
self.state.contexts[self.index] = if bit {
|
||||
old + ((ONE_PROB - old as u32 + UPDATE_ADD) >> UPDATE_RATE) as u8
|
||||
|
||||
self.state.contexts[self.index] = if self.state.simplified_prob_update {
|
||||
let offset = if bit ^ self.state.invert_bit_encoding {
|
||||
ONE_PROB as i32 >> UPDATE_RATE
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
(offset + old as i32 - ((old as i32 + UPDATE_ADD as i32) >> UPDATE_RATE)) as u8
|
||||
} else {
|
||||
old - ((old as u32 + UPDATE_ADD) >> UPDATE_RATE) as u8
|
||||
if bit ^ self.state.invert_bit_encoding {
|
||||
old + ((ONE_PROB - old as u32 + UPDATE_ADD) >> UPDATE_RATE) as u8
|
||||
} else {
|
||||
old - ((old as u32 + UPDATE_ADD) >> UPDATE_RATE) as u8
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user