迄今为止,已有许多关于使用GPU加速视频编解码的文章发表,如下表所示。目前GPU加速视频编码的主要集中在运动估计(ME,Motion Estimate),运动补偿(MC,Motion Compensation)和帧内预测(Intraprediction)
H.264是目前最好的视频编码标准之一,是一种基于块(Block)的视频编码,H.264支持16*16,8*8,4*4的帧内预测块。它充分利用帧内块(Block)的空间相关性和帧间块(Block)的时空相关性来对视频进行压缩,因此可以达到比较高的压缩率。
H.264是在MPEG-4技术的基础之上建立起来的,其编解码流程主要包括5个部分:帧间和帧内预测(Estimation)、变换(Transform)和反变换、量化(Quantization)和反量化、环路滤波(LoopFilter)、熵编码(EntropyCoding)。下图为H.264的视频编码过程。
H.264标准的关键技术
1.帧内预测编码
帧内编码用来缩减图像的空间冗余。为了提高H.264帧内编码的效率,在给定帧中充分利用相邻宏块的空间相关性,相邻的宏块通常含有相似的属性。因此,在对一给定宏块编码时,首先可以根据周围的宏块预测(典型的是根据左上角的宏块,因为此宏块已经被编码处理),然后对预测值与实际值的差值进行编码,这样,相对于直接对该帧编码而言,可以大大减小码率。
H.264提供6种模式进行4×4像素宏块预测,包括1种直流预测和5种方向预测,如图2所示。在图中,相邻块的A到I共9个像素均已经被编码,可以被用以预测,如果我们选择模式4,那么,a、b、c、d4个像素被预测为与E相等的值,e、f、g、h4个像素被预测为与F相等的值,对于图像中含有很少空间信息的平坦区,H.264也支持16×16的帧内编码。
2.帧间预测编码
帧间预测编码利用连续帧中的时间冗余来进行运动估计和补偿。H.264的运动补偿支持以往的视频编码标准中的大部分关键特性,而且灵活地添加了更多的功能,除了支持P帧、B帧外,H.264还支持一种新的流间传送帧——SP帧。码流中包含SP帧后,能在有类似内容但有不同码率的码流之间快速切换,同时支持随机接入和快速回放模式。H.264的运动估计有以下4个特性。
(1)不同大小和形状的宏块分割
对每一个16×16像素宏块的运动补偿可以采用不同的大小和形状,H.264支持7种模式。小块模式的运动补偿为运动详细信息的处理提高了性能,减少了方块效应,提高了图像的质量。
(2)高精度的亚像素运动补偿
在H.263中采用的是半像素精度的运动估计,而在H.264中可以采用1/4或者1/8像素精度的运动估值。在要求相同精度的情况下,H.264使用1/4或者1/8像素精度的运动估计后的残差要比H.263采用半像素精度运动估计后的残差来得小。这样在相同精度下,H.264在帧间编码中所需的码率更小。
(3)多帧预测
H.264提供可选的多帧预测功能,在帧间编码时,可选5个不同的参考帧,提供了更好的纠错性能,这样更可以改善视频图像质量。这一特性主要应用于以下场合:周期性的运动、平移运动、在两个不同的场景之间来回变换摄像机的镜头。
(4)去块滤波器
H.264定义了自适应去除块效应的滤波器,这可以处理预测环路中的水平和垂直块边缘,大大减少了方块效应。
3.整数变换
在变换方面,H.264使用了基于4×4像素块的类似于DCT的变换,但使用的是以整数为基础的空间变换,不存在反变换,因为取舍而存在误差的问题,变换矩阵如图5所示。与浮点运算相比,整数DCT变换会引起一些额外的误差,但因为DCT变换后的量化也存在量化误差,与之相比,整数DCT变换引起的量化误差影响并不大。此外,整数DCT变换还具有减少运算量和复杂度,有利于向定点DSP移植的优点。
4.量化
H.264中可选32种不同的量化步长,这与H.263中有31个量化步长很相似,但是在H.264中,步长是以12.5%的复合率递进的,而不是一个固定常数。
在H.264中,变换系数的读出方式也有两种:之字形(Zigzag)扫描和双扫描,如图6所示。大多数情况下使用简单的之字形扫描;双扫描仅用于使用较小量化级的块内,有助于提高编码效率。图6变换系数的读出方式
5.熵编码
视频编码处理的最后一步就是熵编码,在H.264中采用了两种不同的熵编码方法:通用可变长编码(UVLC)和基于文本的自适应二进制算术编码(CABAC)。
在H.263等标准中,根据要编码的数据类型如变换系数、运动矢量等,采用不同的VLC码表。H.264中的UVLC码表提供了一个简单的方法,不管符号表述什么类型的数据,都使用统一变字长编码表。其优点是简单;缺点是单一的码表是从概率统计分布模型得出的,没有考虑编码符号间的相关性,在中高码率时效果不是很好。
因此,H.264中还提供了可选的CABAC方法。算术编码使编码和解码两边都能使用所有句法元素(变换系数、运动矢量)的概率模型。为了提高算术编码的效率,通过内容建模的过程,使基本概率模型能适应随视频帧而改变的统计特性。内容建模提供了编码符号的条件概率估计,利用合适的内容模型,存在于符号间的相关性可以通过选择目前要编码符号邻近的已编码符号的相应概率模型来去除,不同的句法元素通常保持不同的模型。
发挥GPU性能的关键在于尽可能地实现数据并行化,因此在视频编解码过程中要注意那些相互依赖的过程,因为控制指令(if,switch, do, while,etc)在GPU中的执行效率很低,因此应该尽量将这些指令放到CPU中执行。此外,由于GPU访问计算机主存的速度很低,因此应该尽量减少GPU对计算机主存的访问。
视频编解码中计算最密集的任务有三个,分别是运动估计(ME)、运动补偿(MC)和帧间预测编码(Intraprediction),这三个计算任务分别是帧间编码、解码和帧内编码计算任务最密集的部分。此外,也有人对使用GPU进行离散余弦变换(DCT)进行了讨论。
ME是视频编解码中计算最密集的部分,前期关于使用GPU加速ME的研究集中在使用GPU来计算SAD(Sumof AbsoluteDifferences)上,SAD用于寻找一个块(Block)的最佳对应块,SAD是通过一个块中的像素与另一个无关块中的像素进行计算活得的。
最新的视频编解码算法使用率失真优化(rate-distortion,RDoptimized)ME,这种算法在选择最佳候选时既考虑rate,又考虑distortion,比如说加权的SAD和运动矢量(MV)的编码率。在RD-optimizedMe的计算中,因为首先要计算相邻blocks的运动矢量(MV),增加了控制逻辑,丧失了一定的独立性,使得使用GPU加速会遇到困难。
通过展开基于SAD的ME中的循环,将其交给并行地计算,可以实现ME的加速。前人的研究证实使用这种方法可以提升ME计算2-13倍的速度。下图为传统的计算ME循环,GPU可以将这些Loop函数转换为并行的计算。
尽管这种方式可以达到很高的并行化,但因为ME和MV分别计算,因此使用运动矢量估计(motionvectorperdition)来优化ME就很困难。而且进行全局搜索(full-search)会使计算量大大提高,因此难以显著地提高ME的计算速度。
因为RD-optimizedME算法中存在对相邻块的依赖,因此不能仅仅使用循环展开的方式来达到并行化,因此人们尝试通过调整编码顺序来实现计算的并行化。与传统的栅格扫描的自然序不同,新算法采用了沿对角线进行块计算的顺序,如下图所示。这样,在计算每一个块时相邻块的MV便已经计算出来,而对角线上的块的计算可以达到很高的并行化。在前人的研究中使用这种方法可以提升40倍的速度。
使用GPU计算RD-OptimizedINTRAMODE DECISION
新的视频编码算法是通过计算RD-Optimizedintramodeselections来找到最佳的intra预测编码(intrapredition)方向。在这种算法里,编码器将计算所有候选方向的拉格朗日cost,拉格朗日cost可以看作所有原始块与预测块的平方差和的和(SSD,sum of sum of square differences)。
将RD-Optimizedintradecision并行化计算是困难的,因为需要使用重建的邻块来计算采样。目前解决这个问题的算法是基于贪心算法,这种算法的原理可以参考右图,实验说明这种方法可以提升2倍的速度。
因为视频编码标准允许运动矢量(MV)达到亚像元(sub-pixel)的级别,因此需要大量的插值运算,比如在H.264标准中,产生一个半像元的样点需要对6个像元进行插值。
由于每个像元块可以使用自己的运动矢量信息来独立地计算MC,因此MC的计算可以并行地处理。在前人的研究中,使用这种方法可以提升超过3倍的速度。
CPU和GPU各有所长,视频编解码中涉及到多种类型的操作,因此需要将CPU和GPU结合使用,才能达到最佳的效果。在这个过程中有几个原则可以参考,比如:
尽可能地将任务并行化,时期同时在CPU和GPU上并行地处理。
因为GPU与计算机主存的交换速度很慢,因此要尽量减少GPU与主存的数据交换,将数据尽可能地留在GPU中进行计算而不是反复读写。
尽可能地将计算任务交给GPU来做,减轻CPU的计算量。
前人对WMV的解码过程进行了分解,将整个反馈环(feedbackloop),包括MC和色彩空间变换(CSC,color spaceconversion)分配给GPU。这样可以减少GPU与CPU之间的数据交换,使数据在GPU中得到充分地计算。下图是这种任务分割的示意图:
从图中可以发现当GPU在做第n帧的MC和CSC计算时,CPU在做第n+1帧的变长解码(variable-lengthdecoding, VLD),反量化(inversequantization, IQ)和反离散余弦变换(inversediscrete cosine transformation, IDCT)计算。在CPU和GPU之间使用缓存来解决两者的同步问题,实验证明使用大小为4帧的缓存可以提升整体的速度。
转自:http://blog.csdn.net/jubincn/article/details/6669156