手机端
or

欢迎您加入我爱方案网QQ群

1.智能产品外包服务群(311606115)
2.嵌入式项目开发群(491609563)

一种基于高清编码的自适应Slice划分算法

冯飞龙; 陈耀武| 多核,并行编码,Slice划分,H.264标准| 2010-12-27
867 收藏
分享到: 
每日精选
热门推荐

【中心议题】

  •        *对于多核高清视频实时编码系统,提出一种自适应Slice划分算法
  •        *实验结果与分析

【解决方案】

  •        *基于码率控制和熵编码复杂度模型
  •        *自适应Slice划分

1 概述

随着视频应用的发展和处理器技术的进步,高复杂度高压缩率的H.264算法取得了广泛应用。多核处理器技术的发展给并行算法提供了物理平台,多核并行算法成了实时编解码设计的关键。目前基于H.264的多核并行编码算法有多种,根据并行级别可以分为GOP级、帧级、Slice级和宏块级,其中Slice级并行算法因为实现简单,并行效果较好,应用最为广泛,Slice级并行算法会因为图像内容差异引起每个核的计算复杂度分配不均匀,降低了并行效率。

针对Slice级并行算法计算复杂度分配不均匀的问题,文献[2]提出一种提前判断宏块编码模式,从而判断宏块计算复杂度,进而进行Slice划分的算法,但该算法并不适用于高清视频实时编码系统,因为高清视频实时编码系统在权衡编码效率与图像质量后,常只进行大块编码(16×1616×88×16),不做8×8块及其子块预测。

本文在分析已有并行算法的基础上,针对多核高清视频实时编码系统,提出一种基于码率控制和熵编码复杂度模型的自适应Slice划分算法。实验结果表明,该算法能有效提高并行加速比。

2 现有Slice划分算法

基于Slice的并行编码算法就是将H.264每帧图像划分为多个Slice,因为同一帧的各个Slice之间没有数据依赖,以此为基础可以实现并行编码。目前的Slice划分算法主要有固定宏块数划分和自适应划分2种。

2.1 固定宏块数Slice划分算法

JM使用的是固定宏块数Slice划分算法,每个Slice所分到的宏块数为:Numi=N-i-1k=0Numk

S-i,i=0,1,…,S-1(1)其中,N为一帧宏块总数;S为一帧内的Slice;Numi为每个Slice的宏块数。采用固定宏块数的Slice划分算法后,每个Slice都能分到基本相同的宏块数,但由于每个宏块的图像内容不同,会造成宏块编码时间的差异,从而使多核间计算复杂度分配不均匀。

2.2 基于快速模式选择的Slice划分算法

文献提出的基于快速模式选择的自适应Slice划分算法,JM 9.6上取得了较好的效果。该算法首先将宏块分割尺寸分为大块模式(16×16Skip)和小块模式(其他块尺寸),然后记录每个宏块的块尺寸、持续的帧数以及MV信息,从而预测当前块的块尺寸。因为JM模型的模式分析模块占最大的比重,RDO关闭时计算复杂度占到整个宏块编码的85%,所以它通过预测宏块编码模式即可确定计算复杂度分布,从而进行均匀的Slice划分。

2.3 高清视频实时编码系统及现有算法分析

在高清视频实时编码系统中,8 Mb/s码率测试6500帧的1080P30高清序列,得到编码模型中各个模块的计算复杂度比重如表1所示。其中,模式分析包含Inter预测和Intra预测;核心计算包含DCT/IDCTQ/IQ子模块;

CAVLCCABAC指不同的熵编码模式。由于高清视频实时编码系统通常只进行大块编码,因此模式分析模块的计算复杂度较为固定。另外,由于核心计算和去块滤波的计算复杂度也比较固定,因此宏块计算复杂度波动主要集中在熵编码模块。

