# HG changeset patch # User michaelni # Date 1054256748 0 # Node ID dae280b939ca350454421ea40794374955f656d1 # Parent 57172377849a7464661743f9cd8a1f8c034de665 (truncated) unary binerization unary k-th order exp golomb binarization diff -r 57172377849a -r dae280b939ca cabac.c --- a/cabac.c Fri May 30 00:02:25 2003 +0000 +++ b/cabac.c Fri May 30 01:05:48 2003 +0000 @@ -127,49 +127,75 @@ int main(){ CABACContext c; uint8_t b[9*SIZE]; - uint8_t bit[9*SIZE]; + uint8_t r[9*SIZE]; int i; - uint8_t state= 0; + uint8_t state[10]= {0}; ff_init_cabac_encoder(&c, b, SIZE); ff_init_cabac_states(&c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); for(i=0; i write zero bit, !=0 write one bit + */ static inline void put_cabac_bypass(CABACContext *c, int bit){ c->low += c->low; @@ -158,6 +161,82 @@ #endif } +/** + * put (truncated) unary binarization. + */ +static inline void put_cabac_u(CABACContext *c, uint8_t * state, int v, int max, int max_index, int truncated){ + int i; + + assert(v <= max); + +#if 1 + for(i=0; i= m){ //FIXME optimize + put_cabac_bypass(c, 1); + v-= m; + m+= m; + } + put_cabac_bypass(c, 0); + while(m>>=1){ + put_cabac_bypass(c, v&m); + } + } + + if(is_signed) + put_cabac_bypass(c, sign); + } +} + static inline void renorm_cabac_decoder(CABACContext *c){ while(c->range < 0x10000){ c->range+= c->range; @@ -230,3 +309,58 @@ } } +/** + * get (truncated) unnary binarization. + */ +static inline int get_cabac_u(CABACContext *c, uint8_t * state, int max, int max_index, int truncated){ + int i; + + for(i=0; i>=1){ + v+= v + get_cabac_bypass(c); + } + i += v; + + if(is_signed && get_cabac_bypass(c)){ + return -i; + }else + return i; +}