Cavlc熵解码器及熵解码方法

文档序号:7823381阅读:278来源:国知局
Cavlc熵解码器及熵解码方法
【专利摘要】本发明公开了一种CAVLC熵解码器及熵解码方法。该解码器包括CAVLC控制器、解码模块和存储模块和数据拼接模块。解码器对码流中非零系数较少的情况做了专门优化;在CAVLC控制器和解码模块间加入旁路电路提前进行解码状态跳转的判断,以节约时钟周期;并将前游程解码与幅值前缀解码并在一个模块完成。本发明在提高熵解码效率的同时节约了面积开销。
【专利说明】CAVLC熵解码器及熵解码方法

【技术领域】
[0001] 本发明涉及视频编解码【技术领域】,更具体地涉及CAVLC熵解码器及熵解码方法。

【背景技术】
[0002] CAVLC是一种用于降低比特率并充分利用统计冗余的熵编码技术。作为视频解码 框架中的第一步,熵解码对视频解码性能有着非常大的影响。在当今视频编解码中应用最 广泛的H. 264标准中,规定熵编码可采用基于上下文的的自适应变长编码(CAVLC)和基于 上下文的自适应算术编码(CABAC)。其中,CAVLC的编码效率较早先的MPEG-1和MPEG-2标 准有了明显提高,而实现复杂度较CABAC而言则低了不少,在视频编码中得到广泛使用。
[0003] 在CAVLC解码器中,通常涉及以下六种语法元素的解码:非零系数的数目、拖尾系 数的数目、每个拖尾系数的符号、拖尾系数以外非零系数的幅值、最后一个非零系数前零的 数目、当前非零系数与前一个非零系数之间零的数目。
[0004] 一般的解码步骤如下:首先查表解得非零系数的数目和拖尾系数的个数,再解出 各拖尾系数的符号位,然后解出除拖尾系数外非零系数的幅值,再解出最后一个非零系数 前零的个数,最后解出每个非零系数前0的个数。
[0005] 传统的CAVLC熵解码器通常由系数标志位模块、拖尾系数符号模块、幅值前缀模 块、幅值后缀模块、总零数模块、前游程模块共六个功能模块,加上一个CAVLC控制模块,以 及相应的存储模块组合而成。由于解码步骤和模块较多,每个模块的解码又依赖于前面模 块输出的结果,导致各模块等待时间较长,整体解码效率偏低。
[0006] 目前,对于CAVLC解码器的优化主要集中在改善其解码效率而提高解码速度上。 以下为其中两种代表性的方案:
[0007] 1)加入旁路电路模块的方法[2]。这种方法将上一级解码模块所获得的解码参数 从旁路电路单元传输给下一级解码状态机跳转控制模块和下一级解码模块,减少了条件判 断时等待的时间,一定程度上提升了解码效率,但其结构较复杂,模块与模块之间、模块与 寄存器之间需要较多连线,带来较大的面积开销。
[0008] 2)基于优化的查找表的方法[3]。这种方法将根据码字中前置零的个数将C〇efT_ token查找表重新分组,解码时以前置零个数和码字后缀为索引进行查表,从而减少查表次 数。但QP较大时,coefT_token码字的前置零的个数较少,此方法对解码的加速效果不明 显〇


【发明内容】