固定宏块数的Slice划分算法可以用于高清视频实时编码系统,但是该算法只是按宏块数分配,没有考虑计算复杂度,所以每个处理器的编码时间有较大差异。因为要编完一帧所有Slice后才能进行下一帧编码,所以固定宏块数的Slice划分算法会有核间等待消耗。文献算法不适用于高清视频实时编码系统,因为在高清视频实时编码系统中,模式分析模块的计算复杂度基本不变,而该算法却是基于模式分析模块的复杂度预测,所以在高清视频实时编码系统中该算法无法实现。

在高清视频实时编码系统中,计算复杂度波动主要集中在熵编码模块,所以针对高清视频实时编码系统,必须通过预测熵编码模块计算复杂度分布才能进行均匀的Slice划分,提高并行加速比。

3 本文算法

基于上文分析,针对多核高清视频实时编码系统,本文提出了基于码率控制和熵编码复杂度模型的自适应Slice划分算法。

 

3.1 整体架构

由于熵编码复杂度模型需要使用到码率信息,由码率控制模型约束,另外码率控制模型需要用到SAD信息,因此可以建立一个如图1所示的自适应Slice划分算法模型,其中,纹理复杂度模块通过Intra预测获得当前帧的纹理复杂度分布,模式修正模块通过预测宏块模式来修正纹理复杂度信息,码率控制模块通过预测量化参数(QP)将纹理复杂度信息转换为比特数分布,熵编码复杂度模块基于熵编码复杂度模型通过比特数分布预测宏块计算复杂度分布,自适应Slice划分模块通过宏块计算复杂度分布均匀地划分Slice,最后以每个处理器编码一个Slice的方式进行多核编码。每个模块的具体工作将在下文中描述。

3.2 纹理复杂度

因为编码复杂度与纹理复杂度相关,针对高清视频实时编码系统的高效率要求,可以用代表纹理信息的Intra预测(IP)结果来预测宏块复杂度,所以纹理复杂度模块主要完成当前编码图像的Intra预测,而编码的后续步骤将在Slice划分后进行。因为Intra宏块解码时参考块由未滤波的相邻重建宏块得出,所以通用编码器在编码时也以重建数据做参考。

而由于纹理复杂度模块只完成整帧Intra预测,没有生成重建数据,又因为重建数据跟原始像素接近,所以编码时参考数据可以使用原始像素,对图像质量基本没有影响。由于每个宏块的IP模块计算复杂度相同,可以给每个处理器分配相同的宏块数来完成该模块,即可产生代表纹理复杂度的IntraSAD值。

3.3 模式修正

