mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-02 05:56:46 +08:00
dehack *ps_state indexing in the branchless decoder
Originally committed as revision 6683 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@ -50,6 +50,7 @@ static const uint8_t lps_range[64][4]= {
|
|||||||
{ 6, 8, 9, 11}, { 6, 7, 9, 10}, { 6, 7, 8, 9}, { 2, 2, 2, 2},
|
{ 6, 8, 9, 11}, { 6, 7, 9, 10}, { 6, 7, 8, 9}, { 2, 2, 2, 2},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint8_t ff_h264_mlps_state[4*64];
|
||||||
uint8_t ff_h264_lps_range[2*65][4];
|
uint8_t ff_h264_lps_range[2*65][4];
|
||||||
uint8_t ff_h264_lps_state[2*64];
|
uint8_t ff_h264_lps_state[2*64];
|
||||||
uint8_t ff_h264_mps_state[2*64];
|
uint8_t ff_h264_mps_state[2*64];
|
||||||
@ -132,16 +133,18 @@ void ff_init_cabac_states(CABACContext *c){
|
|||||||
ff_h264_lps_range[2*i+1][j+4]= lps_range[i][j];
|
ff_h264_lps_range[2*i+1][j+4]= lps_range[i][j];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ff_h264_mlps_state[128+2*i+0]=
|
||||||
ff_h264_mps_state[2*i+0]= 2*mps_state[i]+0;
|
ff_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;
|
ff_h264_mps_state[2*i+1]= 2*mps_state[i]+1;
|
||||||
|
|
||||||
if( i ){
|
if( i ){
|
||||||
#ifdef BRANCHLESS_CABAC_DECODER
|
#ifdef BRANCHLESS_CABAC_DECODER
|
||||||
ff_h264_mps_state[-2*i-1]= 2*lps_state[i]+0; //FIXME yes this is not valid C but iam lazy, cleanup welcome
|
ff_h264_mlps_state[128-2*i-1]= 2*lps_state[i]+0;
|
||||||
ff_h264_mps_state[-2*i-2]= 2*lps_state[i]+1;
|
ff_h264_mlps_state[128-2*i-2]= 2*lps_state[i]+1;
|
||||||
}else{
|
}else{
|
||||||
ff_h264_mps_state[-2*i-1]= 1;
|
ff_h264_mlps_state[128-2*i-1]= 1;
|
||||||
ff_h264_mps_state[-2*i-2]= 0;
|
ff_h264_mlps_state[128-2*i-2]= 0;
|
||||||
#else
|
#else
|
||||||
ff_h264_lps_state[2*i+0]= 2*lps_state[i]+0;
|
ff_h264_lps_state[2*i+0]= 2*lps_state[i]+0;
|
||||||
ff_h264_lps_state[2*i+1]= 2*lps_state[i]+1;
|
ff_h264_lps_state[2*i+1]= 2*lps_state[i]+1;
|
||||||
|
@ -47,6 +47,7 @@ typedef struct CABACContext{
|
|||||||
PutBitContext pb;
|
PutBitContext pb;
|
||||||
}CABACContext;
|
}CABACContext;
|
||||||
|
|
||||||
|
extern uint8_t ff_h264_mlps_state[4*64];
|
||||||
extern uint8_t ff_h264_lps_range[2*65][4]; ///< rangeTabLPS
|
extern uint8_t ff_h264_lps_range[2*65][4]; ///< rangeTabLPS
|
||||||
extern uint8_t ff_h264_mps_state[2*64]; ///< transIdxMPS
|
extern uint8_t ff_h264_mps_state[2*64]; ///< transIdxMPS
|
||||||
extern uint8_t ff_h264_lps_state[2*64]; ///< transIdxLPS
|
extern uint8_t ff_h264_lps_state[2*64]; ///< transIdxLPS
|
||||||
@ -480,7 +481,7 @@ static int always_inline get_cabac_inline(CABACContext *c, uint8_t * const state
|
|||||||
#endif /* CMOV_IS_FAST */
|
#endif /* CMOV_IS_FAST */
|
||||||
|
|
||||||
//eax:state ebx:low edx:mask esi:range
|
//eax:state ebx:low edx:mask esi:range
|
||||||
"movzbl "MANGLE(ff_h264_mps_state)"(%%eax), %%ecx \n\t"
|
"movzbl "MANGLE(ff_h264_mlps_state)"+128(%%eax), %%ecx \n\t"
|
||||||
"movb %%cl, (%1) \n\t"
|
"movb %%cl, (%1) \n\t"
|
||||||
|
|
||||||
"movl %%esi, %%edx \n\t"
|
"movl %%esi, %%edx \n\t"
|
||||||
@ -550,7 +551,7 @@ static int always_inline get_cabac_inline(CABACContext *c, uint8_t * const state
|
|||||||
c->range += (RangeLPS - c->range) & lps_mask;
|
c->range += (RangeLPS - c->range) & lps_mask;
|
||||||
|
|
||||||
s^=lps_mask;
|
s^=lps_mask;
|
||||||
*state= ff_h264_mps_state[s];
|
*state= (ff_h264_mlps_state+128)[s];
|
||||||
bit= s&1;
|
bit= s&1;
|
||||||
|
|
||||||
lps_mask= ff_h264_norm_shift[c->range>>(CABAC_BITS+3)];
|
lps_mask= ff_h264_norm_shift[c->range>>(CABAC_BITS+3)];
|
||||||
|
Reference in New Issue
Block a user