在对语法元素进行编码前,需要对语法元素进行二进制化(使用二进制符号0或1表示)。VVC中常用的二进制化方法包括截断莱码(truncated Rice (TR) )、截断二进制码(truncated binary (TB) )、k阶指数哥伦布码(the k-th order Exp-Golomb (EGk) binarization )和定长码( fixed-length (FL))。
1、定长码
给定一个参数cMax,使用定长码编码得到的码长为
Length = Ceil( Log2( cMax + 1 ) )
对于待编码的语法元素值x,当0<=x<=cMax时,通过十进制转二进制的方法,得到x的长度为Length的二进制码。
通常,当语法元素的概率呈现均匀分布的时候,可以用定长码,如split_cu_flag、split_qt_flag等。
coding_tree( ) | split_cu_flag | FL | cMax = 1 |
split_qt_flag | FL | cMax = 1 | |
mtt_split_cu_vertical_flag | FL | cMax = 1 | |
mtt_split_cu_binary_flag | FL | cMax = 1 | |
non_inter_flag | FL | cMax = 1 | |
coding_unit( ) | cu_skip_flag[ ][ ] | FL | cMax = 1 |
pred_mode_ibc_flag | FL | cMax = 1 | |
pred_mode_plt_flag | FL | cMax = 1 | |
cu_act_enabled_flag | FL | cMax = 1 | |
pred_mode_flag | FL | cMax = 1 | |
intra_bdpcm_luma_flag | FL | cMax = 1 | |
intra_bdpcm_luma_dir_flag | FL | cMax = 1 | |
intra_mip_flag[ ][ ] | FL | cMax = 1 | |
intra_mip_transposed_flag[ ][ ] | FL | cMax = 1 |
2. 截断一元码(Truncated Unary,TU)
给定输入语法元素值x,截断一元码由最大可能值cMax控制。
- 当x < cMax时,截断一元码为普通一元码,即由x个“1”(或者“0”)加一个终结比特“0”(或者“1”)组成;
- 当x >= cMax时,则取x=cMax进行编码:此时输出x个“1”,终结比特“0”被忽略
以cMax=4的截断一元码为例:
x | TU(x) |
0 | 0 |
1 | 10 |
2 | 110 |
3 | 1110 |
4 | 1111 |
5 | 1111 |
... |
3、截断莱斯码(Truncated Rice, TR )
给定输入语法元素值x,截断莱斯码由门限值参数cMax和莱斯参数cRiceParam控制。
TR码通常由前缀字符串prefix bin string和后缀字符串suffix bin string(如果存在)组成。
(1)前缀字符串
前缀字符串由一元码组成。对于语法元素x,其前缀值prefixVal的推导如下:
prefixVal = symbolVal >> cRiceParam
对应前缀字符串的推导如下:
- 若 prefixVal小于cMax >> cRiceParam,则前缀字符串的长度为prefixVal + 1,即prefixVal个1与1个0组成(下表说明了前缀二进制化字符串)
- 若prefixVal大于等于cMax >> cRiceParam,则前缀字符串的长度为cMax >> cRiceParam,即cMax >> cRiceParam个1组成
prefixVal | Bin string | |||||
0 | 0 | |||||
1 | 1 | 0 | ||||
2 | 1 | 1 | 0 | |||
3 | 1 | 1 | 1 | 0 | ||
4 | 1 | 1 | 1 | 1 | 0 | |
5 | 1 | 1 | 1 | 1 | 1 | 0 |
... | ||||||
binIdx | 0 | 1 | 2 | 3 | 4 | 5 |
(2)后缀字符串
当x < cMax且参数cRiceParam > 0时,后缀字符串才存在。当后缀字符串存在时,后缀值suffixVal的推导如下:
suffixVal = x − ( prefixVal << cRiceParam )
后缀字符串通常是使用定长码得到的(输入值为suffixVal,cMax为 ( 1 << cRiceParam) − 1)
注意:对于输入参数 cRiceParam = 0,TR二进制化恰好是截断一元码,并且总是使用等于被解码的语法元素的最大可能值的 cMax 值。在VVC中,所有使用TR的语法元素后缀长度都为0,也就是后缀不存在。此时截断莱斯码等同于截断一元码。
coding_tree_unit( ) | ||
alf_ctb_filter_alt_idx[ ][ ][ ] | TR | cMax = alf_chroma_num_alt_filters_minus1, cRiceParam = 0 |
alf_ctb_cc_cb_idc[ ][ ] | TR | cMax = ( alf_cc_cb_filters_signalled_minus1 + 1 ), cRiceParam = 0 |
alf_ctb_cc_cr_idc[ ][ ] | TR | cMax = ( alf_cc_cr_filters_signalled_minus1 + 1 ), cRiceParam = 0 |
4、截断二进制码(truncated binary, TB)
给定输入语法元素x,参数值cMax,TB的二进制化过程如下:
n = cMax + 1
k = Floor( Log2( n ) )
u = ( 1 << ( k + 1 ) ) − n
- 当x小于u时,此时TB二进制化等同于输入为x,CMax为( 1 << k ) − 1的定长码
- 当x大于等于u时,此时TB二进制化等同于输入为x+u,CMax为 ( 1 << ( k + 1 ) ) − 1的定长码
cMax | x | TB |
5 | 0 | 00 |
1 | 01 | |
2 | 100 | |
3 | 101 | |
4 | 110 | |
5 | 111 |
VVC中使用TB编码的语法元素如下所示:
coding_unit( ) | ||
intra_mip_mode[ ][ ] | TB | cMax = (cbWidth = = 4 && cbHeight = = 4) ? 15 : ( ( (cbWith = = 4 | | cbHeight = = 4) | | (cbWith = = 8 && cbHeight = = 8) )? 7 : 5) |
intra_luma_mpm_remainder[ ][ ] | TB | cMax = 60 |
// symbol为当前待编码的符号 maxSymbol为cMax
void CABACWriter::xWriteTruncBinCode(uint32_t symbol, uint32_t maxSymbol)
{int thresh;if (maxSymbol > 256){int threshVal = 1 << 8;thresh = 8;while (threshVal <= maxSymbol){thresh++;threshVal <<= 1;}thresh--;}else{thresh = g_tbMax[maxSymbol]; // k = Floor( Log2( cMAX ) ) }int val = 1 << thresh; assert(val <= maxSymbol);assert((val << 1) > maxSymbol);assert(symbol < maxSymbol);int b = maxSymbol - val;assert(b < val);if (symbol < val - b) // val-b = u{m_BinEncoder.encodeBinsEP(symbol, thresh);}else{symbol += val - b;assert(symbol < (val << 1));assert((symbol >> 1) >= val - b);m_BinEncoder.encodeBinsEP(symbol, thresh + 1);}
}
5、零阶指数哥伦布码
零阶指数哥伦布由前缀和后缀组成:
前缀是一元码:000...01,其中0的个数
后缀是INFO的二进制表示,其中
其中codeNum为编码数值索引:
- 对于无符号数V,其索引
- 对于有符号数V,其索引
编码时,根据待编码的数值,选择无符号数指数哥伦布编码ue(v)或者有符号数指数哥伦布编码se(v)
解码:读取第一个1之前的0的个数M,再读取第一个1后的M比特INFO(二进制转换为十进制),根据得到codeNum,然后根据ue(v)或者se(v)得到V(即根据有符号数还是无符号数映射)
(参考:指数哥伦布编码)
零阶指数哥伦布编码主要用于用于视频参数集(Video Parameter Set,VPS)、序列参数集(Sequence Parameter Set,SPS)、图像参数集(Picture Parameter Set,PPS)和片头信息等所设计的大部分语法元素中,如:
sps_pic_width_max_in_luma_samples | ue(v) |
sps_pic_height_max_in_luma_samples | ue(v) |
sps_conf_win_left_offset | ue(v) |
sps_conf_win_right_offset | ue(v) |
sps_conf_win_top_offset | ue(v) |
sps_conf_win_bottom_offset | ue(v) |