wdefu 2007-4-12 14:02
基于ADSP-BF533处理器的H.264解码器
[b][font=宋体]引[/font][font=宋体]言[/font] [/b]
H[font=宋体].[/font]264[font=宋体]是[/font]ITU T[font=宋体]的[/font]VCEG[font=宋体]和[/font]ISO[font=宋体]/[/font]IEC[font=宋体]的[/font]MPEG[font=宋体]联合成立的联合视频组[/font]JVT(Joint Video Tearn)[font=宋体]共同制定的新视频编码标准,定位于覆盖整个视频应用领域。[/font]H[font=宋体].[/font]264[font=宋体]标准采用了基于可变大小宏块的运动补偿、多帧参考、整数变换、基于[/font]1[font=宋体]/[/font]4[font=宋体]像素精度的运动估计、去块效应滤波器等新技术,因而获得更好的压缩性能,同时也导致了运算量的大幅度增加。[/font]
Blackfin[font=宋体]处理器采用了[/font]ADI[font=宋体]公司和英特尔公司共同开发的微信号结构,在结构中加人专门的视频处理指令,工作频率高达[/font]756 MHz[font=宋体],能完成[/font]12OOM[font=宋体]次/[/font]s[font=宋体]乘加操作。与采用超标量结构或超长指令集的[/font]DSP([font=宋体]如[/font]TI[font=宋体]的[/font]C6000[font=宋体]系列[/font])[font=宋体]相比,[/font]Blackfin[font=宋体]处理器在功耗、成本方面具有很大的优势,非常适合嵌入式的视频应用。[/font]
[b]1H[/b][b][font=宋体].[/font]264[/b][b][font=宋体]视频编码标准[/font] [/b]
H[font=宋体].[/font]264[font=宋体]视频编解码器的基本结构与早期的编码标准[/font](H[font=宋体].[/font]263[font=宋体]、[/font]MPEG4[font=宋体]等[/font])[font=宋体]相似,都是由运动补偿、变换、量化、熵编码、环路去块效应滤波器等功能单元组成的。[/font]H[font=宋体].[/font]264[font=宋体]标准的改进主要体现在各功能模块内部。[/font]H_264[font=宋体]的重大改进表现在以下几个方面:[/font]
[font=宋体]
①高精度的基于[/font]1[font=宋体]/[/font]4[font=宋体]像素精度的运动预测。[/font]
[font=宋体]
②多种宏块划分模式。每个宏块[/font](16[font=宋体]×[/font]16[font=宋体]像素[/font])[font=宋体]的亮度分量有[/font]7[font=宋体]种分区方法:[/font]16[font=宋体]×[/font]16[font=宋体]、[/font]16[font=宋体]×[/font]8[font=宋体]、[/font]8[font=宋体]×[/font]16[font=宋体]、[/font]8[font=宋体]×[/font]8[font=宋体]、[/font]8[font=宋体]×[/font]4[font=宋体]、[/font]4[font=宋体]×[/font]8[font=宋体]、[/font]4[font=宋体]×[/font]4[font=宋体]。[/font]
[font=宋体]
③多帧预测。在帧间编码时,可选[/font]5[font=宋体]个不同的参考帧。[/font]
[font=宋体]
④整数变换。采用基于[/font]4[font=宋体]×[/font]4[font=宋体]像素块的整数变换代替[/font]DCT[font=宋体]变换。[/font]
[font=宋体]
⑤[/font]H_264[font=宋体]/[/font]AVC[font=宋体]支持两种熵编码方法,即[/font]CAVLC([font=宋体]基于上下文的自适应可变长编码[/font])[font=宋体]和[/font]CABAC([font=宋体]基于上下文的自适应算术编码[/font])[font=宋体]。[/font]CAVLC[font=宋体]的抗差错能力比较高,而编码效率比[/font]CABAC[font=宋体]低;[/font]CABAC[font=宋体]编码效率高,但需要的计算量和存储容量更大。[/font]
[font=宋体]
[font=Verdana] [/font]⑥帧内预测编码。[/font]H[font=宋体].[/font]264[font=宋体]采用了多种设计合理的帧内预测模式,大大降低了[/font]I[font=宋体]帧的编码率。[/font]
[font=宋体]
[font=Verdana] [/font]⑦网络适配层[/font]NAL(Network Abstraction Layer)[font=宋体]为视频编码层提供一个与网络无关的统一接口,使视频编码数据能适应不同的网络应用环境。[/font]
H[font=宋体].[/font]264[font=宋体]分为[/font]7[font=宋体]种不同的框架[/font](profile)[font=宋体]——[/font]Baselineprofile[font=宋体]、[/font]Main profiIe[font=宋体]、[/font]Extended profile[font=宋体]、[/font]High profik[font=宋体]、[/font]High10 profik[font=宋体]、[/font]High4[font=宋体]:[/font]2[font=宋体]:[/font]2 profile[font=宋体]和[/font]High 4[font=宋体];[/font]4[font=宋体]:[/font]4[font=宋体],分别代表不同的技术限制和算法集合。其中[/font]baseline prome[font=宋体]的使用是不收版权费的。[/font]
[b]2[/b][b][font=宋体]基于[/font]ADSP[/b][b][font=宋体]—[/font]BF533[font=宋体]的软硬件实现平台[/font] [/b]
[font=宋体]
硬件平台采用[/font]ADI[font=宋体]公司的[/font]ADSP[font=宋体]—[/font]BF533 EZ[font=宋体]—[/font]kit Lite[font=宋体]评估板。此评估板包括[/font]l[font=宋体]块[/font]ADSP[font=宋体]—[/font]BF533[font=宋体]处理器,[/font]32MB SDRAM[font=宋体],[/font]2 MB? Flash[font=宋体],[/font]ADVl836[font=宋体]音频编解码器外接[/font]4[font=宋体]输入/[/font]6[font=宋体]输出音频接口,[/font]ADV7183[font=宋体]视频解码器和[/font]ADV7171[font=宋体]视频编码器外接[/font]3[font=宋体]输入/[/font]3[font=宋体]输出视频接口,[/font]1[font=宋体]个[/font]UART[font=宋体]接口,[/font]1[font=宋体]个[/font]USB[font=宋体]调试接口,[/font]1[font=宋体]个[/font]JTAG[font=宋体]调试接口。评估板系统结构框图如图[/font]1[font=宋体]所示。[/font]
[font=宋体][img]http://www.icembed.com/UploadFiles/200727151915734.jpg[/img][/font]
[font=宋体]评估板上采用的ADSP[font=宋体]—[/font]BF533[font=宋体]处理器,工作频率高达[/font]756 MHz[font=宋体]。该处理器有以下特点:双[/font]16[font=宋体]位乘法累加器;双[/font]40[font=宋体]位算术逻辑单元[/font](ALU)[font=宋体];[/font]4[font=宋体]个[/font]8[font=宋体]位视频[/font]ALU[font=宋体];[/font]1[font=宋体]个[/font]40
[font=宋体]位移位器;专用的视频信号处理指令;[/font]148 KB[font=宋体]的片内存储器[/font](16 KB[font=宋体]可作为指令[/font]Cache[font=宋体],[/font]32 KB[font=宋体]可作为数据[/font]Cache)[font=宋体];动态电源管理功能等。[/font]Blackfin[font=宋体]处理器还包括丰富的外设和接口:[/font]EBIU[font=宋体]接口[/font](4[font=宋体]个[/font]128 MB SDRAM[font=宋体]接口,[/font]4[font=宋体]个[/font]l MB[font=宋体]异步存储器接口[/font])[font=宋体],[/font]3[font=宋体]个定时/计数器,[/font]1[font=宋体]个[/font]UART[font=宋体],[/font]1[font=宋体]个[/font]SPI[font=宋体]接口,[/font]2[font=宋体]个同步串行接口,[/font]1[font=宋体]路并行外设接口[/font]([font=宋体]支持[/font]ITU[font=宋体]一[/font]656[font=宋体]数据格式[/font])[font=宋体]等等。[/font]Blackfin[font=宋体]处理器在结构上充分体现了对媒体应用[/font]([font=宋体]特别是视频应用[/font])[font=宋体]算法的支持。[/font]
[font=宋体]
软件验证采用如下方式:首先,通过[/font]DSP[font=宋体]仿真器将[/font]H[font=宋体].[/font]264[font=宋体]编码文件拷贝到评估板的存储器里。然后,软件从存储器中读取编码文件的数据,进行解码操作。最后,将解码的数据通过[/font]PPI[font=宋体]接口输出到[/font]ADV7171[font=宋体]芯片,[/font]ADV7171[font=宋体]芯片将输入的视频数据编码为[/font]PAL[font=宋体]格式输出到显示器上二进行显示。[/font]
Blackfin[font=宋体]处理器的软件开发平台是[/font]VisualDSP++4[font=宋体].[/font]0[font=宋体]。[/font]
[b]3 H 264[font=宋体]实时解码器软件设计[/font] [/b]
[b]
3.1[font=宋体]软件总体设计[/font] [/b]
[font=宋体]
为了实现实时解码的要求,需要优化程序的设计。优化流程如下:[/font]
[font=宋体]
①在[/font]PC[font=宋体]机上进行算法的验证和评估、优化程序的流程设计和数据结构设计。[/font]
[font=宋体]
②将程序代码移植到[/font]Blackfin[font=宋体]处理器。在[/font]Visual[font=宋体]—[/font]DSP++[font=宋体]集成开发环境里进行编译,删除[/font]PC[font=宋体]平台相关的代码,添加[/font]DSP[font=宋体]平台相关的代码。[/font]
[font=宋体]
③进行基于[/font]DSP[font=宋体]平台的优化操作。设置速度优化的编译参数,进行[/font]C[font=宋体]语言级的优化,用汇编指令改写最耗时的函数,通过使用专用的向量指令和并行指令减少函数的执行时间。[/font]
[b]
3.2 [font=宋体]在[/font]PC[font=宋体]机上实现并优化解码器程序[/font] [/b]
[font=宋体]
解码器程序参考了[/font]JM9[font=宋体].[/font]6[font=宋体],并在以下方面作了优化:[/font]
[font=宋体]
①由于只支持[/font]Baseline profile[font=宋体],删除有关[/font]B[font=宋体]帧、[/font]SI[font=宋体]片、[/font]SP[font=宋体]片和数据分割等不支持特性的冗余程序代码;[/font]
[font=宋体]
②修正[/font]JM9[font=宋体].[/font]6[font=宋体],每次处理一个[/font]Slice[font=宋体]时都要分配内存,读取其中信息,再释放内存,合理安排内存空间的分配和释放;[/font]
[font=宋体]
③将[/font]I[font=宋体]帧、[/font]P[font=宋体]帧分别独立解码,宏块解码也按预测模式和预测方向分成不同的解码模块,以省去中间的重复判断,提高解码速度;[/font]
[font=宋体]
④优化[/font]CAVLC[font=宋体]码表的查询方法。[/font]
[b]
3.3 [font=宋体]程序移植[/font] [/b]
VisualDSP++[font=宋体]是一款支持[/font]Blackfin[font=宋体]处理器的集成开发、调试环境,包括[/font]VisuaIDSP++[font=宋体]内核[/font](VDK)[font=宋体]、[/font]C[font=宋体]/[/font]C++[font=宋体]编译器、高级图形绘制工具、调试工具、器件模拟器等多种功能;能够很好地支持在[/font]Blackfin[font=宋体]处理器上用[/font]C[font=宋体]/[/font]C++[font=宋体]语言进行开发工作。[/font]
[font=宋体][font=Verdana] [/font]移植的第一步是除去所有的编译环境不支持的函数[/font]([font=宋体]例如某些时间相关的函数[/font])[font=宋体],将文件操作修改为读取文件数据缓存的操作,删除[/font]SNR[font=宋体]信息收集和信息打印输出等[/font]DSP[font=宋体]平台实现不需要的代码。第二步是添加与硬件相关的代码。这些代码包括系统初始化代码、输出模块代码、中断服务程序和解码速率控制程序等程序代码。[/font]
[font=宋体] 移植完毕后,就实现了基于[/font]ADSP-BF533[font=宋体]处理器的[/font]H_264[font=宋体]解码器;但速度达不到实时解码的要求,还需要进行优化。[/font]
[b]
3.4 [font=宋体]基于[/font]DSP[font=宋体]平台的优化[/font] [/b]
[font=宋体]
基于[/font]DSP[font=宋体]平台的优化分为系统级优化、[/font]C[font=宋体]程序级优化和汇编级优化。[/font]
(1)[font=宋体]系统级优化[/font]
[font=宋体]
打开编译器中的优化开关,设置为速度最优化;打开自动内联开关;打开“[/font]Interprocedural optimization[font=宋体]”[/font]([font=宋体]过程间优化[/font])[font=宋体]开关;使用[/font]VisualDSP++[font=宋体]编译器的[/font]PGO(Profile[font=宋体]—[/font]Guided Optimization)[font=宋体]优化编译技术。[/font]
(2)C[font=宋体]程序级优化[/font]
C[font=宋体]程序级的优化主要是针对[/font]BIackfin[font=宋体]处理器的具体特点进行优化:[/font]
[font=宋体]
①编写链接描述文件,将经常用的数据存储在片内存储器,例如[/font]CAVLC[font=宋体]熵解码的码表;启用指令[/font]Cache[font=宋体]和数据[/font]Cache[font=宋体],设置好启用[/font]Cache[font=宋体]机制的指令地址和数据地址。[/font]
[font=宋体]
[font=Verdana] [/font]②将除法操作转换为乘法操作或者采用查表法计算。[/font]
[font=宋体]
[font=Verdana] [/font]③减少对片外存储器的访问次数。对于经常访问的片外存储器区域,设置[/font]Cache[font=宋体]使能,并可设置[/font]Cache[font=宋体]锁定,防止被缓存的数据被替换,减少[/font]Cache[font=宋体]未命中的几率。[/font]
[font=宋体]
[font=Verdana] [/font]④对于能够用较短的数据类型表达的数据改用较短的数据类型表达,例如原定义为[/font]int[font=宋体]类型的[/font]4[font=宋体]×[/font]4[font=宋体]逆整数变换的输人数据,实际上可以定义为[/font]short[font=宋体]类型。[/font]
(3)[font=宋体]汇编级优化[/font]
[font=宋体]
汇编级优化通常遵循以下原则:[/font]
① [font=宋体]使用寄存器代替局部变量。如果局部变量用来保存计算的中间结果,那么用寄存器[/font]
[font=宋体]代替局部变量可以省掉很多访问内存的时问。[/font]
②[font=Times New Roman] [/font][font=宋体]使用硬件循环代替软件循环。.[/font]Blackfin[font=宋体]处理器有专用的硬件支持两级嵌套的零开销[/font]
[font=宋体]硬件循环。用硬件循环代替软件循环可避免堵塞流水线,提高速度。[/font]
[font=宋体]③ 使用并行指令和向量指令。使用并行指令和向量指令,可以充分利用[/font]Blackfin[font=宋体]处理器的[/font]SIMD[font=宋体]系统结构的优点和内部硬件资源的并行处理优点,减少指令执行次数和提高指令执行效率。使用[/font]1[font=宋体]条并行指令同时执行[/font]2[font=宋体]条或[/font]3[font=宋体]条非并行指令。向量指令可以同时对多个数据流进行相同的加工操作。[/font]
[font=宋体]④ 使用视频处理指令。视频处理应用可以使用[/font]Blackfin[font=宋体]处理器专用的视频处理指令,提高执行效率。[/font]
[font=宋体]
将最耗时的一些函数用汇编语言改写,充分利用[/font]Blackfin[font=宋体]处理器的[/font]S1MD[font=宋体]结构的优点和硬件上的并行性,在一个指令周期内执行多个操作,减少函数执行需要的指令周期。最耗时的函数有宏块解码函数[/font]decode_one_macroblock[font=宋体]、逆整数变换函数[/font]itrans[font=宋体]、去块效应滤波函数[/font]EdgeLoop[font=宋体]、滤波门限计算函数[/font]Get_Strength[font=宋体]等函数。[/font]
[font=宋体]
下面以[/font]4[font=宋体]×[/font]4[font=宋体]矩阵逆整数变换函数[/font]itrans[font=宋体]和[/font]1[font=宋体]/[/font]4[font=宋体]像素插值滤波[/font]get_block()[font=宋体],说明用汇编指令优化带来的性能提高。[/font]4[font=宋体]×[/font]4[font=宋体]矩阵的逆整数变换函数[/font]itrans[font=宋体]采用的是[/font]2[font=宋体]级蝶形运算,先对[/font]4[font=宋体]×[/font]4[font=宋体]矩阵的每一行分别做行逆变换,再对每一列做列逆变换。一维变换采用如图[/font]2[font=宋体]所示的蝶形算法。[/font]
[font=宋体][img]http://www.icembed.com/UploadFiles/200727151923580.jpg[/img][/font]
[font=宋体]Blackfin[font=宋体]处理器的[/font]SIMD[font=宋体]结构支持向量操作,最多可以在[/font]1[font=宋体]个周期内完成[/font]4[font=宋体]个[/font]16[font=宋体]位的加法操作。它的并行指令能同时进行算术运算和两个数据的装载/存储操作。例如上述的蝶形运算可以用如下指令实现[/font]([font=宋体]设寄存器[/font]IO[font=宋体]中保存了输人数据[/font]y[4][4][font=宋体]的地址,[/font]I2[font=宋体]中保存了系数数组[/font]cof[2]={0x7fff[font=宋体],[/font]0x4000}[font=宋体]的地址,[/font]Il[font=宋体]中保存了临时变量[/font]tmp[4][4][font=宋体]的地址,[/font]R2[font=宋体]和[/font]R1[font=宋体]保存的是中问结果[/font])[font=宋体]:[/font]
R7=[IO++][font=宋体];[/font]
Al=R6[font=宋体].[/font]I*R7[font=宋体].[/font]1[font=宋体],[/font]AO=R6[font=宋体].[/font]1*R7[font=宋体].[/font]1(IS)[font=宋体]┃│[/font]I R5=
[10++][font=宋体]┃┃[/font][[font=宋体]││[/font]++]=R2[font=宋体];[/font]
R4[font=宋体].[/font]h=(A1[font=宋体]一一[/font]R5[font=宋体].[/font]1*R6[font=宋体].[/font]1)[font=宋体],[/font]R4[font=宋体].[/font]1=(AO+=R5[font=宋体].[/font]1*R6[font=宋体].[/font]1)(IS)[font=宋体]││[/font]W[I1++]=R1[font=宋体].[/font]h[font=宋体];[/font]
R7[font=宋体].[/font]1=R6[font=宋体].[/font]1*R5[font=宋体].[/font]h(IS)1 W[11++]=R1[font=宋体].[/font]1[font=宋体];[/font]
R5=R7>>>1(v)[font=宋体];[/font]
A1=R6[font=宋体].[/font]1*R5[font=宋体].[/font]h[font=宋体],[/font]AO[font=宋体]—[/font]R6[font=宋体].[/font]1*R5[font=宋体].[/font]1(IS)[font=宋体];[/font]
R3[font=宋体].[/font]h[font=宋体]一[/font](A1+[font=宋体]一[/font]R6[font=宋体].[/font]1*R7[font=宋体].[/font]1)[font=宋体],[/font]R3[font=宋体].[/font]1[font=宋体]一[/font](AO=R6[font=宋体].[/font]1*R7[font=宋体].[/font]h)(IS)[font=宋体];[/font]
R2=R4+l+R3,R1=R4[font=宋体]一│[/font] [font=宋体]一[/font]R3[font=宋体]:[/font]
[font=宋体]
完成一次一维逆变换只需[/font]8[font=宋体]条指令,算上函数调用的开销和其他一些辅助指令,完成一个[/font]4[font=宋体]×[/font]4[font=宋体]矩阵的逆整数变换时总共需要[/font]82[font=宋体]条指令周期。表[/font]1[font=宋体]是优化前、后的比较。[/font]
[font=宋体][img]http://www.icembed.com/UploadFiles/200727151924621.jpg[/img][/font]
[font=宋体]get_block[font=宋体]函数对像素矩阵进行[/font]1[font=宋体]/[/font]4[font=宋体]像素插值操作。先用六阶滤波器进行[/font]1[font=宋体]/[/font]2[font=宋体]像素插值,然后用线性内插法进行[/font]l[font=宋体]/[/font]4[font=宋体]像素插值。[/font]
l[font=宋体]/[/font]2[font=宋体]像素[/font]b[font=宋体]计算方法为:[/font]b=round((E[font=宋体]一[/font]5F+20G+20H[font=宋体]一[/font]5I+j)[font=宋体]/[/font]32)[font=宋体]。示意图如图[/font]3[font=宋体]所示。[/font]E[font=宋体]、[/font]F[font=宋体]、[/font]G[font=宋体]、[/font]H[font=宋体]、[/font]I[font=宋体]、[/font]J[font=宋体]是整数像素,[/font]b[font=宋体]是[/font]G[font=宋体]和[/font]H[font=宋体]之问的[/font]1[font=宋体]/[/font]2[font=宋体]像素。[/font]
[font=宋体][img]http://www.icembed.com/UploadFiles/200727151926360.jpg[/img][/font]
[font=宋体][font=宋体]像素的亮度值为[/font]unsigned char[font=宋体]类型,先利用并行指令可以在[/font]1[font=宋体]个指令周期内将[/font]8[font=宋体]个像素的亮度值读到寄存器,然后利用视频专用指令将[/font]4[font=宋体]个字节解包到[/font]1[font=宋体]个寄存器对[/font](R1[font=宋体]:[/font]O[font=宋体]或[/font]R3[font=宋体]:[/font]2)[font=宋体]中去,利用向量指令在[/font]1[font=宋体]个周期内进行[/font]2[font=宋体]次乘加操作。通过视频专用指令、向量指令和并行指令的使用,减少了函数指令的指令周期数。[/font]
[b]4 [font=宋体]实验结果[/font] [/b]
[font=宋体]
在[/font]EZKit533[font=宋体]开发板上测试了解码器算法,对[/font]CIF[font=宋体]格式[/font](352[font=宋体]×[/font]288)[font=宋体]的[/font]foreman[font=宋体]测试序列,可以达到[/font]45[font=宋体]~[/font]50[font=宋体]帧/[/font]s[font=宋体]的解码速度;对[/font]CIF[font=宋体]格式的[/font]mobile[font=宋体]测试序列,能够达到[/font]40[font=宋体]帧~[/font]44[font=宋体]帧的解码速度。如果增加解码速率控制模块,可以稳定地实现以[/font]30[font=宋体]帧/[/font]s[font=宋体]的速率播放[/font]CIF[font=宋体]测试序列。实验结果证明,在[/font]Blackiln[font=宋体]处理器上实现[/font]H[font=宋体].[/font]264[font=宋体]实时解码器是可行的。[/font]ADI[font=宋体]公司甚至声称可以在[/font]600 Mtz[font=宋体]的[/font]BF533[font=宋体]处理器上实现[/font]D1(720[font=宋体]×[/font]576)[font=宋体]格式的视频实时解码器。[/font]
BIackfin[font=宋体]处理器有低功耗、低成本和高性能的特点。在[/font]Blackfin[font=宋体]处理器上实现的[/font]H[font=宋体].[/font]264[font=宋体]视频解码器很适合用于[/font]IP[font=宋体]机顶盒、可视电话、[/font]PMP([font=宋体]便携式媒体播放器[/font])[font=宋体]等嵌人式视频应用中。[/font]
[/font][/font][/font][/font]