发明内容
本发明所要解决的技术问题是如何采用一种简单有效的方法,在MAE上实现对CAVLC和CABAC的两种视频编码数据的熵解码,既能保证解码的质量和解码效率,结构简单又易于实现。
本发明的目的在于公开了一种专用于H.264解码MAE中对熵编码残差数据等进行解码的方法及装置,由于本发明所述方法采用了软硬件协同工作,使得熵解码器在保证获得可靠的解码效率和解码质量的前提下,大大降低了结构的复杂度和计算复杂度,从而有效的解决了结构和效率之间的矛盾,顺利的实现了对CAVLC和CABAC熵编码码流的解码。
基于H.264的熵解码器的实现方法,其特征在于:该方法采用了软硬件协 同工作,将解码过程中占用大量资源的部分改用软件程序方法实现,包括如下步骤:
步骤1:熵解码控制模块(6)根据熵编码模式标志选择解码方式:即是对CAVLC编码码流进行解码还是对CABAC编码码流进行解码;
步骤2:根据步骤1选定的解码类型以片(slice)数据为单位对CAVLC或者CABAC编码码流进行解码;
步骤3:解码完成后,判断是否为CAVLC或者CABAC编码码流的最后一个片数据,若不是,返回步骤2继续对下一个片(Slice)的数据进行解码,否则,解码过程结束。
基于H.264的熵解码器的实现方法,所述的将解码过程中占用大量资源的部分改用软件程序方法实现,其特征在于:所述的软件程序方法是指利用嵌入式cpu代替硬件电路进行运算的方式,而不是单纯的指用计算机软件实现熵解码中的某些计算功能。
所述的基于H.264的熵解码器的实现方法,其特征在于:该方法步骤2中所述的根据选定的解码类型以片数据为单位对CAVLC编码码流进行解码,其中所述的对CAVLC编码码流的解码还包括如下的具体步骤:
步骤2.1:熵解码控制模块(6)向软件模块(4)发出开始信号,开始求解与解码有关的变量和参数;
步骤2.2:软件模块(4)收到来自熵解码控制模块(6)的开始信号后,经由ue/se/te解码单元(2)并最终通过BSI取数模块(1)得到所需的编码数据流,经解码得到所需的宏块参数以及除残差系数以外的其他语法元素;
步骤2.3:熵解码控制模块(6)收到软件模块(4)发出的结束信号后,向CAVLC残差解码模块(3)发出解残差开始信号;
步骤2.4:CAVLC残差解码模块(3)收到熵解码控制模块(6)发来的开始信号后开始残差解码,并通过BSI取数据模块(1)获得解码所需的编码数据,得到亮度块和色度块的残差系数值;
步骤2.5:判断解码的是否为片数据的最后一个宏块,如果不是,则返回到步骤2.1继续解下一个宏块,否则解码结束。
所述的基于H.264的熵解码器的实现方法,其特征在于:以片数据为单位对CAVLC编码码流进行解码是通过对组成片数据的每个宏块进行解码实现的,所述对单个宏块的解码包括如下的步骤:
步骤1:由软件模块求解与宏块解码相关的变量和参数;
步骤2:根据上述步骤1得到解码所需的当前宏块以及邻近宏块解码所需的参数后,按照先亮度块后色度块的顺序对宏块进行解码;
步骤3:对亮度块进行解码;以4x4块为基本的解码单位,即每次对一个4x4亮度块进行块解码,先对亮度块的直流(DC)系数进行解码,然后再对亮度块的交流系数(AC)进行解码;
步骤4:解码完亮度块后,对色度块进行解码;以4x4块为基本的解码单位,按照先Cb块后Cr块的顺序,先解码色度块的直流系数,再解码色度块的交流系数;
步骤5:重复上述步骤,继续解下一个宏块。
所述基于H.264的熵解码器的实现方法,该方法步骤2所述的根据选定的解码方式以片数据为单位对CABAC编码码流进行解码,其特征在于:其中所述的对CABAC编码码流的解码还包括如下的具体步骤:
步骤2.1′:对CABAC解码所需的上下文模型进行初始化,并初始化概率区间;
步骤2.2′:熵解码控制模块(6)向软件模块(4)发出开始信号,开始对除残差系数以外的其他语法元素、运动向量mvd_l0,mvd_l1解码,并求解残差解码中用到的宏块参数;
步骤2.3′:软件模块(4)收到来自熵解码控制模块(6)的开始信号后,经由二进制算术解码单元(5)并最终通过BSI取数模块(1)得到所需的编码数据流,解码得到所需的宏块参数以及除残差系数以外的其他语法元素;
步骤2.4′:熵解码控制模块(6)向CABAC残差解码模块(7)发出解残差开始信号;
步骤2.5′:CABAC残差解码模块(7)收到熵解码控制模块(6)发来的开始信号后开始残差解码,经由二进制算术解码单元(5)并最终通过BSI取数模块(1)得到所需的编码数据流,解码得到亮度(luma)和色度(chroma)块的残差系数值;
步骤2.6′:判断解码的宏块是否为片(slice)的最后一个宏块,如果不是,则返回到步骤2.1′继续解下一个宏块,否则解码结束。
本发明所述的基于H.264的熵解码器的实现方法,其特征在于:所述的以片数据为单位对CABAC编码码流进行解码是通过对组成片数据的每个宏块进行解码实现的,所述对单个宏块的解码包括如下的步骤:
步骤1:对上下文模型和概率区间进行初始化;
步骤2:开始对残差系数以外其他语法元素进行解码,并通过采用软件方法求解残差解码中要用到的宏块参数和其他参数;
步骤3:按照先亮度后色度的顺序对残差宏块进行解码;
步骤4:对亮度块的解码;以4x4块或者8x8块为基本单位,先对亮度直流系数进行解码,再对剩余的亮度交流系数进行解码,完成对亮度块的解码过程;
步骤5:对色度块的解码;按照先Cb后Cr块的顺序以4x4块为单位对两个色度块Cb和Cr块进行解码,先解Cb和Cr块的直流系数,然后再解Cb和Cr块的交流系数;
步骤6:重复上述步骤,继续解下一个宏块。
本发明还公开了一种基于H.264的熵解码器装置,该装置包括如下模块:
BSI取数模块:负责从外部取得解码所需的码流数据,当接收到其他模块的取数请求时,返回相应长度的码流数据;
ue/se/te解码单元:接收软件模块发送来的解码请求并返回解码后的参数值;
CAVLC残差解码模块:以‘4X4块’为单位,根据软件模块解码得到的相应参数,对亮度和色度的残差系数进行解码,解码完成后向熵解码控制模块发出结束信号,解码出来的残差系数存入反扫描RAM;
软件模块:对残差解码需要的参数和变量进行解码,通过ue/se/e解码单元求解与CAVLC相关的参数,通过二进制算术解码单元求解与CABAC相关的参数,最终得到的参数再提供给CAVCL或CABAC残差解码模块使用;
二进制算术解码单元:在解码与宏块有关的参数时,当收到软件模块发送来的解码请求,经解码返回得到的二进制结果;另外在进行CABAC残差解码的时,当收到CABAC残差解码模块发送来的解码请求时,经解码返回得到的二进制结果;
熵解码控制模块:控制整个解码流程,先控制软件模块求解相关的参数,负责向CAVLC残差解码模块或者CABAC残差解码模块发出开始解码信号,当接收到解码结束信号后,将解码得到的相应残差系数写入反扫描RAM;
CABAC残差解码模块:以‘4X4’块或者‘8X8’块为单位,根据软件模块解 码得到的相应参数,对亮度和色度的残差系数进行解码,解码完成后向熵解码控制模块发出结束信号,解码出来的残差系数存入反扫描RAM;
反扫描RAM:存储经CAVLC残差解码模块或者CABAC残差解码模块解码得到的残差系数。
本发明的显著有益效果在于:在CAVLC和CABAC的解码过程中,尤其是在对CABAC码流的解码过程中,CABAC解码本身就是一个复杂的过程,而且在对残差以外的其他语法元素进行解码时,CABAC的编码方式决定了解码的复杂性,伴随而来的是计算的复杂度,在ASIC设计中,如果完全采用纯硬件实现,这不仅将会占用大量的硬件资源,而且势必会大大增加设计的难度。
本发明提出了一种专用于H.264解码MAE中对熵编码残差数据等进行解码的方法,由于采用了软硬件协同工作,将解码过程中占用大量硬件资源的部分改用软件方式实现,使得熵解码器在保证获得可靠的解码效率和解码质量的前提下,大大降低了结构的复杂度和计算的复杂度,从而有效的解决了速度和效率之间的矛盾,顺利的实现了对CAVLC和CABAC熵编码码流的解码。而且,由于采用本发明所述的解决方案,使得熵解码器可以应用于实际的电路设计中,由于支持CABAC的解码,可以加快H.264在多媒体视频方面的应用,可以用于标清的数字存储和其他的实时应用,如视频存储、VOIP、可视电话等。
具体实施方式
下面参考说明书附图,具体说明本发明的实现过程。如附图1所示:本发明所述的基于H.264的熵解码器装置,该装置包括如下模块:
BSI取数模块1:负责从外部取得解码所需的码流数据,当接收到其他模块的取数请求时,返回相应长度的码流数据;
ue/se/te解码单元2:接收软件模块发送来的ue,se或者te解码请求,并返回解码后的参数值;
CAVLC残差解码模块3:以‘4X4块’为单位,根据软件模块解码得到的相应参数,对亮度和色度的残差系数进行解码,解码完成后向熵解码控制模块发出结束信号,解码出来的残差系数存入反扫描RAM;
软件模块4:对残差解码需要的一些全部和局部参数和变量进行解码,通过ue/se/te解码单元求解与CAVLC相关的参数,通过二进制算术解码单元求解与CABAC相关的参数,最终得到的参数再提供给CAVCL或CABAC残差解码模块使用;
二进制算术解码单元5:除了软件模块在解码与残差相关的参数时需要借助该模块以外,在进行CABAC残差解码的时候,CABAC残差解码模块向该模块发送解码请求,经解码,返回得到二进制结果;
熵解码控制模块6:控制整个解码流程,先控制软件模块求解相关的参数,负责向CAVLC残差解码模块或者CABAC残差解码模块发出开始解码信号,当接收到解码结束信号后,将解码得到的相应残差系数写入反扫描RAM;
CABAC残差解码模块7:以‘4X4’块或者‘8X8’块为单位,根据软件模块 解码得到的相应参数,对亮度和色度的残差系数进行解码,解码完成后向熵解码控制模块发出结束信号,解码出来的残差系数存入反扫描RAM.
反扫描RAM8:根据CAVLC残差解码模块或者CABAC残差解码模块发来的信号,存储经CAVLC残差解码模块或者CABAC残差解码模块解码得到的残差系数。
熵解码首先要确定编码码流的编码方式,编码方式的确定是依据编码模式标志得到,如附图2所示,当编码模式标志entropy_mode_flag=0时表示编码方式为CAVLC编码;当编码模式标志entropy_mode_flag=1时表示编码方式为CABAC编码,根据判断出的编码方式选择相应的解码方法。
下面结合附图1说明熵解码器的解码过程:
步骤1:确定了码流的编码方式之后,熵解码控制模块6根据编码方式决定解码的类型:即是对CAVLC编码码流解码还是对CABAC编码码流解码;如果是解CAVLC编码码流,则进入步骤2执行,如果是解CABAC编码码流,则进入步骤3执行;
步骤2:进行CAVLC解码;
步骤3:进行CABAC解码;
步骤4:步骤(2)或步骤(3)完成后,返回到步骤(1),继续解下一个片(slice)的数据。
如附图1所示,上述步骤(2)所述的进行CAVLC解码的具体步骤为:
步骤2.1:熵解码控制模块6向软件模块4发出开始信号,求解与解码有关的非残差语法元素,如mb_type,sub_mb_type,运动向量mvd_l0,mvd_l1等;
步骤2.2:软件模块4收到来自熵解码控制模块6的开始信号后,经由ue/se/te模块2并最终通过BSI取数模块1得到所需的编码数据流,解码得到所需的除宏块参数以及残差系数以外的其他语法元素;
步骤2.3:熵解码控制模块6收到软件模块4发出的结束信号后,向CAVLC残差解码模块3发出解残差开始信号;
步骤2.4:CAVLC残差解码模块3收到熵解码控制模块6发来的开始信号后开始残差解码,并通过BSI取数据模块1获得解码所需的编码数据,最终解码得到亮度和色度块的残差系数值;
步骤2.5:如果解码的不是片(slice)的最后一个宏块,则返回到步骤2.2,继续解下一个宏块,否则结束。
如附图1所示,步骤(3)所述的对CABAC解码的具体步骤为:
步骤3.1:对CABAC解码所需的上下文模型进行初始化,并初始化概率区间;
步骤3.2:熵解码解码控制模块6向软件模块4发开始信号,开始对残差系数以外其他语法元素如mb_type,sub_mb_type,运动向量mvd_l0,mvd_l1等解码,并求解残差解码中要用到的宏块参数和其他参数;
步骤3.3:软件模块4收到来自熵解码解码控制模块6的开始信号后,经由二进制算术解码单元5并最终通过BSI取数模块1得到所需的编码数据流,解码得到所需的宏块参数以及除残差系数以外的其他语法元素;
步骤3.4:熵解码控制模块6向CABAC残差解码模块7发出解残差开始信号;
步骤3.5:CABAC残差解码模块7收到熵解码控制模块6发来的开始信号后开始残差解码,同样经由二进制算术解码单元5并最终通过BSI取数模块1得到所需的编码数据流,最终解码得到亮度和色度块的残差系数值;
步骤3.6:如果解码的不是片(slice)的最后一个宏块,回到步骤3.2,否则结束。
下面参考图3说明对一个片数据的宏块进行CAVLC解码的流程:
步骤1:由软件模块完成求出与宏块解码相关的变量和参数,如mb_type、mb_skip_flag、sub_mb_type、mvd_l0、mvd_l1、ref_idx_l0、ref_idx_l1、mb_qp_delta、intra_chroma_pred_mode等;
步骤2:由步骤1得到解码时所需的当前宏块以及邻近宏块等解码所需的参数后,由于一个宏块包含一个16×16的亮度块和两个8×8的色度块Cb和Cr,所以下面按照先亮度后色度的顺序对宏块进行解码。
对亮度块进行解码:
进行亮度块解码时,由于亮度块包含16×16个像素点,解码时以4×4块为基本的解码单位,即每次对一个4×4块解码,共分16次完成一个16×16亮度块的解码。在每个16×16亮度块中,每个4×4块有一个直流系数,16个4×4亮度块共有16个直流系数;解码时首先对16个亮度的直流(DC)系数进行解码,然后对16个4×4亮度块的交流系数(AC)进行解码,每个4×4交流系数块有15个交流系数。
对色度块进行解码:
解码完16×16亮度块后,接着对两个8×8色度块解码,同样的以4×4块为基本的解码单位,同样先解码直流系数。每个8×8色度块有4个直流系数,分别完成对Cb和Cr块的直流系数的解码后,再对Cb和Cr块的交流系数进行解码,对两个色度块的解码顺序都是先Cb块后Cr块。
步骤3:完成对16×16亮度块和Cb及Cr色度块的解码之后,一个宏块的数据就解码完了,可以继续下一个宏块的解码。
下面参考图4以对一个亮度4×4块或色度4×4块残差系数进行CAVLC解码说明CAVLC残差解码的过程:
步骤401:确定所要解码的系数是亮度系数还是色度系数,是直流系数还是交流系数;
步骤402:如果色度直流系数为1,参数nC=1,是对色度直流系数进行解码,否则nC=(nA+nB)/2,其中nA,nB分别表示解码残差块的左边和正上方参考块中非零系数的个数。
步骤403:由于CAVLC是变长编码,采用的不是固定的码表,因此,根据步骤2得到的nC的值决定着进行解码时采用哪一个码表,以及是采用变长码表还是定长码表或者是否使用码表。
步骤404:查表求解numtrailingones,其中numtrailingones表示拖尾系数,即从最后一个高频残差系数开始往前连续遇到的1和-1的个数(1和-1之间可以包括0),numtrailingones的值不超过3。numtrailingones的作用在于,在进行编码的时候,对于4×4块中高频部分的系数多为1,0,-1的情况,编码的时候,可以只记录1,-1的个数以及符号位即可,而无需像其他的残差系数一样要对整个系数值level进行编码,提高了编码效率。
步骤405:对拖尾系数trailingones部分的系数符号进行解码,得到trailingones部分的幅值level的值,1或者-1。
步骤406:解除拖尾系数之外的其他非零系数的值level,加上步骤5中得到的拖尾系数部分的level值,得到4×4块中的非零系数值level[i],这里的I表示幅值level的序号。
步骤407:根据相应的码表求得TotalZeros的值,TotalZeros表示4×4中最后一个非零系数前零的个数。
步骤408:求各个非零系数得run的值,run表示各非零系数前零的个数,分别用run[i]表示,其中i是非零系数level的序号。
步骤409:结束:根据前面得到的level[i],run[i]的值从低频部分第一个系数就可以恢复16个4×4块的残差系数值。
下面举例说明numtrailingones,numcoeff,TotalZeros,level[j],run[j]的含义:如附图7所示为一个4×4块的16个残差系数:这里numtrailingones=3,numcoeff=6,TotalZeros=10,level[j],run[j]的值已经在图中注明。其中的符号i表示4×4子块中残差系数的序号,level[j],run[j]中的符号j表示非零系数level[j]和零行程run[j]的序号。
下面参考图5说明对一个片数据中的一个宏块进行CABAC解码的流程:
步骤1:对上下文模型和概率区间进行初始化;CABAC是自适应的二进制算术编码,所以无论是在解码还是编码时对它的上下文模型和概率区间都必须先进行初始化,才能保证解码时和编码时使用的是相同的上下文模型和概率区间;
步骤2:开始对残差系数以外其他语法元素,如mb_type,sub_mb_type,运动向量mvd_l0,mvd_l1等解码,并求解残差解码中要用到的宏块参数,由于这一部分需要占用较多地硬件资源,所以这里采用软件的方式完成;
步骤3:下面对一个残差宏块进行解码;一个宏块包含一个16×16的亮度块和两个8×8的色度块Cb和Cr,此处和CAVLC的解码顺序一样,仍然按照先亮度后色度的顺序对宏块进行解码;
步骤4:以4×4块或者8×8块为基本单位对亮度进行解码。如果有直流系数,先对亮度直流系数进行解码,一共16个亮度dc系数;然后以4×4块为基本单位,对剩余的亮度交流系数进行解码,共16个4×4交流系数块;如果只有交流系数,直接以4×4块或者8×8块为基本单位对交流系数进行解码。这样就完成了亮度块的解码过程;
步骤5:按照先DC系数后AC系数先Cb后Cr块的顺序对两个色度块Cb和Cr块进行解码,先解Cb和Cr块的DC系数,然后再解Cb和Cr块的AC系数,每个8×8色度块一共得到4个DC系数和60个AC系数;
步骤6:继续解下一个宏块。
下面参考图6以解一个4×4残差数据块为例来说明CABAC的解码过程:
步骤601:根据标志coded_block_flag的值决定是否需要对该4×4块进行解码。如果coded_block_flag=0,表示该4×4块中系数全为零,所以不必进行解码,当coded_block_flag=1时进行下一步;
步骤602:计算4×4块中非零系数的幅值coeffLevel[i],从低频到高频的顺序,以i表示系数的标号;
步骤603:计算非零系数的coeffLevel[i]的绝对值abs(coeffLevel[i]);
步骤604:计算非零系数的符号sign;
步骤605~606:由上面的得到的非零系数的符号决定非零系数的值;
步骤607:根据已有的残差系数的大小和位置信息,加上符号信息,对4×4块的16个残差系数进行恢复,得到4×4块的16个残差系数的值;
本发明所说的软件方式,是指利用嵌入式cpu代替硬件电路进行运算的方式,而不是单纯的指用计算机软件实现熵解码中的某些计算功能。
本发明所用的实例只是用来对上述解码器中所支持的解码功能的一种解释说明,并不代表本发明所要保护的范围仅限于此,凡采用本发明中所提及的方法和结构,或者采用对某些部分相同功能的替代方案,均在本发明所要求的保护范围,从事本行业的技术人员对此应予理解。