faster ue/se/te write
authorLoren Merritt <pengvado@akuvian.org>
Sat, 5 Jul 2008 00:56:30 +0000 (18:56 -0600)
committerLoren Merritt <pengvado@akuvian.org>
Thu, 10 Jul 2008 13:36:23 +0000 (07:36 -0600)
common/bs.h

index 823471a..1503fed 100644 (file)
@@ -132,73 +132,61 @@ static inline void bs_align_1( bs_t *s )
 
 /* golomb functions */
 
-static const uint8_t i_size0_255[256] =
-{
-    1,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
-    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
-    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
+static const uint8_t x264_ue_size_tab[256] =
+{
+     1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
+     9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+    11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+    11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+    13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
+    13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
+    13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
+    13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
+    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
 };
 
 static inline void bs_write_ue_big( bs_t *s, unsigned int val )
 {
-    int i_size = 0;
-
-    if( val == 0 )
-        bs_write1( s, 1 );
-    else
+    int size = 0;
+    int tmp = ++val;
+    if( tmp >= 0x10000 )
     {
-        unsigned int tmp = ++val;
-
-        if( tmp >= 0x00010000 )
-        {
-            i_size += 16;
-            tmp >>= 16;
-        }
-        if( tmp >= 0x100 )
-        {
-            i_size += 8;
-            tmp >>= 8;
-        }
-        i_size += i_size0_255[tmp];
-
-        bs_write( s, 2 * i_size - 1, val );
+        bs_write32( s, 0 );
+        tmp >>= 16;
+    }
+    if( tmp >= 0x100 )
+    {
+        size = 16;
+        tmp >>= 8;
     }
+    size += x264_ue_size_tab[tmp];
+    bs_write( s, size, val );
 }
 
 /* Only works on values under 255. */
 static inline void bs_write_ue( bs_t *s, int val )
 {
-    if( val == 0 )
-        bs_write1( s, 1 );
-    else
-        bs_write( s, 2 * i_size0_255[val+1] - 1, val+1 );
+    bs_write( s, x264_ue_size_tab[val+1], val+1 );
 }
 
 static inline void bs_write_se( bs_t *s, int val )
 {
-    int i_size = 0;
-    val = val <= 0 ? -val * 2 : val * 2 - 1;
-
-    if( val == 0 )
-        bs_write1( s, 1 );
-    else
+    int size = 0;
+    int tmp = val = val <= 0 ? -val*2+1 : val*2;
+    if( tmp >= 0x100 )
     {
-        unsigned int tmp = ++val;
-
-        if( tmp >= 0x100 )
-        {
-            i_size += 8;
-            tmp >>= 8;
-        }
-        i_size += i_size0_255[tmp];
-
-        bs_write( s, 2 * i_size - 1, val );
+        size = 16;
+        tmp >>= 8;
     }
+    size += x264_ue_size_tab[tmp];
+    bs_write( s, size, val );
 }
 
 static inline void bs_write_te( bs_t *s, int x, int val )
@@ -215,50 +203,22 @@ static inline void bs_rbsp_trailing( bs_t *s )
     bs_flush( s );
 }
 
-static const uint8_t i_size0_254[255] =
-{
-    1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
-    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
-    11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
-    11,11,11,11,11,11,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
-    13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
-    13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
-    13,13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
-    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
-    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
-    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
-    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
-    15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
-};
-
 static inline int bs_size_ue( unsigned int val )
 {
-    return i_size0_254[val];
+    return x264_ue_size_tab[val+1];
 }
 
 static inline int bs_size_ue_big( unsigned int val )
 {
     if( val < 255 )
-        return i_size0_254[val];
+        return x264_ue_size_tab[val+1];
     else
-    {
-        val++;
-        val = (val >> 8) - 1;
-        return i_size0_254[val] + 16;
-    }
+        return x264_ue_size_tab[(val+1)>>8] + 16;
 }
 
 static inline int bs_size_se( int val )
 {
-    val = val <= 0 ? -val * 2 : val * 2 - 1;
-    if( val < 255 )
-        return i_size0_254[val];
-    else
-    {
-        val++;
-        val = (val >> 8) - 1;
-        return i_size0_254[val] + 16;
-    }
+    return bs_size_ue_big( val <= 0 ? -val*2 : val*2-1 );
 }
 
 static inline int bs_size_te( int x, int val )
@@ -266,8 +226,9 @@ static inline int bs_size_te( int x, int val )
     if( x == 1 )
         return 1;
     else if( x > 1 )
-        return i_size0_254[val];
-    return 0;
+        return x264_ue_size_tab[val+1];
+    else
+        return 0;
 }
 
 #endif