具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图和实施例,对本发明进行进一步详细说明,为了便于说明,仅示出了与本发明实施例相关的部分。应当理解,此处所描写的具体实施例,仅仅用于解释本发明,并不用以限制本发明。
在视频编码中,宏块是视频编码的基本单元,宏块大小为16×16,每个宏块由4个4×4块组成,每个块由1个4×4亮度块和2个色度块组成。对于图像块而言,预测和量化后的残差系数需要通过扫描获得图像块残差系数的相应的语法元素。这些需要编码的语法元素主要有:Level(非零系数的幅值)、Run(一个非零系数前的连续零系数游程)以及数据结束符等。通常熵编码先对预测变换量化后的系统进行Zigzag扫描进行预处理,把扫描中遇到的非零系数记为Level,一个非零系数前的连续零系数游程记为Run。当然,视频编码的熵编码除了残差系数的语法元素进行编码,还有其他各种辅助信息的语法元素需要进行编码,如运动矢量、图像序列参数、图片层参数、片层参数、宏块类型、编码块类型等。
H.264/AVC视频编码标准的CAVLC在传统变长编码方法的基础上,通过引入上下文的自适应模型,定义了多组码表,根据编码码字特征,动态的进行码表切换,将Level、Run分开进行编码,取得了目前已发布视频标准中最佳编码效率效果。CAVLC的编码基本原理仍然遵循Huffman编码原理,即大概率的符号分配短码字、小概率的符号分配长码字,从而达到平均码长最短的目的。
因此,本发明实施例将遵循H.264/AVC视频编码标准的CAVLC编码方法基本思想和相应的语法元素的统计概率分布,但对码表进行了全新的设计。因此,需要处理的残差系数语法元素主要包括:(a)coeff token(非零系数个数TotalCoeff和拖尾系数的个数TrailingOnes);(b)拖尾系数的符号trailing_ones_sign_flag;(c)非零系数幅值(Level);(d)total_zeros;(e)run_before。
这些参数系数语法元素的解码操作主要需要两个技术条件:内存资源的要求和逐位遍历查找表的功耗问题,这对嵌入式终端的视频解码设计带来了挑战。本发明实施例通过对码字规则和语法元素的概率分布分析,通过引入码表顺序索引对码字进行了排序,并且将部分高使用频率的特殊短码字直接简单算术表达式计算出相应的语法元素数值,消除了遍历二叉树的操作和匹配码字的操作,从而极大降低熵编码算法对内存等硬件的要求,非常适合于嵌入式终端的熵解码应用的方法和系统。
为了获得高的熵编码下来,每个残差系数的语法元素,设计了多张码表,通过上下文自适应选择。Huffman编码原理,即大概率的符号分配短码字、小概率的符号分配长码字,从而达到平均码长最短的目的。码表中的码字完全依据语法元素出现概率来构造带权路径长度最小的二叉树从而实现平均码字长度最短,且各个符号编码的字头都是相异的,即任何一个语法符号的编码都不会成为另一个语法符号编码的前缀。
实施例1,依据上述思想,本发明实施例提供了一种熵解码方法,
该方法可以是:获取二进制比特流;获取第一变量;
根据第一变量的范围确定当前码字的类型;
根据当前码字的类型采用相应的解码方法进行解码。
其中如果当前码字的类型为变长码字,那么在所述的“根据当前码字的类型采用相应的解码方法进行解码”之前还包括步骤:获取二进制比特流中码字的前缀部分;
“根据当前码字的类型采用相应的解码方法进行解码”可以为:当确定为变长码字时,则确定解码模式为变长码字解码模式;根据所述前缀判断当前码字是否为特殊短码,若是则根据预置相应的特殊短码解码公式进行解码,获得第一参数和第二参数;若否则则在变长码字解码模式下根据所述前缀选择相应的预置解码公式进行解码,获得索引值,根据所述的索引值获得第一参数和第二参数。
如果当前码字的类型为定长码字,“根据当前码字的类型采用相应的解码方法进行解码”可以为:确定解码模式为定长码字解码模式;设置索引值数值等于定长码字数值,根据所述的索引值至预置的定长码表查询,获取索引值相应的第一参数与第二参数。
参见图1,该方法具体为:
在本发明实施例中,设置第一参数为拖尾系数的个数TrailingOnes,设置第二参数为非零系数个数TotalCoeff;
步骤101:获取第一变量(NC);若第一变量(NC)在变长码字参数范围内,例如可以是-1≤NC<8;则确定解码模式为第一至第四解码模式其中之一;若第一变量(NC)在定长码字参数范围内,例如可以是NC≥8,则确定当前码字为定长码字,执行步骤106;
该步骤中所述的“获取的第一变量(NC)”的方法可以为:
(1)预先计算当前宏块左边4X4宏块的第一非零系数数目(NA)和当前宏块上面4X4宏块的第二非零系数数目(NB);当前宏块与左边、上面宏块位置关系图,参见图2。
当NA和NB都有效时,NC=(NA+NB)/2;当NB有效,NA无效时,NC=NB;当NB无效,NA有效时,NC=NA;
第一变量(NC)的确定如表一所示:
表1NC与NA和NB的相应关系
(2)该步骤中所述的“若-1≤NC<8;则确定解码模式为第一至第四解码模式其中之一”可以为:
例如:若0≤NC<2,则选择第一解码模式(表2,第一变长码表VLC-1)进行解码;
若2≤NC<4,则选择第二解码模式(表3,第二变长码表VLC-2)进行解码;
若5≤NC<8,则选择第三解码模式(表4,第三变长码表VLC-3)进行解码;
若NC=-1,则选择第四解码模式(表5,第四变长码表VLC-4);
(3)该步骤中所述当NC≥8,则确定当前码字为定长码字进行解码;
步骤102:获取二进制比特流,根据所述的二进制比特流获取码字的前缀部分;
例如可以通过首“1”检测器来获取前缀部分;
步骤103:在步骤101中确定的第一至第四解码模式下,根据所述前缀判断当前码字是否为特殊短码;若是则执行步骤104;若否则执行步骤105;
该步骤可以为:将所述前缀部分的“0”的个数赋予中间变量PrefixNum,然后根据所述的中间变量PrefixNum与阈值的关系,来确定码字是否为特殊短码。阈值S可以根据所述的第一变量NC来决定,例如:
当0≤NC<2时为第一解码模式,那么此时阈值S可以设置为3,当PrefixNum<3时,则确定当前码字为特殊短码;
当2≤NC<4时为第二解码模式,那么此时阈值S可以设置为2,当PrefixNum<2时,则确定当前码字为特殊短码;
当5≤NC<8时为第三解码模式,那么此时阈值S可以设置为1,当PrefixNum<1时,则确定当前码字为特殊短码;
当NC=-1时为第四解码模式,那么此时阈值S可以设置为3,当PrefixNum<3时,则确定当前码字为特殊短码;
步骤104:在步骤101中确定的第一至第四其中之一解码模式下根据预置相应的特殊短码解码公式进行解码,获得第一参数TrailingOnes和第二参数TotalCoeff;
例如:(1)当确定0≤NC<2时为第一解码模式:
TrailingOnes=TotalCoeff=PrefixNum
(2)当确定2≤NC<4时为第二解码模式:
第二解码模式下特殊短码时,根据预置的Suffixlength=1读取二进制比特流,获取Suffix;
TrailingOnes=TotalCoeff=(Prefix<<1)+Suffix;
(3)当确定5≤NC<8时为第三解码模式:
第三解码模式下特殊短码时,根据预置的Suffixlength=3读取二进制比特流,获取Suffix;
TotalCoeff=Suffix
TrailingOnes=3×(Suffix/4)+(Suffix%4)×(1-Suffix/4)
或TrailingOnes=3×Suffix[2:2]+suffix[1:0]×(~Suffix[2:2])
其中,获得TrailingOnes的2个公式实际是相同的,前一个是简单计算,后一个是根据位操作;
(4)当确定NC=-1时为第四解码模式,
TrailingOnes=TotalCoeff=2×PrefixNum[1:1]+(~PrefixNum[0:0])×(~PrefixNum[1:1])
其中TrailingOnes是第一参数、TotalCoeff是第二参数、PrefixNum为中间变量、Prefix为前缀、Suffix为后缀,Suffix[2:0]表示第2位到第0位的3比特二进制数,Suffix[1:0]表示第1位至第0位的2比特二进制数,Suffix[2:2]表示第2位的1比特二进制数。PrefixNum[1:0]表示第1位到第0位的2比特二进制数,PrefixNum[1:1]表示第1为的1比特二进制数,PrefixNum[0:0]表示第0位的1比特二进制数。“/”表示除法运算符,“%”表示取余运算符,“~”表示位取反运算符。
步骤105;在步骤101中确定的第一至第四其中之一解码模式下根据所述前缀选择相应的预置解码公式进行解码,获得索引值,索引值表征了语法元素(第一参数TrailingOnes和第二参数TotalCoeff)的排列顺序,根据索引值获得第一参数TrailingOnes和第二参数TotalCoeff。
该步骤根据确定不同的解码模式、所述前缀选择相应的预置解码公式进行解码,获得索引值可以为:
(1)确定为第一解码模式时,
Suffixlength=(PrefixNum>=9&&PrefixNum<13)?3:2
根据所述的Suffixlength读取二进制比特流,获取Suffix;
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,Suffixlength为后缀长度,“&&”表示逻辑与运算符、“?:”表示条件运算符、“<<”表示按位左移运算;
(2)当确定为第二解码模式时,
Suffixlength=(PrefixNum>=7)?3:2
根据所述的Suffixlength读取二进制比特流,获取Suffix;
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,Suffixlength为后缀长度,“?:”表示条件运算符“<<”表示按位左移运算。
(3)当确定为第三解码模式时,根据预置的Suffixlength=3读取二进制比特流,获取Suffix;
Index=((PrefixNum-3)<<2)+Suffix;
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,“<<”表示按位左移运算。
(4)当确定为第四解码模式时,根据预置的Suffixlength=2读取二进制比特流,获取Suffix;
Index=(PrefixNum-3)<<3)+Suffix;
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,“<<”表示按位左移运算。
并且在步骤105中,所述的“获得索引值,根据索引值获得第一参数和第二参数”可以为:获得索引值后,在确定的第一至第四其中之一解码模式下,根据所述索引值查找预置的参数表,获取索引值相应的第一参数与第二参数。其中在第一解码模式时,相应的查找预置的参数表为表2,第一变长码表(VLC-1);在第二解码模式时,相应查找预置的参数表为表3,第二变长码表(VLC-2);其中在第三解码模式时,相应的查找预置的参数表为表4,第三变长码表(VLC-3);在第四解码模式时,相应查找预置的参数表为表5,第四变长码表(VLC-4)。
步骤106:在步骤101中确定的当前码字是定长码字;则设置定长码字长度为预置长度,则设置索引值Index等于定长码字;根据所述索引值获取第一参数和第二参数。
定长码字的预置长度为不低于log2N的整数,N是语法元素取值的个数;本例中预置长度可以为6。
该步骤可以为:当确定当前码字为定长码字时,设置索引值等于定长码字后,根据所述的索引值至预置的定长码表查询,获取索引值相应的第一参数与第二参数。
下面从具体码字的角度来进行描述:
(1)第一解码模式的非特殊短码情况:
根据步骤101的方法,根据宏块情况,获取到当前NC=1,那么根据步骤101中确定解码模式中“若0≤NC<2,则选择第一解码模式(VLC-1码表)进行解码”,可以确定当前解码模式为第一解码模式;
根据步骤102的方法,获取一个二进制比特流00000110xxxxx,那么前缀部分为000001;
根据步骤103的方法,由于前缀部分为000001,那么得到中间变量PrefixNum=5;由于是在第一解码模式下,阈值S=3,那么PrefixNum=5>3,因此该码字不是特殊短码;
根据步骤105的方法,由于确定是第一解码模式;
那么根据预置的公式:Suffixlength=(PrefixNum>=9&&PrefixNum<13)?3:2=(5>=9&&5<13)?3:2=2
PrefixNum为中间变量、Suffix为后缀,Suffixlength为后缀长度,“&&”表示“与”、“(判断条件)?a:b”表示:当判断条件成立时,则取a,当判断条件不成立时则取b。
根据所述的Suffixlength=2读取二进制比特流00000110xxxxx,获取Suffix为“10”;
由于PrefixNum=5,那么根据公式((PrefixNum-3)<<2)+Suffix进行计算,获取索引值Index ,那么最后得到Index=(PrefixNumb-3)<<2+Suffix)=((5-3)<<2)+2=10。
然后根据Index=10,至第一变长码表(VLC-1)查表获取第一参数TrailingOnes和第二参数TotalCoeff;那么通过表1-第一变长码表VLC-1以及索引值10可以查找到TrailingOnes为0、TotalCoeff为3。
表2第一变长码表VLC-1
TrailingOnes |
TotalCoeff |
Index |
3 |
3 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
3 |
4 |
3 |
2 |
3 |
4 |
3 |
5 |
5 |
0 |
2 |
6 |
1 |
3 |
7 |
2 |
4 |
8 |
3 |
6 |
9 |
0 |
3 |
10 |
1 |
4 |
11 |
2 |
5 |
12 |
3 |
7 |
13 |
0 |
4 |
14 |
1 |
5 |
15 |
2 |
6 |
16 |
3 |
8 |
17 |
0 |
5 |
18 |
1 |
6 |
19 |
2 |
7 |
20 |
3 |
9 |
21 |
0 |
6 |
22 |
1 |
7 |
23 |
2 |
8 |
24 |
3 |
10 |
25 |
0 |
7 |
26 |
1 |
8 |
27 |
2 |
9 |
28 |
0 |
8 |
29 |
0 |
9 |
30 |
1 |
9 |
31 |
2 |
10 |
32 |
3 |
11 |
33 |
0 |
10 |
34 |
1 |
10 |
35 |
2 |
11 |
36 |
3 |
12 |
37 |
0 |
11 |
38 |
1 |
11 |
39 |
2 |
12 |
40 |
3 |
13 |
41 |
0 |
12 |
42 |
1 |
12 |
43 |
2 |
13 |
44 |
3 |
14 |
45 |
0 |
13 |
46 |
1 |
14 |
47 |
2 |
14 |
48 |
3 |
15 |
49 |
0 |
14 |
50 |
1 |
15 |
51 |
2 |
15 |
52 |
3 |
16 |
53 |
0 |
15 |
54 |
1 |
16 |
55 |
2 |
16 |
56 |
0 |
16 |
57 |
1 |
13 |
58 |
(2)第一解码模式的特殊短码情况:
根据步骤101的方法,根据宏块情况,获取到当前NC=1,那么根据步骤101中确定解码模式中“若0≤NC<2,则选择第一解码模式(VLC-1码表)进行解码”,可以确定当前解码模式为第一解码模式;
根据步骤102的方法,获取一个二进制比特流0010110xxxxx,那么前缀部分为0010110;
根据步骤103的方法,由于前缀部分为000001,那么得到中间变量PrefixNum=2;由于是在第一解码模式下,阈值S=3,那么PrefixNum=2<3,因此该码字是特殊短码;
根据步骤104中的方法,根据TrailingOnes=TotalCoeff=PrefixNum;可以得知TrailingOnes=TotalCoeff=2。
(3)第二解码模式的非特殊短码情况;
根据步骤102的方法,获取一个二进制比特流000001101xxxx,那么前缀部分为000001;
根据步骤101的方法,根据宏块情况,获取到当前NC=3,那么根据步骤10x中确定解码模式中“若2≤NC<4,则选择第二解码模式(第二变长码表VLC-2码表)进行解码”,可以确定当前解码模式为第二解码模式;
根据步骤103的方法,由于前缀部分为000001,那么得到中间变量PrefixNum=5;由于是在第二解码模式下,阈值S=2,那么PrefixNum=5>2,因此该码字不是特殊短码;
根据步骤105的方法,由于确定是第二解码模式;
那么根据预置的公式:Suffixlength=(PrefixNum>=7)?3:2=(5>=7)?3:2=3;
PrefixNum为中间变量、Suffix为后缀,Suffixlength为后缀长度,“?:”表示条件运算符。
根据所述的Suffixlength=3读取二进制比特流000001101xxxx,获取Suffix为“101”;
由于PrefixNum=5,那么根据公式((PrefixNum-3)<<2)+Suffix进行计算,获取索引值Index ,那么最后得到Index=(PrefixNumb-2)<<2+Suffix)=((5-2)<<2)+5=17
然后根据Index=17,至第二变长码表(VLC-2)查表获取第一参数TrailingOnes和第二参数TotalCoeff;那么通过表2-第二变长码表VLC-2以及索引值14可以查找到TrailingOnes为2、TotalCoeff为6。
表3第二变长码表VLC-2
TrailingOnes |
TotalCoeff |
Index |
3 |
4 |
0 |
1 |
2 |
1 |
3 |
5 |
2 |
0 |
1 |
3 |
1 |
3 |
4 |
2 |
3 |
5 |
3 |
6 |
6 |
0 |
2 |
7 |
1 |
4 |
8 |
2 |
4 |
9 |
3 |
7 |
10 |
0 |
3 |
11 |
1 |
5 |
12 |
2 |
5 |
13 |
3 |
8 |
14 |
0 |
4 |
15 |
1 |
6 |
16 |
2 |
6 |
17 |
0 |
5 |
18 |
0 |
6 |
19 |
1 |
7 |
20 |
2 |
7 |
21 |
3 |
9 |
22 |
0 |
7 |
23 |
1 |
8 |
24 |
2 |
8 |
25 |
3 |
10 |
26 |
0 |
8 |
27 |
1 |
9 |
28 |
2 |
9 |
29 |
3 |
11 |
30 |
0 |
9 |
31 |
1 |
10 |
32 |
2 |
10 |
33 |
3 |
12 |
34 |
0 |
10 |
35 |
1 |
11 |
36 |
2 |
11 |
37 |
0 |
11 |
38 |
0 |
12 |
39 |
1 |
12 |
40 |
2 |
12 |
41 |
3 |
13 |
42 |
0 |
13 |
43 |
1 |
13 |
44 |
2 |
13 |
45 |
3 |
14 |
46 |
0 |
14 |
47 |
2 |
14 |
48 |
1 |
14 |
49 |
2 |
15 |
50 |
0 |
15 |
51 |
1 |
15 |
52 |
0 |
16 |
53 |
1 |
16 |
54 |
2 |
16 |
55 |
3 |
16 |
56 |
3 |
15 |
57 |
(4)第二解码模式的特殊短码情况:
根据步骤101的方法,根据宏块情况,获取到当前NC=3,那么根据步骤101中确定解码模式中“若2≤NC<4,则选择第二解码模式(VLC-2码表)进行解码”,可以确定当前解码模式为第二解码模式;
根据步骤102的方法,获取一个二进制比特流0110111xxx,那么前缀部分为01;
根据步骤103的方法,由于前缀部分为01,那么得到中间变量PrefixNum=1;由于是在第二解码模式下,阈值S=2,那么PrefixNum=1<2,因此该码字是特殊短码;
根据步骤104中的方法,根据:根据预置的Suffixlength=1读取二进制比特流,获取Suffix=1;
TrailingOnes=TotalCoeff=(Prefix<<1)+Suffix=(1<<1)+1=2+1=3;
(5)第三解码模式的非特殊短码情况:
根据步骤101的方法,根据宏块情况,获取到当前NC=6,那么根据步骤101中确定解码模式中“若5≤NC<8,则选择第三解码模式(VLC-1码表)进行解码”,可以确定当前解码模式为第三解码模式;
根据步骤102的方法,获取一个二进制比特流000001101xxxx,那么前缀部分为000001;
根据步骤103的方法,由于前缀部分为000001,那么得到中间变量PrefixNum=5;由于是在第三解码模式下,阈值S=1,那么PrefixNum=5>1,因此该码字不是特殊短码;
根据步骤105的方法,由于确定是第三解码模式;
那么根据预置的公式:
Index=((PrefixNum-3)<<2)+Suffix
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,“<<”表示按位左移运算。
其中,在第三解码模式下,由于码字后缀长度预置为3,那么可以根据二进制比特流000001101xxxx获取后缀为“101”;因此Index=((5-3)<<2)+5=8+5=13;
那么通过Index=13查找第三变长码表(VCL-3)可以获得TrailingOnes=1、TotalCoeff=7
表4变长码表3(VLC-3)
TrailingOnes |
TotalCoeff |
Index |
1 |
2 |
0 |
2 |
3 |
1 |
3 |
8 |
2 |
1 |
3 |
3 |
2 |
4 |
4 |
1 |
4 |
5 |
2 |
5 |
6 |
1 |
5 |
7 |
0 |
1 |
8 |
1 |
6 |
9 |
2 |
6 |
10 |
3 |
9 |
11 |
0 |
2 |
12 |
1 |
7 |
13 |
2 |
7 |
14 |
0 |
3 |
15 |
0 |
4 |
16 |
1 |
8 |
17 |
2 |
8 |
18 |
3 |
10 |
19 |
0 |
5 |
20 |
2 |
9 |
21 |
0 |
6 |
22 |
0 |
7 |
23 |
0 |
8 |
24 |
1 |
9 |
25 |
2 |
10 |
26 |
3 |
11 |
27 |
0 |
9 |
28 |
1 |
10 |
29 |
2 |
11 |
30 |
3 |
12 |
31 |
0 |
10 |
32 |
1 |
11 |
33 |
2 |
12 |
34 |
3 |
13 |
35 |
0 |
11 |
36 |
1 |
12 |
37 |
2 |
13 |
38 |
0 |
12 |
39 |
1 |
13 |
40 |
0 |
13 |
41 |
1 |
14 |
42 |
2 |
14 |
43 |
3 |
14 |
44 |
0 |
14 |
45 |
1 |
15 |
46 |
2 |
15 |
47 |
3 |
15 |
48 |
0 |
15 |
49 |
1 |
16 |
50 |
2 |
16 |
51 |
3 |
16 |
52 |
0 |
16 |
53 |
(6)第三解码模式的特殊短码情况:
根据步骤101的方法,根据宏块情况,获取到当前NC=6,那么根据步骤101中确定解码模式中“若5≤NC<8,则选择第三解码模式进行解码”,可以确定当前解码模式为第三解码模式;
根据步骤102的方法,获取一个二进制比特100111xxx,那么前缀部分为10;
根据步骤103的方法,由于前缀部分为1,那么得到中间变量PrefixNum=0;由于是在第三解码模式下,阈值S=1,因此该码字是特殊短码;
根据步骤104中的方法,根据预置的Suffixlength=3读取二进制比特流,获取Suffix=001;
TotalCoeff=Suffix
TrailingOnes=3×(Suffix/4)+(Suffix%4)×(1-Suffix/4)
或TrailingOnes=3×Suffix[2:2]+suffix[1:0]×(~Suffix[2:2])
其中,在第三解码模式下,由于码字后缀长度预置为3,那么可以根据二进制比特流100111xxx获取后缀为“001”;
其中,获得TrailingOnes的2个公式实际是相同的,前一个是简单计算,后一个是根据位操作;
其中TrailingOnes是第一参数、TotalCoeff是第二参数、Prefix为前缀、Suffix后缀;Suffix[2:0]表示第3位到第0位的3比特二进制数,Suffix[1:0]表示第2为至第0位的3比特二进制数,Suffix[2:2]表示第2位的1比特二进制数。“/”表示除法运算符,“%”表示取余运算符,“~”表示位取反运算符;
那么通过:TrailingOnes=3×Suffix[3:3]+suffix[2:0]×(~Suffix[3:3])=3×0+1×(~0)=0+1×1=1。
(7)第四解码模式的非特殊短码情况:
根据步骤101的方法,根据宏块情况,获取到当前NC=-1,那么根据步骤101中确定解码模式中“NC=-1,则选择第四解码模式(VLC-4码表)进行解码”,可以确定当前解码模式为第四解码模式;
根据步骤102的方法,获取一个二进制比特流000001001xxxx,那么前缀部分为000001;
根据步骤103的方法,由于前缀部分为000001,那么得到中间变量PrefixNum=5;由于是在第四解码模式下,阈值S=3,那么PrefixNum=5>3,因此该码字不是特殊短码;
根据步骤105的方法,由于确定是第四解码模式;
那么根据预置的公式:
Index=((PrexfixNum-3)<<2)+Suffix
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,“<<”表示按位左移运算。
其中,在第三解码模式下,由于码字后缀长度预置为3,那么可以根据二进制比特流000001001xxxx获取后缀为“001”;因此Index=((5-3)<<2)+1=9;
那么通过Index=9;查找第四变长码表(VCL-4)可以获得TrailingOnes=2、TotalCoeff=4。
表5变长码表4(VLC-4)
TrailingOnes |
TotalCoeff |
Index |
0 |
1 |
0 |
1 |
2 |
1 |
3 |
3 |
2 |
0 |
2 |
3 |
0 |
3 |
4 |
0 |
4 |
5 |
1 |
3 |
6 |
2 |
3 |
7 |
1 |
4 |
8 |
2 |
4 |
9 |
3 |
4 |
10 |
(8)第四解码模式的特殊短码情况:
根据步骤101的方法,根据宏块情况,获取到当前NC=-1,那么根据步骤101中确定解码模式中“NC=-1,则选择第四解码模式进行解码”,可以确定当前解码模式为第四解码模式;
根据步骤102的方法,获取一个二进制比特100111xxx,那么前缀部分为10;
根据步骤103的方法,由于前缀部分为1,那么得到中间变量PrefixNum=0;由于是在第四解码模式下,阈值S=3,因此该码字是特殊短码。
那么根据公式
TrailingOnes=TotalCoeff=2×PrefixNum[1:1]+(PrefixNum[0:0])×(~PrefixNum[1:1])=2×0+0×1=0
其中TrailingOnes是第一参数、TotalCoeff是第二参数、PrefixNum为中间变量、PrefixNum[1:0]表示第1位到第0位的2比特二进制数,Suffix[1:1]表示第1为的1比特二进制数,Suffix[0:0]表示第0位的1比特二进制数。“~”表示位取反运算符。
(9)定长码字情况
根据步骤101的方法,根据宏块情况,获取到当前NC=9,那么根据步骤101中确定解码模式中“若第一变量(NC)在定长码字参数范围内NC≥8,则确定当前码字为定长码字”;因此可以确定当前码字为定长码字;
那么根据步骤106的方法,获取一个二进制比特100111xxx,本例中的由于定长码字长度为6,设置索引值Index=定长码字=100111=39,根据Index=39至表五-定长码表获取TrailingOnes=0;TotalCoeff=12。
表6定长码表
TrailingOnes |
TotalCoeff |
Index |
1 |
2 |
0 |
2 |
3 |
1 |
3 |
8 |
2 |
1 |
3 |
3 |
2 |
4 |
4 |
1 |
4 |
5 |
2 |
5 |
6 |
1 |
5 |
7 |
0 |
1 |
8 |
1 |
6 |
9 |
2 |
6 |
10 |
3 |
9 |
11 |
0 |
2 |
12 |
1 |
7 |
13 |
2 |
7 |
14 |
0 |
3 |
15 |
0 |
4 |
16 |
1 |
8 |
17 |
2 |
8 |
18 |
3 |
10 |
19 |
0 |
5 |
20 |
2 |
9 |
21 |
0 |
6 |
22 |
0 |
7 |
23 |
0 |
8 |
24 |
1 |
9 |
25 |
2 |
10 |
26 |
3 |
11 |
27 |
0 |
9 |
28 |
1 |
10 |
29 |
2 |
11 |
30 |
3 |
12 |
31 |
0 |
10 |
32 |
1 |
11 |
33 |
2 |
12 |
34 |
3 |
13 |
35 |
0 |
11 |
36 |
1 |
12 |
37 |
2 |
13 |
38 |
0 |
12 |
39 |
1 |
13 |
40 |
0 |
13 |
41 |
1 |
14 |
42 |
2 |
14 |
43 |
3 |
14 |
44 |
0 |
14 |
45 |
1 |
15 |
46 |
2 |
15 |
47 |
3 |
15 |
48 |
0 |
15 |
49 |
1 |
16 |
50 |
2 |
16 |
51 |
3 |
16 |
52 |
0 |
16 |
53 |
0 |
0 |
54 |
1 |
1 |
55 |
2 |
2 |
56 |
3 |
3 |
57 |
3 |
4 |
58 |
3 |
5 |
59 |
3 |
6 |
60 |
3 |
7 |
61 |
在本发明实施例提供的表1至表4中,为了说明方便,能够索引值直接在表中快速找到TrailingOnes和TotalCoeff分别列出了TrailingOnes、TotalCoeff和Index,实际在系统中,表1至表4只有TrailingOnes和TotalCoeff两项。
实施例2,相应于实施例1的熵解码方法,本发明实施例还提供一种熵解码装置,参见图3,该装置包括:获取单元、码字类型确定单元、解码单元;
所述的获取单元,用于获取二进制比特流、获取第一变量;
码字类型确定单元,用于根据第一变量的范围确定当前码字的类型;
解码单元,用于根据当前码字的类型采用相应的解码方法进行解码。
其中,所述的获取单元包括:
比特流获取单元,用于获取二进制比特流;
第一变量获取单元,用于获取第一变量。
其中,所述的第一变量获取单元:用于获取第一变量具体为:
用于预先计算当前宏块左边4X4块的第一非零系数数目和当前宏块上面4X4块的第二非零系数数目;
当第一非零系数数目和第二非零系数数目都有效时,第一变量=(第一非零系数数目+第二非零系数数目)/2;
当第二非零系数数目有效,第一非零系数数目无效时,第一变量=第二非零系数数目;
当第二非零系数数目无效,第一非零系数数目有效时,第一变量=第一非零系数数目。
其中,所述的获取单元进一步包括前缀获取单元,用于根据所述的二进制比特流,获取当前码字的前缀;
所述的码字类型确定单元,用于根据第一变量的范围确定当前码字的类型为变长码字;
所述的解码单元包括:解码模式确定单元、判断单元、特殊短码解码单元;
解码模式确定单元,用于当确定为变长码字时,则确定解码模式为变长码字解码模式;
判断单元,用于当确定解码模式为变长码字解码模式时,根据所述前缀判断当前码字是否为特殊短码;
特殊短码解码单元,用于当确定为特殊短码时,根据预置相应的特殊短码解码公式进行解码,获得第一参数和第二参数。
其中,所述的码字类型确定单元,用于根据第一变量的范围确定当前码字的类型为变长码字具体为:当0≤第一变量<8时确定为当前码字的类型为变长码字;
所述的解码模式确定单元结构图请参见图4,该单元包括:第一解码模式确定单元、第二解码模式确定单元、第三解码模式确定单元、第四解码模式确定单元;
第一解码模式确定单元,用于判断若0≤第一变量<2,则确定为第一解码模式进行解码;
第二解码模式确定单元,用于判断若2≤第一变量<4,则确定为第二解码模式进行解码;
第三解码模式确定单元,用于判断若5≤第一变量<8,则确定为第三解码模式进行解码;
第四解码模式确定单元,用于判断若第一变量=-1,则确定为第四解码模式进行解码。
其中,所述的解码模式确定单元当确定第一至第四其中之一解码模式进行解码时,
所述的判断单元,用于当确定解码模式为变长码字解码模式时,根据所述前缀判断当前码字是否为特殊短码具体为:
将所述前缀部分的“0”的个数赋予中间变量,在所述第一至第四其中之一的解码模式下,若所述的中间变量小于阈值,则确定当前码字为特殊短码;若中间变量大于或等于阈值,则确定当前码字为非特殊短码;
参见图5,所述的特殊短码解码单元的结构具体为:
所述的特殊短码解码单元包括第一特殊短码解码单元;
所述第一特殊短码解码单元,用于当确定为第一解码模式时,TrailingOnes=TotalCoeff=PrefixNum;
其中TrailingOnes是第一参数、TotalCoeff是第二参数、PrefixNum为中间变量。
其中,所述的特殊短码解码单元进一步包括第二特殊短码解码单元;
所述第二特殊短码解码单元,用于根据预置的Suffixlength=1读取二进制比特流,获取Suffix;
TrailingOnes=TotalCoeff=(Prefix<<1)+Suffix;
其中TrailingOnes是第一参数、TotalCoeff是第二参数、PrefixNum为中间变量、Prefix为前缀、Suffixlength为后缀长度;
其中,所述的特殊短码解码单元进一步包括第三特殊短码解码单元;
所述的第三特殊短码解码单元,用于当确定为第三解码模式时,根据预置的Suffixlength=3读取二进制比特流,获取Suffix;
TotalCoeff=Suffix;TrailingOnes=3×(Suffix/4)+(Suffix%4)×(1-Suffix/4)
或TrailingOnes=3×Suffix[2:2]+suffix[1:0]×(~Suffix[2:2]);
其中TrailingOnes是第一参数、TotalCoeff是第二参数、PrefixNum为中间变量、Prefix为前缀、Suffix为后缀,Suffix[2:0]表示第2位到第0位的3比特二进制数,Suffix[1:0]表示第1位至第0位的2比特二进制数,Suffix[2:2]表示第2位的1比特二进制数。“/”表示除法运算符,“%”表示取余运算符,“~”表示位取反运算符。
其中,所述的特殊短码解码单元进一步包括第四特殊短码解码单元;
所述的第四特殊短码解码单元,用于当确定为第四解码模式时,
TrailingOnes=TotalCoeff=2×PrefixNum[1:1]+(~PrefixNum[0:0])×(~PrefixNum[1:1])
其中TrailingOnes是第一参数、TotalCoeff是第二参数、PrefixNum为中间变量、PrefixNum[1:0]表示第1位到第0位的2比特二进制数,PrefixNum[1:1]表示第1为的1比特二进制数,PrefixNum[0:0]表示第0位的1比特二进制数,“~”表示位取反运算符。
其中,所述的解码单元进一步包括:非特殊短码解码单元,用于当不是特殊短码时,则在变长码字解码模式下根据所述前缀选择相应的预置解码公式进行解码,获得索引值,根据所述的索引值获得第一参数和第二参数。
其中,所述的非特殊短码解码单元结构参见图6,包括:第一解码单元;用于Suffixlength=(PrefixNum>=9&&PrefixNum<13)?3:2
根据所述的Suffixlength读取二进制比特流,获取Suffix;
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,Suffixlength为后缀长度,“&&”表示逻辑与运算符、“?:”表示条件运算符、“<<”表示按位左移运算。
其中,所述的非特殊短码解码单元进一步包括第二解码单元;用于当确定为第二解码模式时,
Suffixlength=(PrefixNum>=7)?3:2
根据所述的Suffixlength读取二进制比特流,获取Suffix;
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,Suffixlength为后缀长度,“?:”表示条件运算符,“<<”表示按位左移运算。
其中,所述的非特殊短码解码单元进一步包括第三解码单元,用于根据预置的Suffixlength=3读取二进制比特流,获取Suffix;
Index=(PrefixNum-3)<<2)+Suffix
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,“<<”表示按位左移运算。
其中,所述的特殊短码解码单元进一步包括第四解码单元,用于当确定为第四解码模式时,根据预置的Suffixlength=2读取二进制比特流,获取Suffix;
Index=(PrefixNum-3)<<3)+Suffix
;
其中Index为索引值、PrefixNum为中间变量、Suffix为后缀,“<<”表示按位左移运算。
在上述的熵解码装置中,所述的特殊短码解码单元中或非特殊短码解码单元中所述的“获得索引值,根据索引值获得第一参数和第二参数”具体为:
获得索引值后,在确定的变长解码模式下,根据所述索引值查找预置的参数表,获取索引值相应的第一参数与第二参数。
其中,所述的解码模式确定单元进一步包括:定长码字解码模式确定单元;
定长码字解码模式确定单元,用于判断若第一变量≥8,则确定为定长码字解码模式进行解码;
所述的解码单元进一步包括:定长码字解码单元,用于确定解码模式为定长码字解码模式;设置索引值数值等于定长码字数值,根据所述的索引值至预置的定长码表查询,获取索引值相应的第一参数与第二参数。
本发明实施例的目的在于提供一种熵解码方法、装置。通过分析语法元素的概率分布情况,对码字规则和码表排列顺序进行全新设计,根据码字规则计算出码表中码字的顺序索引,对码表中的语法元素进行索引排序,进而实现快速解码操作。此外,将部分高使用频率的特殊短码字直接简单算术表达式计算出相应的语法元素数值。本发明实施例消除了遍历二叉树的操作和匹配码字的操作,从而极大降低熵编码算法对内存等硬件的要求。
本领域普通技术人员可以理解实现上述实施例1方法中的全部或部分步骤是可以通过程序来指令相关的硬件完成,该程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。