H.266/VVC熵编码之二进制化

news/2025/3/29 14:19:52/

在对语法元素进行编码前,需要对语法元素进行二进制化(使用二进制符号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的截断一元码为例:

xTU(x)
00
110
2110
31110
41111
51111
...

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的定长码
cMaxxTB
5000
101
2100
3101
4110
5111

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的个数M = \left \lfloor (codeNum+1) \right \rfloor

后缀是INFO的二进制表示,其中INFO=codeNum+1-2^{M}

其中codeNum为编码数值索引:

  • 对于无符号数V,其索引CodeNum=V
  • 对于有符号数V,其索引codeNum=\left\{\begin{matrix} 2V-1 & ,V >0\\ -2V & ,V\leqslant 0 \end{matrix}\right.

编码时,根据待编码的数值,选择无符号数指数哥伦布编码ue(v)或者有符号数指数哥伦布编码se(v)

解码:读取第一个1之前的0的个数M,再读取第一个1后的M比特INFO(二进制转换为十进制),根据codeNum=2^{M}+INFO-1得到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)


http://www.ppmy.cn/news/130348.html

相关文章

H.266/VVC变换量化部分内容总结

变换 一、基础内容 VVC中使用了DCT-2变换、DST-7变换和DCT-8变换作为主变换&#xff1b;同时为了进一步提高变换的性能&#xff0c;VVC针对帧内预测残差的低频分量引入了不可分变换作为二次变换&#xff08;低频不可分二次变换&#xff09;。 DCT-2变换、DST-7变换和DCT-8变…

H.266/VVC技术学习:算术编码

算术编码是一种常用的变长编码方法&#xff0c;和Huffman编码类似&#xff0c;也是对出现概率大的符号赋予短码&#xff0c;出现概率小的符号赋予长码&#xff0c;但算术编码不是简单的将每个信源符号映射成一个码字&#xff0c;而是对整个输入序列分配一个码字&#xff0c;所以…

一、H.266新增技术

H.266的提案&#xff1a;http://phenix.it-sudparis.eu/jvet/ VVC&#xff08;Versatile Video Coding&#xff09;&#xff1a;https://jvet.hhi.fraunhofer.de/ H.266采用了与HEVC相同的编码结构&#xff0c;但也引入了许多新的元素&#xff0c;主要包括以下几个部分 1.块结…

H.266视频编解码标准

H.266多功能视频编码编解码器标准&#xff0c;新的H.266 /VCC编解码器在保持清晰度不变的情况下&#xff0c;数据压缩效率获得极大提高&#xff0c;数据量减少了50%。 新标准的公告中指出&#xff0c;由于改进了压缩技术&#xff0c;H.266将减少约50%的数据需求。使用之前的HE…

参与制定H.266标准的公司

1、Microsoft。JVET的主席之一Gary J. Sullivan就职于微软&#xff0c;还有微软亚研的李斌&#xff08;Bin Li&#xff09;博士。 2、Qualcomm。高通的提案最多。 3、Samsung。三星是H.264的赢家&#xff0c;提案很多。 4、MediaTek。联发科提出来的QTBT编码结构做的很好。 …

AtCoder Beginner Contest 266 A-G

更好观感 AtCoder Beginner Contest 266 A-G A 直接输出字符串中间字符即可。 #include<bits/stdc.h> using namespace std; using ll long long; using db double; using ld long double; using pii pair<int, int>; using pll pair<ll, ll>; usin…

LeetCode 266. 回文排列(计数)

文章目录 1. 题目2. 解题 1. 题目 给定一个字符串&#xff0c;判断该字符串中是否可以通过重新排列组合&#xff0c;形成一个回文字符串。 示例 1&#xff1a; 输入: "code" 输出: false示例 2&#xff1a; 输入: "aab" 输出: true示例 3&#xff1a; 输…

H.266/VVC技术学习:熵编码

在VVC中&#xff0c;与HEVC中的设计相比&#xff0c;CABAC包含以下主要变化&#xff1a; Core CABAC engine分离变换块和变换跳过块的残差编码结构。变换系数的上下文建模 一、Core CABAC engine HEVC中的CABAC engine 在64个不同的代表性概率状态之间使用基于表的概率转换过…