Ticket #113: ffmpeg-simpler-cabac.diff
| File ffmpeg-simpler-cabac.diff, 3.0 kB (added by astrange, 2 years ago) |
|---|
-
cabac.h
old new 267 267 c->bytestream+= CABAC_BITS/8; 268 268 } 269 269 270 static void refill2(CABACContext *c){270 static int refill2(CABACContext *c, int low){ 271 271 int i, x; 272 272 273 x= c->low ^ (c->low-1);273 x= low ^ (low-1); 274 274 i= 7 - ff_h264_norm_shift[x>>(CABAC_BITS-1)]; 275 275 276 x= -CABAC_MASK;277 278 276 #if CABAC_BITS == 16 279 x += (c->bytestream[0]<<9) + (c->bytestream[1]<<1);277 x= AV_RB16(c->bytestream)<<1; 280 278 #else 281 x += c->bytestream[0]<<1;279 x= c->bytestream[0]<<1; 282 280 #endif 281 282 x -= CABAC_MASK; 283 283 284 c->low += x<<i;284 low += x<<i; 285 285 c->bytestream+= CABAC_BITS/8; 286 287 return low; 286 288 } 287 289 288 290 static inline void renorm_cabac_decoder(CABACContext *c){ … … 534 536 #endif /* BRANCHLESS_CABAC_DECODER */ 535 537 #else /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */ 536 538 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]; 538 541 int bit, lps_mask attribute_unused; 539 542 540 c->range -= RangeLPS;543 range -= RangeLPS; 541 544 #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; 544 547 *state= ff_h264_mps_state[s]; 548 c->low= low; 549 c->range= range; 545 550 renorm_cabac_decoder_once(c); 546 551 }else{ 547 552 bit= ff_h264_norm_shift[RangeLPS]; 548 c->low -= (c->range<<(CABAC_BITS+1));553 low -= (range<<(CABAC_BITS+1)); 549 554 *state= ff_h264_lps_state[s]; 550 555 c->range = RangeLPS<<bit; 551 c->low <<= bit;552 bit= (s&1)^1;556 low <<= bit; 557 bit= s^1; 553 558 554 if(!( c->low & CABAC_MASK)){555 refill2(c);559 if(!(low & CABAC_MASK)){ 560 low = refill2(c, low); 556 561 } 562 563 c->low= low; 557 564 } 558 565 #else /* BRANCHLESS_CABAC_DECODER */ 559 lps_mask= (( c->range<<(CABAC_BITS+1)) - c->low)>>31;566 lps_mask= ((range<<(CABAC_BITS+1)) - low)>>31; 560 567 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; 563 570 564 571 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; 567 574 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; 573 583 #endif /* BRANCHLESS_CABAC_DECODER */ 574 584 #endif /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */ 575 return bit ;585 return bit&1; 576 586 } 577 587 578 588 static int av_noinline get_cabac_noinline(CABACContext *c, uint8_t * const state){
