mirror of
https://github.com/exoticorn/upkr.git
synced 2026-01-20 11:36:42 +01:00
alternative way to write state/prob update
This commit is contained in:
@@ -17,6 +17,14 @@ test_armv6m: build/unpack_armv6m
|
||||
build/unpack_armv6m.bin: unpack_armv6m.S
|
||||
arm-none-eabi-gcc -march=armv6-m -c -o build/unpack_armv6m.o $?
|
||||
arm-none-eabi-objcopy -O binary --only-section=.text build/unpack_armv6m.o $@
|
||||
|
||||
build/unpack_c: ../c_unpacker/main.c ../c_unpacker/unpack.c
|
||||
mkdir -p build
|
||||
gcc -g -o $@ $^
|
||||
|
||||
test_c: build/unpack_c
|
||||
$< test_data.upk /tmp/out.bin
|
||||
cmp test_data.bin /tmp/out.bin
|
||||
|
||||
sizes: build/unpack_armv6m.bin
|
||||
ls -l build/*.bin
|
||||
33
c_unpacker/decode_bit_alt.c
Normal file
33
c_unpacker/decode_bit_alt.c
Normal file
@@ -0,0 +1,33 @@
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -32,17 +32,14 @@ int upkr_decode_bit(int context_index) {
|
||||
int prob = upkr_probs[context_index];
|
||||
int bit = (upkr_state & 255) < prob ? 1 : 0;
|
||||
|
||||
int tmp = prob;
|
||||
if(!bit) {
|
||||
tmp = 256 - tmp;
|
||||
if(bit) {
|
||||
upkr_state = prob * (upkr_state >> 8) + (upkr_state & 255);
|
||||
prob += (256 - prob + 8) >> 4;
|
||||
} else {
|
||||
upkr_state = (256 - prob) * (upkr_state >> 8) + (upkr_state & 255) - prob;
|
||||
prob -= (prob + 8) >> 4;
|
||||
}
|
||||
upkr_state = tmp * (upkr_state >> 8) + (upkr_state & 255);
|
||||
tmp += (256 - tmp + 8) >> 4;
|
||||
if(!bit) {
|
||||
upkr_state -= prob;
|
||||
tmp = 256 - tmp;
|
||||
}
|
||||
upkr_probs[context_index] = tmp;
|
||||
upkr_probs[context_index] = prob;
|
||||
|
||||
return bit;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user