Commit 91e0ff6b authored by Loren Merritt's avatar Loren Merritt

faster ue/se/te write

parent ab90da74
...@@ -132,73 +132,61 @@ static inline void bs_align_1( bs_t *s ) ...@@ -132,73 +132,61 @@ static inline void bs_align_1( bs_t *s )
/* golomb functions */ /* golomb functions */
static const uint8_t i_size0_255[256] = static const uint8_t x264_ue_size_tab[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, 1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
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, 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
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, 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
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, 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
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, 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
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, 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
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 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 ) static inline void bs_write_ue_big( bs_t *s, unsigned int val )
{ {
int i_size = 0; int size = 0;
int tmp = ++val;
if( val == 0 ) if( tmp >= 0x10000 )
bs_write1( s, 1 );
else
{ {
unsigned int tmp = ++val; bs_write32( s, 0 );
if( tmp >= 0x00010000 )
{
i_size += 16;
tmp >>= 16; tmp >>= 16;
} }
if( tmp >= 0x100 ) if( tmp >= 0x100 )
{ {
i_size += 8; size = 16;
tmp >>= 8; tmp >>= 8;
} }
i_size += i_size0_255[tmp]; size += x264_ue_size_tab[tmp];
bs_write( s, size, val );
bs_write( s, 2 * i_size - 1, val );
}
} }
/* Only works on values under 255. */ /* Only works on values under 255. */
static inline void bs_write_ue( bs_t *s, int val ) static inline void bs_write_ue( bs_t *s, int val )
{ {
if( val == 0 ) bs_write( s, x264_ue_size_tab[val+1], val+1 );
bs_write1( s, 1 );
else
bs_write( s, 2 * i_size0_255[val+1] - 1, val+1 );
} }
static inline void bs_write_se( bs_t *s, int val ) static inline void bs_write_se( bs_t *s, int val )
{ {
int i_size = 0; int size = 0;
val = val <= 0 ? -val * 2 : val * 2 - 1; int tmp = val = val <= 0 ? -val*2+1 : val*2;
if( val == 0 )
bs_write1( s, 1 );
else
{
unsigned int tmp = ++val;
if( tmp >= 0x100 ) if( tmp >= 0x100 )
{ {
i_size += 8; size = 16;
tmp >>= 8; tmp >>= 8;
} }
i_size += i_size0_255[tmp]; size += x264_ue_size_tab[tmp];
bs_write( s, size, val );
bs_write( s, 2 * i_size - 1, val );
}
} }
static inline void bs_write_te( bs_t *s, int x, int 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 ) ...@@ -215,50 +203,22 @@ static inline void bs_rbsp_trailing( bs_t *s )
bs_flush( 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 ) 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 ) static inline int bs_size_ue_big( unsigned int val )
{ {
if( val < 255 ) if( val < 255 )
return i_size0_254[val]; return x264_ue_size_tab[val+1];
else else
{ return x264_ue_size_tab[(val+1)>>8] + 16;
val++;
val = (val >> 8) - 1;
return i_size0_254[val] + 16;
}
} }
static inline int bs_size_se( int val ) static inline int bs_size_se( int val )
{ {
val = val <= 0 ? -val * 2 : val * 2 - 1; return bs_size_ue_big( 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;
}
} }
static inline int bs_size_te( int x, int val ) static inline int bs_size_te( int x, int val )
...@@ -266,7 +226,8 @@ static inline int bs_size_te( int x, int val ) ...@@ -266,7 +226,8 @@ static inline int bs_size_te( int x, int val )
if( x == 1 ) if( x == 1 )
return 1; return 1;
else if( x > 1 ) else if( x > 1 )
return i_size0_254[val]; return x264_ue_size_tab[val+1];
else
return 0; return 0;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment