基于Blackfin533的H.264编码
2.2 各程序模块的优化
各程序模块的优化主要指各模块的C代码优化及部分代码的汇编优化。
C代码的优化对H.264编码器有着重要意义,它既有利于提高编码的速度,又有利于编码器的跨平台移植。C代码优化有下面的原则:
(1) 使编码器代码线性化,这样有利于DSP的流水线满负荷运行,更充分地发挥DSP的数据处理能力。
(2) 取消循环中的数据依赖。数据依赖是指后面指令的输入数据依赖于前面指令的输出数据。许多DSP芯片都提供了硬件循环指令,Blackfin533有两个硬件循环器,可提供两层的硬件循环。硬件循环实现了零开销的循环判断,能大大提高循环指令的执行速度,然而数据依赖的存在会阻止硬件循环的使用。所以要尽可能消除循环中的数据依赖。
(3) 将除法转化为乘法或查表方式。Blackfin533提供了硬件乘法器,但没有硬件除法器。执行除法指令会花费几十或上百个指令周期。将除法转化为乘法或查表,能大大减少这种开销。
(4) 减少对片外存储器的访问次数。片外存储器相对于片内存储器是低速设备,片外存储器的读取时间是片内存储器的几倍至十几倍。对于片外存储器的数据要做到一次读取,完成多次计算。
Blackfin芯片的开发环境VisualDSP本身已经带有汇编器,但由于种种原因,对于某些运算量大、调用频繁的函数仍需要进行手动汇编优化。进行汇编优化时,应注意以下几点:
(1) 节省寄存器资源。Blackfin533提供了8个32位数据寄存器以及一系列的地址寄存器。对于这些寄存器,应尽可能做到一个寄存器多次使用;同时在能用较短的数据类型的情况下用短的数据类型,如能用short则不用int,这样每个32位寄存器可以作为两个16位寄存器使用,相当于增加了寄存器的数量。
(2) 使用专用指令。Blackfin533提供了求最大值、最小值、绝对值、CLIP及大量视频专用指令,通过使用这些指令,能大大提高代码的执行速度。
(3) 使用并行指令。对于大多数指令都存在相对应的并行指令,如一条运算指令可以并行两条数据读取指令。并行指令的使用能成倍提高代码的执行速度。
(4) 将内层循环展开等。
对于不同的图像帧(I、P),各模块所占的比例各不相同。对于I帧,帧内模式选择和去块效应滤波占较大的比例;对于P帧,帧间模式选择则占较大的比例。总之,模式选择及去块效应滤波是H.264编码的瓶颈,需要对这两部分进行优化。
进行模式选择时会调用绝对差值求和函数(SAD)及hadamard变换后再绝对值求和函数(SATD)。这两个函数虽然较简单,但调用较频繁,对这两个函数进行汇编优化,能较大提高模式选择的速度。对于绝对差值求和函数(SAD),通过使用Blackfin的专用视频指令SAA,可以大大提高运算速度,具体见汇编优化统计表1和表2。
表1 优化前后函数所占时钟周期数对比表
优化函数 | 优化前(时钟周期数) | 优化后(时钟周期数) | 提高倍数 |
SAD | 1385 | 55 | 25 |
SATD | 1964 | 84 | 23 |
GetStrength | 50214 | 4983 | 10 |
EdgeLoopY | 61227 | 5032 | 12 |
EdgeLoopUV | 52110 | 4173 | 12 |
表2 优化后的H.264各模块性能
占用时间(时钟周期数M) | 所占比例 | |
模式选择(包含插值) | 11.26 | 53.6% |
变换、量化 | 1.87 | 8.9% |
反量化、反变换 | 1.93 | 9.2% |
编码(UVLC) | 0.90 | 4.3% |
去块效应滤波 | 2.73 | 13% |
其他 | 2.31 | 11% |
表3 压缩后的CIF图像的质量
H.264编码器 | ||||
视频序列 (100帧) | 平均峰值信噪比PSNR(dB) | 码率(kbit/s) | ||
亮度Y | 色度U | 色度V | ||
Foreman | 36.57 | 41.23 | 43.39 | 503 |
- DVI与HDMI:视频传输的数字化革命(08-15)
- 大规模IPTV点播系统解决方案(08-18)
- 数字音视频编解码技术标准AVS(08-19)
- 嵌入式设备的静止图像编码(08-18)
- 全球手机电视三大技术标准对比分析(08-19)
- 高清标准:入主中国,到底谁家?(08-20)