H.264的一個重要特色就是採用UVLC(Universal Variable Length coding, 統一可變長編碼)編碼,提高了編碼效率。
UVLC編碼中有一種編碼方式就是指數哥倫布編碼。程式實現該編碼時需要計算編碼長度len及其value,下面分別對無符號和有符號兩種指數哥倫布編碼進行分析。
設編碼值為code_val。
static const int 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
};
void bs_write( bs_t *s, int bit_len, int value);
1. ue(v)
1) value = code_val+1 2)len = 2*i_size0_255[value]+1編程實現如下:
void ue_v( bs_t *s, unsigned int code_val )
{
int i_size = 0;
if( val == 0 )
{
bs_write( s, 1, 1);
}
else
{
unsigned int tmp = ++code_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, code_val);
}
}
2. se(v)
1) 若code_val>0: value = 2*code_val-1 若code_val>0: value = -2*val 2)len = 2*i_size0_255[value]+1編程實現如下:
static void se_v( bs_t *s, int code_val )
{
ue_v( s, code_val <= 0 ? -code_val * 2 : code_val * 2 - 1);
}