mirror of
https://github.com/exoticorn/upkr.git
synced 2026-01-20 19:46:42 +01:00
34 lines
795 B
C
34 lines
795 B
C
int upkr_decode_bit(int context_index) {
|
|
#ifdef UPKR_BITSTREAM
|
|
while(upkr_state < 32768) {
|
|
if(upkr_bits_left == 0) {
|
|
upkr_current_byte = *upkr_data_ptr++;
|
|
upkr_bits_left = 8;
|
|
}
|
|
upkr_state = (upkr_state << 1) + (upkr_current_byte & 1);
|
|
upkr_current_byte >>= 1;
|
|
--upkr_bits_left;
|
|
}
|
|
#else
|
|
while(upkr_state < 4096) {
|
|
upkr_state = (upkr_state << 8) | *upkr_data_ptr++;
|
|
}
|
|
#endif
|
|
|
|
int prob = upkr_probs[context_index];
|
|
int bit = (upkr_state & 255) < prob ? 1 : 0;
|
|
|
|
if(bit) {
|
|
prob = 256 - prob;
|
|
}
|
|
upkr_state -= prob * ((upkr_state >> 8) + (bit ^ 1));
|
|
prob -= (prob + 8) >> 4;
|
|
if(bit) {
|
|
prob = -prob;
|
|
}
|
|
upkr_probs[context_index] = prob;
|
|
|
|
return bit;
|
|
}
|
|
|