1*81ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 2*81ad8388SMartin Matuska // 3*81ad8388SMartin Matuska /// \file range_decoder.h 4*81ad8388SMartin Matuska /// \brief Range Decoder 5*81ad8388SMartin Matuska /// 6*81ad8388SMartin Matuska // Authors: Igor Pavlov 7*81ad8388SMartin Matuska // Lasse Collin 8*81ad8388SMartin Matuska // 9*81ad8388SMartin Matuska // This file has been put into the public domain. 10*81ad8388SMartin Matuska // You can do whatever you want with this file. 11*81ad8388SMartin Matuska // 12*81ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 13*81ad8388SMartin Matuska 14*81ad8388SMartin Matuska #ifndef LZMA_RANGE_DECODER_H 15*81ad8388SMartin Matuska #define LZMA_RANGE_DECODER_H 16*81ad8388SMartin Matuska 17*81ad8388SMartin Matuska #include "range_common.h" 18*81ad8388SMartin Matuska 19*81ad8388SMartin Matuska 20*81ad8388SMartin Matuska typedef struct { 21*81ad8388SMartin Matuska uint32_t range; 22*81ad8388SMartin Matuska uint32_t code; 23*81ad8388SMartin Matuska uint32_t init_bytes_left; 24*81ad8388SMartin Matuska } lzma_range_decoder; 25*81ad8388SMartin Matuska 26*81ad8388SMartin Matuska 27*81ad8388SMartin Matuska /// Reads the first five bytes to initialize the range decoder. 28*81ad8388SMartin Matuska static inline bool 29*81ad8388SMartin Matuska rc_read_init(lzma_range_decoder *rc, const uint8_t *restrict in, 30*81ad8388SMartin Matuska size_t *restrict in_pos, size_t in_size) 31*81ad8388SMartin Matuska { 32*81ad8388SMartin Matuska while (rc->init_bytes_left > 0) { 33*81ad8388SMartin Matuska if (*in_pos == in_size) 34*81ad8388SMartin Matuska return false; 35*81ad8388SMartin Matuska 36*81ad8388SMartin Matuska rc->code = (rc->code << 8) | in[*in_pos]; 37*81ad8388SMartin Matuska ++*in_pos; 38*81ad8388SMartin Matuska --rc->init_bytes_left; 39*81ad8388SMartin Matuska } 40*81ad8388SMartin Matuska 41*81ad8388SMartin Matuska return true; 42*81ad8388SMartin Matuska } 43*81ad8388SMartin Matuska 44*81ad8388SMartin Matuska 45*81ad8388SMartin Matuska /// Makes local copies of range decoder and *in_pos variables. Doing this 46*81ad8388SMartin Matuska /// improves speed significantly. The range decoder macros expect also 47*81ad8388SMartin Matuska /// variables `in' and `in_size' to be defined. 48*81ad8388SMartin Matuska #define rc_to_local(range_decoder, in_pos) \ 49*81ad8388SMartin Matuska lzma_range_decoder rc = range_decoder; \ 50*81ad8388SMartin Matuska size_t rc_in_pos = (in_pos); \ 51*81ad8388SMartin Matuska uint32_t rc_bound 52*81ad8388SMartin Matuska 53*81ad8388SMartin Matuska 54*81ad8388SMartin Matuska /// Stores the local copes back to the range decoder structure. 55*81ad8388SMartin Matuska #define rc_from_local(range_decoder, in_pos) \ 56*81ad8388SMartin Matuska do { \ 57*81ad8388SMartin Matuska range_decoder = rc; \ 58*81ad8388SMartin Matuska in_pos = rc_in_pos; \ 59*81ad8388SMartin Matuska } while (0) 60*81ad8388SMartin Matuska 61*81ad8388SMartin Matuska 62*81ad8388SMartin Matuska /// Resets the range decoder structure. 63*81ad8388SMartin Matuska #define rc_reset(range_decoder) \ 64*81ad8388SMartin Matuska do { \ 65*81ad8388SMartin Matuska (range_decoder).range = UINT32_MAX; \ 66*81ad8388SMartin Matuska (range_decoder).code = 0; \ 67*81ad8388SMartin Matuska (range_decoder).init_bytes_left = 5; \ 68*81ad8388SMartin Matuska } while (0) 69*81ad8388SMartin Matuska 70*81ad8388SMartin Matuska 71*81ad8388SMartin Matuska /// When decoding has been properly finished, rc.code is always zero unless 72*81ad8388SMartin Matuska /// the input stream is corrupt. So checking this can catch some corrupt 73*81ad8388SMartin Matuska /// files especially if they don't have any other integrity check. 74*81ad8388SMartin Matuska #define rc_is_finished(range_decoder) \ 75*81ad8388SMartin Matuska ((range_decoder).code == 0) 76*81ad8388SMartin Matuska 77*81ad8388SMartin Matuska 78*81ad8388SMartin Matuska /// Read the next input byte if needed. If more input is needed but there is 79*81ad8388SMartin Matuska /// no more input available, "goto out" is used to jump out of the main 80*81ad8388SMartin Matuska /// decoder loop. 81*81ad8388SMartin Matuska #define rc_normalize(seq) \ 82*81ad8388SMartin Matuska do { \ 83*81ad8388SMartin Matuska if (rc.range < RC_TOP_VALUE) { \ 84*81ad8388SMartin Matuska if (unlikely(rc_in_pos == in_size)) { \ 85*81ad8388SMartin Matuska coder->sequence = seq; \ 86*81ad8388SMartin Matuska goto out; \ 87*81ad8388SMartin Matuska } \ 88*81ad8388SMartin Matuska rc.range <<= RC_SHIFT_BITS; \ 89*81ad8388SMartin Matuska rc.code = (rc.code << RC_SHIFT_BITS) | in[rc_in_pos++]; \ 90*81ad8388SMartin Matuska } \ 91*81ad8388SMartin Matuska } while (0) 92*81ad8388SMartin Matuska 93*81ad8388SMartin Matuska 94*81ad8388SMartin Matuska /// Start decoding a bit. This must be used together with rc_update_0() 95*81ad8388SMartin Matuska /// and rc_update_1(): 96*81ad8388SMartin Matuska /// 97*81ad8388SMartin Matuska /// rc_if_0(prob, seq) { 98*81ad8388SMartin Matuska /// rc_update_0(prob); 99*81ad8388SMartin Matuska /// // Do something 100*81ad8388SMartin Matuska /// } else { 101*81ad8388SMartin Matuska /// rc_update_1(prob); 102*81ad8388SMartin Matuska /// // Do something else 103*81ad8388SMartin Matuska /// } 104*81ad8388SMartin Matuska /// 105*81ad8388SMartin Matuska #define rc_if_0(prob, seq) \ 106*81ad8388SMartin Matuska rc_normalize(seq); \ 107*81ad8388SMartin Matuska rc_bound = (rc.range >> RC_BIT_MODEL_TOTAL_BITS) * (prob); \ 108*81ad8388SMartin Matuska if (rc.code < rc_bound) 109*81ad8388SMartin Matuska 110*81ad8388SMartin Matuska 111*81ad8388SMartin Matuska /// Update the range decoder state and the used probability variable to 112*81ad8388SMartin Matuska /// match a decoded bit of 0. 113*81ad8388SMartin Matuska #define rc_update_0(prob) \ 114*81ad8388SMartin Matuska do { \ 115*81ad8388SMartin Matuska rc.range = rc_bound; \ 116*81ad8388SMartin Matuska prob += (RC_BIT_MODEL_TOTAL - (prob)) >> RC_MOVE_BITS; \ 117*81ad8388SMartin Matuska } while (0) 118*81ad8388SMartin Matuska 119*81ad8388SMartin Matuska 120*81ad8388SMartin Matuska /// Update the range decoder state and the used probability variable to 121*81ad8388SMartin Matuska /// match a decoded bit of 1. 122*81ad8388SMartin Matuska #define rc_update_1(prob) \ 123*81ad8388SMartin Matuska do { \ 124*81ad8388SMartin Matuska rc.range -= rc_bound; \ 125*81ad8388SMartin Matuska rc.code -= rc_bound; \ 126*81ad8388SMartin Matuska prob -= (prob) >> RC_MOVE_BITS; \ 127*81ad8388SMartin Matuska } while (0) 128*81ad8388SMartin Matuska 129*81ad8388SMartin Matuska 130*81ad8388SMartin Matuska /// Decodes one bit and runs action0 or action1 depending on the decoded bit. 131*81ad8388SMartin Matuska /// This macro is used as the last step in bittree reverse decoders since 132*81ad8388SMartin Matuska /// those don't use "symbol" for anything else than indexing the probability 133*81ad8388SMartin Matuska /// arrays. 134*81ad8388SMartin Matuska #define rc_bit_last(prob, action0, action1, seq) \ 135*81ad8388SMartin Matuska do { \ 136*81ad8388SMartin Matuska rc_if_0(prob, seq) { \ 137*81ad8388SMartin Matuska rc_update_0(prob); \ 138*81ad8388SMartin Matuska action0; \ 139*81ad8388SMartin Matuska } else { \ 140*81ad8388SMartin Matuska rc_update_1(prob); \ 141*81ad8388SMartin Matuska action1; \ 142*81ad8388SMartin Matuska } \ 143*81ad8388SMartin Matuska } while (0) 144*81ad8388SMartin Matuska 145*81ad8388SMartin Matuska 146*81ad8388SMartin Matuska /// Decodes one bit, updates "symbol", and runs action0 or action1 depending 147*81ad8388SMartin Matuska /// on the decoded bit. 148*81ad8388SMartin Matuska #define rc_bit(prob, action0, action1, seq) \ 149*81ad8388SMartin Matuska rc_bit_last(prob, \ 150*81ad8388SMartin Matuska symbol <<= 1; action0, \ 151*81ad8388SMartin Matuska symbol = (symbol << 1) + 1; action1, \ 152*81ad8388SMartin Matuska seq); 153*81ad8388SMartin Matuska 154*81ad8388SMartin Matuska 155*81ad8388SMartin Matuska /// Like rc_bit() but add "case seq:" as a prefix. This makes the unrolled 156*81ad8388SMartin Matuska /// loops more readable because the code isn't littered with "case" 157*81ad8388SMartin Matuska /// statements. On the other hand this also makes it less readable, since 158*81ad8388SMartin Matuska /// spotting the places where the decoder loop may be restarted is less 159*81ad8388SMartin Matuska /// obvious. 160*81ad8388SMartin Matuska #define rc_bit_case(prob, action0, action1, seq) \ 161*81ad8388SMartin Matuska case seq: rc_bit(prob, action0, action1, seq) 162*81ad8388SMartin Matuska 163*81ad8388SMartin Matuska 164*81ad8388SMartin Matuska /// Decode a bit without using a probability. 165*81ad8388SMartin Matuska #define rc_direct(dest, seq) \ 166*81ad8388SMartin Matuska do { \ 167*81ad8388SMartin Matuska rc_normalize(seq); \ 168*81ad8388SMartin Matuska rc.range >>= 1; \ 169*81ad8388SMartin Matuska rc.code -= rc.range; \ 170*81ad8388SMartin Matuska rc_bound = UINT32_C(0) - (rc.code >> 31); \ 171*81ad8388SMartin Matuska rc.code += rc.range & rc_bound; \ 172*81ad8388SMartin Matuska dest = (dest << 1) + (rc_bound + 1); \ 173*81ad8388SMartin Matuska } while (0) 174*81ad8388SMartin Matuska 175*81ad8388SMartin Matuska 176*81ad8388SMartin Matuska // NOTE: No macros are provided for bittree decoding. It seems to be simpler 177*81ad8388SMartin Matuska // to just write them open in the code. 178*81ad8388SMartin Matuska 179*81ad8388SMartin Matuska #endif 180