mirror of
https://github.com/exoticorn/upkr.git
synced 2026-01-20 19:46:42 +01:00
implement simplified prob update, update unpack.c
This commit is contained in:
@@ -19,8 +19,8 @@ int upkr_decode_bit(int context_index) {
|
|||||||
upkr_current_byte = *upkr_data_ptr++;
|
upkr_current_byte = *upkr_data_ptr++;
|
||||||
upkr_bits_left = 8;
|
upkr_bits_left = 8;
|
||||||
}
|
}
|
||||||
upkr_state = (upkr_state << 1) + (upkr_current_byte & 1);
|
upkr_state = (upkr_state << 1) + (upkr_current_byte >> 7);
|
||||||
upkr_current_byte >>= 1;
|
upkr_current_byte <<= 1;
|
||||||
--upkr_bits_left;
|
--upkr_bits_left;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -30,19 +30,18 @@ int upkr_decode_bit(int context_index) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int prob = upkr_probs[context_index];
|
int prob = upkr_probs[context_index];
|
||||||
int bit = (upkr_state & 255) < prob ? 1 : 0;
|
int bit = (upkr_state & 255) >= prob ? 1 : 0;
|
||||||
|
|
||||||
int tmp = prob;
|
int prob_offset = 16;
|
||||||
if(!bit) {
|
int state_offset = 0;
|
||||||
tmp = 256 - tmp;
|
int state_scale = prob;
|
||||||
|
if(bit) {
|
||||||
|
state_offset = -prob;
|
||||||
|
state_scale = 256 - prob;
|
||||||
|
prob_offset = 0;
|
||||||
}
|
}
|
||||||
upkr_state = tmp * (upkr_state >> 8) + (upkr_state & 255);
|
upkr_state = state_offset + state_scale * (upkr_state >> 8) + (upkr_state & 255);
|
||||||
tmp += (256 - tmp + 8) >> 4;
|
upkr_probs[context_index] = prob_offset + prob - ((prob + 8) >> 4);
|
||||||
if(!bit) {
|
|
||||||
upkr_state -= prob;
|
|
||||||
tmp = 256 - tmp;
|
|
||||||
}
|
|
||||||
upkr_probs[context_index] = tmp;
|
|
||||||
|
|
||||||
return bit;
|
return bit;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
use crate::rans::{ONE_PROB, PROB_BITS};
|
use crate::rans::{ONE_PROB, PROB_BITS};
|
||||||
|
|
||||||
const INIT_PROB: u16 = 1 << (PROB_BITS - 1);
|
const INIT_PROB: u16 = 1 << (PROB_BITS - 1);
|
||||||
const UPDATE_RATE: u32 = 4;
|
const UPDATE_RATE: i32 = 4;
|
||||||
const UPDATE_ADD: u32 = 8;
|
const UPDATE_ADD: i32 = 8;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ContextState {
|
pub struct ContextState {
|
||||||
@@ -33,10 +33,13 @@ impl<'a> Context<'a> {
|
|||||||
|
|
||||||
pub fn update(&mut self, bit: bool) {
|
pub fn update(&mut self, bit: bool) {
|
||||||
let old = self.state.contexts[self.index];
|
let old = self.state.contexts[self.index];
|
||||||
self.state.contexts[self.index] = if !bit {
|
let offset = if !bit {
|
||||||
old + ((ONE_PROB - old as u32 + UPDATE_ADD) >> UPDATE_RATE) as u8
|
ONE_PROB as i32 >> UPDATE_RATE
|
||||||
} else {
|
} else {
|
||||||
old - ((old as u32 + UPDATE_ADD) >> UPDATE_RATE) as u8
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
self.state.contexts[self.index] =
|
||||||
|
(offset + old as i32 - ((old as i32 + UPDATE_ADD) >> UPDATE_RATE)) as u8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user