2 Commits

Author SHA1 Message Date
f1f1c64a76 implement simplified prob update, update unpack.c 2022-09-10 12:01:42 +02:00
36cb6d77b5 BE bitstream, flip bit encoding 2022-09-10 11:31:09 +02:00
3 changed files with 32 additions and 30 deletions

View File

@@ -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;
} }

View File

@@ -1,8 +1,8 @@
use crate::rans::{PROB_BITS, ONE_PROB}; 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;
} }
} }

View File

@@ -38,15 +38,15 @@ impl RansCoder {
let mut state = 1 << l_bits; let mut state = 1 << l_bits;
let mut byte = 0u8; let mut byte = 0u8;
let mut bit = 8; let mut bit = 0;
let mut flush_state: Box<dyn FnMut(&mut u32)> = if self.use_bitstream { let mut flush_state: Box<dyn FnMut(&mut u32)> = if self.use_bitstream {
Box::new(|state: &mut u32| { Box::new(|state: &mut u32| {
bit -= 1;
byte |= ((*state & 1) as u8) << bit; byte |= ((*state & 1) as u8) << bit;
if bit == 0 { bit += 1;
if bit == 8 {
buffer.push(byte); buffer.push(byte);
byte = 0; byte = 0;
bit = 8; bit = 0;
} }
*state >>= 1; *state >>= 1;
}) })
@@ -61,7 +61,7 @@ impl RansCoder {
let max_state_factor: u32 = 1 << (l_bits + num_flush_bits - PROB_BITS); let max_state_factor: u32 = 1 << (l_bits + num_flush_bits - PROB_BITS);
for step in self.bits.into_iter().rev() { for step in self.bits.into_iter().rev() {
let prob = step as u32 & 32767; let prob = step as u32 & 32767;
let (start, prob) = if step & 32768 != 0 { let (start, prob) = if step & 32768 == 0 {
(0, prob) (0, prob)
} else { } else {
(prob, ONE_PROB - prob) (prob, ONE_PROB - prob)
@@ -118,7 +118,7 @@ impl CostCounter {
impl EntropyCoder for CostCounter { impl EntropyCoder for CostCounter {
fn encode_bit(&mut self, bit: bool, prob: u16) { fn encode_bit(&mut self, bit: bool, prob: u16) {
let prob = if bit { let prob = if !bit {
prob as u32 prob as u32
} else { } else {
ONE_PROB - prob as u32 ONE_PROB - prob as u32
@@ -163,8 +163,8 @@ impl<'a> RansDecoder<'a> {
self.data = &self.data[1..]; self.data = &self.data[1..];
self.bits_left = 8; self.bits_left = 8;
} }
self.state = (self.state << 1) | (self.byte & 1) as u32; self.state = (self.state << 1) | (self.byte >> 7) as u32;
self.byte >>= 1; self.byte <<= 1;
self.bits_left -= 1; self.bits_left -= 1;
} }
} else { } else {
@@ -174,12 +174,12 @@ impl<'a> RansDecoder<'a> {
} }
} }
let bit = (self.state & PROB_MASK) < prob; let bit = (self.state & PROB_MASK) >= prob;
let (start, prob) = if bit { let (start, prob) = if bit {
(0, prob)
} else {
(prob, ONE_PROB - prob) (prob, ONE_PROB - prob)
} else {
(0, prob)
}; };
self.state = prob * (self.state >> PROB_BITS) + (self.state & PROB_MASK) - start; self.state = prob * (self.state >> PROB_BITS) + (self.state & PROB_MASK) - start;