Browse code

dehack *ps_state indexing in the branchless decoder

Originally committed as revision 6683 to svn://svn.ffmpeg.org/ffmpeg/trunk

Michael Niedermayer authored on 2006/10/13 23:21:25
Showing 2 changed files
... ...
@@ -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)];