X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fcabac.c;h=9b880d2398ed76fba57460364499df97a62fefc5;hb=006508032057824a371bec4e629b66f8cbb26c47;hp=e03043f91f64c6da684a9240371a0c346d302e27;hpb=552ec4c9fda480d61bff8447347b08f927f1fca3;p=ffmpeg diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c index e03043f91f6..9b880d2398e 100644 --- a/libavcodec/cabac.c +++ b/libavcodec/cabac.c @@ -29,6 +29,7 @@ #include "libavutil/common.h" #include "get_bits.h" #include "cabac.h" +#include "cabac_functions.h" static const uint8_t lps_range[64][4]= { {128,176,208,240}, {128,167,197,227}, {128,158,187,216}, {123,150,178,205}, @@ -52,7 +53,7 @@ static const uint8_t lps_range[64][4]= { uint8_t ff_h264_mlps_state[4*64]; uint8_t ff_h264_lps_range[4*2*64]; uint8_t ff_h264_lps_state[2*64]; -uint8_t ff_h264_mps_state[2*64]; +static uint8_t h264_mps_state[2 * 64]; static const uint8_t mps_state[64]= { 1, 2, 3, 4, 5, 6, 7, 8, @@ -109,10 +110,6 @@ void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size){ c->low= 0; c->range= 0x1FE; c->outstanding_count= 0; -#ifdef STRICT_LIMITS - c->sym_count =0; -#endif - c->pb.bit_left++; //avoids firstBitFlag } @@ -145,9 +142,9 @@ void ff_init_cabac_states(CABACContext *c){ } ff_h264_mlps_state[128+2*i+0]= - ff_h264_mps_state[2*i+0]= 2*mps_state[i]+0; + h264_mps_state[2 * i + 0] = 2 * mps_state[i] + 0; ff_h264_mlps_state[128+2*i+1]= - ff_h264_mps_state[2*i+1]= 2*mps_state[i]+1; + h264_mps_state[2 * i + 1] = 2 * mps_state[i] + 1; if( i ){ ff_h264_lps_state[2*i+0]= @@ -170,12 +167,37 @@ void ff_init_cabac_states(CABACContext *c){ #include "avcodec.h" #include "cabac.h" +static inline void put_cabac_bit(CABACContext *c, int b){ + put_bits(&c->pb, 1, b); + for(;c->outstanding_count; c->outstanding_count--){ + put_bits(&c->pb, 1, 1-b); + } +} + +static inline void renorm_cabac_encoder(CABACContext *c){ + while(c->range < 0x100){ + //FIXME optimize + if(c->low<0x100){ + put_cabac_bit(c, 0); + }else if(c->low<0x200){ + c->outstanding_count++; + c->low -= 0x100; + }else{ + put_cabac_bit(c, 1); + c->low -= 0x200; + } + + c->range+= c->range; + c->low += c->low; + } +} + static void put_cabac(CABACContext *c, uint8_t * const state, int bit){ int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state]; if(bit == ((*state)&1)){ c->range -= RangeLPS; - *state= ff_h264_mps_state[*state]; + *state = h264_mps_state[*state]; }else{ c->low += c->range - RangeLPS; c->range = RangeLPS; @@ -183,10 +205,6 @@ static void put_cabac(CABACContext *c, uint8_t * const state, int bit){ } renorm_cabac_encoder(c); - -#ifdef STRICT_LIMITS - c->symCount++; -#endif } /** @@ -208,10 +226,6 @@ static void put_cabac_bypass(CABACContext *c, int bit){ put_cabac_bit(c, 1); c->low -= 0x400; } - -#ifdef STRICT_LIMITS - c->symCount++; -#endif } /** @@ -236,74 +250,9 @@ static int put_cabac_terminate(CABACContext *c, int bit){ flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong } -#ifdef STRICT_LIMITS - c->symCount++; -#endif - return (put_bits_count(&c->pb)+7)>>3; } -/** - * put (truncated) unary binarization. - */ -static void put_cabac_u(CABACContext *c, uint8_t * state, int v, int max, int max_index, int truncated){ - int i; - - assert(v <= max); - - 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); - } -} - int main(void){ CABACContext c; uint8_t b[9*SIZE]; @@ -333,19 +282,6 @@ START_TIMER STOP_TIMER("put_cabac") } -#if 0 - for(i=0; i