基于上下文自适应的可变长编码的解码方法及系统转让专利

申请号 : CN201010604527.7

文献号 : CN102547260B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 杨长平朱东巍

申请人 : 联芯科技有限公司

摘要 :

本发明公开了一种基于上下文自适应的可变长编码的解码方法及系统,所述方法包括:获取需要解码的码流;确定所述码流中的非零系数个数预测值nC;根据所述预测值nC查找预先建立的第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数;如果所述非零系数个数大于0,并且所述拖尾系数个数大于0,则解码拖尾连1系数的符号;如果所述非零系数个数小于非零系数个数的最大值,则根据所述非零系数个数查找预先建立的第二解码码表,得到所述码流中最后一个非零系数前0的总个数;根据所述最后一个非零系数前0的总个数及所述非零系数个数,解码所述码流中其他非零系数前0的个数。利用本发明,可以节省码表存储空间,并提高解码效率。

权利要求 :

1.一种基于上下文自适应的可变长编码的解码方法,其特征在于,包括:获取需要解码的码流;

确定所述码流中的非零系数个数预测值nC;

根据所述预测值nC查找预先建立的第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数,所述第一解码码表为包含非零系数个数和拖尾系数个数的解码码表;

如果所述非零系数个数大于0,并且所述拖尾系数个数大于0,则解码拖尾连1系数的符号;

如果所述非零系数个数小于非零系数个数的最大值,则根据所述非零系数个数查找预先建立的第二解码码表,得到所述码流中最后一个非零系数前0的总个数,所述第二解码码表为包含最后一个非零系数前0的总个数的解码码表;

根据所述最后一个非零系数前0的总个数及所述非零系数个数,解码所述码流中其他非零系数前0的个数。

2.根据权利要求1所述的方法,其特征在于,所述方法还包括:

基于编码非零系数个数和拖尾系数个数时的标准编码中各码字的连零个数对码流进行分组,将连零个数相同的码字分为一组;

根据各组码流的连零个数及该组码流中第一个1后面的两比特或三比特数据,建立所述第一解码码表,所述第一解码码表中包含:码流中第一个1后面的码流长度、非零系数个数、拖尾系数个数。

3.根据权利要求2所述的方法,其特征在于,所述根据所述预测值nC查找预先建立的第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数包括:如果所述预测值0<=nC<8,则根据所述码流中第一个1前面的连零个数及第一个1后面的三比特数据计算第一索引值;根据所述第一索引值查找所述第一解码码表,得到所述码流中第一个1后面的码流长度、非零系数个数和拖尾系数个数;

如果所述预测值8<=nC,则确定所述码流中码流长度固定为6;并根据所述码流对应的码字查找所述第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数;

如果所述预测值nC=-1,则根据所述码流中第一个1前面的连零个数查找所述第一解码码表,得到所述码流中第一个1后面的码流长度;根据所述码流中第一个1后面的两比特数据查找所述第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数。

4.根据权利要求1所述的方法,其特征在于,所述方法还包括:

基于编码最后一个非零系数前0的总个数的标准编码中各码字的连零个数对码流进行分组,将连零个数相同的码字分为一组;

根据各组码流的连零个数及该组码流中第一个1后面的两比特数据,建立所述第二解码码表,所述第二解码码表中包含:码流中第一个1后面的比特数,最后一个非零系数前0的总个数。

5.根据权利要求4所述的方法,其特征在于,所述根据所述非零系数个数查找预先建立的第二解码码表,得到所述码流中最后一个非零系数前0的总个数包括:根据所述非零系数个数、所述码流中连零个数及第一个1后面的两比特数据计算第二索引值;

根据所述第二索引值查找所述第二解码码表,得到所述码流中最后一个非零系数前0的总个数。

6.根据权利要求1所述的方法,其特征在于,所述方法还包括:

针对码流长度小于等于3的码流建立第三解码码表,所述第三解码码表为包含其他非零系数前0的个数及所述码流的长度值的解码码表;

所述根据所述最后一个非零系数前0的总个数及所述非零系数个数,解码所述码流中其他非零系数前0的个数包括:如果所述码流的长度小于等于3,则根据所述码流中的三比特数据、以及该非零系数为

1至7时最后一个非零系数前0的总个数计算第三索引值;

根据所述第三索引值查找所述第三解码码表,得到码流长度和所述其他非零系数前0的个数;

如果所述其他非零系数前0的总个数大于6并且所述码流中的三比特数据为预定值,则获取所述码流的连零个数,并将所述连零个数加4作为所述其他非零系数前0的个数。

7.一种基于上下文自适应的可变长编码的解码系统,其特征在于,包括:码流获取单元,用于获取需要解码的码流;

计算单元,用于确定所述码流中的非零系数个数预测值nC;

第一解码单元,用于根据所述预测值nC查找预先建立的第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数,所述第一解码码表为包含非零系数个数和拖尾系数个数的解码码表;

第一判断单元,用于判断所述非零系数个数是否大于0,以及所述拖尾系数个数是否大于0;

符号解析单元,用于在所述第一判断单元判断所述非零系数个数大于0,并且所述拖尾系数个数大于0时,解码拖尾连1系数的符号;

第二判断单元,用于判断所述非零系数个数是否小于非零系数个数的最大值;

第二解码单元,用于在所述第二判断单元判断所述非零系数个数小于非零系数个数的最大值时,根据所述非零系数个数查找预先建立的第二解码码表,得到所述码流中最后一个非零系数前0的总个数,所述第二解码码表为包含最后一个非零系数前0的总个数的解码码表;

第三解码单元,用于根据所述最后一个非零系数前0的总个数及所述非零系数个数,解码所述码流中其他非零系数前0的个数。

8.根据权利要求7所述的系统,其特征在于,所述系统还包括:

第一解码码表建立单元,用于基于编码非零系数个数和拖尾系数个数时的标准编码中各码字的连零个数对码流进行分组,将连零个数相同的码字分为一组;并根据各组码流的连零个数及该组码流中第一个1后面的两比特或三比特数据,建立所述第一解码码表,所述第一解码码表中包含:码流中第一个1后面的码流长度、非零系数个数、拖尾系数个数;

所述第一解码单元包括:

第一系数解码子单元,用于在所述预测值0<=nC<8时,根据所述码流中第一个1前面的连零个数及第一个1后面的三比特数据计算第一索引值;并根据所述第一索引值查找所述第一解码码表,得到所述码流中第一个1后面的码流长度、非零系数个数和拖尾系数个数;

第二系数解码子单元,用于在所述预测值8<=nC时,确定所述码流中码流长度固定为

6;并根据所述码流对应的码字查找所述第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数;

第三系数解码子单元,用于在所述预测值nC=-1时,则根据所述码流中第一个1前面的连零个数查找所述第一解码码表,得到所述码流中第一个1后面的码流长度;并根据所述码流中第一个1后面的两比特数据查找所述第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数。

9.根据权利要求7所述的系统,其特征在于,所述系统还包括:

第二解码码表建立单元,用于基于编码最后一个非零系数前0的总个数的标准编码中各码字的连零个数对码流进行分组,将连零个数相同的码字分为一组;并根据各组码流的连零个数及该组码流中第一个1后面的两比特数据,建立所述第二解码码表,所述第二解码码表中包含:码流中第一个1后面的比特数,最后一个非零系数前0的总个数;

所述第二解码单元包括:

索引值计算子单元,用于根据所述非零系数个数、所述码流中连零个数及第一个1后面的两比特数据计算第二索引值;

解码子单元,根据所述第二索引值查找所述第二解码码表,得到所述码流中最后一个非零系数前0的总个数。

10.根据权利要求7所述的系统,其特征在于,所述系统还包括:第三解码码表建立单元,用于针对码流长度小于等于3的码流建立第三解码码表,所述第三解码码表为包含其他非零系数前0的个数及所述码流的长度值的解码码表;

所述第三解码单元包括:

