X-Git-Url: https://git.videolan.org/?p=ffmpeg.git;a=blobdiff_plain;f=libavcodec%2Fcabac.h;h=1377c61f38ebba9f1ab32cc6cebbe0177959fe3a;hp=69f66976887e6f20ef3de1ad10dc389c895d10cd;hb=61ccfcc00950ae53725abc50435b2cce72ec8deb;hpb=cf713bb8624d3e56e5077d51283f4e1ae02a5910 diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h index 69f6697688..1377c61f38 100644 --- a/libavcodec/cabac.h +++ b/libavcodec/cabac.h @@ -113,6 +113,9 @@ static inline void put_cabac_static(CABACContext *c, int RangeLPS, int bit){ #endif } +/** + * @param bit 0 -> 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 @@ static inline void put_cabac_terminate(CABACContext *c, int bit){ #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 @@ static inline int get_cabac_terminate(CABACContext *c){ } } +/** + * 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; +}