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 )
/* 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,
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
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;
bs_write32( s, 0 );
tmp >>= 16;
}
if( tmp >= 0x100 )
{
i_size += 8;
size = 16;
tmp >>= 8;
}
i_size += i_size0_255[tmp];
bs_write( s, 2 * i_size - 1, val );
}
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
{
unsigned int tmp = ++val;
int size = 0;
int tmp = val = val <= 0 ? -val*2+1 : val*2;
if( tmp >= 0x100 )
{
i_size += 8;
size = 16;
tmp >>= 8;
}
i_size += i_size0_255[tmp];
bs_write( s, 2 * i_size - 1, val );
}
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,7 +226,8 @@ 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 x264_ue_size_tab[val+1];
else
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