查表解码子单元,用于在所述码流的长度小于等于3时,根据所述码流中的三比特数据、以及该非零系数为1至7时最后一个非零系数前0的总个数计算第三索引值,并根据所述第三索引值查找所述第三解码码表,得到码流长度和所述其他非零系数前0的个数;

计算解码子单元,用于在所述其他非零系数前0的总个数大于6并且所述码流中的三比特数据为预定值时,获取所述码流的连零个数,并将所述连零个数加4作为所述其他非零系数前0的个数。

说明书 :

基于上下文自适应的可变长编码的解码方法及系统

技术领域

[0001] 本发明涉及视频多媒体技术开发领域,尤其涉及一种基于上下文自适应的可变长编码的解码方法及系统。

背景技术

[0002] H.264是ITU-T(国际电信联盟远程通信标准化组织)和MPEG(动态图像专家组)组织共同推出的最新一代视频压缩标准,它与H.263以及MPEG-4相似,同属基于预测变换
的混合编码架构,在编码过程中分为四个主要部分:
[0003] 1)将每帧视频分成像素块;
[0004] 2)帧内预测,削减空间冗余;
[0005] 3)通过运动估计和运动补偿进行帧间预侧,削减时间冗余;
[0006] 4)通过对原始块和对应的预测块之间差别形成的残差块进行变换、量化和熵编码,进一步削减空间冗余。
[0007] H.264增加了很多新的编码技术,大大提高了编码效率。但其高性能是以其编解码的复杂度的提高为代价的,对于同一个编码序列,H.264解码所需时间通常是H.263的2-3倍。编解码算法的复杂度直接影响到开发基于H.264视频方案的效率。
[0008] 在熵编码部分,H.264有两套方案:一个是CAVLC(基于上下文自适应的可变长编码),另一个是CABAC(基于上下文的自适应二进制算术编码)。其中,CAVLC的本质是变长
编码,它的特性主要体现在自适应能力上,CAVLC可以根据已编码句法元素的情况动态地选择编码中使用的码表,并且随时更新拖尾系数后缀的长度,从而获得极高的压缩比。CAVLC用于亮度和色度残差数据即经变换、量化后4x4块的系数的编码,利用相邻已编码符号所
提供的相关性,为所要编码的符号选择合适的上下文模型。在CAVLC中,上下文模型的选择主要体现在选择变长表格,共有四个变长表格约450个码字可供选择。
[0009] 在视频解码过程中,所有视频码流都要经过熵解码运算,因此在整个混合编解码系统中它具有举足轻重的地位,而解码模块的运算量与码流速率紧密相关,在高比特率情
况下变换系数即量化后的残差数据编码所占码流占据了码流总量的70%以上,这就意味着
解码模块将承担熵解码器大部分的运算量。
[0010] 现有技术中,熵解码方案是通过读取固定长度的码流来解析句法元素,主要存在以下缺陷:
[0011] (1)解析句法元素时首先读取固定长度的码流并不能保证解析正确,若解析错误则需要重新读取码流来解码,效率较低;而且,解析的过程需要大量的判断来控制,也影响了解析效率;
[0012] (2)解码码表占用的存储空间比较大,对于存储空间有限的嵌入式设备是一个限制。

发明内容

[0013] 本发明实施例提供一种基于上下文自适应的可变长编码的解码方法及系统,以提高解码效率,节省存储空间。
[0014] 为此,本发明实施例提供如下技术方案:
[0015] 一种基于上下文自适应的可变长编码的解码方法,包括:
[0016] 获取需要解码的码流;
[0017] 确定所述码流中的非零系数个数预测值nC;
[0018] 根据所述预测值nC查找预先建立的第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数,所述第一解码码表为包含非零系数个数和拖尾系数个数的解码码
表;
[0019] 如果所述非零系数个数大于0,并且所述拖尾系数个数大于0,则解码拖尾连1系数的符号;
[0020] 如果所述非零系数个数小于非零系数个数的最大值,则根据所述非零系数个数查找预先建立的第二解码码表,得到所述码流中最后一个非零系数前0的总个数,所述第二
解码码表为包含最后一个非零系数前0的总个数的解码码表;
[0021] 根据所述最后一个非零系数前0的总个数及所述非零系数个数,解码所述码流中其他非零系数前0的个数。
[0022] 一种基于上下文自适应的可变长编码的解码系统,包括:
[0023] 码流获取单元,用于获取需要解码的码流;
[0024] 计算单元,用于确定所述码流中的非零系数个数预测值nC;
[0025] 第一解码单元,用于根据所述预测值nC查找预先建立的第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数,所述第一解码码表为包含非零系数个数和拖尾系
数个数的解码码表;
[0026] 第一判断单元,用于判断所述非零系数个数是否大于0,以及所述拖尾系数个数是否大于0;
[0027] 符号解析单元,用于在所述第一判断单元判断所述非零系数个数大于0,并且所述拖尾系数个数大于0时,解码拖尾连1系数的符号;
[0028] 第二判断单元,用于判断所述非零系数个数是否小于非零系数个数的最大值;
[0029] 第二解码单元,用于在所述第二判断单元判断所述非零系数个数小于非零系数个数的最大值时,根据所述非零系数个数查找预先建立的第二解码码表,得到所述码流中最
后一个非零系数前0的总个数,所述第二解码码表为包含最后一个非零系数前0的总个数
的解码码表;
[0030] 第三解码单元,用于根据所述最后一个非零系数前0的总个数及所述非零系数个数,解码所述码流中其他非零系数前0的个数。
[0031] 本发明实施例基于上下文自适应的可变长编码的解码方法及系统,基于码流连零个数对解码码表重新分组,对大部分句法的解码采用了查表实现,不仅大大节省了解码码
表的存储空间,而且有效地提高了解码效率,可以很好地应用于H.264视频解码的嵌入式
设备中。

附图说明

[0032] 为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一
些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
[0033] 图1是现有技术中编码非零系数个数和拖尾系数个数时的标准编码码表;
[0034] 图2是本发明实施例CAVLC解码方法的流程图;
[0035] 图3是现有技术中编码非零系数为1至7时最后一个非零系数前0的总个数时的标准编码码表;
[0036] 图4是现有技术中编码某一个非零系数前0的个数的标准编码码表;
[0037] 图5是本发明实施例中解码非零系数个数和拖尾系数个数的流程图;
[0038] 图6是本发明实施例中解码最后一个非零系数前0的总个数的流程图;
[0039] 图7是本发明实施例中解码某一个非零系数前0的个数的流程图;
[0040] 图8是本发明实施例CAVLC解码系统的结构示意图。

具体实施方式