[0009] (一)要解决的技术问题
[0010] 本发明旨在解决现有技术中的解码器在码流中QP较大时优化效率不高以及面积 开销大的问题。
[0011] (二)技术方案
[0012] 鉴于以上提到的问题,本发明提供了一种新的CAVLC熵解码器的实现和方法,对 系数较少的情况做了专门优化,使用较少的旁路电路提前判断是否进入下一个解码状态, 并将前游程解码与系数块重建合并在一个模块完成。能进行高效的解码并减少面积开销。
[0013] 为解决上述技术问题,本发明提出一种CAVLC熵解码器,包括CAVLC控制器、解码 模块、存储模块和数据拼接模块,其中:所述CAVLC控制器包括状态跳转控制模块、拖尾符 号输出模块、系数幅值计算模块,用于控制码流输入,协调各模块的工作,根据各模块解码 得到的语法元素进行拖尾符号和幅值的解码;所述解码模块用于从码流中解出码字的系数 标志位和总零数以及每个幅值的前缀和前游程;所述存储模块用于暂时保存解码模块和 CAVLC控制器解出的语法元素值;所述数据拼接模块将系数幅值重新组合拼接后输出。
[0014] 根据本发明的【具体实施方式】,所述解码模块包括系数标志位解码模块、总零数解 码模块、幅值前缀解码模块和前游程解码模块。
[0015] 根据本发明的【具体实施方式】,所述存储模块包括非零系数寄存器、拖尾系数寄存 器、幅值前缀寄存器、总零数寄存器、后缀码长寄存器、剩余零数寄存器、前游程寄存器、非 零系数幅值存储器和系数幅值存储器。
[0016] 根据本发明的【具体实施方式】,所述CAVLC控制器在解出系数标志位后,对拖尾系 数个数提前进行判断,若拖尾系数个数为〇,解码器跳过拖尾符号解码,进行幅值解码。
[0017] 根据本发明的【具体实施方式】,所述CAVLC控制器在解完拖尾符号后,对非零系数 个数与拖尾系数的个数进行判断,若相等,表明不存在除拖尾系数之外的非零系数,解码器 跳过幅值解码,进行总零数解码。
[0018] 根据本发明的【具体实施方式】,所述的CAVLC控制器还包括幅值后缀解码模块,其 用于在系数标志解码状态中,根据解码得到的非零系数和拖尾系数对后缀码长进行初始 化,在幅值解码状态中,根据已解码的系数幅值对后缀码长作动态更新。
[0019] 根据本发明的【具体实施方式】,所述的CAVLC控制器和解码模块间,还包括参数传 输电路,其用于将解码模块中得到的参数值,在当前周期传递给CAVLC控制器,提前进行状 态机的跳转判断。
[0020] 根据本发明的【具体实施方式】,前游程解码模块中包含所述幅值前缀解码模块,在 进行前游程解码时,对于剩余零数大于6情况,前游程的值可根据幅值前缀解码模块计算 得到。
[0021] 本发明还提出一种CAVLC熵解码方法,应用于CAVLC解码器中,CAVLC解码器包括 CAVLC控制器、解码模块、存储模块和数据拼接模块,所述解码方法包括如下步骤:步骤S1 : 查表确定码流中的非零系数个数和拖尾符号个数,并根据其值设置后缀码长的初始值;步 骤S2 :当拖尾符号个数大于零时,顺序解出每个拖尾系数的符号值;步骤S3 :解出当前变 换系数的前缀码和后缀码,计算得到幅值并判断是否还有待解码的非零系数,若存在则重 复此步骤,直至解出所有非零系数;步骤S4 :查表解出总零数值,将其作为剩余零数的初始 值;步骤S5 :根据剩余零数,查表解出前游程的值,并动态更新剩余零数,重复进行该步骤, 直至只剩最后一个非零系数或是剩余零数与前游程相等;步骤S6 :根据解出的拖尾符号 值、系数幅值、和前游程值重建系数块,经过zig-zag扫描后输出。
[0022] (三)有益效果
[0023] 本发明对CAVLC熵解码过程中,码流中非零系数较少的情况做了专门优化,在控 制模块与解码模块间加入了旁路电路提前进行状态机跳转判断,并将前游程解码与系数块 重建合并在一个模块完成,从而提高了熵解码器的工作效率,对其面积开销和延时也有一 定改善,能有效地提高整体解码的速度。

【专利附图】

【附图说明】
[0024] 图1是本发明实现的CAVLC熵解码器结构示意图;
[0025] 图2是本发明实现的CAVLC熵解码器状态机跳转示意图;
[0026] 图3是拖尾系数条件判断示意图;
[0027] 图4是非零系数个数条件判断示意图;
[0028] 图5是H. 264标准中给出的prefix_value码表[1];
[0029] 图6是H. 264标准中给出的run_before码表[1]。

