发明内容
本发明实施例提供一种视频宏块解码方法及装置,能够节省解码时间,提高解码效率。
本发明实施例采用如下技术方案:
一种视频宏块解码方法,包括:
宏块头解码和宏块数据解码;其中,在所述宏块头解码中,当解码完宏块类型信息后,启动读取相应宏块运动信息的操作;当所述宏块头解码完毕后,同时启动帧预测操作和所述宏块数据解码操作;
所述宏块数据解码包括:
根据所述宏块头解码确定的宏块类型,调用相应的码表;
逐个像素地按照一定方式读取码流,解析所述码流得到变换系数;
以所述变换系数为索引,查找所述码表得到量化系数level和游程run数据对;
在所述码表中,所述level和所述run数据对合并为一个11比特的数据,其中高6比特是有符号的所述level,其范围是[-26,26];低5比特是无符号的所述run,其范围是[0,25]。
进一步的,所述启动读取相应宏块运动信息的操作包括:
发出一个宏块类型解码完毕控制信号,启动读取相应宏块运动信息的操作。
进一步的,所述启动帧预测操作和所述宏块数据解码操作包括:
发出一个宏块头解码完毕控制信号,启动帧预测操作;
将所述宏块头解码完毕控制信号作为所述宏块数据解码的输入,启动所述宏块数据解码操作。
进一步的,所述宏块头解码还包括:
根据宏块的所属帧类型、运动矢量信息、残差数据信息、划分信息,确定宏块类型。
一种视频宏块解码装置,包括:
宏块头解码单元和宏块数据解码单元;其中,所述宏块头解码单元包括第一启动模块和第二启动模块,
所述第一启动模块,用于当解码完宏块类型信息后,启动读取相应宏块运动信息的操作;
所述第二启动模块,用于当所述宏块头解码完毕后,同时启动帧预测操作和所述宏块数据解码操作;
所述宏块数据解码单元包括:
码表调用模块,用于根据所述宏块头解码单元确定的宏块类型,调用相应的码表;
变换系数获取模块,用于逐个像素地按照一定方式读取码流,解析所述码流得到变换系数;
查找模块,用于以所述变换系数为索引,查找所述码表得到量化系数level和游程run数据对;
码表合并模块,用于将码表中量化系数level和游程run数据对合并为一个11比特的数据,其中高6比特是有符号的所述level,其范围是[-26,26],低5比特是无符号的所述run,其范围是[0,25]。
进一步的,所述宏块头解码单元还包括:
宏块类型确定模块,用于根据解码出的宏块的所属帧类型、运动矢量信息、残差数据信息、划分信息,确定宏块类型。
由本发明实施例的技术方案可知,在所述宏块头解码中,当解码完宏块类型信息后,通过启动读取相应宏块运动信息的操作,可以早一步启动直接类型或对称类型宏块的直接存储器存取DMA操作,为后续解码做好准备;当宏块头解码完毕后,通过同时启动帧预测操作和所述宏块数据解码操作,可以将帧预测操作与宏块数据解码并行操作;从而达到了节省解码时间,提高解码效率的效果。
进一步地,给出一种宏块类型定义表来重新定义宏块类型对应关系,通过在宏块头解码中确定宏块类型,可以将具有相同类型的宏块进行类似的操作,减少了分块数量,避免了对每一个子块都要进行不同的处理的弊端,简化了后期解码处理中的很多操作;以及通过对码表中的level和run数据对的合并,可以一次性地将level和run同时查到,减少了查表次数;从而也达到了节省解码时间,提高解码效率的效果。
具体实施方式
下面将结合附图,对本发明实施例中的技术方案进行清楚、完整地描述。
如图1所示,本发明实施例提供的一种视频宏块解码方法,包括宏块头解码和宏块数据解码;其中,
在所述宏块头解码中,当解码完宏块类型信息后,启动读取相应宏块运动信息的操作;
当所述宏块头解码完毕后,启动帧预测操作和所述宏块数据解码操作。其中,所述帧预测操作是指帧间运动矢量预测、帧内预测模式计算等操作。
宏块的上一级划分单位为条带(Slice),当码流被放入FIFO缓存器当中,确定了条带信息后,根据宏块的码流特点,很容易地将宏块分成宏块头(Header)和宏块数据,而宏块数据又可以细分为亮度数据(Luma)和色度数据(Chroma)。宏块解码即是对这三部分进行可变长解码(Variable Length Decoding,VLD)。对宏块头解码可以得到当前的宏块头信息(Curr_MB_Info),对宏块数据的亮度数据和色度数据解码后,还需要经进一步的反扫描(Zig-Zag Scan)操作,得到当前宏块的变换系数信息(Curr_MB_Coef)。
如图2所示,在AVS标准基准档中,视频码流经过码流预处理模块(Bs_Pre_Process)预处理后的数据流(BitStream FIFO)、条带级别信息(SliceLevel Info)以及可变长解码表(VLD_LUT)等信息作为宏块头解码的输入。经解码后,输出当前宏块头信息(Curr_MB_Info)给宏块数据解码,并且输出一些控制后续操作的控制信号。宏块头内有该宏块的所有信息,这些信息以一定的编码方式(例如AVS标准中采用了哥伦布编码)存储在比特流里面,通过可变长解码(VLD)可以将这些信息解码出来。
本发明实施例在解码宏块头过程中,定义了宏块类型解码完毕信号(MbType_Done)。对于直接类型或对称类型的宏块,参考帧中相应位置的宏块运动信息需从外部存储器中通过DMA(直接存储器存取)搬移到片内存储器。在解码完宏块类型(包括子块类型)后,通过设置MbType_Done控制信号可以早一步启动DMA操作,去读取相应宏块运动信息,为后续解码做好准备,从而可以节省解码时间,提高解码效率。
并且,定义了宏块头解码完毕信号(VLD_Header_Done)。在宏块头解码完毕后,发出该VLD_Header_Done控制信号,来启动帧间运动矢量预测、帧内预测模式计算等操作,同时将所述VLD_Header_Done控制信号作为宏块数据解码的输入,启动宏块数据解码操作,使帧预测与宏块数据解码并行操作,这样同样可以起到节省解码时间,提高解码效率的效果。
仍如图2所示,在AVS标准基准档中,宏块数据解码的输入由三部分组成:从码流预处理模块出来的码流数据(BitStream FIFO),可变长解码表(VLD_LUT)以及宏块头解码完毕信号(VLD_Header_Done)。依据这三部分信息进行数据解码,解码完成后,会输出当前宏块的变换系数(Curr_MB_Coef)和宏块数据解码完成信号(VLD_Done)给后续解码使用。
宏块数据解码包括亮度解码和色度解码两部分。其中,宏块亮度解码时又会判断是帧内预测还是帧间预测来分别进行处理。为此,在本发明实施例的宏块头解码中还可以包括:
根据宏块的所属帧类型、运动矢量信息、残差数据信息、划分信息,确定宏块类型。
例如,可以给出如下一种宏块类型定义表(MB_TYPE_MAP):用一组5bit的数值(EDCBA)来表示宏块类型,定义如下:
应用此定义格式的宏块类型对应关系如下表所示:
通过上述表格重新定义宏块类型对应关系后,可以将具有相同类型的宏块进行类似的操作,减少了分块数量,避免了对每一个子块都要进行不同的处理的弊端,简化了后期解码处理中的很多操作,从而能够节省解码时间,提高解码效率。
本发明实施例的宏块数据解码,如图3所示,包括:
S31,根据所述宏块头解码确定的宏块类型,调用相应的码表;
S32,逐个像素地按照一定方式读取码流,解析所述码流得到变换系数;
S33,以所述变换系数为索引,查找所述码表得到level和run数据对。
以AVS标准的解码为例,宏块的大小为16*16像素,在4:2:0格式下一个宏块包括4个8×8亮度子块(Y)和2个8×8色度子块(1个Cb,1个Cr),如图4所示,图中数字为宏块中8*8子块的顺序号。
对于AVS基准档宏块数据解码,如图5所示,包括:
步骤51,获取当前子块的信息,包括子块的顺序号等,顺序号为0-3表示为亮度子块,为4、5则表示为色度子块。
步骤52,根据宏块类型调用相应的码表。
逐个像素进行如下循环处理:
步骤531,初始化哥伦布码阶数,即获取当前哥伦布码阶数k;
步骤532,从码流里面按照k阶哥伦布码方式读码流,解析码流得到变换系数trans_coefficient;
步骤533,如果码流已经结束,即标志当前子块结束,退出当前循环;
步骤534,如果码流未结束,并且当前的变换系数trans_coefficient小于逃逸门限(ESCAPE_CODE=59),以所述trans_coefficient为索引,查找所述码表得到量化系数level和游程run数据对,然后返回循环开始继续后面的循环;
步骤535,如果码流未结束,且当前的变换系数trans_coefficien大于逃逸门限(ESCAPE_CODE=59),还需要再读取转逸系数差值(escape_level_diff),这个差值用k=0(亮度帧间,色度)或者1(亮度帧内)阶指数哥伦布码来读取。根据escape_level_diff查找所述码表获取run和level数据对,然后返回循环体继续后面的循环。
需要说明的是,在AVS标准基准档中,码表中定义的run、level值是以变换系数(trans_coefficient,其取值范围是[0,58])为索引来查表,得到对应的run和level的值。对于一个码流的解码过程来说,要用到很多个码表,对不同类型宏块定义了不同的码表,例如在AVS标准中给出了level和run的共20个码表。在本发明实施例中,对码表进行整合,共分成了三大类码表:亮度帧内、亮度帧间、色度,据此可以设定一个码表类型(IPC)变量,来确定当前解码宏块类型,例如可以设定:IPC=0表示亮度帧内预测宏块;IPC=1为亮度帧间预测宏块;IPC=2为色度宏块。经过这样处理后,使得所要查找的码表数量大为减少。
为了进一步减少查表次数,在本发明实施例中对查找的码表进行了合并,将level、run合并为一个11比特的数据,其中高6比特是有符号的level,其范围是[-26,26];低5比特是无符号的run,其范围是[0,25],从而可以一次性将两个值一次查到。经过这样的处理后,节省了查找表的次数,达到了节省解码时间,提高解码效率的效果。下表给出了合并后的部分码表:
如图6所示,本发明实施例还提供了一种视频宏块解码装置,包括宏块头解码单元61和宏块数据解码单元62;其中,所述宏块头解码单元包括第一启动模块611和第二启动模块612,
所述第一启动模块611,用于当解码完宏块类型信息后,启动读取相应宏块运动信息的操作;所述第二启动模块612,用于当所述宏块头解码完毕后,启动帧预测操作和所述宏块数据解码操作。
进一步地,如图7所示,所述宏块头解码单元61还可以包括:
宏块类型确定模块610,用于根据解码出的宏块的所属帧类型、运动矢量信息、残差数据信息、划分信息,确定宏块类型。
所述宏块数据解码单元62包括:
码表调用模块621,用于根据所述宏块类型确定模块610确定的宏块类型,调用相应的码表;
变换系数获取模块622,用于逐个像素地按照一定方式读取码流,解析所述码流得到变换系数trans_coefficient;
查找模块623,用于以所述变换系数trans_coefficient为索引,查找所述码表得到量化系数level和游程run数据对。
优选地,所述宏块数据解码单元62还包括:
码表合并模块620,用于将码表中的量化系数level和游程run数据对合并为一个11比特的数据,其中高6比特是有符号的所述level,其范围是[-26,26],低5比特是无符号的所述run,其范围是[0,25]。
由本发明实施例的视频宏块解码装置,在宏块头解码单元61中,当解码完宏块类型信息后,通过第一启动模块611启动读取相应宏块运动信息的操作,可以早一步启动直接类型或对称类型宏块的直接存储器存取DMA操作,为后续解码做好准备;当宏块头解码完毕后,通过第二启动模块612同时启动帧预测操作和所述宏块数据解码操作,可以将帧预测操作与宏块数据解码并行操作;从而达到了节省解码时间,提高解码效率的效果。
进一步地,通过在宏块头解码单元61中的宏块类型确定模块610确定宏块类型,可以将具有相同类型的宏块进行类似的操作,减少了分块数量,避免了对每一个子块都要进行不同的处理的弊端,简化了后期解码处理中的很多操作;以及通过宏块数据解码单元62中的码表合并模块620对码表中的level和run数据对的合并,可以一次性地将level和run同时查到,减少了查表次数;从而也达到了节省解码时间,提高解码效率的效果。
上述具体实施例并不用以限制本发明,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。