视频编码中由于时域相关性,前向帧的宏块信息可以用于当前帧参考,而在高清视频实时编码系统中块分割较大、宏块模式较少,因此可以通过直接映射前向帧宏块模式来实现快速模式预测。码率控制模块需要宏块SAD,可以结合宏块预测模式来预测宏块SAD。当预测模式为Skip,宏块预测SAD0;当预测模式为Intra,宏块预测SAD使用(纹理复杂度模块结果(Intra SAD);当预测模式为Inter,宏块预测SAD需使用前向Inter结果(PreInterSAD)和前向Intra结果(PreIntraSAD)Intra SAD进行修正。

SAD=IntraSAD if mode=IntraIntraSADPreIntraSAD×PreInterSAD if mode=Inter0 if mode=Skip

(2)

3.4 码率控制

单元级码率控制算法通过对每个宏块或宏块行进行比特分配,可以满足人们对感兴趣区域的高质量要求。对于高清视频实时编码系统,因为其整体复杂度很高,不能再采用复杂度较高的码率控制算法,权衡图像质量和编码效率后,可以采用宏块行级码率控制算法。

因为码率与纹理复杂度相关,针对本文提出的编码模型,可以使用基于纹理复杂度的宏块行级码率控制算法。首先按行统计一帧内的图像纹理分布,即对每行的Intra SAD求和,然后按每行SAD在整帧图像中所占比重分配比特数,再根据比特数结合率失真模型调整每行的QP

率失真模型给出了码率(R)QP的关系,可以通过宏块QP估计宏块比特数。常用的率失真模型有线性率失真模型和二次率失真模型两种,如式(3)和式(4)所示,其中线性率失真模型复杂度较低,但二次率失真模型具有较高精确度:

R = c1×σ2QP+c2(3)R = c3×σ2QP+c4×σ2QP2(4)其中,σ2SAD;c1c2c3c4为常数,由前向帧给出。宏块行级码率控制时需根据比特数调整宏块行QP,由于二次模型通过RQP复杂度较高,因此可以采用线性率失真模型。

熵编码复杂度模型需要宏块比特数信息,可用二次率失真模型通过QP获得,但该模型公式中包含平方、除法等操作,复杂度较高,需要进行优化,可在帧开始对c3/QP+c4/QP2建表,通过查表法每个宏块只需一次乘法操作。

3.5 熵编码复杂度

熵编码模块复杂度随码率而变化,其复杂度模型为:

 

C = k1R+k2Rα(5)其中,k1,k2和α为常数,由表2给出;R为码率,C为熵编码模块复杂度。由于熵编码与熵解码复杂度类似,该模型同样适用于熵编码。

因为该模型是非线性的,所以实时编码过程中不能直接使用该公式。由于系数为常数,因此可以对熵编码复杂度和R建表,通过划分码率区间进行查表即可在较低复杂度下完成该模型的功能。

3.6 自适应Slice划分

在高清视频实时编码系统中,因为其他编码模块计算复杂度较为固定,只要加上熵编码模块复杂度即为宏块计算复杂度,然后以宏块为单位统计整帧复杂度分布,最后使用式(6)可以将计算复杂度均匀地分配到每个Slice

Iik=Ii-1Ck≤∑Nk=0Ck-Ii-1k=0CkS-i,i=0,1,…,S-1(6)其中,Ck是宏块索引为k的宏块计算复杂度;N为一帧宏块数;S为一帧的Slice;Ii为宏块索引。满足条件的最大Ii值即为第iSlice最后一个宏块的索引,i0,第一个Slice分到的计算复杂度为总计算复杂度除以Slice,后面的Slice分到的计算复杂度为剩余计算复杂度除以剩余Slice,以此实现自适应Slice划分。

3.7 多核并行编码

由于本文提出的算法模型在初始阶段完成了整帧的Intra预测,因此在多核编码阶段只需做Inter模式预测,然后与Intra预测结果比较。因为多核编码划分了Slice,Intra预测时还没有Slice边界,没有考虑预测方向的限制,所以多核编码时在Slice边界的Intra宏块预测方向不一定合法,需进行以下修正:如果选择Intra模式,则判断预测方向是否存在,如果不存在则重做Intra预测,然后再选择编码模式。最后结合编码模式选择,以一个处理器编码一个Slice的方式实现多核并行编码。

由于本文提出的自适应算法只是提前完成Intra预测,模式修正时也采用直接映射的方法,并且对二次率失真模型和熵编码复杂度模型进行了查表优化,因此使用该算法后整体计算复杂度增加很小。

4 实验结果与分析

本文以高清视频实时编码系统为基础,PC仿真平台上测试了固定宏块数Slice划分算法和本文提出的自适应Slice划分算法。测试序列为5001080P30rush-hourducks,使用IPPP模式,分别以CAVLCCABAC测试了8 Mb/s码率下并行加速比随并行核数的变化情况以及四核并行编码时不同码率下的并行加速比情况,分别如图2~5所示。在图2和图3,当并行核数为8,自适应算法并行加速比约提高了0.5,提升效果明显。其中,CABAC提升效果比CAVLC略好,因为CABAC时熵编码模块复杂度较高,该模块计算复杂度波动对整体并行效率的影响也更大,经本文提出的自适应Slice划分算法调整后效果更为明显。在图4和图5,码率增加后并行加速比会降低,主要是因为码率增加导致熵编码模块复杂度增加,使整体的计算复杂度波动变大,所以整体并行编码效率会有所降低。

 

5 结束语

本文针对多核高清视频实时编码系统,提出一种新的自适应Slice划分算法,该算法均匀地分配计算复杂度并有效地提高了并行加速比。

点赞

深圳市中电网络技术有限公司 Copyright© www.52solution.com 粤ICP备10202284号