【具体实施方式】
[0030] 本发明提出的CAVLC熵解码器包括CAVLC控制器、解码模块、数据拼接模块和存储 丰旲块。
[0031] 所述CAVLC控制器包括状态跳转控制模块、拖尾符号输出模块、系数幅值计算模 块。
[0032] 所述解码模块包括系数标志位解码模块(coeff_token)、总零数解码模块 (total_zero)、幅值前缀解码模块(level_prefix)和前游程解码模块(run_before)。
[0033] 所述存储模块包括非零系数寄存器(TotalCoefT)、拖尾系数寄存器 (TrailingOnes)、幅值前缀寄存器(level_prefix)、总零数寄存器(total_zeros)、后缀码 长寄存器(suffix_length)、剩余零数寄存器(zeros_left)、前游程寄存器(run_before)、 非零系数幅值存储器(LevelVal)和系数幅值存储器(coeff_level)。
[0034] 所述CAVLC控制器用于控制码流输入,通过状态机协调各模块的工作,根据各模 块解码得到的语法元素进行拖尾符号和幅值的解码,最后当所有语法元素解码完成后,将 系数幅值重新组合拼接后输出。
[0035] 所述CAVLC控制器,在进行状态跳转控制时,对系数较少的情况做了专门优化:
[0036] 1)系数标志位解码状态下,对非零系数个数和拖尾系数个数提前进行判断。若非 零系数个数为〇,则结束当前块解码;若拖尾系数个数为〇,直接跳过拖尾符号解码状态,如 图3所示。
[0037] 2)在拖尾符号解码状态下,加入了对非零系数个数的判断,若总的非零系数个数 与拖尾系数的个数相等,表明不存在除拖尾系数之外的非零系数,状态机跳过幅值解码,直 接进入总零数解码状态,如图4所示。
[0038] CAVLC控制器和各解码模块间还包括参数传输电路,用于将解码模块中得到的参 数值,在当前周期传递给CAVLC控制器,提前进行状态机的跳转判断,避免寄存器幅值完成 后再判断状态跳转造成不必要的等待。
[0039] 所述的幅值前缀解码模块,在实现时作为子模块,包含在前游程解码模块中。由图 5、图6中码表可以看出,当zeros_left大于6时,若码流中前两位均为零,run_before的 值直接由level_prefix的值加4给出,无需再通过查表或组合逻辑得到,节约了开销。
[0040] 本发明还提出应用于CAVLC解码器的CAVLC熵解码方法,包括如下步骤:
[0041] 步骤SI :查表确定码流中的非零系数个数和拖尾符号个数,并根据其值设置后缀 码长的初始值;
[0042] 步骤S2 :当拖尾符号个数大于零时,顺序解出每个拖尾系数的符号值;
[0043] 步骤S3 :解出当前变换系数的前缀码和后缀码,计算得到幅值并判断是否还有待 解码的非零系数,若存在则重复此步骤,直至解出所有非零系数;
[0044] 步骤S4 :查表解出总零数值,将其作为剩余零数的初始值;
[0045] 步骤S5 :根据剩余零数,查表解出前游程的值,并动态更新剩余零数,重复进行该 步骤,直至只剩最后一个非零系数或是剩余零数与前游程相等;
[0046] 步骤S6 :根据解出的拖尾符号值、系数幅值、和前游程值重建系数块,经过 zig-zag扫描后输出。
[0047] 为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照 附图,对本发明作进一步的详细说明。
[0048] 如图1所示,本发明实现的熵解码器包括CAVLC控制器、解码模块和存储模块和数 据拼接模块。所述CAVLC控制器包括状态跳转控制模块(11)、拖尾符号输出模块(12)、系数 幅值计算模块(13)。所述解码模块,包括系数标志位解码模块(21)、总零数解码模块(22)、 幅值前缀解码模块(23)和前游程解码模块(24)。
[0049] 所述存储模块,包括非零系数寄存器(31)、拖尾系数寄存器(32)、幅值前缀寄存 器(33)、总零数寄存器(34)、后缀码长寄存器(35)、剩余零数寄存器(36)、前游程寄存器 (37)、非零系数幅值存储器(38)和系数幅值存储器(39)。
[0050] CAVLC控制器、解码模块和存储模块在一起构成了一个状态机,状态机的状态表征 解码所处的阶段。状态机包括初始化、系数标志位解码、拖尾符号解码、幅值解码状态、幅值 输出状态、总零数解码、前游程解码这七个状态,各状态之间跳转关系如图2所示。完整的 解码步骤如下:
[0051] 步骤1 :熵解码器接收到使能信号,进入初始化状态,各寄存器和存储器被清零, 初始化完成后,状态机跳转到系数标志位解码状态。
[0052] 步骤2 :在系数标志位解码状态中,解码器将系数标志位解码模块解码得到 的 coeff_token_TotalCoeff、coeff_token_TrailingOnes 通过旁路电路分别传输给 TotalCoeff 和 TrailingOnes 寄存器。
[0053] 依据标志位的值对幅值后缀长度寄存器的值进行初始化,当coeff_token_ TotalCoeff 大于 10 且 coeff_token_TrailingOnes 小于 3 时,suffix_length 的值被赋为 1,否则赋为〇。
[0054] 进行状态跳转判断,若非零系数个数为零,则结束当前残差块的解码,状态机跳转 回到初始化状态,等待进行下一残差块解码。
[0055] 若非零系数个数不为零,则如图3所示,根据拖尾系数的数目进行状态跳转判断:
[0056] 若拖尾系数个数为零,状态机跳过拖尾系数解码状态,直接跳转到幅值解码状态, 执行步骤4 ;
[0057] 若拖尾系数个数不为零,状态机跳转进入拖尾系数解码状态。
[0058] 步骤3 :在拖尾符号解码状态中,CAVLC控制器依次对输入比特流中各个拖尾系数 的符号进行解码,并将结果输出到LevelVal中。
[0059] 如图4所示过程,将TrailingOnes和TotalCoeff的值进行比较,根据结果进行状 态跳转:
[0060] 若相等,则表明除拖尾系数外没有其他非零系数需要解码,状态机直接跳转进入 总零数解码状态,执行步骤6;
[0061] 若TrailingOnes的值小于TotalCoeff,状态机跳转进入幅值解码状态。
[0062] 步骤4 :在幅值解码状态中,CAVLC控制模块首先将前缀幅值模块解出的level_ prefix_value 传输给 level_prefix 寄存器,并根据 suffix_length 更新 levelSuffixSize 的值。
[0063] 然后根据level_prefix_value和suffix_length的值解出高频位置上第一个未 解码的非拖尾系数的幅值,并将其输出到LevelVal的相应位。最后使状态机跳转到幅值输 出状态。
[0064] 步骤5 :在幅值输出状态中,首先对当前解码的非零系数的数目进行判断,若还有 未被解码的非零系数,则状态机跳转回到幅值解码状态,继续解下一非拖尾系数幅值。
[0065] 若所有系数幅值均被解码,再对startldx-endldx+l的结果进行判断,进行状态 跳转:
[0066] 若等于TotalCoeff,CAVLC控制器输出系数幅值到coeff_level中,经重新拼接后 输出,完成当前残差块的解码,状态机跳转回初始状态;
[0067] 若不等,则进入总零数解码状态。
[0068] 步骤6 :在总零数解码状态下,CAVLC控制模块将总零数解码模块解出的total_ zeros_value 传输给 zeros_left 寄存器。
[0069] 再对总零数的值进行判断,根据结果进行状态跳转:
[0070] 若total_zeros_value为0,即没有系数为0的情况,将LevelVal的值直接传输给 coeff_l eve 1,拼接后输出,完成当前残差块的解码,状态机跳转回初始状态。
[0071] 若total_zeros_value不为0,再对非零系数的个数进行判断。
[0072] 若TotalCoeff等于1,表明只有一个非零系数,不需要解run_before,将LevelVal 中唯一的非零系数值直接传到C〇eff_leVel的对应位上,拼接后输出,完成当前残差块的 解码,状态机跳转回初始状态。
[0073] 若TotalCoeff不等于1,表明有多个非零系数需要解码,状态机跳转至前游程解 码状态。
[0074] 步骤7 :在前游程解码状态下,CAVLC控制器根据前游程解码模块解出的run_ before_value的值,更新zeros_left寄存器的值,然后将LevelVal中各系数幅值,根据游 程,写入coeff_level对应的位置。
[0075] 对剩余非零系数个数进行判断:
[0076] 当只剩最后一个非零系数时,不需要继续解run_before的值,直接将最低频的 LevelVal赋给系数幅值存储器C〇eff_leVel的相应位置。完成当前残差块的解码
[0077] 当剩余非零系数不止一个时,再对zeros_left和run_before_value的大小进行 判断:
[0078] 若相等,表明除当前非零系数外,剩余的非零系数前,均不存在前导零,可依次顺 序输出系数幅值给coefOevel存储器。完成当前残差块的解码。
[0079] 若不等,表明还存在待解码的前导零,状态机循环执行步骤7的工作,直至当前残 差块解码完成。
[0080] coeff_level存储器中的16个系数幅值经数据拼接模块按zig-zag扫描重排序之 后,拼接为一整行输出。CAVLC控制器将解码完成信号拉高,并跳转至初始状态,等待下一残 差块的解码。
[0081 ] 本发明在控制模块和解码模块之间加入旁路电路的方式,提前进行状态机跳转判 断;对码流中非零系数较少的情况加入相应的判断条件,以跳过不必要的解码状态;并将 前游程解码与系数块重建合并在一个模块完成。通过以上方法实现的熵解码器具备解码效 率高,面积开销小的特点。
[0082] 以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详 细说明,应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在 本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护 范围之内。
【权利要求】
1. 一种CAVLC熵解码器,其特征在于,包括CAVLC控制器、解码模块、存储模块和数据拼 接模块,其中: 所述CAVLC控制器包括状态跳转控制模块、拖尾符号输出模块、系数幅值计算模块,用 于控制码流输入,协调各模块的工作,根据各模块解码得到的语法元素进行拖尾符号和幅 值的解码; 所述解码模块用于从码流中解出码字的系数标志位和总零数以及每个幅值的前缀和 前游程; 所述存储模块用于暂时保存解码模块和CAVLC控制器解出的语法元素值; 所述数据拼接模块将系数幅值重新组合拼接后输出。
2. 根据权利要求1所述的CAVLC熵解码器,其特征在于, 所述解码模块包括系数标志位解码模块、总零数解码模块、幅值前缀解码模块和前游 程解码模块。
3. 根据权利要求1所述的CAVLC熵解码器,其特征在于, 所述存储模块包括非零系数寄存器、拖尾系数寄存器、幅值前缀寄存器、总零数寄存 器、后缀码长寄存器、剩余零数寄存器、前游程寄存器、非零系数幅值存储器和系数幅值存 储器。
4. 根据权利要求1所述的CAVLC熵解码器,其特征在于,所述CAVLC控制器在解出系数 标志位后,对拖尾系数个数提前进行判断,若拖尾系数个数为0,解码器跳过拖尾符号解码, 进行幅值解码。
5. 根据权利要求1所述的CAVLC熵解码器,其特征在于,所述CAVLC控制器在解完拖尾 符号后,对非零系数个数与拖尾系数的个数进行判断,若相等,表明不存在除拖尾系数之外 的非零系数,解码器跳过幅值解码,进行总零数解码。
6. 根据权利要求1所述的CAVLC熵解码器,其特征在于,所述的CAVLC控制器还包括幅 值后缀解码模块,其用于在系数标志解码状态中,根据解码得到的非零系数和拖尾系数对 后缀码长进行初始化,在幅值解码状态中,根据已解码的系数幅值对后缀码长作动态更新。
7. 根据权利要求1所述的CAVLC熵解码器,其特征在于,所述的CAVLC控制器和解码模 块间,还包括参数传输电路,其用于将解码模块中得到的参数值,在当前周期传递给CAVLC 控制器,提前进行状态机的跳转判断。
8. 根据权利要求1所述的CAVLC熵解码器,其特征在于,前游程解码模块中包含所述幅 值前缀解码模块,在进行前游程解码时,对于剩余零数大于6情况,前游程的值可根据幅值 前缀解码模块计算得到。
9. 一种CAVLC熵解码方法,应用于CAVLC解码器中,CAVLC解码器包括CAVLC控制器、 解码模块、存储模块和数据拼接模块,其特征在于,所述解码方法包括如下步骤: 步骤S1 :查表确定码流中的非零系数个数和拖尾符号个数,并根据其值设置后缀码长 的初始值; 步骤S2 :当拖尾符号个数大于零时,顺序解出每个拖尾系数的符号值; 步骤S3 :解出当前变换系数的前缀码和后缀码,计算得到幅值并判断是否还有待解码 的非零系数,若存在则重复此步骤,直至解出所有非零系数; 步骤S4 :查表解出总零数值,将其作为剩余零数的初始值i 步骤S5 :根据剩余零数,查表解出前游程的值,并动态更新剩余零数it重复进行该步 骤,直至只剩最后一个非零系数或是剩余零数与前游程相等; 步骤S6:根据解出的拖尾符号值、系数幅值、和前游程值重建系数块,经过zig-zag扫 描后输出。
【文档编号】H04N19/13GK104486624SQ201410796177
【公开日】2015年4月1日 申请日期:2014年12月18日 优先权日:2014年12月18日
【发明者】王东琳, 李玲, 石守谦, 陈皓, 谭吉来, 周钰致 申请人:中国科学院自动化研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1