基于HEVC熵编码器的集成电路设计方法与流程

文档序号:12789940阅读:196来源:国知局
基于HEVC熵编码器的集成电路设计方法与流程
本发明属于视频压缩编码
技术领域
,涉及一种集成电路设计方法,具体涉及一种基于HEVC熵编码器的集成电路设计方法,可用于视频编码中降低信源符号冗余度的无损编码。
背景技术
:视频编码中熵编码器主要完成将前期的控制数据、量化变换系数、帧内预测数据以及运动数据等编码为二进制流,一方面作为视频压缩过程中评价预测模式和划分深度组合性能好坏的标准之一,一方面用于存储或传输。熵编码器主要包括二进制化、上下文建模和二进制算数编码三个步骤,本身具有结构复杂、编码符号前后依赖性强等特征。为了加快视频压缩系统中熵编码器的实时处理速度,采用专用集成电路实现视频熵编码器,专用集成电路通常具有速度快,稳定性好,可靠性高等特点。视频压缩系统将一帧视频划分为多个等大的编码块单元,针对每个编码块单元遍历多种预测模式和划分深度,然后对每种预测模式和划分深度的组合进行预测、变换和量化,得到二维量化残差数据,可以称为TU块,作为熵编码的主要输入数据。TU块的熵编码是基于4×4子块进行的,需要按照TU块中所有4×4子块的扫描顺序依次处理每个子块,其中包含当前TU块中最后一个非零系数的4×4子块称为lastCG。熵编码器的集成电路实现一直是视频编码中的难点所在,熵编码器的结构特点使得熵编码器称为制约整个硬件视频编码器速度性能的瓶颈所在。目前熵编码器集成电路的设计方法为:4×4子块输入顺序和TU块中所有4×4子块的扫描顺序不同,应当第一个处理的4×4子块往往最后一个才输入熵编码器,需要对当前输入熵编码器却不能处理的4×4子块的数据进行存储,直至获取得到TU块中所有的4×4子块,再按照TU块中所有4×4子块的扫描顺序依次对所有4×4子块进行二值化、上下文建模和二进制算数编码,输出二进制码流Bit串。这种集成电路的设计方法需要大量的存储开销,在存储过程中增加了延时等待,存在硬件开销大,实现复杂度高等缺点。技术实现要素:本发明的目的在于克服上述现有技术存在的缺陷,提出了一种基于HEVC熵编码器的集成电路设计方法,用于解决现有熵编码器集成电路设计方法中存在的硬件开销大和实现复杂度高的技术问题。本发明的技术思路是:通过将残差系数TU块中所有4×4子块的非零系数的位置信息和幅值信息转换为HEVC中相关语法元素,用HEVC熵编码器的二值化方法对这些语法元素进行二进制化,得到每个子块的二元符号Bin串长度,再按照TU块中所有4×4子块的扫描顺序对4×4子块的二元符号Bin串长度进行计算,得到TU块的二元符号Bin串长度,作为评价视频压缩过程中预测模式和划分深度组合性能好坏的标准之一。根据上述技术思路,实现本发明目的采取的技术方案,包括如下步骤:(1)创建寄存器LengthOut1、LengthOut2、csbfOut、LengthOut1Reg32、LengthOut1Reg16、LengthOut1Reg8、LengthOut2Reg32、LengthOut2Reg16、LengthOut2Reg8、CsbfReg32、CsbfReg16、CsbfReg8、Counter32、Counter16和Counter8,并将这些寄存器初始化为0;(2)计算HEVC熵编码器用到的HEVC标准中各语法元素的二元符号Bin长度:(2a)对当前4×4子块的二维系数进行扫描,得到当前4×4子块的一维数据;(2b)对当前4×4子块的一维数据中非零系数的位置信息和幅值信息进行格式转化,得到多个HEVC标准中语法元素;(2c)对HEVC标准中各语法元素进行二值化,得到当前4×4子块多个二元符号Bin长度;(3)计算当前4×4子块的二元符号Bin串长度和全零标志位csbf的值,并将计算结果分别存储到相应的寄存器中,实现步骤为:(3a)按照当前4×4子块与lastCG的位置关系,对当前4×4子块各二元符号Bin长度进行不同操作:当当前4×4子块位于lastCG之前,则当前4×4子块的二元符号Bin串长度为0,将数值0分别存入寄存器LengthOut1和寄存器LengthOut2;当当前4×4子块位于lastCG之后,对当前4×4子块中与所有非零系数幅值信息和除最后一个非零系数之外的非零系数的位置信息相关的二元符号Bin长度进行相加,并将计算结果存入寄存器LengthOut1;当当前4×4子块位置与lastCG位置相同,对当前4×4子块中与所有非零系数幅值信息和位置信息相关的二元符号Bin长度进行相加,并将计算结果存入寄存器LengthOut2;(3b)计算当前4×4子块所有系数的绝对值之和,并判断计算结果是否为0,若是,则当前4×4子块的全零标志位csbf的值为0,否则,当前4×4子块的全零标志位csbf的值为1,再将全零标志位csbf的值存入寄存器csbfOut;(4)根据当前4×4子块所在TU块的规格,对当前4×4子块在TU块中的位置坐标(CGposX,CGposY)进行不同的位置格式转换操作,并将寄存器LengthOut1、寄存器LengthOut2和寄存器csbfOut存储的值分别存储到相应的寄存器中:当当前4×4子块所在TU块的规格是TU32×32,将当前4×4子块在TU块中的位置坐标(CGposX,CGposY),转换为当前4×4子块在TU块的所有子块扫描顺序中的位置CGNum,并将寄存器LengthOut1存储的值存储到寄存器LengthOut1Reg32的CGNum位置处,将寄存器LengthOut2存储的值存储到寄存器LengthOut2Reg32的CGNum位置处,将寄存器csbfOut存储的值存储到寄存器CsbfReg32的CGNum位置处;当当前4×4子块所在TU块的规格是TU16×16,将当前4×4子块在TU块中的位置坐标(CGposX,CGposY),转换为当前4×4子块在TU块的所有子块扫描顺序中的位置CGNum,然后将寄存器LengthOut1存储的值存储到寄存器LengthOut1Reg16的CGNum位置处,将寄存器LengthOut2存储的值存储到寄存器LengthOut2Reg16的CGNum位置处,将寄存器csbfOut存储的值存储到寄存器CsbfReg16的CGNum位置处;当当前4×4子块所在TU块的规格是TU8×8,将当前4×4子块在TU块中的位置坐标(CGposX,CGposY),转换为当前4×4子块在TU块的所有子块扫描顺序中的位置CGNum,然后将寄存器LengthOut1存储的值存储到寄存器LengthOut1Reg8的CGNum位置处,将寄存器LengthOut2存储的值存储到寄存器LengthOut2Reg8的CGNum位置处,将寄存器csbfOut存储的值存储到寄存器CsbfReg8的CGNum位置处;(5)根据当前4×4子块所在TU块的规格,计算TU块中已经计算得到二元符号Bin串长度的4×4子块的个数,并将不同的计算结果分别存入寄存器Counter32、Counter16和Counter8:当当前4×4子块所在TU块的规格是TU32×32,对寄存器Counter32存储的值加1,并将计算结果存入寄存器Counter32;当当前4×4子块所在TU块的规格是TU16×16,对寄存器Counter16存储的值加1,并将计算结果存入寄存器Counter16;当当前4×4子块所在TU块的规格是TU8×8,对寄存器Counter8存储的值加1,并将计算结果存入寄存器Counter8;(6)将寄存器Counter32、Counter16和Counter8的值与TU块包含的4×4子块的总数进行比较,并根据比较结果和当前4×4子块所在TU块的规格,对当前TU块的下一个4×4子块和当前TU块进行不同操作:当寄存器Counter32小于64,且4×4子块所在TU块的规格是TU32×32时,执行步骤(2),计算当前TU块的下一个4×4子块的二元符号Bin串长度,否则执行步骤(7),计算当前TU块的二元符号Bin串长度;当寄存器Counter16小于16,且4×4子块所在TU块的规格是TU16×16时,执行步骤(2),计算当前TU块的下一个4×4子块的二元符号Bin串长度,否则执行步骤(7),计算当前TU块的二元符号Bin串长度;当寄存器Counter8小于4,且4×4子块所在TU块的规格是TU8×8时,执行步骤(2),计算当前TU块的下一个4×4子块的二元符号Bin串长度,否则执行步骤(7),计算当前TU块的二元符号Bin串长度;(7)计算当前4×4子块所在不同规格的TU块的二元符号Bin串长度:当当前4×4子块所在TU块的规格为TU32×32,根据寄存器CsbfReg32存储的值,将寄存器LengthOut1Reg32和寄存器LengthOut2Reg32中存储的多个4×4子块的二元符号Bin串长度进行相加,得到TU32×32的二元符号Bin串长度;当当前4×4子块所在TU块的规格为TU16×16,根据寄存器CsbfReg16存储的值,将寄存器LengthOut1Reg16和寄存器LengthOut2Reg16中存储的多个4×4子块的二元符号Bin串长度进行相加,得到TU16×16的二元符号Bin串长度;当当前4×4子块所在TU块的规格为TU8×8,根据寄存器CsbfReg8存储的值将寄存器LengthOut1Reg8和寄存器LengthOut2Reg8中存储的多个4×4子块的二元符号Bin串长度进行相加,得到TU8×8块的二元符号Bin串长度。本发明与现有技术相比,具有以下优点:本发明由于在获取不同规格的TU块的二元符号Bin串长度的过程中,将TU块中所有4×4子块的非零系数的位置信息和幅值信息转换为HEVC熵编码器用到的HEVC标准中各语法元素的格式,并用HEVC熵编码器的二值化方法对这些语法元素进行二进制化,得到每个4×4子块的二元符号Bin串长度,通过比较输入的4×4子块与lastCG的位置关系,对每个4×4子块进行实时处理,避免了现有技术中由于4×4子块输入顺序和实际处理顺序不同带来的硬件开销大和延时等待长的缺陷,得到TU块的二元符号Bin串长度作为集成电路的输出,用于评价当前编码块单元的预测方向和划分深度的组合的性能,与现有技术方法相比,能够减小集成电路硬件开销,在压缩系统性能损失较小的情况下,极大降低了集成电路的实现复杂度。附图说明图1是本发明的实现流程图;图2是本发明实施例的三种扫描方式中子块和系数的扫描顺序示意图;图3是本发明实施例的残差系数分布和4×4子块坐标图。具体实施方式以下结合附图和具体实施例,对本发明作进一步详细说明。参照图1,一种基于HEVC标准的熵编码器集成电路设计方法,包括如下步骤:步骤1,创建寄存器LengthOut1、LengthOut2、csbfOut、LengthOut1Reg32、LengthOut1Reg16、LengthOut1Reg8、LengthOut2Reg32、LengthOut2Reg16、LengthOut2Reg8、CsbfReg32、CsbfReg16、CsbfReg8、Counter32、Counter16和Counter8,并将这些寄存器初始化为0;LengthOut1:用于存储当当前4×4子块位于lastCG之后时,当前4×4子块的二元符号Bin串长度;LengthOut2:用于存储当当前4×4子块位置与lastCG位置相同时,当前4×4子块的二元符号Bin串长度;csbfOut:用于存储当前4×4子块的全零标志位csbf的值;LengthOut1Reg32:用于存储TU32×32块中所有4×4子块在位于lastCG之后情况下的二元符号Bin串长度;LengthOut1Reg16:用于存储TU16×16块中所有4×4子块在位于lastCG之后情况下的二元符号Bin串长度;LengthOut1Reg8:用于存储TU8×8块中所有4×4子块在位于lastCG之后情况下的二元符号Bin串长度;LengthOut2Reg32:用于存储TU32×32块中所有4×4子块在位置与lastCG位置相同情况下的二元符号Bin串长度;LengthOut2Reg16:用于存储TU16×16块中所有4×4子块在位置与lastCG位置相同情况下的二元符号Bin串长度;LengthOut2Reg8:用于存储TU8×8块中所有4×4子块在位置与lastCG位置相同情况下的二元符号Bin串长度;CsbfReg32:用于存储TU32×32块中所有4×4子块的全零标志位的值;CsbfReg16:用于存储TU16×16块中所有4×4子块的全零标志位的值;CsbfReg8:用于存储TU8×8块中所有4×4子块的全零标志位的值;Counter32:用于存储TU32×32块中已经计算得到二元符号Bin串长度的4×4子块的个数;Counter16:用于存储TU16×16块中已经计算得到二元符号Bin串长度的4×4子块的个数;Counter8:用于存储TU8×8块中已经计算得到二元符号Bin串长度的4×4子块的个数。步骤2,计算HEVC熵编码器用到的HEVC标准中各语法元素的二元符号Bin长度:(2a)对当前4×4子块的二维系数进行扫描,得到当前4×4子块的一维数据:(2a1)确定对当前4×4子块的二维系数进行扫描的方式:当前4×4子块的扫描方式ScanIdx取值为0,采用HEVC熵编码器中的对角扫描方式,取值为1,采用HEVC熵编码器中的水平扫描方式,取值为2,采用HEVC熵编码器中的垂直扫描方式;HEVC熵编码器中包括对角扫描、水平扫描和垂直扫描三种扫描方式,该三种扫描方式中子块和系数的扫描顺序示意图如图2所示。系数扫描基于4×4子块进行,TU块中所有的4×4块之间以及4×4子块内部均采用相同的扫描方式进行扫描。对于采用帧内预测的TU8×8来说,扫描方式和帧内预测方向有关,对于采用帧内预测的TU16×16、TU32×32和所有采用帧间预测的TU块来说,都采用对角扫描方式。(2a2)根据图2所示的三种扫描方式,按照当前4×4子块由右下角到左上角的顺序,从该4×4子块的最后一个系数到第一个系数逐一进行扫描,得到一维数据。其中,图2(a)为采用对角扫描的TU8×8块中,所有4×4子块之间和4×4子块内部系数的扫描示意图,图2(b)为采用水平扫描的TU8×8块中,所有4×4子块之间和4×4子块内部的扫描示意图,图2(c)为采用垂直扫描的TU8×8块中,所有4×4子块之间和4×4子块内部的扫描示意图。(2b)对当前4×4子块的一维数据中非零系数的位置信息和幅值信息进行格式转化,得到多个HEVC标准中语法元素:(2b1)将当前4×4子块的一维数据中最后一个非零系数在该4×4子块中的位置坐标,转化为HEVC标准中对应的语法元素的格式;(2b2)将当前4×4子块的一维数据中除最后一个非零系数之外的所有非零系数的位置信息,转化为HEVC标准中对应的语法元素的格式;(2b3)将当前4×4子块的一维数据中所有非零系数的幅值信息,转化为HEVC标准中对应的语法元素的格式。规格为TU8×8的TU块包含了4个4×4子块,一个4×4子块也称为一个CG。该TU块的残差系数分布和4×4子块坐标如图3所示,其中CG1为非全零块,坐标为(0,0),CG2、CG3和CG4为全零子块,CG2的坐标为(1,0),CG3的坐标为(0,1),CG4的坐标为(1,1)。该TU块采用对角扫描方式,CG1的非零系数的位置信息和幅值信息的格式转换以及得到的多个HEVC标准中语法元素见表1:表1(2c)对HEVC标准中各语法元素进行二值化,得到当前4×4子块多个二元符号Bin长度;HEVC熵编码器采用的二值化方法主要有截断莱斯二值化(TruncatedRice,TR),k阶指数哥伦布二值化(k-thorderExp-Golomb,EGk)和定长二值化(FixedLength,FL),个别语法元素采用两种二值化方式相结合或查表的方式进行二值化。步骤3,计算当前4×4子块的二元符号Bin串长度和全零标志位csbf的值,并将计算结果分别存储到相应的寄存器中,实现步骤为:(3a)按照当前4×4子块与lastCG的位置关系,对当前4×4子块各二元符号Bin长度进行不同操作:当当前4×4子块位于lastCG之前,则当前4×4子块的二元符号Bin串长度为0,将数值0分别存入寄存器LengthOut1和寄存器LengthOut2;当当前4×4子块位于lastCG之后,对当前4×4子块中与所有非零系数幅值信息和除最后一个非零系数之外的非零系数的位置信息相关的二元符号Bin长度进行相加,并将计算结果存入寄存器LengthOut1;当当前4×4子块位置与lastCG位置相同,对当前4×4子块中与所有非零系数幅值信息和位置信息相关的二元符号Bin长度进行相加,并将计算结果存入寄存器LengthOut2;(3b)计算当前4×4子块所有系数的绝对值之和,并判断计算结果是否为0,若是,则当前4×4子块的全零标志位csbf的值为0,否则,当前4×4子块的全零标志位csbf的值为1,再将全零标志位csbf的值存入寄存器csbfOut;步骤4,根据当前4×4子块所在TU块的规格,对当前4×4子块在TU块中的位置坐标(CGposX,CGposY)进行不同的位置格式转换操作,并将寄存器LengthOut1、寄存器LengthOut2和寄存器csbfOut存储的值分别存储到相应的寄存器中:当当前4×4子块所在TU块的规格是TU32×32,将当前4×4子块在TU块中的位置坐标(CGposX,CGposY),转换为当前4×4子块在TU块的所有子块扫描顺序中的位置CGNum,并将寄存器LengthOut1存储的值存储到寄存器LengthOut1Reg32的CGNum位置处,将寄存器LengthOut2存储的值存储到寄存器LengthOut2Reg32的CGNum位置处,将寄存器csbfOut存储的值存储到寄存器CsbfReg32的CGNum位置处;当当前4×4子块所在TU块的规格是TU16×16,将当前4×4子块在TU块中的位置坐标(CGposX,CGposY),转换为当前4×4子块在TU块的所有子块扫描顺序中的位置CGNum,然后将寄存器LengthOut1存储的值存储到寄存器LengthOut1Reg16的CGNum位置处,将寄存器LengthOut2存储的值存储到寄存器LengthOut2Reg16的CGNum位置处,将寄存器csbfOut存储的值存储到寄存器CsbfReg16的CGNum位置处;当当前4×4子块所在TU块的规格是TU8×8,将当前4×4子块在TU块中的位置坐标(CGposX,CGposY),转换为当前4×4子块在TU块的所有子块扫描顺序中的位置CGNum,然后将寄存器LengthOut1存储的值存储到寄存器LengthOut1Reg8的CGNum位置处,将寄存器LengthOut2存储的值存储到寄存器LengthOut2Reg8的CGNum位置处,将寄存器csbfOut存储的值存储到寄存器CsbfReg8的CGNum位置处;(4a)计算当前4×4子块在所属TU块中所有子块按光栅扫描顺序排列中的位置CGZscanNum:CGZscanNum=(CGposY<<ShiftNum)+CGposX其中,ShiftNum=log2TUSize-2,TUSize表示当前4×4子块所属的TU块的规格;(4b)将当前4×4子块在所属TU块中所有子块按光栅扫描顺序排列中的位置CGZscanNum转换为该子块在所属TU块中所有子块的扫描顺序中的位置CGNum。经过位置格式转换操作将二维的位置坐标(CGposX,CGposY)转换为一维的位置CGNum。以一个TU8×8为例,该TU8×8所包含的4个4×4子块在三种扫描方式情况下CGZscanNum和CGNum的对应关系如表2:表2二维坐标(CGposX,CGposY)(0,0)(1,0)(0,1)(1,1)光栅扫描位置CGZscanNum1234对角扫描CGNum4231水平扫描CGNum4321垂直扫描CGNum4231步骤5,根据当前4×4子块所在TU块的规格,计算TU块中已经计算得到二元符号Bin串长度的4×4子块的个数,并将不同的计算结果分别存入寄存器Counter32、Counter16和Counter8:当当前4×4子块所在TU块的规格是TU32×32,对寄存器Counter32存储的值加1,并将计算结果存入寄存器Counter32;当当前4×4子块所在TU块的规格是TU16×16,对寄存器Counter16存储的值加1,并将计算结果存入寄存器Counter16;当当前4×4子块所在TU块的规格是TU8×8,对寄存器Counter8存储的值加1,并将计算结果存入寄存器Counter8;步骤6,将寄存器Counter32、Counter16和Counter8的值与TU块包含的4×4子块的总数进行比较,并根据比较结果和当前4×4子块所在TU块的规格,对当前TU块的下一个4×4子块和当前TU块进行不同操作:当寄存器Counter32小于64,且4×4子块所在TU块的规格是TU32×32时,执行步骤(2),计算当前TU块的下一个4×4子块的二元符号Bin串长度,否则执行步骤(7),计算当前TU块的二元符号Bin串长度;当寄存器Counter16小于16,且4×4子块所在TU块的规格是TU16×16时,执行步骤(2),计算当前TU块的下一个4×4子块的二元符号Bin串长度,否则执行步骤(7),计算当前TU块的二元符号Bin串长度;当寄存器Counter8小于4,且4×4子块所在TU块的规格是TU8×8时,执行步骤(2),计算当前TU块的下一个4×4子块的二元符号Bin串长度,否则执行步骤(7),计算当前TU块的二元符号Bin串长度;步骤7,计算当前4×4子块所在不同规格的TU块的二元符号Bin串长度:当当前4×4子块所在TU块的规格为TU32×32,根据寄存器CsbfReg32存储的值,将寄存器LengthOut1Reg32和寄存器LengthOut2Reg32中存储的多个4×4子块的二元符号Bin串长度进行相加,得到TU32×32的二元符号Bin串长度;当当前4×4子块所在TU块的规格为TU16×16,根据寄存器CsbfReg16存储的值,将寄存器LengthOut1Reg16和寄存器LengthOut2Reg16中存储的多个4×4子块的二元符号Bin串长度进行相加,得到TU16×16的二元符号Bin串长度;当当前4×4子块所在TU块的规格为TU8×8,根据寄存器CsbfReg8存储的值将寄存器LengthOut1Reg8和寄存器LengthOut2Reg8中存储的多个4×4子块的二元符号Bin串长度进行相加,得到TU8×8块的二元符号Bin串长度。以TU8×8为例,共包含4个4×4子块。寄存器CsbfReg8位宽为4,寄存器LengthOut1Reg8和寄存器LengthOut2Reg8的位宽为44,即存储一个4×4子块二元符号Bin串长度需要的位宽为11。寄存器CsbfReg8存储了4个子块的全零标志位csbf,寄存器LengthOut1Reg8存储了TU8×8块中所有4×4子块在位于lastCG之后情况下的二元符号Bin串长度,寄存器LengthOut2Reg8存储了TU8×8中所有4×4子块在位置与lastCG位置相同情况下的二元符号Bin串长度,则当前TU块的二元符号Bin串长度R'为:R'=(CsbfReg[3]?LengthOut2Reg8[43:33]:0)+(CsbfReg[3]?LengthOut1Reg8[32:22]:(CsbfReg[2]?LengthOut2Reg8[32:22]:0))+((CsbfReg[3]|CsbfReg[2])?LengthOut1Reg8[21:11]:(CsbfReg[1]?LengthOut2Reg8[21:11]:0))+((CsbfReg[3]|CsbfReg[2]|CsbfReg[1])?LengthOut1Reg8[10:0]:(CsbfReg[0]?LengthOut2Reg8[10:0]:0))以下结合测试,对本发明的效果作进一步的描述。1.测试条件:本发明的测试是在主频2.93GHz的Intel(R)Core(TM)2DuoCPU、内存2GB的硬件环境和HEVC软件测试平台HM16.2的软件环境下进行的。在本发明中,采用的测试序列为Traffic.yuv和BasketballDrill.yuv的全灰度视频序列,QP采用标准测试组(22、27、32、37),其余配置参数均取默认值。2.测试内容及结果分析:采用本发明和现有的熵编码器集成电路的设计方法对视频压缩系统的性能进行测试,其结果如表3所示,当BD-rate值为负时,表示相同PSNR条件下,码率减少,性能提高;当BD-rate值为正时,表示码率增加,性能下降。表3测试结果表明:对于不同测试序列并且QP采用标准测试组(22、27、32、37)时,本发明的方法将二元符号Bin串长度R'作为熵编码器的输出,用于评价当前预测方向和划分深度组合的性能好坏。相比于现有方法中将二进制码流Bit串长度R作为熵编码器输出的方法来说,修改后的方法虽然带来了一定的压缩性能损失,但是损失较小,在实现相同功能的情况下大大简化了熵编码器的硬件实现,降低了集成电路的实现复杂度。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1