使用GPU进行视频编解码

GPU视频编解码研究现状

迄今为止,已有许多关于使用GPU加速视频编解码的文章发表,以下表所示。目前GPU加速视频编码的主要集中在运动估计(ME,Motion Estimate),运动补偿(MC,Motion Compensation)和帧内预测(Intraprediction算法


视频编码—H.264

H.264是目前最好的视频编码标准之一,是一种基于块(Block)的视频编码,H.264支持16*168*84*4的帧内预测块。它充分利用帧内块(Block)的空间相关性和帧间块(Block)的时空相关性来对视频进行压缩,所以能够达到比较高的压缩率。缓存

H.264是在MPEG-4技术的基础之上创建起来的,其编解码流程主要包括5个部分:帧间和帧内预测(Estimation)、变换(Transform)和反变换、量化(Quantization)和反量化、环路滤波(LoopFilter)、熵编码(EntropyCoding)。下图为H.264的视频编码过程。函数


H.264标准的关键技术oop

 1.帧内预测编码性能

  帧内编码用来缩减图像的空间冗余。为了提升H.264帧内编码的效率,在给定帧中充分利用相邻宏块的空间相关性,相邻的宏块一般含有类似的属性。所以,在对一给定宏块编码时,首先能够根据周围的宏块预测(典型的是根据左上角的宏块,由于此宏块已经被编码处理),而后对预测值与实际值的差值进行编码,这样,相对于直接对该帧编码而言,能够大大减少码率。优化

  H.264提供6种模式进行4×4像素宏块预测,包括1种直流预测和5种方向预测,如图2所示。在图中,相邻块的AI9个像素均已经被编码,能够被用以预测,若是咱们选择模式4,那么,abcd4个像素被预测为与E相等的值,efgh4个像素被预测为与F相等的值,对于图像中含有不多空间信息的平坦区,H.264也支持16×16的帧内编码。编码

  2.帧间预测编码spa

  帧间预测编码利用连续帧中的时间冗余来进行运动估计和补偿。H.264的运动补偿支持以往的视频编码标准中的大部分关键特性,并且灵活地添加了更多的功能,除了支持P帧、B帧外,H.264还支持一种新的流间传送帧——SP。码流中包含SP帧后,能在有相似内容但有不一样码率的码流之间快速切换,同时支持随机接入和快速回放模式。H.264的运动估计有如下4个特性。.net

  (1)不一样大小和形状的宏块分割orm

  对每个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辅助视频编解码中的挑战

发挥GPU性能的关键在于尽量地实现数据并行化,所以在视频编解码过程当中要注意那些相互依赖的过程,由于控制指令(if,switch, do, while,etc)在GPU中的执行效率很低,所以应该尽可能将这些指令放到CPU中执行。此外,因为GPU访问计算机主存的速度很低,所以应该尽可能减小GPU对计算机主存的访问。

视频编解码中计算最密集的任务有三个,分别是运动估计(ME)、运动补偿(MC)和帧间预测编码(Intraprediction),这三个计算任务分别是帧间编码、解码和帧内编码计算任务最密集的部分。此外,也有人对使用GPU进行离散余弦变换(DCT)进行了讨论。

使用GPU进行运动估计(ME

ME是视频编解码中计算最密集的部分,前期关于使用GPU加速ME的研究集中在使用GPU来计算SADSumof AbsoluteDifferences)上,SAD用于寻找一个块(Block)的最佳对应块,SAD是经过一个块中的像素与另外一个无关块中的像素进行计算活得的。

最新的视频编解码算法使用率失真优化(rate-distortionRDoptimizedME,这种算法在选择最佳候选时既考虑rate,又考虑distortion,好比说加权的SAD和运动矢量(MV)的编码率。在RD-optimizedMe的计算中,由于首先要计算相邻blocks的运动矢量(MV),增长了控制逻辑,丧失了必定的独立性,使得使用GPU加速会遇到困难。

基于GPUME:循环展开(LoopUnrolling

经过展开基于SADME中的循环,将其交给并行地计算,能够实现ME的加速。前人的研究证明使用这种方法能够提高ME计算2-13倍的速度。下图为传统的计算ME循环,GPU能够将这些Loop函数转换为并行的计算。




尽管这种方式能够达到很高的并行化,但由于MEMV分别计算,所以使用运动矢量估计(motionvectorperdition)来优化ME就很困难。并且进行全局搜索(full-search)会使计算量大大提升,所以难以显著地提升ME的计算速度。

基于GPUME:重排编码顺序

由于RD-optimizedME算法中存在对相邻块的依赖,所以不能仅仅使用循环展开的方式来达到并行化,所以人们尝试经过调整编码顺序来实现计算的并行化。与传统的栅格扫描的天然序不一样,新算法采用了沿对角线进行块计算的顺序,以下图所示。这样,在计算每个块时相邻块的MV便已经计算出来,而对角线上的块的计算能够达到很高的并行化。在前人的研究中使用这种方法能够提高40倍的速度。

使用GPU计算RD-OptimizedINTRAMODE DECISION

新的视频编码算法是经过计算RD-Optimizedintramodeselections来找到最佳的intra预测编码(intrapredition)方向。在这种算法里,编码器将计算全部候选方向的拉格朗日cost,拉格朗日cost能够看做全部原始块与预测块的平方差和的和(SSD,sum of sum of square differences)。

RD-Optimizedintradecision并行化计算是困难的,由于须要使用重建的邻块来计算采样。目前解决这个问题的算法是基于贪心算法,这种算法的原理能够参考右图,实验说明这种方法能够提高2倍的速度。

使用GPU计算运动补偿(MC

由于视频编码标准容许运动矢量(MV)达到亚像元(sub-pixel)的级别,所以须要大量的插值运算,好比在H.264标准中,产生一个半像元的样点须要对6个像元进行插值。

因为每一个像元块可使用本身的运动矢量信息来独立地计算MC,所以MC的计算能够并行地处理。在前人的研究中,使用这种方法能够提高超过3倍的速度。

CPUGPU的任务分配

CPUGPU各有所长,视频编解码中涉及到多种类型的操做,所以须要将CPUGPU结合使用,才能达到最佳的效果。在这个过程当中有几个原则能够参考,好比:

  1. 尽量地将任务并行化,时期同时在CPUGPU上并行地处理。

  2. 由于GPU与计算机主存的交换速度很慢,所以要尽可能减小GPU与主存的数据交换,将数据尽量地留在GPU中进行计算而不是反复读写。

  3. 尽量地将计算任务交给GPU来作,减轻CPU的计算量。

前人对WMV的解码过程进行了分解,将整个反馈环(feedbackloop),包括MC和色彩空间变换(CSC,color spaceconversion)分配给GPU。这样能够减小GPUCPU之间的数据交换,使数据在GPU中获得充分地计算。下图是这种任务分割的示意图:


从图中能够发现当GPU在作第n帧的MCCSC计算时,CPU在作第n+1帧的变长解码(variable-lengthdecoding, VLD),反量化(inversequantization, IQ)和反离散余弦变换(inversediscrete cosine transformation, IDCT)计算。在CPUGPU之间使用缓存来解决二者的同步问题,实验证实使用大小为4帧的缓存能够提高总体的速度。


转自:http://blog.csdn.net/jubincn/article/details/6669156