[0041] 为了使本技术领域的人员更好地理解本发明实施例的方案,下面结合附图和实施方式对本发明实施例作进一步的详细说明。
[0042] 首先,对现有技术中CAVLC编码和解码的基本原理做简单介绍。
[0043] CAVLC用于对4×4块的残差数据进行编码,非零系数个数的范围是0~16,拖尾系数个数范围是0~3。如果±1的个数大于3个,则只有最后三个被视为拖尾系数,其余
的被视为普通的非零系数。对非零系数个数和拖尾系数个数的编码通过查表实现,编码表
格是标准协议中的表格,和解码表格不同。共有5个编码表格可供选择,根据非零系数个数预测值nC来选择表格。
[0044] 例如,一个4×4块残差数据为:0,3,0,1,-1,-1,0,1,0,0,0,0,0,0,0,0,对该4×4块残差数据需要编码以下句法元素:
[0045] a、非零系数个数numcoeff,本例中为5;拖尾系数个数numtrailingones,本例为3;图1是编码非零系数个数和拖尾系数个数时用到的标准协议的编码码表(图1仅示出了
表格的部分内容);假设nC=0,则查此表可得numcoeff=5、并且numtrailingones=3
对应的编码后的码流为0000100;
[0046] b、编码三个拖尾系数(本例中的-1,-1,1)和除了拖尾系数以外非零系数幅值Levels(本例中的3,1);
[0047] c、编码最后一个非零系数前零的个数TotalZeros,本例中为3;
[0048] d、编码每个非零系数前零的个数RunBefore
[0049] CAVLC解码是编码的反向过程,需要从码流中解析出编码的各个句法元素,根据这些句法元素重构出来4×4块的残差数据。解码也是对编码码表的反向查表过程,例如,知道编码码流0000100后,查表可得非零系数个数为5,拖尾系数个数为3。解码其他句法元
素也是类似的,解析完所有句法后即可得到编码前的残差数据。
[0050] 在解码过程中读取码流后可以和编码码表的码流反复比较,找到匹配值后就可以查表得到句法元素的值,但这种解析方法效率极低,码表空间也很大,不适合应用在嵌入式设备中,因此需要重新设计解码码表来提高解析效率,降低码表空间。
[0051] 针对上述不足,发明人通过对码表码字规律的统计发现,H.264中CAVLC译码的很多码表具有共同的一个特点,即其码字多0,并且其码字在第一个1后面的比特个数较少。
因此,本发明实施例CAVLC解码方法及系统,基于码字的连零个数,首先取得起始连零的个数leadingzeros,再查一个n比特的表就可以通过查表操作,获得句法元素的值,所述n为
第一个1后面的比特数。
[0052] 进一步地,对于码表的设计基于连零个数进行分组,将连零个数相同的码字分为一组,每组的码字通过第一个1后面的n比特数据进一步区分。因此,在解码过程中可首先
获取码字的连零个数,基于此找到码字所在的组,然后读取n比特的数据,进一步找到该组中具体的码字,即可得到句法元素的值。
[0053] 进一步地,由于CAVLC解码是基于码字的连零个数,在解码过程中需要反复地读取码字的连零个数,因此在本发明实施例中,还可通过硬件方式获取码字的连零个数,提高获取码字的连零个数的速度,提升解码效率。
[0054] 如图2所示,是本发明实施例CAVLC解码方法的流程图,包括以下基本步骤:
[0055] 步骤201,获取需要解码的码流。
[0056] 步骤202,确定所述码流中的非零系数个数预测值nC。
[0057] nC的值基于当前块左侧的非零系数个数nA和当前块上侧的非零系数个数nB计算得来。若当前块左侧和上侧块都可用,则nC=(nA+nB+1)>>1;若当前块左侧和上侧块
之一可用,则nC等于nA或nB;若当前块左侧和上侧块都不可用,则nC等于0。
[0058] 步骤203,根据所述预测值nC查找预先建立的第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数,所述第一解码码表为包含非零系数个数和拖尾系数个数的
解码码表。
[0059] 步骤204,如果所述非零系数个数大于0,并且所述拖尾系数个数大于0,则解码拖尾连1系数的符号。
[0060] 如果非零系数个数小于等于0,则表明码字为全0,此时不需要再进行其他解码过程;同样,如果拖尾系数个数小于等于0,则表明没有拖尾系数,因此,也就不用解码拖尾连
1系数的符号了。
[0061] 在解码拖尾连1系数的符号时,可以通过直接读取码流中的比特数据来确定系数1的符号,如果读取的比特数据为1,则表示系数1的符号为“-”;如果读取的比特数据为0,则表示系数1的符号为“+”。
[0062] 步骤205,如果所述非零系数个数小于非零系数个数的最大值,则根据所述非零系数个数查找预先建立的第二解码码表,得到所述码流中最后一个非零系数前0的总个数,所述第二解码码表为包含最后一个非零系数前0的总个数的解码码表。
[0063] 步骤206,解码所述码流中其他非零系数前0的个数。
[0064] 如果非零系数个数大于或等于非零系数个数的最大值,即16,则表明所述码流中没有0,因此,也就无需执行上述步骤205和步骤206。
[0065] 需要说明的是,在上述步骤204和步骤205之间,还可进一步包括以下步骤:解码其他非零系数幅值。具体解码过程可采用与现有技术相同的方式。
[0066] 本发明实施例在进行CAVLC解码时,需要预先建立对应各句法解析的解码码表,即前面所述的第一解码码表、第二解码码表、第三解码码表。下面将详细说明各解码码表的建立方法。
[0067] 分析图1所示编码非零系数个数和拖尾系数个数时的标准协议的表格,可以发现有以下特点:其码字多0,最大连零个数为14,且第一个1后面最多只有三个比特。因此,
基于这些特点,可以建立一个非零系数个数和拖尾系数个数解码码表,为了便于描述,将其称为第一解码码表。根据码流数据查找所述第一解码码表,得到解码后的两个句法元素信
息:非零系数个数、拖尾系数个数,同时获得第一个1后面的码流长度,用于移动码流比特指针。
[0068] 在建立所述第一解码码表时,首先基于连零个数对码字进行分组,将连零个数相同的码字分为一组,每组的码字通过第一个1后面的n比特数据进一步区分该组中具体的
码字,即可得到句法元素的值。
[0069] 下面以0<=nC<2(nC为非零系数个数预测值)为例说明非零系数个数和拖尾系数个数解码码表的设计过程,具体过程如下:
[0070] 首先,根据图1所示的标准编码码表将连零个数相同的码流分为一组,得到:
[0071] 连零个数为0的码流有1个,为码流“1”;
[0072] 连零个数为1的码流有1个,为码流“01”;
[0073] 连零个数为2的码流有1个,为码流“001”;
[0074] 连零个数为3的码流有3个,分别为码流“000101”、“000100”、“00011”;
[0075] 连零个数为4的码流有3个,分别为码流“0000101”、“000011”、“0000100”;
[0076] 连零个数为5的码流有3个,分别为码流“00000111”、“00000110”、“00000101”;
[0077] 连零 个数 为6的码 流有3 个,分 别为 码流“000000111”、“000000110”、“000000101”;
[0078] 连零个数为7的码流有2个,分别为码流“0000000111”、“0000000110”;
[0079] 连零个数为8的码流有1个,分别为码流“00000000111”;
[0080] 由上述各组码流可以看出,这些码流的第一个1后面最多只有两比特数据,因此当连零个数相同时,利用码流中第一个1后面的两比特数据即可区分具体的码流。
[0081] 例如,连零个数为4的码流有3个,分别为“0000101”、“000011”、“0000100”,解析时确定了连零个数为4后再读取码流中第一个1后面的两比特数据。
[0082] 若读取的第一个1后面的两比特数据为0,则表示为码流“0000100”,由图1所示编码码表可知其对应的拖尾系数个数和非零系数个数分别为3和5,第一个1后面的码流长
度为2(这个值不是标准的句法元素,仅仅是为了在解析时移动码流指针,也可以设计在非
零系数个数和拖尾系数个数解码码表中);
[0083] 若读取的第一个1后面的两比特数据为1,则表示为码流“0000101”,由图1所示编码码表可知其对应的拖尾系数个数和非零系数个数分别为2和3,第一个1后面的码流长
度为2;
[0084] 若读取的第一个1后面的两比特数据为2或3,则表示为码流“000011”(这个码流第一个1后面实际只有1比特数据,第二个1比特数据未知,因此读到的两比特数据为2
或3都表示这个码流),其对应的拖尾系数个数和非零系数个数分别为4和3,第一个1后
面的码流长度为1。
[0085] 因此,当连零个数为4时设计的非零系数个数和拖尾系数个数解码码表为{{2,5,3},{2,3,2},{1,4,3},{1,4,3}},其中,每个集合中的三个值分别表示码流中第一个1后面的码流长度、非零系数个数和拖尾系数个数。比如,{2,5,3}表示码流长度为2,非零系数个数为5,拖尾系数个数为3。
[0086] 按照上述思想,可以设计出针对nC在不同取值情况下的非零系数个数和拖尾系数个数解码码表,即所述第一解码码表。
[0087] 为了使整个解码码表保持对齐,以便在查表时更方便快捷地计算出码表索引值,在该解码码表中还可以包含一些重复值或无效的填充值。例如,当连零个数为n(0=<n
<=8)时,直接将n左移2位(即乘4),即可得到所在的组:
[0088] {
[0089] {0,0,0},{0,0,0},{0,0,0},{0,0,0},//连零个数为0时
[0090] {0,1,1},{0,1,1},{0,1,1},{0,1,1},//连零个数为1时
[0091] {0,2,2},{0,2,2},{0,2,2},{0,2,2},//连零个数为2时
[0092] {2,2,1},{2,1,0},{1,3,3},{1,3,3},//连零个数为3时
[0093] {2,5,3},{2,3,2},{1,4,3},{1,4,3},//连零个数为4时
[0094] {-100,-100,-100},{2,4,2},{2,3,1},{2,2,0},//连零个数为5时,-100表示不会
[0095] 出现这种情况
[0096] {-100,-100,-100},{2,5,2},{2,4,1},{2,3,0},//连零个数为6时
[0097] {-100,-100,-100},{-100,-100,-100},{2,5,1},{2,4,0},//连零个数为7时[0098] {-100,-100,-100},{100,-100,-100},{-100,-100,-100},{2,5,0},//连零个数为8
[0099] 时
[0100] }
[0101] 在本发明实施例中,同样可以基于连零个数设计所述第二解码码表。
[0102] 如图3所示,是现有技术中编码非零系数为1至7时最后一个非零系数前0的总个数(下面以TotalZeros表示)时的标准编码码表。
[0103] 基于上述图3所示的标准编码码表,下面以非零系数等于2(图3所示表格中第三列)为例,详细说明解码TotalZeros的解码码表的的设计过程,具体过程如下:
[0104] 首先,需要找出这种情况下连零个数的最大值Maxnum_LeadingZeros,当非零系数为2时观察图3所示的编码码表可知Maxnum_LeadingZeros=6。
[0105] 其次,将连零个数相同的码流分为一组,当非零系数为2时分组如下:
[0106] 连零个数为0的码流有4个,分别为“111”、“110”、“101”、“100”;
[0107] 连零个数为1的码流有3个,分别为“011”、“0101”、“0100”;
[0108] 连零个数为2的码流有2个,分别为“0011”、“0010”;
[0109] 连零个数为3的码流有2个,分别为“00011”、“00010”;
[0110] 连零个数为4的码流有2个,分别为“000011”、“000010”;
[0111] 连零个数为5的码流有1个,分别为“000001”;
[0112] 连零个数为6的码流有1个,分别为“000000”。
[0113] 由上述各组码流可以看出,第一个1后面最多只有两比特(全零情况特殊处理),因此,当连零个数相同时,可以以第一个1后面的两比特数据来区分具体码流。例如,当连零个数为0时的解码码表为{2,3},{2,2},{2,1},{2,0}。其中,每个集合中包含两个值,第一个值表示第一个“1”后面有两比特数据,第二个值是TotalZeors,比如,{2,3}中的第一个值表示第一个1后面有两比特数据,第二个值表示TotalZeors=3。
[0114] 最后设计出当非零系数为2的TotalZeros的解码码表如下:
[0115] {
[0116] {2,3},{2,2},{2,1},{2,0},//连零个数为0时
[0117] {2,6},{2,5},{1,4},{1,4},//连零个数为1时
[0118] {1,8},{1,8},{1,7},{1,7},//连零个数为2时
[0119] {1,10},{1,10},{1,9},{1,9},//连零个数为3时
[0120] {1,12},{1,12},{1,11},{1,11},//连零个数为4时
[0121] {0,13},{0,13},{0,13},{0,13},//连零个数为5时
[0122] {0,14},{0,14},{0,14},{0,14},//连零个数为6时
[0123] }
[0124] 需要说明的是,观察图3所示的编码码表可知,当非零系数为2时有全零的情况,此时读取码流连零个数时可能会出现连零个数大于6的情况,因此在解码过程中需要用最
大连零个数Maxnum_LeadingZeros来控制,解码过程中若解析出连零个数大于6则使其等
于6。
[0125] 依据上述原理,可以设计出当非零系数为不同值时TotalZeros的解码码表,并将其组合在一起,即可生成最后一个非零系数前0的总个数的解码码表,即前面所述的第二
解码码表。
[0126] 需要说明的是,当非零系数取不同值时TotalZeros的解码码表大小是不同的,因此可以另外设计一个偏移码表TotalZerosTable_indexoffset[15],此码表以非零系数个
数为索引值,查表得到的内容是非零系数取该值时TotalZeros解码码表在总码表的偏移
位置。
[0127] 另外,还可以将非零系数个数取不同值时码流的最大连零个数组合在一个码表Maxnum_LeadingZerosTable[15]中,此码表以非零系数个数为索引值,查表得到的内容是
非零系数取该值时码流的最大连零个数。
[0128] 在本发明实施例中,同样可以基于连零个数建立所述第三解码码表。
[0129] 如图4所示,是现有技术中编码某一个非零系数前0的个数的标准编码码表。
[0130] 由图4所示编码码本可知,只有当zeroleft大于6时码流长度大于3,因此可以只对码流长度小于等于3的码流设计码表解码;当码流长度大于3时可以看出某一个非零
系数前0的个数RunBefore的值与连零个数有一一对应的关系,即RunBefore=连零个数
+4,因此这种情况下采用计算的方式即可得到RunBefore的值。
[0131] 下面以zeroleft大于6为例说明RunBefore解码码表的设计过程。
[0132] 解码RunBefore时可直接从码流中读取三比特数据,以这三比特数据的大小为索引查表得到RunBefore的值和码流长度值,若查表得到RunBefore的值为7(这个值相当于
一个特殊的标记,可任意设定一个值)时,则获取码流连零个数,RunBefore的值等于连零
个数加4,相应的码表为:{7,0},{6,3},{5,3},{4,3},{3,3},{2,3},{1,3},{0,3}。
[0133] 依据上述原理,可以设计出RunBefore的解码码表,即前面所述的第三解码码表,整个码表如下:
[0134] VLCtab2 RunBeforeTable_vlc[]=
[0135] {//{run_before,len},run_before table
[0136] {1,1},{1,1},{1,1},{1,1},{0,1},{0,1},{0,1},{0,1},//zeroleft等于1时[0137] {2,2},{2,2},{1,2},{1,2},{0,1},{0,1},{0,1},{0,1},//zeroleft等于2时[0138] {3,2},{3,2},{2,2},{2,2},{1,2},{1,2},{0,2},{0,2},//zeroleft等于3时[0139] {4,3},{3,3},{2,2},{2,2},{1,2},{1,2},{0,2},{0,2},//zeroleft等于4时[0140] {5,3},{4,3},{3,3},{2,3},{1,2},{1,2},{0,2},{0,2},//zeroleft等于5时[0141] {1,3},{2,3},{4,3},{3,3},{6,3},{5,3},{0,2},{0,2},//zeroleft等于6时[0142] {7,0},{6,3},{5,3},{4,3},{3,3},{2,3},{1,3},{0,3}//zeroleft大于6时[0143] };
[0144] 在本发明实施例中,所需的解码码表的总空间为:360+312+240+128+72+734+48+112+12+64=2082words。
[0145] 所有解码码表在表1中说明:
[0146] 表1
[0147]
[0148]
[0149] 具体的码表设计如下:
[0150] VLCtab1 CoeffTokenTable_vlcN[]=
[0151] {//{len,numcoeffs,trallingones},0<=nC<2
[0152] {0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},[0153] {0,1,1},{0,1,1},{0,1,1},{0,1,1},{0,1,1},{0,1,1},{0,1,1},{0,1,1},[0154] {0,2,2},{0,2,2},{0,2,2},{0,2,2},{0,2,2},{0,2,2},{0,2,2},{0,2,2},[0155] {2,2,1},{2,2,1},{2,1,0},{2,1,0},{1,3,3},{1,3,3},{1,3,3},{1,3,3},[0156] {2,5,3},{2,5,3},{2,3,2},{2,3,2},{1,4,3},{1,4,3},{1,4,3},{1,4,3},[0157] {2,6,3},{2,6,3},{2,4,2},{2,4,2},{2,3,1},{2,3,1},{2,2,0},{2,2,0},[0158] {2,7,3},{2,7,3},{2,5,2},{2,5,2},{2,4,1},{2,4,1},{2,3,0},{2,3,0},[0159] {2,8,3},{2,8,3},{2,6,2},{2,6,2},{2,5,1},{2,5,1},{2,4,0},{2,4,0},[0160] {2,9,3},{2,9,3},{2,7,2},{2,7,2},{2,6,1},{2,6,1},{2,5,0},{2,5,0},[0161] {3,8,0},{3,9,2},{3,8,1},{3,7,0},{3,10,3},{3,8,2},{3,7,1},{3,6,0},[0162] {3,12,3},{3,11,2},{3,10,1},{3,10,0},{3,11,3},{3,10,2},{3,9,1},{3,9,0},
[0163] {3,14,3},{3,13,2},{3,12,1},{3,12,0},{3,13,3},{3,12,2},{3,11,1},{3,11,0},
[0164] {3,16,3},{3,15,2},{3,15,1},{3,14,0},{3,15,3},{3,14,2},{3,14,1},{3,13,0},
[0165] {2,16,0},{2,16,0},{2,16,2},{2,16,2},{2,16,1},{2,16,1},{2,15,0},{2,15,0},
[0166] {0,13,1},{0,13,1},{0,13,1},{0,13,1},{0,13,1},{0,13,1},{0,13,1},{0,13,1},
[0167] {0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},[0168] //{len,numcoeffs,trallingones},2<=nC<4
[0169] {1,1,1},{1,1,1},{1,1,1},{1,1,1},{1,0,0},{1,0,0},{1,0,0},{1,0,0},[0170] {2,4,3},{2,4,3},{2,3,3},{2,3,3},{1,2,2},{1,2,2},{1,2,2},{1,2,2},[0171] {3,6,3},{3,3,2},{3,3,1},{3,1,0},{2,5,3},{2,5,3},{2,2,1},{2,2,1},[0172] {2,7,3},{2,7,3},{2,4,2},{2,4,2},{2,4,1},{2,4,1},{2,2,0},{2,2,0},[0173] {2,8,3},{2,8,3},{2,5,2},{2,5,2},{2,5,1},{2,5,1},{2,3,0},{2,3,0},[0174] {2,5,0},{2,5,0},{2,6,2},{2,6,2},{2,6,1},{2,6,1},{2,4,0},{2,4,0},[0175] {2,9,3},{2,9,3},{2,7,2},{2,7,2},{2,7,1},{2,7,1},{2,6,0},{2,6,0},[0176] {3,11,3},{3,9,2},{3,9,1},{3,8,0},{3,10,3},{3,8,2},{3,8,1},{3,7,0},
[0177] {3,11,0},{3,11,2},{3,11,1},{3,10,0},{3,12,3},{3,10,2},{3,10,1},{3,9,0},
[0178] {3,14,3},{3,13,2},{3,13,1},{3,13,0},{3,13,3},{3,12,2},{3,12,1},{3,12,0},
[0179] {3,15,1},{3,15,0},{3,15,2},{3,14,1},{2,14,2},{2,14,2},{2,14,0},{2,14,0},
[0180] {2,16,3},{2,16,3},{2,16,2},{2,16,2},{2,16,1},{2,16,1},{2,16,0},{2,16,0},
[0181] {0,15,3},{0,15,3},{0,15,3},{0,15,3},{0,15,3},{0,15,3},{0,15,3},{0,15,3},
[0182] {0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},[0183] {0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},[0184] {0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},[0185] //{len,numcoeffs,trallingones},4<=nC<8
[0186] {3,7,3},{3,6,3},{3,5,3},{3,4,3},{3,3,3},{3,2,2},{3,1,1},{3,0,0},[0187] {3,5,1},{3,5,2},{3,4,1},{3,4,2},{3,3,1},{3,8,3},{3,3,2},{3,2,1},[0188] {3,3,0},{3,7,2},{3,7,1},{3,2,0},{3,9,3},{3,6,2},{3,6,1},{3,1,0},[0189] {3,7,0},{3,6,0},{3,9,2},{3,5,0},{3,10,3},{3,8,2},{3,8,1},{3,4,0},[0190] {3,12,3},{3,11,2},{3,10,1},{3,9,0},{3,11,3},{3,10,2},{3,9,1},{3,8,0},
[0191] {3,12,0},{3,13,2},{3,12,1},{3,11,0},{3,13,3},{3,12,2},{3,11,1},{3,10,0},
[0192] {3,15,1},{3,14,0},{3,14,3},{3,14,2},{3,14,1},{3,13,0},{2,13,1},{2,13,1},
[0193] {2,16,1},{2,16,1},{2,15,0},{2,15,0},{2,15,3},{2,15,3},{2,15,2},{2,15,2},
[0194] {1,16,3},{1,16,3},{1,16,3},{1,16,3},{1,16,2},{1,16,2},{1,16,2},{1,16,2},
[0195] {0,16,0},{0,16,0},{0,16,0},{0,16,0},{0,16,0},{0,16,0},{0,16,0},{0,16,0}
[0196] };
[0197] VLCtab2 CoeffTokenTable_vlc3[]=
[0198] {//{numcoeffs,trallingones},Chroma DC,nC=-1
[0199] {1,1},{1,1},{1,1},{1,1},
[0200] {0,0},{0,0},{0,0},{0,0},
[0201] {2,2},{2,2},{2,2},{2,2},
[0202] {2,0},{3,3},{2,1},{1,0},
[0203] {4,0},{4,0},{3,0},{3,0},
[0204] {3,2},{3,2},{3,1},{3,1},
[0205] {4,2},{4,2},{4,1},{4,1},
[0206] {4,3},{4,3},{4,3},{4,3}
[0207] };
[0208] const INT16 CoeffTokenTable_vlc3_len[8]=
[0209] {//{len},Chroma DC,nC=-1
[0210] 0,0,0,2,1,1,1,0
[0211] };
[0212] VLCtab2 CoeffTokenTable_vlc4[]=
[0213] {//{numcoeffs,trallingones},8<=nC,len=6
[0214] {1,0},{1,1},{-1,-1},{0,0},
[0215] {2,0},{2,1},{2,2},{-1,-1},
[0216] {3,0},{3,1},{3,2},{3,3},
[0217] {4,0},{4,1},{4,2},{4,3},
[0218] {5,0},{5,1},{5,2},{5,3},
[0219] {6,0},{6,1},{6,2},{6,3},
[0220] {7,0},{7,1},{7,2},{7,3},
[0221] {8,0},{8,1},{8,2},{8,3},
[0222] {9,0},{9,1},{9,2},{9,3},
[0223] {10,0},{10,1},{10,2},{10,3},
[0224] {11,0},{11,1},{11,2},{11,3},
[0225] {12,0},{12,1},{12,2},{12,3},
[0226] {13,0},{13,1},{13,2},{13,3},
[0227] {14,0},{14,1},{14,2},{14,3},
[0228] {15,0},{15,1},{15,2},{15,3},
[0229] {16,0},{16,1},{16,2},{16,3}
[0230] };
[0231] VLCtab2 TotalZerosTable[]=
[0232] {//{len,totalzeros},total_zeros table
[0233] {0,0},{0,0},{0,0},{0,0},{1,2},{1,2},{1,1},{1,1},{1,4},{1,4},{1,3},{1,3},
[0234] {1,6},{1,6},{1,5},{1,5},{1,8},{1,8},{1,7},{1,7},{1,10},{1,10},{1,9},{1,9},
[0235] {1,12},{1,12},{1,11},{1,11},{1,14},{1,14},{1,13},{1,13},{1,15},{1,15},{1,15},{1,15},
[0236] {2,3},{2,2},{2,1},{2,0},{2,6},{2,5},{1,4},{1,4},{1,8},{1,8},{1,7},{1,7},
[0237] {1,10},{1,10},{1,9},{1,9},{1,12},{1,12},{1,11},{1,11},{0,13},{0,13},{0,13},{0,13},
[0238] {0,14},{0,14},{0,14},{0,14},{2,6},{2,3},{2,2},{2,1},{2,4},{2,0},{1,7},{1,7},
[0239] {1,8},{1,8},{1,5},{1,5},{1,10},{1,10},{1,9},{1,9},{0,12},{0,12},{0,12},{0,12},
[0240] {0,11},{0,11},{0,11},{0,11},{0,13},{0,13},{0,13},{0,13},{2,6},{2,5},{2,4},{2,1},
[0241] {2,3},{2,2},{1,8},{1,8},{1,9},{1,9},{1,7},{1,7},{1,10},{1,10},{1,0},{1,0},
[0242] {0,11},{0,11},{0,11},{0,11},{0,12},{0,12},{0,12},{0,12},{2,6},{2,5},{2,4},{2,3},
[0243] {2,1},{2,0},{1,7},{1,7},{1,8},{1,8},{1,2},{1,2},{0,10},{0,10},{0,10},{0,10},
[0244] {0,9},{0,9},{0,9},{0,9},{0,11},{0,11},{0,11},{0,11},{2,5},{2,4},{2,3},{2,2},
[0245] {1,7},{1,7},{1,6},{1,6},{0,9},{0,9},{0,9},{0,9},{0,8},{0,8},{0,8},{0,8},
[0246] {0,1},{0,1},{0,1},{0,1},{0,0},{0,0},{0,0},{0,0},{0,10},{0,10},{0,10},{0,10},
[0247] {2,3},{2,2},{1,5},{1,5},{1,6},{1,6},{1,4},{1,4},{0,8},{0,8},{0,8},{0,8},
[0248] {0,7},{0,7},{0,7},{0,7},{0,1},{0,1},{0,1},{0,1},{0,0},{0,0},{0,0},{0,0},
[0249] {0,9},{0,9},{0,9},{0,9},{1,5},{1,5},{1,4},{1,4},{1,6},{1,6},{1,3},{1,3},
[0250] {0,7},{0,7},{0,7},{0,7},{0,1},{0,1},{0,1},{0,1},{0,2},{0,2},{0,2},{0,2},
[0251] {0,0},{0,0},{0,0},{0,0},{0,8},{0,8},{0,8},{0,8},{1,4},{1,4},{1,3},{1,3},
[0252] {0,6},{0,6},{0,6},{0,6},{0,5},{0,5},{0,5},{0,5},{0,2},{0,2},{0,2},{0,2},
[0253] {0,7},{0,7},{0,7},{0,7},{0,0},{0,0},{0,0},{0,0},{0,1},{0,1},{0,1},{0,1},
[0254] {1,4},{1,4},{1,3},{1,3},{0,5},{0,5},{0,5},{0,5},{0,2},{0,2},{0,2},{0,2},
[0255] {0,6},{0,6},{0,6},{0,6},{0,0},{0,0},{0,0},{0,0},{0,1},{0,1},{0,1},{0,1},
[0256] {0,4},{0,4},{0,4},{0,4},{1,3},{1,3},{1,5},{1,5},{0,2},{0,2},{0,2},{0,2},
[0257] {0,1},{0,1},{0,1},{0,1},{0,0},{0,0},{0,0},{0,0},{0,3},{0,3},{0,3},{0,3},
[0258] {0,2},{0,2},{0,2},{0,2},{0,4},{0,4},{0,4},{0,4},{0,1},{0,1},{0,1},{0,1},
[0259] {0,0},{0,0},{0,0},{0,0},{0,2},{0,2},{0,2},{0,2},{0,3},{0,3},{0,3},{0,3},
[0260] {0,1},{0,1},{0,1},{0,1},{0,0},{0,0},{0,0},{0,0},{0,2},{0,2},{0,2},{0,2},
[0261] {0,1},{0,1},{0,1},{0,1},{0,0},{0,0},{0,0},{0,0},{0,1},{0,1},{0,1},{0,1},
[0262] {0,0},{0,0},{0,0},{0,0}
[0263] };
[0264] const INT16 Maxnum_LeadingZerosTable[15]=
[0265] {//total_zeros table
[0266] 8,6,6,5,5,
[0267] 6,6,6,6,5,
[0268] 4,4,3,2,1
[0269] };
[0270] const INT16 TotalZerosTable_indexoffset[15]=
[0271] {
[0272] 0,36,64,92,116,
[0273] 140,168,196,224,252,
[0274] 276,296,316,332,344
[0275] };
[0276] VLCtab2 TotalZerosChromaDCTable_vlc[]=
[0277] {//{len,totalzeros},total_zeros table,Chroma DC
[0278] {3,3},{3,2},{2,1},{2,1},{1,0},{1,0},{1,0},{1,0},
[0279] {2,2},{2,2},{2,1},{2,1},{1,0},{1,0},{1,0},{1,0},
[0280] {1,1},{1,1},{1,1},{1,1},{1,0},{1,0},{1,0},{1,0}
[0281] };
[0282] VLCtab2 RunBeforeTable_vlc[]=
[0283] {//{run_before,len},run_before table
[0284] {1,1},{1,1},{1,1},{1,1},{0,1},{0,1},{0,1},{0,1},
[0285] {2,2},{2,2},{1,2},{1,2},{0,1},{0,1},{0,1},{0,1},
[0286] {3,2},{3,2},{2,2},{2,2},{1,2},{1,2},{0,2},{0,2},
[0287] {4,3},{3,3},{2,2},{2,2},{1,2},{1,2},{0,2},{0,2},
[0288] {5,3},{4,3},{3,3},{2,3},{1,2},{1,2},{0,2},{0,2},
[0289] {1,3},{2,3},{4,3},{3,3},{6,3},{5,3},{0,2},{0,2},
[0290] {7,0},{6,3},{5,3},{4,3},{3,3},{2,3},{1,3},{0,3}
[0291] };
[0292] const INT16 TrailingOnes_Index[]=
[0293] {//-100:just for efficiency,invalid value
[0294] 0,0,0,-100,0,-1,-1,-100,0,-1,-2,-100
[0295] };
[0296] const INT16 TrailingOnes_Table[]=
[0297] {//-100:just for efficiency,invalid value
[0298] 1,1,1,-100,-1,-1,-1,-100,-100,-100,-100,-100,-100,-100,-100,-100,[0299] 1,1,1,-100,1,-1,-1,-100,-1,1,1,-100,-1,-1,-1,-100,
[0300] 1,1,1,-100,1,1,-1,-100,1,-1,1,-100,1,-1,-1,-100,
[0301] -1,1,1,-100,-1,1,-1,-100,-1,-1,1,-100,-1,-1,-1,-100
[0302] };
[0303] 基于上述各解码码表,下面对本发明实施例中解码各句法元素的具体过程进行详细说明。
[0304] 如图5所示,是本发明实施例中解码非零系数个数和拖尾系数个数的流程图,包括以下步骤:
[0305] 判断确定的非零系数个数预测值nC的范围,然后根据nC的不同取值,对非零系数个数NumCoeff和拖尾系数个数TrailingOnes进行解码。
[0306] (1)在0<=nC<2、2<=nC<4、4<=nC<8这三种情况下,根据码流中连零个数和所述码流中第一个1后面的三比特数据计算出码表索引,查找相应的解码码表得
到NumCoeff和TrailingOnes,具体如下:
[0307] a)解码0<=nC<2时的NumCoeff和TrailingOnes
[0308] 根据图1所示标准编码码表可知,此时码流中最长连零个数为14,且第一个1后面只有三个比特。因此,在解码时,获取码流中的连零个数以及第一个1后面的
三个比特数据,根据连零个数和所述三个比特数据计算出码表索引值,查找解码码表
CoeffTokenTable_vlcN即可得到:所述码流中第一个1后面的码流长度、NumCoeff和
TrailingOnes。
[0309] 对应0<=nC<2时的NumCoeff和TrailingOnes的解码码表空间为:15×8×3=360words。
[0310] b)解码2<=nC<4时的NumCoeff和TrailingOnes
[0311] 根据图1所示标准编码码表可知,此时码流中最长连零个数为12,且第一个1后面只有三个比特数据。因此,在解码时,获取码流中的连零个数以及第一个1后
面的三个比特,根据连零个数和所述三个比特数据计算出码表索引值,查找解码码表
CoeffTokenTable_vlcN即可得到:所述码流中第一个1后面的码流长度、NumCoeff和
TrailingOnes。
[0312] 对应2<=nC<4时的NumCoeff和TrailingOnes的解码码表空间为:13×8×3=312words。
[0313] c)解码4<=nC<8时的NumCoeff和TrailingOnes
[0314] 根据图1所示标准编码码表可知,此时码流中最长连零个数为9,且第一个1后面只有三个比特数据。因此,在解码时,获取码流的连零个数以及第一个1后面的三个比特数据,根据连零个数和所述三个比特数据计算出码表索引值,查表CoeffTokenTable_vlcN即
可得到:所述码流中第一个1后面的码流长度、NumCoeff和TrailingOnes。
[0315] 对应4<=nC<8时的NumCoeff和TrailingOnes的解码码表空间为:10×8×3=240words。
[0316] (2)在8<=nC时的情况下,此时码流长度固定为6比特,因此直接读取6比特数据作为码表索引。
[0317] 针对这种情况的解码码表CoeffTokenTable_vlc4中只包含非零系数个数和拖尾系数个数,因此,直接从所述码流中读入6比特,将其数值作为索引值,范围是0~63,查表CoeffTokenTable_vlc4即可得到NumCoeff和TrailingOnes。
[0318] 对应8<=nC时的NumCoeff和TrailingOnes的解码码表空间为:64×2=128words。
[0319] (3)解码nC=-1(色度DC)时的NumCoeff和TrailingOnes
[0320] 在这种情况下,根据码流中连零个数和所述码流中第一个1后面的两比特数据计算出码表索引,查找相应的解码码表得到NumCoeff和TrailingOnes,
[0321] 根据图1所示标准编码码表可知,此时码流中最长连零个数为7,第一个1后面最多只有两个比特,而且码长和连零个数有着一一对应的关系,以图1中当nC=-1时的前5
个码流“01”、“000111”、“1”、“000100”、“000110”为例,它们对应的连零个数分别为1、3、0、
3、3,第一个“1”后面的码流长度分别为0、2、0、2、2,即当连零个数取某个值时,第一个“1”后面的码流长度是一个固定值。因此可以建立两个码表:一个码表中的值为第一个1后面
的码流长度(可以用连零个数作为索引来查表),码表空间为8;另一个码表中的值为非零
系数个数和拖尾系数个数,码表空间为64words。
[0322] 因此,在解码时,首先获取码流中的连零个数,然后读取第一个1后面的两个比特。根据连零个数查表CoeffTokenTable_vlc3_len得到码流中第一个1后面的码流长度;
根据连零个数和读取的两比特数据计算出另一个码表索引值,查表CoeffTokenTable_vlc3
即可得到NumCoeff和TrailingOnes。
[0323] 对应nC=-1时的NumCoeff和TrailingOnes的解码码表空间为:8+64=72words。
[0324] 需要说明的是,当码流连零个数为7时,属于全零的情况,需要特殊处理。因为在这种情况下,连零个数最多为7,因此读取完连零个数后判断是否大于7,若大于7使其等于7。
[0325] 如图6所示,是本发明实施例中解码最后一个非零系数前0的总个数TotalZeros的流程图。
[0326] 步骤601,根据解码得到的非零系数个数查找标准编码码表得到对应的最大连零个数,并且根据所述非零系数个数确定码表偏移值;
[0327] 步骤602,读取码流中连零个数leadingzeros和第一个1后面的两个比特数据;
[0328] 步骤603,判断所述连零个数leadingzeros是否大于所述最大连零个数;如果是,则执行步骤604;否则,执行步骤605;
[0329] 步骤604,将读取的连零个数leadingzeros设置为所述最大连零个数;
[0330] 步骤605,根据所述码表偏移值、所述连零个数leadingzeros、和所述两比特数据计算出码表索引;
[0331] 步骤606,根据所述码表索引查找解码码表TotalZerosTable[704],得到所述码流中最后一个非零系数前0的总个数。
[0332] 基于上述解码过程,下面针对解码非色度DC时的TotalZeros及解码色度DC时的TotalZeros的具体情况进行说明。
[0333] (1)解码非色度DC(直流系数)时的TotalZeros
[0334] 首先,根据已得到的非零系数个数TotalCoeff获得两个数据:一个是此非零系数个数对应的最大连零个数(根据对标准编码码表中的码字统计得到);另一个是此非零
系数个数对应的若干码字在解码查找表中的偏移位置即前面提到的码表偏移值,此偏移位
置查表TotalZerosTable_indexoffset可得到。根据标准编码码表可知第一个1后面最
多只有两个比特,因此获取码流的连零个数之后读取第一个1后面的两个比特数据,然后,根据所述两比特数据、以及前面确定了的码表偏移值和连零个数计算出码表索引值,从表
TotalZerosTable中查出实际码字长度和TotalZeros,解码成功结束。
[0335] 对应非色度DC时的TotalZeros的解码码表空间为:352×2=704words。
[0336] 由于解码需要,还可以建立两个码表,即:
[0337] 最大连零个数码表Maxnum_LeadingZerosTable和TotalZeros偏移码 表TotalZerosTable_indexoffset。
[0338] 需要说明的是,在这种情况下,很多码流会出现全零的情况,需要特殊处理。具体处理过程如下:
[0339] 由于最大连零个数码表Maxnum_LeadingZerosTable中的值为非零系数个数TotalCoeff取不同值时的最大连零个数,因此,当读取完连零个数值后判断该值是否大于
此码表对应的最大连零个数值,若大于则使该值等于码表中对应的最大连零个数值。
[0340] 最大连零个数码表Maxnum_LeadingZerosTable和TotalZeros偏移码 表TotalZerosTable_indexoffset的总空间为:30words。
[0341] (2)解码色度DC时的TotalZeros
[0342] 在这种情况下,码流长度都小于等于3比特。从码流中读取三比特数据,根据得到的三比特数据连同前面已解码得到的非零系数个数计算出码表索引值,从码表
TotalZerosChromaDCTable_vlc中查出实际码字长度和TotalZeros。
[0343] 码表TotalZerosChromaDCTable_vlc的空间为:3×8×2=48words。
[0344] 如图7所示,是本发明实施例中解码某一个非零系数前0的个数的流程图。
[0345] 在该解码过程中,需要根据之前解码得到的最后一个非零系数前0的总个数TotalZeros及非零系数个数解码得到某一个非零系数前0的个数RunBefore。
[0346] 根据标准编码码表的特点,分码长小于等于3和大于3两种情况分析。在本发明实施例中,只对码长小于等于3的部分设计解码码表,码长大于3的情况使用计算的方法进
行解码。对于码长小于等于3的情况,首先从码流中读出三比特数据,根据其数值和已知的该非零系数前剩余0的个数zerosleft计算出码表索引值(即第三索引值),查解码码表
RunBeforeTable_vlc,得到码流的实际码字长度和该非零系数前0的个数RunBefore。
[0347] 该过程包括以下步骤:
[0348] 步骤701,设置变量zerosleft,所述zerosleft代表其它非零系数前剩余0的总个数,其初始值为最后一个非零系数前0的总个数Totalzeros,即zerosleft=
Totalzeros,并且,设置变量i,所述i代表码流中非零系数个数的序号,其初始值为之前解码得到的非零系数个数numcoeff-1,即i=numcoeff-1;
[0349] 步骤702,判断是否zerosleft>0并且i>0;如果是,则执行步骤703;否则,表示已对所有非零系数前0的个数解码完毕,结束解码过程;
[0350] 步骤703,读取码流中的三比特数据;
[0351] 步骤704,根据所述zeroleft和读取的三比特数据计算码表索引;
[0352] 步骤705,根据得到的码表索引查解码码表RunBeforeTable_vlc,得到第i个非零系数前0的个数RunBefore;
[0353] 步骤706,判断得到的非零系数前0的个数RunBefore是否等于7(该值相当于一个特殊的标记,可任意设定一个特殊值);如果是,则执行步骤707;否则,执行步骤709;
[0354] 步骤707,读取码流中连零个数leadingzeros;
[0355] 步骤708,确定第i个非零系数前0的个数RunBefore=leadingzeros+4;
[0356] 步骤709,设置zerosleft-=runbefore,并且i--,即获取下一个非零系数;
[0357] 步骤710,判断zerosleft!=0并且i!=0;如果是,则表明还需要继续解码,执行步骤703;否则,表明对所有的非零系数前0的个数已解码完毕,结束解码过程。
[0358] 可见,本发明实施例CAVLC解码方法,基于码流连零个数对解码码表重新分组,对部分非零系数的解析也采用了查表实现。通过测试验证,本发明实施例的方法解析效率较现有技术提升了1倍左右,存储空间也降低了很多,可以很好的应用于嵌入式硬件平台设
计中。
[0359] 与现有技术的解码方法相比,区别主要体现在以下几点:
[0360] 1.处理速度
[0361] 现有技术在对视频码流解码时,是根据统计概率直接读取了固定比特的数据,需要大量的辅助判断来完成解码,比如在现有版本中耗时最大的非零系数解码模块现有
技术每次需13次判断,而本发明实施例的方法仅需4次判断,极大地提升了解码效率;
另外,本发明实施例的方法根据码字特点重新设计了码表,拖尾系数解码时也采用了查
表实现,减少了3次判断,提升了解码效率。在相同的测试环境下分别测试了分辨率为
qcif(176×144)、cif(352×288)、qvga(320×240)码流CAVLC模块的解析时间,利用本发
明实施例的方法,三种码流的CAVLC的解析时间分别是现有技术的50%、47.6%、51.5%,可见效率提升了1倍左右。
[0362] 2.存储空间
[0363] 现有技术需要存储3208words的码表元素,而本发明实施例的方法只需要存储2082words的码表元素,降低了2Kbytes左右的存储空间,这对于有限的嵌入式设备空间来
说具有重要意义,可以很好地应用在H.264视频解码的嵌入式设备中。
[0364] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,
所述的存储介质,如:ROM/RAM、磁碟、光盘等。
[0365] 相应地,本发明实施例还提供一种CAVLC解码系统,如图8所示,是本发明实施例CAVLC解码系统的结构示意图。
[0366] 在该实施例中,所述系统包括:
[0367] 码流获取单元801,用于获取需要解码的码流;
[0368] 计算单元802,用于确定所述码流中的非零系数个数预测值nC;
[0369] 第一解码单元803,用于根据所述预测值nC查找预先建立的第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数,所述第一解码码表为包含非零系数个数和拖
尾系数个数的解码码表;
[0370] 第一判断单元804,用于判断所述非零系数个数是否大于0,以及所述拖尾系数个数是否大于0;
[0371] 符号解析单元805,用于在所述第一判断单元判断所述非零系数个数大于0,并且所述拖尾系数个数大于0时,解码拖尾连1系数的符号;
[0372] 第二判断单元806,用于判断所述非零系数个数是否小于非零系数个数的最大值;
[0373] 第二解码单元807,用于在所述第二判断单元判断所述非零系数个数小于非零系数个数的最大值时,根据所述非零系数个数查找预先建立的第二解码码表,得到所述码流
中最后一个非零系数前0的总个数,所述第二解码码表为包含最后一个非零系数前0的总
个数的解码码表;
[0374] 第三解码单元808,用于根据所述最后一个非零系数前0的总个数及所述非零系数个数,解码所述码流中其他非零系数前0的个数。
[0375] 在本发明实施例中,所述系统还可进一步包括:第一解码码表建立单元(未图示),用于基于编码非零系数个数和拖尾系数个数时的标准编码中各码字的连零个数对码
流进行分组,将连零个数相同的码字分为一组;并根据各组码流的连零个数及该组码流中
第一个1后面的两比特或三比特数据(根据nC值确定),建立所述第一解码码表,所述第一
解码码表中包含:码流中第一个1后面的码流长度、非零系数个数、拖尾系数个数。
[0376] 相应地,所述第一解码单元803包括:
[0377] 第一系数解码子单元,用于在所述预测值0<=nC<8时,根据所述码流中第一个1前面的连零个数及第一个1后面的三比特数据计算第一索引值;并根据所述第一索引
值查找所述第一解码码表,得到所述码流中第一个1后面的码流长度、非零系数个数和拖
尾系数个数;
[0378] 第二系数解码子单元,用于在所述预测值8<=nC时,确定所述码流长度固定为6;并根据所述码流对应的码字查找所述第一解码码表,得到所述码流中的非零系数个数和拖尾系数个数;
[0379] 第三系数解码子单元,用于在所述预测值nC=-1时,则根据所述码流中第一个1前面的连零个数查找所述第一解码码表,得到所述码流中第一个1后面的码流长度;并根
据所述码流中第一个1后面的两比特数据查找所述第一解码码表,得到所述码流中的非零
系数个数和拖尾系数个数。
[0380] 在本发明实施例中,所述系统还可进一步包括:第二解码码表建立单元(未图示),用于基于编码最后一个非零系数前0的总个数的标准编码中各码字的连零个数对码
流进行分组,将连零个数相同的码字分为一组;并根据各组码流的连零个数及该组码流中
第一个1后面的两比特数据,建立所述第二解码码表,所述第二解码码表中包含:码流中第一个1后面的比特数,最后一个非零系数前0的总个数。
[0381] 相应地,所述第二解码单元807包括:
[0382] 索引值计算子单元,用于根据所述非零系数个数、所述码流中连零个数及第一个1后面的两比特数据计算第二索引值;
[0383] 解码子单元,根据所述第二索引值查找所述第二解码码表,得到所述码流中最后一个非零系数前0的总个数。
[0384] 在本发明实施例中,所述系统还可进一步包括:第三解码码表建立单元(未图示),用于针对码流长度小于等于3的码流建立第三解码码表,所述第三解码码表为包含其
他非零系数前0的个数及所述码流的长度值的解码码表;
[0385] 所述第三解码单元808包括:
[0386] 查表解码子单元,用于在所述码流的长度小于等于3时,根据所述码流中的三比特数据、以及该非零系数前剩余0的总个数计算第三索引值,并根据所述第三索引值查找
所述第三解码码表,得到码流长度和所述其他非零系数前0的个数;
[0387] 计算解码子单元,用于在所述其他非零系数前0的总个数大于6并且读取的三比特数据为预定值时,获取所述码流的连零个数,并将所述连零个数加4作为所述其他非零
系数前0的个数。
[0388] 需要说明的是,本发明实施例CAVLC解码系统并不仅限于上述结构形式,还可以有其他变形结构,在此不再一一描述。
[0389] 本发明实施例CAVLC解码系统,基于码流连零个数对解码码表重新分组,对大部分句法元素的解码也采用了查表实现。本发明不仅大大节省了解码码表的存储空间,而且
有效地提高了解码效率,可以很好地应用于H.264视频解码的嵌入式设备中。
[0390] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统实施例仅仅是示意性的,其中所述作为分离部件说明
的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是
物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出
创造性劳动的情况下,即可以理解并实施。
[0391] 本发明实施例可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
[0392] 本发明实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0393] 以上对本发明实施例进行了详细介绍,本文中应用了具体实施方式对本发明进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及设备;同时,对于本领域的
一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。