X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Flzms_decompress.c;fp=src%2Flzms_decompress.c;h=5093a3d32ed2e21322b1eba0f172eec0a8163659;hp=d5d51417352b2ff5b81a8da2fdaaa27ca6e886ed;hb=5472f62361eb32dcb357a6b90ddc3f2481b68774;hpb=5343bde03c158cc767b1a347a7323d0e33c78d41 diff --git a/src/lzms_decompress.c b/src/lzms_decompress.c index d5d51417..5093a3d3 100644 --- a/src/lzms_decompress.c +++ b/src/lzms_decompress.c @@ -463,18 +463,22 @@ lzms_decode_bit(struct lzms_range_decoder *rd, u32 *state_p, u32 num_states, /* Load the probability entry corresponding to the current state. */ prob_entry = &probs[*state_p]; + /* Update the state early. We'll still need to OR the state with 1 + * later if the decoded bit is a 1. */ + *state_p = (*state_p << 1) & (num_states - 1); + + /* Get the probability (out of LZMS_PROBABILITY_DENOMINATOR) that the + * next bit is 0. */ + prob = lzms_get_probability(prob_entry); + /* Normalize if needed. */ - if (rd->range <= 0xffff) { + if (!(rd->range & 0xFFFF0000)) { rd->range <<= 16; rd->code <<= 16; if (likely(rd->next != rd->end)) rd->code |= le16_to_cpu(*rd->next++); } - /* Get the probability (out of LZMS_PROBABILITY_DENOMINATOR) that the - * next bit is 0. */ - prob = lzms_get_probability(prob_entry); - /* Based on the probability, calculate the bound between the 0-bit * region and the 1-bit region of the range. */ bound = (rd->range >> LZMS_PROBABILITY_BITS) * prob; @@ -484,7 +488,6 @@ lzms_decode_bit(struct lzms_range_decoder *rd, u32 *state_p, u32 num_states, rd->range = bound; /* Update the state and probability entry based on the decoded bit. */ - *state_p = ((*state_p << 1) | 0) & (num_states - 1); lzms_update_probability_entry(prob_entry, 0); return 0; } else { @@ -493,8 +496,8 @@ lzms_decode_bit(struct lzms_range_decoder *rd, u32 *state_p, u32 num_states, rd->code -= bound; /* Update the state and probability entry based on the decoded bit. */ - *state_p = ((*state_p << 1) | 1) & (num_states - 1); lzms_update_probability_entry(prob_entry, 1); + *state_p |= 1; return 1; } }