背景技术
近年来,全球信息产业发展迅速,多媒体处理技术逐步与网络通讯技术相融合,触及了国民经济和社会生活的各个方面,消费类电子、通信、影视及广播、计算机技术日益紧密地结合起来,使得基于互联网的多媒体产业成为现在发展最快、规模最大的产业之一。作为多媒体信息中的重要组成部分,视频信息是最有效和最重要的信息获取形式,其大约占据了人们日常生活中所接受信息的70%,随着数字电视、网络视频的普及和推广,人们对视频信息的需求与日俱增,与数字视频相关的应用场景也不断拓宽,如数字电视广播、远程监控、数字视频点播、无线多媒体通信等。然而,未经压缩的原始视频数据,其数据量之大对于有限的传输带宽或存储空间都是难以承受的,这就使得视频压缩成为国内外研究和应用的热点之一。
在数字视频应用产业链的快速发展下,面对视频应用不断向高清晰度、高帧率、高压缩率方向发展的趋势,当前主流的视频压缩标准协议H.264/AVC的局限性不断凸显,因此,面向更高清晰度、更高帧率、更高压缩率视频应用的高效视频编码(HighEfficientVideoCoding,HEVC)协议标准应运而生,HEVC也被称为H.265。HEVC标准主要目标是与上一代标准H.264/AVC实现大幅度的编码效率的提高,尤其是针对高分辨率视频序列,在相同视频质量下,码率大约降为H.264标准的50%。
HEVC依然沿用H.264就开始采用的混合编码框架。包括,通过帧间和帧内预测编码两种基本编码方法,消除时间域和空间域的相关性;通过变换编码对残差进行变换编码以消除空间相关性;通过熵编码消除统计上的冗余度。HEVC将在混合编码框架内,着力研究新的编码工具或技术,提高视频压缩效率。
在HEVC标准中,将宏块的大小从H.264的16x16扩展到了64x64,以便于高分辨率视频的压缩。离散余弦变换(DiscreteCosineTransform,DCT)编码突破8x8,最大能够达到32x32。对于帧内预测,预测的方向更加细化,多达35种帧内预测(Intrapredication)模式,图1示出了35种帧内预测模式的情况,这将使帧内预测更加精确,更高效地减少冗余。帧间预测在插值时采用了更多抽头的滤波器,以及1/4像素精度,来提高帧间预测的精度。在熵编码方面,使用了适应性更强的CABAC。
HEVC标准采用了更加灵活的编码结构来提高编码效率,包括编码单元(CodingUnit,CU)、预测单元(PredictUnit,PU)和变换单元(TransformUnit,TU)。其中编码单元类似于H.264中的宏块的概念,用于编码的过程,预测单元是进行预测的基本单元,变换单元是进行变换和量化的基本单元。这三个单元的分离,使得变换、预测和编码各个处理环节更加灵活,也有利于各环节的划分更加符合视频图像的纹理特征,有利于各个单元更优化的完成各自的功能。
对于最大编码单元(LargestCodeUnit,LCU)为64x64的情况,其内部可根据图像的复杂性按四叉树的方式分为更小的编码单元。图2示出了一个LCU的可能分割情况。对每个编码单元,可以进一步分割为更小的预测单元,对每个编码单元预测后产生的残差,也可以按四叉树的方式用更小的变换单元来表示。
对于帧内预测,每个变换单元都会采用其邻近的块的重建结果作为预测参考,当其邻近块重建结果未能及时获得时,不能对当前块进行预测计算,这种数据依赖是造成帧内预测编码相关运算单元吞吐量下降的主要原因,也正是由于这种吞吐量的下降,使得整个帧内编码循环的运行时延增大。图3示出了帧内编码循环框图,该图是将帧内预测循环从总的编码器框图中抽出来,以更加明确帧内循环存在的数据依赖,由图可见,帧内预测模块不仅需要当前单元的预测模式,还需要之前的编码单元的重建图像结果,而之前编码单元的重建图像结果,只有通过帧内预测、变换量化和反量化反变换三个阶段才能获得最终的结果,所以,这种数据依赖不仅造成的这三个运算单元的运算吞吐量不足,而且使整个编码过程的时延增大。
在设计图像编码器的硬件或并行软件时,会采用流水线的方式顺序完成一个最大编码单元的各步运算,达到模块级的并行。整个系统的运算速度时由流水线中时延最大的模块决定的。当图像尺寸比较小时,处理一个最大编码单元的时延尚不成为实时编码的瓶颈,但是针对大尺寸图像的编码,这种时延就成为实时编码的主要瓶颈。只有减少这个时延,才能实现用单核完成大尺寸图像的实时编码。而HEVC编码中,帧内编码循环是涉及模块最多的、并且内部有较大的数据依赖的运算单元组,因此,减少其时延具有重要的实践意义。
发明内容
本发明所要解决的技术问题在于如何克服HEVC标准中帧内编码中由于相互依赖而造成的运算单元吞吐量下降,本发明所要达到的目标是减少帧内编码时延。
为了解决上述技术问题,本发明提供了一种减少HEVC编码器中帧内编码时延的方法,包括以下步骤:
S1、对待编码的最大编码单元做模式决策,获得其所有子编码单元分割结果和预测模式决策结果;
S2、将待编码的最大编码单元所选择的所有子编码单元分割结果和预测模式决策结果发送至调度器;
S3、调度器通过反向触发标记的方法生成当前编码单元的基本单元的数据依赖图;
S4、根据所述数据依赖图产生帧内编码单元的运算结果;
S5、调度器根据所述运算结果向下一个帧内编码单元输入所需数据,并触发下一个帧内编码单元运行;
S6、当所有编码单元进入帧内编码模块后,完成当前最大编码单元的处理,继续下一个编码单元的处理。
进一步地,步骤S3中的反向触发标记的方法是以最大编码单元的所有子编码单元分割结果和预测模式决策结果为基础,并包括以下步骤:
步骤一、判断当前编码单元Tu(n)是否需要另一编码单元Tu(x)的重建图像元素,若需要,则将Tu(n)作为Tu(x)的触发端之一;
步骤二、通过遍历所有的编码单元记录Tu(x)的所有触发端,根据所有触发端建立Tu(x)的依赖列表,并记录Tu(x)所需的触发源的数量;
步骤三、根据Tu(x)的所有触发端及Tu(x)所需的触发源的数量构建Tu(x)的数据依赖图。
具体地,在步骤一中还包括事先建立依赖查找表,所述依赖查找表通过参考当前块的大小和预测模式来获得可能的数据依赖块的坐标,根据所述依赖列表能够快速查找可能的数据依赖关系;若编码单元Tu(x)不依赖任何一个编码单元,则将其放入单独的序列Tu_Ii中。
其中,所述依赖列表是指在分析依赖过程中动态创建的一个列表。
具体地,所述编码单元包括亮度和色度分量,所述亮度采用二维数组MarkL[0...i][0...i]进行编号,并将所述编号作为亮度对应的编码单元的ID;所述色度采用二维数组MarkC[0...i][0...i]进行编号,并将所述编号作为色度对应的编码单元的ID。
进一步地,获得所述步骤一中的触发端的步骤包括以下步骤:
步骤I、通过所述依赖查找表获得可能的数据依赖块的坐标,通过查找MarkL[0...i][0...i]和MarkC[0...i][0...i]获得当前编码单元的触发端ID值;
步骤II、将触发端ID值与当前编码单元ID值进行比较,若触发端ID值大于当前编码单元ID值,则所述触发端ID值不计入当前编码单元的依赖列表,否则将所述触发端ID值计入当前编码单元的依赖列表;
进一步地,步骤S2中所选择的最大编码单元的运行是将亮度和色度分量送入帧内预测模块中开始运行。
进一步地,当帧内编码循环时,若当前编码单元没有及时进行编码,则从Tu_Ii中选择一个编码单元进行运行。
其中,没有及时进行编码的情况是:当前编码单元所依赖的其它编码单元的重构图像没有完成。
进一步地,当编码单元Tu(x)的重建图像完成后,从Tu(x)的依赖列表中依次取出Tu(x)触发的一个或多个编码单元的触发源信息,并将所述编码单元的触发源个数减一,若触发源个数减一后为零,则将此编码单元加入到帧内预测模块中。
进一步地,判断步骤S6中最大编码单元是否遍历了所有的子编码单元的方法是:
当将编码单元送入帧内编码模式时,分别统计当前编码单元的亮度和色度分量的每个基本单元的面积;
将所有基本单元的面积求和,并将求和后的总面积与当前最大编码单元的面积进行比较,若面积相等,则判定最大编码单元遍历了所有的编码单元。
进一步地,步骤S5中的所需数据是下一个帧内编码单元所依赖的编码单元的重构图像数值。
本发明的减少HEVC编码器中帧内编码时延的方法,具有如下有益效果:
1、本发明的方法采用反向触发标记的方法记录当前编码单元的基本单元的数据依赖图,并且通过事先计算所得的“依赖查找表”,解决了在高效视频编码中如何快速准确地判断各个编码单元的依赖问题。
2、本发明的方法通过遍历编码单元的触发端,获得其ID集合,有效地将运算依赖的数据集减到最小,减少运算负荷,从而也减小帧内编码时延。
3、本发明的方法若当前编码单元没有及时进行编码,则从Tu_Ii中选择一个编码单元进行运行,并且通过数据依赖源的触发机制,让更多的无依赖的编码单元开始进入帧内编码循环,解决了传统方法中顺序执行时造成的流水线中各运算单元的吞吐量不足,提高了流水线的效率,减少了系统的编码时延。
4、本发明的方法对亮度和色度的运算分别进行交织的调度,进一步提高了流水线的效率,减少了系统的编码时延。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供了一种减少HEVC编码器中帧内编码时延的方法,包括以下步骤:
S1、对待编码的最大编码单元做模式决策,获得所有子编码单元分割结果和预测模式决策结果;
S2、将待编码的的最大编码单元的所有子编码单元分割结果和预测模式决策结果发送至调度器;
S3、调度器通过反向触发标记的方法生成当前编码单元的基本单元的数据依赖图;
S4、根据所述数据依赖图产生帧内编码单元的运算结果;
S5、调度器根据所述运算结果向下一个帧内编码单元输入所需数据,并触发下一个帧内编码单元运行。
S6、当所有编码单元进入帧内编码模块后,完成当前最大编码单元的处理。继续下一个编码单元的处理。
步骤S3中的反向触发标记的方法是以最大编码单元的所有子编码单元分割结果和预测模式决策结果为基础,并包括以下步骤:
步骤一、查找当前块的依赖列表,判断当前编码单元Tu(n)是否需要另一编码单元Tu(x)的重建图像元素,若需要,则将Tu(n)作为Tu(x)的触发端之一;
步骤二、通过遍历所有的编码单元记录Tu(x)的所有触发端,根据所有触发端建立Tu(x)的依赖列表,并记录Tu(x)所需的触发源的数量;
步骤三、根据Tu(x)的所有触发端及Tu(x)所需的触发源的数量构建Tu(x)的数据依赖图。
在步骤一中,若编码单元Tu(x)不依赖任何一个编码单元,则将其放入单独的序列Tu_Ii中。
所述编码单元包括亮度和色度分量,所述亮度采用二维数组MarkL[0...i][0...i]进行编号,并将所述编号作为亮度对应的编码单元的ID;所述色度采用二维数组MarkC[0...i][0...i]进行编号,并将所述编号作为色度对应的编码单元的ID。
获得所述步骤一中的触发端,即数据依赖端的步骤包括以下步骤:
步骤I、通过所附“依赖查找表”获得可能的数据依赖块的坐标,通过查找MarkL[0...i][0...i]和MarkC[0...i][0...i]获得当前编码单元的触发端ID值;
步骤II、将触发端ID值与当前编码单元ID值进行比较,若触发端ID值大于当前编码单元ID值,则所述触发端ID值不计入当前编码单元的依赖列表,否则将所述触发端ID值计入当前编码单元的依赖列表;
步骤S2中所选择的最大编码单元的运行是将亮度和色度分量送入帧内预测模块中开始运行。
当帧内编码循环时,若当前编码单元没有及时进行编码,则从Tu_Ii中选择一个编码单元进行运行。
当编码单元Tu(x)的重建图像完成后,从Tu(x)的依赖列表中依次取出Tu(x)触发的一个或多个编码单元的触发源信息,并将所述编码单元的触发源个数减一,若触发源个数减一后为零,则将此编码单元加入到帧内预测模块中。
判断步骤S6中最大编码单元是否遍历了所有的子编码单元的方法是:
当将编码单元送入帧内编码模式时,分别统计当前编码单元的亮度和色度分量的每个基本单元的面积;
将所有基本单元的面积相和,并将相加之和与当前最大编码单元的面积进行比较,若面积相等,则判定最大编码单元遍历了所有的编码单元。
步骤S5中的所需数据是下一个帧内编码单元所依赖的编码单元的重构图像数值。
更加具体的是:图3是将帧内预测循环从总的编码器框图中抽出来,以更加明确帧内循环存在的数据依赖。图中可见,帧内预测模块不仅需要当前单元的预测模式,还需要之前的编码单元的重建图像结果。而之前编码单元的重建图像结果,只有通过帧内预测、变换量化和反量化反变换三个阶段才能获得最终的结果,所以这种数据依赖不仅造成的这三个运算单元的运算吞吐量不足,而且使整个编码过程的时延增大。
图4为本发明的帧内预测循环框图。首先,一个LCU的所有编码单元的分割结果及预测模式被调度器接收,调度器将产生出各个帧内预测基本单元(即变换单元TU)的依赖图。其中,每个变换单元都有一个ID标明其位置。当一个变换单元完成其重构图像时,其ID被反馈至调度器,调度器根据依赖图向下一个运算单元(即帧内编码预测模块)输入所需数据,并触发其运行。例如,在图2中,当编码单元5的重构图像完成后,可以触发编码单元6开始计算,同时,即使编码单元6没有完成重构,编码单元7就可以准备好送入帧内预测模块了。这样,当编码单元6完成帧内预测后,可以立即开始编码单元7的帧内预测编码。此时,变换量化模块正在运行编码单元6的数据。这样帧内预测循环各运算单元就可以尽可能的实现流水线运算,从而提高运算单元的吞吐率,减少了系统总的编码时延。
下面分三步介绍本发明的具体算法。首先介绍了依赖图产生算法;然后重点说明对于一个TU来判断其所依赖的重构图像TU的编号。最后说明了如何利用数据依赖图及最近产生的重构图像的结果进行帧内预测编码单元的调度。
变换单元是进行帧内预测的基本单元。为了清楚地定义某个TU,对一个LCU的所有TU编号作为其标识ID。用一个二维数组MarkL[0..16][0..16]来存贮64x64大小的LCU中的每个亮度4x4小块对应的TU编号。用一个二维数组MarkC[0..8][0..8]来存贮64x64LCU中的每个色度4x4小块对应的TU编号。因为二个色度都采用同样的预测块大小和预测模式,所以只考虑一个色度分量如Cb的依赖情况,另一个色度分量Cr的依赖情况与Cb相同。
因为帧内预测的最小运算单元是4x4块,所以按整个LCU都是4x4块TU时每个4x4块的标准定义的运算顺序,将整个LCU分为256个亮度小块,64个色度小块。每个小块的运算顺序作为其编号,这个编号也就是其在LCU四叉树中的前向遍历的顺序号。对于大于4x4的TU,采用其左上角的4x4块对应的编号作为整个TU的编号,因此,编号可能是不连续的。
在一个LCU内,其包括的TU分别表示为TUY(nY)、TUCb(nCb)和TUCr(nCr),其中nY=0..NY,nYCb=0..NC,nYCr=0..NC。NY和NC分别对应亮度和色度的TU个数。
依赖图产生算法:
1、根据每个TU的大小对MarkL[0..15][0..15]和MarkC[0..7][0..7]赋值。
2、按编码顺序遍历LCU的所有亮度TUY(nY)。对每个TU所依赖的相邻TU做反向触发标记。具体地讲,如果TU(n)的帧内预测需要TU(x)的重建图像元素,则将TU(n)作为TU(x)的触发端之一。同时,记录当前TU所需的触发源数量。当所有TU遍历完成后,每个TU都会有一个它所影响的TU的ID列表,和它会被多少个TU触发的总数。每个TU的触发端列表以及其本身的触发源个数构成了此LCU的数据依赖图。如果当前TU不依赖任何一个TU,将其放入一个单独的序列TU_Ii中。TU_Ii中包括第一个TU以及其它非帧内模式的TU。
3、依照类似的方法统计色度TU触发端列表及触发源个数。因为Cb与Cr的数据依赖情况是一致的,所以,只需对上述计算运行一次得到结果对Cb与Cr均适用。
用来判断运算单元的依赖TU编号的算法:
一个TU运算单元所依赖的其它重构像素是其左侧和左下侧同高度的边、其上方和右斜上方同宽度的边以及其左上方的像素。图5展示了一个4x4块可能依赖的相邻像素。一个TU所依赖的相邻重构像素,不仅与其按规范定义的在四叉树中遍历的顺序有关,不同的TU尺寸和预测模式也会有不同的依赖像素集合。
为减少描述调度算法的复杂性,此处以LCU为同步点,即假设之前一个LCU重建已经完成。考虑到左边LCU的未完成时的算法只需在本算法的基础上实现一个乒乓运算即可。考虑到上边LCU未完成时的算法对大尺寸图像意义不大,而只需处理当前LCU时确认上边LCU已完成重建即可。
假设当前TU(n)在LCU内的坐标为(x,y)(其中横向及纵向的单位均为4个像素),通过查找附录一中针对不同TU大小、预测模式以及当前对应分量,就可获得其对应的依赖TU列表TUi(xi,yi),i=0...Dx。则其对应的依赖TU坐标为(x+xi,y+yi)。当x+xi或y+yi小于0时,表示在当前LCU外,为简化描述,此处当作无依赖处理。
附录表中只列出了亮度TU大小为4x4到16x16,色度TU大小为4x4和8x8的TU依赖查找表。32x32亮度TU及16x16色度TU依赖查找表可用类似方法根据规范推出。如果当前块的模式为帧间预测块,不需要帧内预测模块运行。当当前块是帧间预测块或无残差预测块(skip模式)时,帧内预测模块无需运行。并且,这两种模式也不存在帧内模式运算所需数据依赖。此处将其依赖标记为TU(-x-1,-y-1),意为无数据依赖。
对当前TU获得的依赖TU列表TUi(xi,yi),查找MarkL[x+xi][y+yi]或者MarkC[x+xi][y+yi],即可获得该依赖TU的ID值。如果该ID值大于当前TU的ID,则不将其计入本TU的依赖列表,否则将其ID作为当前TU所依赖TU的ID,相同ID的TU只记录一次,最后获得的总的依赖TU的ID集合即是当前TU所依赖之TU集合。
以下为事先建立的不同尺寸TU的依赖TU查找表:
亮度分量依赖查找表
色度分量依赖查找表
根据LCU的数据依赖图对帧内预测模块进行调度:
1、从TU_Ii中选择第一个TU运行。比如对第一个TU(0);依次将TUY(0)、TUCb(0)、TUCr(0)三个TU分量的输入送入帧内预测处理模块的队列中。初始送入流水线的的个数由帧内编码循环的流水线级别定义。
2、当出现流水线吞吐不足时,从TU_Ii中选出一个加入加入运行队列。
3、当TUComp(x),Comp为Y或Cb或Cr,重建完成后,从其触发端列表中依次取出TUComp(x)触发的一个或多个TU的相关信息。将其触发源个数减一。如果触发源个数减一后为零,则将此TU加入到帧内预测处理模块的队列中。对Cb和Cr分量,因为两个分量共用一个触发管理数据结构,所以当触发色度分量运算时每次输入均为两个,即TUCb(x')和TUCr(x')。
4、重复第一步和第二步,直到所有的TU的所有分量都完成处理。在将处理TU送入运算单元时,分别统计YCbCr分量的每个TU的面积,当面积和达到一个LCU的面积时,即说明该LCU处理完毕。
本发明的减少HEVC编码器中帧内编码时延的方法,具有如下有益效果:
1、本发明的方法采用反向触发标记的方法记录当前编码单元的基本单元的数据依赖图,解决了在高效视频编码中如何判断各个编码单元的依赖问题。
2、本发明通过事先计算所得的“依赖查找表”获得其依赖数据的ID集合,考虑了模式的影响,有效地将运算依赖的数据集减到最小,减少运算负荷,缩小了依赖的范围,从而也减小帧内编码时延。
3、本发明的方法若当前编码单元没有及时进行编码,则从Tu_Ii中选择一个编码单元进行运行,并且通过数据依赖源的触发机制,让更多的无依赖的编码单元开始进入帧内编码循环,解决了传统方法中顺序执行时造成的流水线中各运算单元的吞吐量不足,提高了流水线的效率,减少了系统的编码时延。
4、本发明的方法对亮度和色度的运算分别进行交织的调度,进一步提高了流水线的效率,减少了系统的编码时延。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。