void ec_dec_init(ec_dec *_this,ec_byte_buffer *_buf){ _this->buf=_buf; _this->rem=ec_dec_in(_this); _this->rng=1U<<EC_CODE_EXTRA; _this->dif=_this->rng-(_this->rem>>EC_SYM_BITS-EC_CODE_EXTRA); /*Normalize the interval.*/ ec_dec_normalize(_this); }
void ec_dec_init(ec_dec *_this,ec_byte_buffer *_buf){ _this->buf=_buf; _this->rem=ec_dec_in(_this); _this->rng=1U<<EC_CODE_EXTRA; _this->dif=_this->rng-(_this->rem>>EC_SYM_BITS-EC_CODE_EXTRA); /*Normalize the interval.*/ ec_dec_normalize(_this); /*_this->end_byte=ec_byte_look_at_end(_this->buf);*/ _this->end_bits_left=0; _this->nb_end_bits=0; }
/*Normalizes the contents of dif and rng so that rng lies entirely in the high-order symbol.*/ static inline void ec_dec_normalize(ec_dec *_this){ /*If the range is too small, rescale it and input some bits.*/ while(_this->rng<=EC_CODE_BOT){ int sym; _this->rng<<=EC_SYM_BITS; /*Use up the remaining bits from our last symbol.*/ sym=_this->rem<<EC_CODE_EXTRA&EC_SYM_MAX; /*Read the next value from the input.*/ _this->rem=ec_dec_in(_this); /*Take the rest of the bits we need from this new symbol.*/ sym|=_this->rem>>EC_SYM_BITS-EC_CODE_EXTRA; _this->dif=(_this->dif<<EC_SYM_BITS)+sym&EC_CODE_MASK; /*dif can never be larger than EC_CODE_TOP. This is equivalent to the slightly more readable: if(_this->dif>EC_CODE_TOP)_this->dif-=EC_CODE_TOP;*/ _this->dif^=_this->dif&_this->dif-1&EC_CODE_TOP; } }