Originally committed as revision 6683 to svn://svn.ffmpeg.org/ffmpeg/trunk
| ... | ... |
@@ -50,6 +50,7 @@ static const uint8_t lps_range[64][4]= {
|
| 50 | 50 |
{ 6, 8, 9, 11}, { 6, 7, 9, 10}, { 6, 7, 8, 9}, { 2, 2, 2, 2},
|
| 51 | 51 |
}; |
| 52 | 52 |
|
| 53 |
+uint8_t ff_h264_mlps_state[4*64]; |
|
| 53 | 54 |
uint8_t ff_h264_lps_range[2*65][4]; |
| 54 | 55 |
uint8_t ff_h264_lps_state[2*64]; |
| 55 | 56 |
uint8_t ff_h264_mps_state[2*64]; |
| ... | ... |
@@ -132,16 +133,18 @@ void ff_init_cabac_states(CABACContext *c){
|
| 132 | 132 |
ff_h264_lps_range[2*i+1][j+4]= lps_range[i][j]; |
| 133 | 133 |
} |
| 134 | 134 |
|
| 135 |
+ ff_h264_mlps_state[128+2*i+0]= |
|
| 135 | 136 |
ff_h264_mps_state[2*i+0]= 2*mps_state[i]+0; |
| 137 |
+ ff_h264_mlps_state[128+2*i+1]= |
|
| 136 | 138 |
ff_h264_mps_state[2*i+1]= 2*mps_state[i]+1; |
| 137 | 139 |
|
| 138 | 140 |
if( i ){
|
| 139 | 141 |
#ifdef BRANCHLESS_CABAC_DECODER |
| 140 |
- ff_h264_mps_state[-2*i-1]= 2*lps_state[i]+0; //FIXME yes this is not valid C but iam lazy, cleanup welcome |
|
| 141 |
- ff_h264_mps_state[-2*i-2]= 2*lps_state[i]+1; |
|
| 142 |
+ ff_h264_mlps_state[128-2*i-1]= 2*lps_state[i]+0; |
|
| 143 |
+ ff_h264_mlps_state[128-2*i-2]= 2*lps_state[i]+1; |
|
| 142 | 144 |
}else{
|
| 143 |
- ff_h264_mps_state[-2*i-1]= 1; |
|
| 144 |
- ff_h264_mps_state[-2*i-2]= 0; |
|
| 145 |
+ ff_h264_mlps_state[128-2*i-1]= 1; |
|
| 146 |
+ ff_h264_mlps_state[128-2*i-2]= 0; |
|
| 145 | 147 |
#else |
| 146 | 148 |
ff_h264_lps_state[2*i+0]= 2*lps_state[i]+0; |
| 147 | 149 |
ff_h264_lps_state[2*i+1]= 2*lps_state[i]+1; |
| ... | ... |
@@ -47,6 +47,7 @@ typedef struct CABACContext{
|
| 47 | 47 |
PutBitContext pb; |
| 48 | 48 |
}CABACContext; |
| 49 | 49 |
|
| 50 |
+extern uint8_t ff_h264_mlps_state[4*64]; |
|
| 50 | 51 |
extern uint8_t ff_h264_lps_range[2*65][4]; ///< rangeTabLPS |
| 51 | 52 |
extern uint8_t ff_h264_mps_state[2*64]; ///< transIdxMPS |
| 52 | 53 |
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 |
| 480 | 480 |
#endif /* CMOV_IS_FAST */ |
| 481 | 481 |
|
| 482 | 482 |
//eax:state ebx:low edx:mask esi:range |
| 483 |
- "movzbl "MANGLE(ff_h264_mps_state)"(%%eax), %%ecx \n\t" |
|
| 483 |
+ "movzbl "MANGLE(ff_h264_mlps_state)"+128(%%eax), %%ecx \n\t" |
|
| 484 | 484 |
"movb %%cl, (%1) \n\t" |
| 485 | 485 |
|
| 486 | 486 |
"movl %%esi, %%edx \n\t" |
| ... | ... |
@@ -550,7 +551,7 @@ static int always_inline get_cabac_inline(CABACContext *c, uint8_t * const state |
| 550 | 550 |
c->range += (RangeLPS - c->range) & lps_mask; |
| 551 | 551 |
|
| 552 | 552 |
s^=lps_mask; |
| 553 |
- *state= ff_h264_mps_state[s]; |
|
| 553 |
+ *state= (ff_h264_mlps_state+128)[s]; |
|
| 554 | 554 |
bit= s&1; |
| 555 | 555 |
|
| 556 | 556 |
lps_mask= ff_h264_norm_shift[c->range>>(CABAC_BITS+3)]; |