Ticket #113: ffmpeg-simpler-cabac.diff

File ffmpeg-simpler-cabac.diff, 3.0 kB (added by astrange, 2 years ago)

Same here; get_cabac_noinline() spills registers less, but decode_cabac_residual spills more (with assembler disabled on x86). I think this is still a win on PPC.

  • cabac.h

    old new  
    267267    c->bytestream+= CABAC_BITS/8; 
    268268} 
    269269 
    270 static void refill2(CABACContext *c){ 
     270static int refill2(CABACContext *c, int low){ 
    271271    int i, x; 
    272272 
    273     x= c->low ^ (c->low-1); 
     273    x= low ^ (low-1); 
    274274    i= 7 - ff_h264_norm_shift[x>>(CABAC_BITS-1)]; 
    275275 
    276     x= -CABAC_MASK; 
    277  
    278276#if CABAC_BITS == 16 
    279         x+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1)
     277        x= AV_RB16(c->bytestream)<<1
    280278#else 
    281         x+= c->bytestream[0]<<1; 
     279        x= c->bytestream[0]<<1; 
    282280#endif 
     281         
     282    x -= CABAC_MASK; 
    283283 
    284     c->low += x<<i; 
     284    low += x<<i; 
    285285    c->bytestream+= CABAC_BITS/8; 
     286     
     287    return low; 
    286288} 
    287289 
    288290static inline void renorm_cabac_decoder(CABACContext *c){ 
     
    534536#endif /* BRANCHLESS_CABAC_DECODER */ 
    535537#else /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */ 
    536538    int s = *state; 
    537     int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + s]; 
     539    int low = c->low, range = c->range; 
     540    int RangeLPS= ff_h264_lps_range[2*(range&0xC0) + s]; 
    538541    int bit, lps_mask attribute_unused; 
    539542 
    540     c->range -= RangeLPS; 
     543    range -= RangeLPS; 
    541544#ifndef BRANCHLESS_CABAC_DECODER 
    542     if(c->low < (c->range<<(CABAC_BITS+1))){ 
    543         bit= s&1
     545    if(low < (range<<(CABAC_BITS+1))){ 
     546        bit= s
    544547        *state= ff_h264_mps_state[s]; 
     548        c->low= low; 
     549        c->range= range; 
    545550        renorm_cabac_decoder_once(c); 
    546551    }else{ 
    547552        bit= ff_h264_norm_shift[RangeLPS]; 
    548         c->low -= (c->range<<(CABAC_BITS+1)); 
     553        low -= (range<<(CABAC_BITS+1)); 
    549554        *state= ff_h264_lps_state[s]; 
    550555        c->range = RangeLPS<<bit; 
    551         c->low <<= bit; 
    552         bit= (s&1)^1; 
     556        low <<= bit; 
     557        bit= s^1; 
    553558 
    554         if(!(c->low & CABAC_MASK)){ 
    555             refill2(c); 
     559        if(!(low & CABAC_MASK)){ 
     560            low = refill2(c, low); 
    556561        } 
     562         
     563        c->low= low; 
    557564    } 
    558565#else /* BRANCHLESS_CABAC_DECODER */ 
    559     lps_mask= ((c->range<<(CABAC_BITS+1)) - c->low)>>31; 
     566    lps_mask= ((range<<(CABAC_BITS+1)) - low)>>31; 
    560567 
    561     c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask; 
    562     c->range += (RangeLPS - c->range) & lps_mask; 
     568    low -= (range<<(CABAC_BITS+1)) & lps_mask; 
     569    range += (RangeLPS - range) & lps_mask; 
    563570 
    564571    s^=lps_mask; 
    565     *state= (ff_h264_mlps_state+128)[s]; 
    566     bit= s&1
     572    *state= ff_h264_mlps_state[s+128]; 
     573    bit= s
    567574 
    568     lps_mask= ff_h264_norm_shift[c->range]; 
    569     c->range<<= lps_mask; 
    570     c->low  <<= lps_mask; 
    571     if(!(c->low & CABAC_MASK)) 
    572         refill2(c); 
     575    lps_mask= ff_h264_norm_shift[range]; 
     576    range<<= lps_mask; 
     577    low  <<= lps_mask; 
     578 
     579    c->range= range; 
     580    if(!(low & CABAC_MASK)) 
     581        low = refill2(c, low); 
     582    c->low= low; 
    573583#endif /* BRANCHLESS_CABAC_DECODER */ 
    574584#endif /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */ 
    575     return bit
     585    return bit&1
    576586} 
    577587 
    578588static int av_noinline get_cabac_noinline(CABACContext *c, uint8_t * const state){