From: Loren Merritt Date: Sat, 5 Jul 2008 00:56:30 +0000 (-0600) Subject: faster ue/se/te write X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=91e0ff6b490a01f5f5438639ed517cb4b09802f0;p=libx264 faster ue/se/te write --- diff --git a/common/bs.h b/common/bs.h index 823471a7..1503fed9 100644 --- a/common/bs.h +++ b/common/bs.h @@ -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