From 99ce10873df41ba650e51c8069280a32a1f57961 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 8 Oct 2006 11:24:37 +0000 Subject: [PATCH] 5% faster get_cabac() Originally committed as revision 6586 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/cabac.c | 16 ++++++++-------- libavcodec/cabac.h | 24 ++++++++++++++++++++---- libavcodec/h264.c | 4 ++-- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c index 86eb4696cb..8dd00a3cd9 100644 --- a/libavcodec/cabac.c +++ b/libavcodec/cabac.c @@ -133,19 +133,19 @@ void ff_init_cabac_states(CABACContext *c, uint8_t const (*lps_range)[4], for(i=0; ilps_range[2*i+0][j+4]= - c->lps_range[2*i+1][j+4]= lps_range[i][j]; + c->lps_range[2*i+2][j+4]= + c->lps_range[2*i+3][j+4]= lps_range[i][j]; } - c->mps_state[2*i+0]= 2*mps_state[i]; - c->mps_state[2*i+1]= 2*mps_state[i]+1; + c->mps_state[2*i+2]= 2*mps_state[i]+2; + c->mps_state[2*i+3]= 2*mps_state[i]+3; if( i ){ - c->lps_state[2*i+0]= 2*lps_state[i]; - c->lps_state[2*i+1]= 2*lps_state[i]+1; + c->lps_state[2*i+2]= 2*lps_state[i]+2; + c->lps_state[2*i+3]= 2*lps_state[i]+3; }else{ - c->lps_state[2*i+0]= 1; - c->lps_state[2*i+1]= 0; + c->lps_state[2*i+2]= 3; + c->lps_state[2*i+3]= 2; } } } diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h index 18fd51d56a..a71b75a0f4 100644 --- a/libavcodec/cabac.h +++ b/libavcodec/cabac.h @@ -39,9 +39,9 @@ typedef struct CABACContext{ #ifdef STRICT_LIMITS int symCount; #endif - uint8_t lps_range[2*65][4]; ///< rangeTabLPS - uint8_t lps_state[2*64]; ///< transIdxLPS - uint8_t mps_state[2*64]; ///< transIdxMPS + uint8_t lps_range[2*66][4]; ///< rangeTabLPS + uint8_t lps_state[2*65]; ///< transIdxLPS + uint8_t mps_state[2*65]; ///< transIdxMPS const uint8_t *bytestream_start; const uint8_t *bytestream; const uint8_t *bytestream_end; @@ -376,7 +376,23 @@ static int get_cabac(CABACContext *c, uint8_t * const state){ #if 1 if(c->low < c->range){ bit= s&1; - *state= c->mps_state[s]; +#ifdef ARCH_X86 + //P3:627 +asm( + "addb $2, %b0 \n\t" + " js 1f \n\t" + "movb %b0, %1 \n\t" + "1: \n\t" + : "+q"(s), "=m"(*state) +); +#else + *state= c->mps_state[s]; //P3:655 +/* if(s<126) //P3:657 + *state= s+2;*/ + s+=2; //P3:631 + if(s<128) + *state= s; +#endif renorm_cabac_decoder_once(c); }else{ // int shift= ff_h264_norm_shift[RangeLPS>>17]; diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 5afda47f64..060d38699e 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -7399,9 +7399,9 @@ static int decode_slice(H264Context *h){ pre = clip( ((cabac_context_init_PB[h->cabac_init_idc][i][0] * s->qscale) >>4 ) + cabac_context_init_PB[h->cabac_init_idc][i][1], 1, 126 ); if( pre <= 63 ) - h->cabac_state[i] = 2 * ( 63 - pre ) + 0; + h->cabac_state[i] = 2 * ( 63 - pre ) + 2; else - h->cabac_state[i] = 2 * ( pre - 64 ) + 1; + h->cabac_state[i] = 2 * ( pre - 64 ) + 3; } for(;;){