H_264软件解码器的优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文章编号:1004-9037(2005)04-0493-06
H .264软件解码器的优化
陈维安,李 典,余松煜,钱团结
(上海交通大学图像通信与信息处理研究所,上海,200030)
摘要:分析了JM 7.6解码器的结构,指出了影响速度的瓶颈,并且对亮度块运动补偿、色度块运动补偿以及帧内预测等耗时模块进行了优化,对程序的流程和数据结构进行了调整。
试验结果表明,优化后程序的解码速度是参考代码JM 7.6的5倍左右,实现了Linux 平台上720×480视频序列的实时解码。
关键词:H.264解码器;运动补偿;帧内预测;亮度块;色度块中图分类号:T N 919.81 文献标识码:A
基金项目:国家自然科学基金(60202006)资助项目。
收稿日期:2004-12-03;修订日期:2005-06-10
Optimization of H .264Video Decoder
CH EN W ei -an ,L I Dian ,YU Song -y u ,QI AN Tuan -j ie
(Institute o f Imag e Communicatio n &Infor mation Pr ocessing ,Shang hai Jiao tong U niver sity ,Shanghai ,200030,China )
Abstract :The architecture of the decoder based on JM 7.6is analy zed and the bottleneck pro -blem fo r influencing the deco ding speed is pointed o ut .T hen some time -consuming sectio ns are optim ized ,such as luminance ,chro minance mo tion co mpensations and intra pr edictio n .So me pr ocesses and the data structure for the progr am are mo dified.Experimental result show s that the propo sed m ethod can increase the decoding speed about 5times than that of JM 7.6,and can realize the real -tim e deco ding o f 720×480video frequency series on Linux .
Key words :H.264decoder ;m otion co mpensation;intr a prediction;luminance;chr ominance H.264是联合视频专家组(JVT )提出的最新视频编码标准。
由于使用了帧内预测、整数变换、多种块大小的运动估计/补偿、多帧参考、1/4像素精度预测、环路滤波等新技术[1],使得它在编码效率、抗干扰能力以及信道利用率方面都优于现存的编码标准[2]。
但是这些新技术的使用,大大增加了计算的复杂度(Baseline 的解码复杂度是H.263的2~3倍[3]),而实际应用中对解码器的实时性要求相当高,标准组织的参考模型远不能满足实时的要求,所以要实现SD 格式视频序列的实时解码,必须对解码器作很大的优化。
目前已有一些对H.264解码优化的研究。
文[4,5]主要使用多媒体指令集进行优化;文[6]进行
C 语言代码级和MM X 指令对解码器进行优化。
总的来说它们都属于纯粹代码级的优化。
本文除了对代码进行优化之外,还分析了解码器的算法,对亮度、色度运动补偿以及帧内预测算法进行了优化。
1 性能分析
为更有效地对参考模型解码器进行优化,文中
使用Intel 分析软件Vtune 测得最耗时的几个模块的运行时间(CPU 为P 4/2.8GHz ),测试结果如图1所示。
可以看出亮度和色度块运动补偿以及程序整
图1 耗时百分比饼形图
第20卷第4期2005年12月数据采集与处理Jo urnal of Dat a Acquisitio n &Pr o cessing V o l.20No.4Dec.2005
体流程是最耗时模块,占了总时间的56.7%。
因此,本文工作在反变换、熵解码和环路滤波几个模块之外,着重于亮度块和色度块运动补偿以及程序流程和数据结构方面的优化。
2 运动补偿的优化
2.1 亮度块的运动补偿
H.264采用的仍旧是传统的MC/DCT 混合编码框架。
该框架下帧间预测编码分为两个过程:(1)运动估计,即当前编码块在参考帧中做运动搜索,求出最佳运动矢量;(2)运动补偿(M C)过程,它利用上面得到的运动矢量在参考帧中做位移,求出当前块的预测值。
运动矢量的精度决定着预测残差的大小,为了获得尽可能小的残差,H.264中运动补偿的精度从原有标准的1/2像素精度提高到了1/4像素精度(指亮度块,色度块为1/8精度)[1]。
对于1/2像素的精度的运动矢量,预测值通过一个一维的六抽头维纳滤波器插值得到;1/4像素位置的预测值通过线性内插得到。
如图2
所示。
图2 分数采样点运动补偿插值滤波
图中:大写字母代表整数像素位置;小写字母代表分数像素位置。
结合图2,可以看出半像素位置(如b 和s )的采样值可以通过将b 1,s 1限制在(0,255)之间得到,b 1,s 1的值则是使用抽头系数为(1,-5,20,20,-5,1)的滤波器得到
b 1=E -5F +20G +20H -5I +J
(1)
s 1=K -5L +20M +20N -5P +Q (2)其他半像素位置的亮度值都通过上述的六抽头滤波器得到,其中j 位置的预测值通过已经得到的cc ,dd ,h ,m ,ee ,ff 位置的值内插得到,它们的值都必须限制在0~255之间。
2.2 亮度块运动补偿算法优化
2.2.1 边缘的预判断
在JM 7.6[7]中,亮度块运动补偿基于4×4的块,它对插值时使用到参考帧的每个像素位置都进行是否越界的判断(保证位置在图像的大小范围之内)。
如果越界,就用边缘的像素点来代替。
其实能
够产生越界情况的块比较少,它们基本都处于图像
的边缘,因此没有必要对每个像素都进行判断。
可以采用先宏块级后4×4块级的预判断顺序,以此来减少判断次数,从而提高解码速度。
2.2.2 使用查表法进行插值运算
在使用六抽头滤波器进行半像素插值的时候,每一个点计算一个方向需要6次乘法。
为求一个1/4像素点,在最复杂的情况下需要计算32次乘法。
由于乘法比较费时,为了避免使用乘法,可以考虑采用查表法代替插值时的乘法。
以计算点b 1为例,重新组合式(1)系数,可以得到
b 1=(E +J )-5(F +I )+20(G +H )(3)像素亮度值的范围为0~255。
根据式(3)建立两张表,每张表有512个元素,一张用于乘系数20;另一张用于乘系数5。
查表时只需将两个像素的和作为数组的索引,找到表格中的值,以此来获得插值后的值。
建表和查找方法如下:
建表:
for (i=0;i<511;i++)
{table1[i]=i*20;//系数乘20的表格 table2[i]=i*5;//系数乘5的表格}查找:
仍以图2为例,img Y -X 为参考帧中X 点的亮度值,利用查表法:
b 1=(img Y -E +im g Y -J )+table 1[im g Y -G +
img Y -H ]-table2[img Y -F +im g Y -I ](4)由于两个表格只需在视频序列开始前初始化一次,后面可以一直使用,所以在插值时就不再需要乘法。
并且由于这两张表比较小,建立表格所额外增加的内存大小对于整个解码器来说几乎可以忽略不计。
2.3 色度块运动补偿算法优化
色度分量的预测值通过双线性内插得到[1]
,如图3所示。
图3 双线性内插
点(k ,l )处的像素值f (k ,l )可由式(5)求出f (k ,l )=(m +1-k )(n +1-l )f (m ,n )+
(k -m )(n +1-l )f (m +1,n )+
(m +1-k )(l -n )f (m ,n +1)+(k -m )(l -n )f (m +1,n +1)(5)
494
数据采集与处理第20卷
在4∶2∶0的格式中,色度分量的采样频率是亮度分量的1/2,所以色度分量的运动补偿实际上是1/8像素精度。
对色度运动补偿的优化可从3个方面进行。
2.3.1 运动矢量分类
在参考代码JM7.6中,色度分量的运动补偿基于像素,而且在参考代码中任何类型的运动矢量,都按照式(5)进行预测,所以在计算一个具体的预测值时需要8次乘法,再加上每个非整像素位置的分量都乘以8(为避免浮点运算,将系数换算成整型),所以还得加上一次除法。
按照这种方法计算,色度分量预测需很长时间。
因此可以根据运动矢量的中心偏置特性,将运动矢量进行分类,把整像素位置情况单独拿出来处理。
整像素位置的运动矢量不需要任何的乘法,只需根据运动矢量在参考帧中找到对应位置的像素点即可。
而且运动矢量是整像素的情况非常多,所以只需进行一个简单的分类,就可大大降低色度分量帧间预测的计算复杂度。
2.3.2 并行处理
仔细分析代码还可以看出,每个2×2的色度块使用同一个相对应的4×4亮度块的运动信息(运动矢量和参考块信息),而预测方向和预测模式则是每个4×4色度块内的像素都相同(对应于亮度8×8的块)。
前面已经指出参考代码基于像素实现色度块的运动补偿,对于每个像素都需要求出运动矢量和参考块,这是一种很大的浪费。
现在把算法改成每个具有相同运动信息的2×2的色度块并行处理,求取运动矢量和参考块的时间减少为原来的1/4,还可以减少像素分类的时间。
2.3.3 边缘像素预判断
对于边缘的处理可以采用与亮度分量类似的方法,进一步提高解码效率。
使用上面3种简单的方法,就可以极大地提高解码速度,取得了非常明显的效果。
所以,色度块的优化具有很大的空间,仔细研究色度块对解码器的优化会有很大的帮助。
3 帧内预测部分的优化
在H .264中,正式引入了帧内预测的概念,它利用相邻宏块的空间相关性,使用相邻块对待编码块进行预测,然后对预测残差进行变换编码。
帧内预测模式可分为intra 4×4,intra 16×16和I -PCM 三种。
其中intra 4×4比较适合细节信号较多的部分,它具有9种预测模式,如图4所示。
使用intr a 4×4模式预测时,每个4×4块的值
图4 intr a 4×4预测模式
(图4(a)中点a ~p )都是从空间相邻位置已经解码的点(图4(a )中点A ~L ,Q )预测得到,每次预测可以从9种模式中选取一种,相应地选择预测所需要的点。
使用intra 16×16模式预测时,整个宏块一次预测完成,有4种预测方向可以选取,同样也是利用空间相邻的已经解码的点进行预测。
在参考代码中,对于intra 4×4的情况,每次都要判断相邻点所属宏块是否已经解码,如果该宏块尚未解码,就把该点的值设为128或用其他点的值代替。
这个过程在大部分情况下没有必要,相邻点的信息可以从当前宏块的位置以及宏块内4×4块的扫描顺序得到。
扫描顺序如图5所示。
0145236789121310
11
14
15
图5 4×4亮度块扫描顺序
本文把宏块分成边缘宏块和非边缘宏块。
对于非边缘宏块,不需要判断相邻点的信息,可以根据已知的扫描顺序直接得到,按照图5中的扫描顺序,编号为3,7,13,11,15右上部分的4个点还没有解码,它们的值都用D 点的值代替,其他部分的邻点都已经解码过,只需把相应的解码值直接赋给对应的点即可;对于边缘宏块,可以根据是在哪个边缘和扫描顺序来确定哪些预测点需要判断。
对于intr a 16×16的情况要简单一些,整个宏块一次预测完成,不涉及宏块内块的扫描顺序,只需判断是否边缘宏块,如为内部宏块,则无需任何判断,因此更能体现优化效果。
经过上面的过程,大大减少了判断的次数,降低了帧内预测部分的复杂度,提高了解码速度。
4 程序流程和数据结构的调整
4.1 亮度块存储结构的改变
在H.264的参考代码JM 7.6中,所有的亮度
495
第4期陈维安,等:H.264软件解码器的优化
和色度及残差数据均以二维向量的形式表示,所以在赋值的时候不利于使用系统函数m em cpy,memset 。
为了方便数据的批量存取,并且在赋值过程中使用系统函数memcpy 和memset 代替两层for 循环嵌套,把亮度及相关的数据结构定义为一维数组,并且对它的访问不再使用数组的形式,而是采用指针偏移,这样可以减少访问亮度块数据所用的时间(开始预测时申请一个本地指针指向当前块的内存地址,计算具体像素点的值时只需将指针偏移,可以省去数组访问时繁琐的下标计算)。
4.2 宏块级初始化改为按帧初始化
JM 的参考代码中,对于运动矢量,参考块等运动信息在每一个宏块中开始的时候进行初始化,由于同一个变量初始化为相同的值,所以可以将他们放到每帧开始的时候进行批量的初始化,而且可以使用memset 等系统函数,避免繁多的循环嵌套,节省了初始化时使用的时间。
4.3 宏块级程序流程的改变
在参考代码中,任何类型的宏块,均使用同一个解码模块进行解码。
宏块类型和预测模式也都在这个模块中进行判断,且以4×4的块为单位判断运动模式和预测方向,而实际上每个8×8的块内这些信息都完全相同,没有必要每次都判断。
所以将程序进行了修改,以8×8的块作为解码单元,并且将不同类型的宏块用单独的函数处理(每个函数中解码8×8的块),这样可以节省大量的类型判断和求取时间。
修改后的宏块级解码流程见图6。
5 仿真结果
通过上面几种方法的优化,解码速度有了明显的提高。
本文使用Vtune 的远程功能,测得优化前后各个模块的耗时,以及解码的速率。
运行Linux 的是P4/2.8GHz 的PC 机,平台是Redhat 9.0。
比较结果如表1~5所示(图中各个模块的运行时间是多次测量得出的平均值)。
表1 帧内预测模块优化前后耗时比较测试序列帧格式优化前
时间/ms 优化后
时间/m s 节约百
分比/%Fo reman (CI F )I (300帧)68020969A kiyo (CIF )I(300帧)56515872Par is(CIF )I(500帧)130046065Highw ay(CI F)I(500帧)79032060
()
(400帧)
1820
575
68
图6 修改后的宏块级解码流程图表2 亮度块运动补偿模块优化前后耗时比较测试序列帧格式优化前
时间/ms 优化后
时间/ms 节约百
分比/%Fo rema n IBP(300帧)254357077.6A kiy o
IBP(300帧)
73019273.7P aris (CIF )IP PP (500帧)105628373.2Stefan (CIF )IBBP (300帧)
212052075.5Ry an 720×352IP PP (300帧)
4650
115875.1Cat (SD )
IBBP (900帧)16320
4120
74.8
表3 色度块运动补偿算法改进前后耗时比较测试序列帧格式优化前
时间/ms 优化后
时间/ms 节约百
分比/%Fo rema n IBP (300帧)79821772.8A kiy o
IBP (300帧)
9319789.6P aris (CIF )IP PP (500帧)102515085.3Stefan (CIF )IBBP (300帧)
67818073.5Ry an 720×352IBBP (900帧)7223170276.4Cat (SD )
IBBP (900帧)
7650
1518
80.2
从前面的分析可知,intr a16×16模式越多,帧内优化取得的效果就越明显。
测试序列Akiy o 本身
496
数据采集与处理第20卷
的复杂度较低,因此intra 16×16模式较多,优化的效果也就比较明显;而对于较复杂的序列Par is 和Highw ay,intr a 4×4模式较多,所以优化效果相对没有那么明显。
数据访问方式(数组形式的访问改成指针访问)以及赋值方式带来的优化没有在表中列出。
由于亮度运动补偿的优化是边缘预判断,查表法以及数据访问3个方面共同优化的结果,这些优
表4 亮度存储结构改变前后耗时比较测试序列帧格式优化前
时间/m s 优化后
时间/ms 节约百
分比/%Fo reman IBP (300帧)109845059.0A kiyo IBP (300帧)124550859.2Pa ris(CI F)
IPP (500帧)
149666555.5Stefan(CIF )IBBP (300帧)
101844056.8Ryan 720×352IP PP (300帧)215086060.0Cat (SD )
IP PP (300帧)
2950
1201
59.3
化对于不同的序列具有相同的效果,所以序列本身复杂度和运动剧烈程度对优化效果影响不大,从表2的优化结果中也可以看出这一特点。
色度块运动补偿优化算法最主要的是运动矢量分类法,因此整像素运动矢量的多少决定着优化的效果,整像素越多,优化就越明显。
从表3可以看出,运动量很小的序列Akiyo 和Par is,由于大部分运动矢量为0,所以效果最为明显;而对于Stefan 和Foreman 等运动剧烈的序列,整像素运动矢量占的比例较少,所以优化效果没那么明显。
亮度存储结构改变前后运行时间的比较见表4。
亮度块存储结构的改进所带来的优化体现在宏块解码模块中,主要包括运动补偿值和解码值的存取。
这个部分的优化效果跟序列的关系也不大。
本解码器对反变换、整体框架和其他数据结构等方面也做了优化,为重点分析上述优化技术的性能,本测试结果仅针对文中所述几种优化技术进行,其他优化如宏块级初始化改为帧的初始化也没有在测试中列出。
表5 解码速度的比较
测试序列分辨率帧数码率/(kb ・s -1)
序列结构JM 7.6W indo w s 版/(帧・s -1)
JM 7.6Linux 版/(帧・s -1)
本项目解码速度/(帧・s -1)
比L inux 解码速度提高倍数
Par is CIF 500433IP PP …28.417.284.8 4.93A kiy o CIF 300100I PBPB …39.421.2106 5.0Fo rem an CIF 300391I BP BP …33.417.082.0 4.82Ry an 720×352900511IBBP …11.07.036.1 5.12Cat
SD
300
886
IP PP …
10.7
6.9
35.5
5.14
解码器整体运行速度的比较见表5,最后一栏是优化前后Linux 版本运行速度的比较。
从表5可以看出,在Linux 下本项目的解码器与参考代码JM 7.6相比有5倍左右的提高,已经可以实现Linux 平台SD 格式的实时解码。
同时可以发现文中解码器的整体解码速度明显高于文[4~6]中的优化方法。
优化后各模块的耗时比例如图7中所示,从图中可以看出本文针对性地优化取得了明显的效果。
6 结束语
本文结合实际的工作,在运动补偿,帧内预测,程序流程以及数据结构上进行了优化,取得了比较
明显的效果。
由于优化是在Linux 平台上进行的,
图7 优化后模块耗时比饼形图
从表5可以看出,完全相同的结构和方法,Linux 平台的实时解码要比Window s 面临更大的困难。
经过上述的优化,已经实现了Linux 平台下SD 码流格式的实时解码。
根据图7显示的耗时比例,作者
497
第4期陈维安,等:H.264软件解码器的优化
正在进行进一步地针对性优化。
同时如参考帧Buffer的管理机制,使用SIM D及如何重复利用已经插值出的非整像素值,也是下一步的工作目标。
参考文献:
[1] Joint V ideo T eam(JVT)of ISO/IEC M PEG&IT U-
T V CEG(ISO/IEC JT C1/SC29/W G11and IT U-T
SG16Q.6)8th M eet ing[M].Genev a,Sw itzer land,
2003.23~27.
[2] T homas W,Sulliv an G J,Bj nteg aard G,et al.
O ver view of the H.264/A V C v ideo co ding st andar d
[J].IEEE T r ans Cir cuit s Syst Video T ech,2003,
13:704~706.
[3] Hor ow itz M,Jo ch A,K o ssentini F,et al.H.264/
A VC baseline pro file decoder co mplex ity analysis
[J].IEEE T r ans Cir cuits Sy st V ideo T ech,2003,
13:560~576.[4] L ee J,M o on S.H.264deco der optimizatio n
ex plo iting SIM D instr uct ions[EB/O L].http://
sips03.snu.ac.kr/pub/co nf/c67.pdf,2003-05. [5] Zhou X iao so ng,Er ic Q L,Chen Yenkuang.
Implementing H.26L decoder on gener al-pur po se
pro cesso rs with m edia instr uct ions[A].SP IE Co nf
o n I mage and V ideo Co mmunicat ions and Pr o cessing
[C].2003,5022:224~235.
[6] 朱冬冬,丁 嵘,等.H.264软件解码器的优化[J].
电视技术,2003,(12):16~21.
[7] H.264/AV C Refer ence soft war e[EB/OL].http://
ipho me.hhi.de/suehr ing/tml/.2004-06.
作者简介:陈维安(1980-),男,硕士研究生,研究方向:流媒体技术、视频压缩,E-mail:chenweian123456@sjt . cn;余松煜(1941-),男,教授,博士生导师,研究方向:视频压缩、图像通信。
498数据采集与处理第20卷。