summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2006-10-08 13:20:22 +0000
committerMichael Niedermayer <michaelni@gmx.at>2006-10-08 13:20:22 +0000
commit260ceb632295f7cea1248ed062e9ac95641edf27 (patch)
tree65e24c8fc44b1d5f8b2f9d2eaad7f389209eaa88
parent99ce10873df41ba650e51c8069280a32a1f57961 (diff)
branchless renormalization (1% faster get_cabac) old branchless renormalization wasnt faster because gcc was scared of the shift variable (missusing bit variable now)
Originally committed as revision 6587 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/cabac.c18
-rw-r--r--libavcodec/cabac.h21
2 files changed, 20 insertions, 19 deletions
diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c
index 8dd00a3cd9..f724dd5368 100644
--- a/libavcodec/cabac.c
+++ b/libavcodec/cabac.c
@@ -73,22 +73,22 @@ const uint8_t ff_h264_lps_state[64]= {
};
const uint8_t ff_h264_norm_shift[256]= {
- 8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,
+ 9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
/**
diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h
index a71b75a0f4..3008792b21 100644
--- a/libavcodec/cabac.h
+++ b/libavcodec/cabac.h
@@ -266,16 +266,16 @@ static void refill(CABACContext *c){
c->bytestream+= CABAC_BITS/8;
}
-#if 0 /* all use commented */
+#if 1 /* all use commented */
static void refill2(CABACContext *c){
int i, x;
x= c->low ^ (c->low-1);
- i= 8 - ff_h264_norm_shift[x>>(CABAC_BITS+1)];
+ i= 9 - ff_h264_norm_shift[x>>(CABAC_BITS+1)];
x= -CABAC_MASK;
- if(c->bytestream < c->bytestream_end)
+ if(c->bytestream <= c->bytestream_end)
#if CABAC_BITS == 16
x+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1);
#else
@@ -395,17 +395,18 @@ asm(
#endif
renorm_cabac_decoder_once(c);
}else{
-// int shift= ff_h264_norm_shift[RangeLPS>>17];
- bit= (s&1)^1;
+ bit= ff_h264_norm_shift[RangeLPS>>17];
c->low -= c->range;
*state= c->lps_state[s];
- c->range = RangeLPS;
- renorm_cabac_decoder(c);
-/* c->range = RangeLPS<<shift;
- c->low <<= shift;
+// c->range = RangeLPS;
+// renorm_cabac_decoder(c);
+ c->range = RangeLPS<<bit;
+ c->low <<= bit;
+ bit= (s&1)^1;
+
if(!(c->low & 0xFFFF)){
refill2(c);
- }*/
+ }
}
#else
lps_mask= (c->range - c->low)>>31;