基于ARM的MPEG4视频解码器
本文旨在研究基于ARM微处理器的MPEG-4视频解码技术,主要应用在手持移动设备中。利用嵌入式系统实现MPEG-4视频解码,处理器的选择是关键。在嵌入式系统中常用的RISC处理器是ARM核,主要是因为它具有体积小,功耗低,成本低,性价比高的特点,这对于移动应用领域非常重要。ARM7系列微处理器为低功耗的32位RISC处理器,最适合于对价位和功耗要求较高的消费类应用。本解码器定位于低分辨率和低帧率的应用场合,因此选择在ARM7TDMI核上实现解码功能。要实现更高帧率和分辨率的解码,可将软件直接应用在更高端的处理器上。 2 MPEG-4视频解码算法的优化与实现 MPEG-4标准可以划分为一套子标准,标准的每一部分都有各自最适合的应用场合。MPEG-4 SVP就是一种特殊的、简单的MPEG-4实现,SVP代表Simple Visual Profile。这部分是专门针对手持式产品中无线视频传输应用场合而制定的。由于本解码器应用在手持移动设备视频解码的场合,因此选用MPEG-4 SVP作为解码算法。 本文选用ARM7TDMI作为核心处理器进行MPEG-4视频解码器的开发。在实际开发过程中,针对ARM7TDMI的结构和MPEG-4的算法特点,做了大量优化工作,保证了解码的精度,大幅度提高了解码的速度。解码器的具体功能如表1所列。 表1 基于ARM7TDMI的MPEG-4视频解码器功能表
2.1 解码器算法 解码过程实际上就是从视频编码码流中恢复出VOP数据的过程。图1描述了一个视频解码过程。解码器主要包含两部分: 运动解码和纹理解码。I帧中只含有纹理信息,因此只须解码纹理信息即可恢复I帧。而P帧中不仅包含纹理信息,还包含运动信息,所以须解码运动信息,获得运动矢量并进行运动补偿。另外,还须进行纹理解码获得残差值,将这两部分组合起来才能重建P帧。
图1 MPEG4 SVP的解码过程 解码器的实现主要是提供一个简单的接口函数,供解码时调用。该接口函数根据解码的不同需要和不同阶段提供了5个入口。5个接口函数中: 4个供初始化、预处理及后续处理时调用;剩余1个是帧解码的实现函数。图2为帧解码主程序的流程图。
图2 帧解码主程序的流程图。 解码过程的计算主要集中在如下几个模块:IDCT、运动补偿MC、逆量化、逆扫描、逆预测以及变长解码VLD。表2给出了优化前解码过程的特征信息。 从表2中可以看出,上述运算模块在解码过程中占有很大比例。对以上各模块进行优化的效果将直接反映在解码器的实时效率上。 表2 优化前解码过程的特征信息
2.2 ARM平台下算法的优化 ARM结构是基于RISC原理的,指令集和相关的解码机制都比CISC要简单得多。它能高效地输出指令,快速送出实时中断响应;它还进行了管道设置,处理和存储系统的所有部分可以持续地运转。在典型的情况下,当一条指令被执行时,其后续指令正在被解码;而第三条指令便从存储器中取出。ARM7TDMI并不具有指令或数据的高速缓存,主要被用于控制核心,而非数据处理。但通过对其特性的灵活运用,可以使其非常容易地应用于视频解码过程。对MPEG4视频解码器的算法优化主要从以下几方面入手: (1) 算法的优化 ① IDCT算法的选择 ② 除法运算的消除 ③ 存储访问的减少 (2) 根据ARM7TDMI芯片结构的优化 (3) 汇编/结构层的优化 ① 内部循环的解开 首先读入一个字到寄存器中,从低到高的数据依次对应的是像素0、像素1、像素2和像素3;然后将读码流指针增加1字节,再读取下一个字到另一寄存器中,从低到高的数据依次对应的为像素1、像素2、像素3和像素4。示意图如图4所示。
图3 半像素内插示意图 图4 4像素补偿原理示意图 半像素补偿可由x=(A+B+1-rounding_control)/2来实现。式中: A和B为参考帧中两个相邻的像素数据;rounding_control可取0或1。 按照补偿公式对上述两个寄存器进行相加移位操作,但是对应像素两两相加时可能会产生进位。为了解决这个问题,须设置保护位,具体方法如下: 将上述两个寄存器中的任意一个(如寄存器1)与0xFEFEFEFF相“与”,则寄存器1中像素1、2、3的最低位被清0,即将后一字节的最低位设置为前一字节的保护位。而对于第3字节,因为寄存器本身带有进位状态标志,所以无需另外设置。 •如果rounding_control为0,则将寄存器2与0x01010101相加,然后再和0xFEFEFEFF相“与”,设置进位保护位;如果rounding_control为1,则直接将寄存器2和0xFEFEFEFF相“与”。 对于垂直方向和水平垂直方向的半像素补偿,其原理与水平方向相同。 3 实验结果与数据分析 通过优化,MPEG4的解码性能有了较大的提升。在ADS1.2环境下分别对各模块进行C算法优化和ARM代码优化,结果如表3所列。按调用一次模块函数所需周期数进行统计。 表3 仿真器上各模块单独统计(使用QCIF格式图像news)
这些模块是解码过程中经常会调用的函数,因此,这些函数的优化将使解码速度有明显的提高。 表4比较了不同序列的15帧QCIF格式视频解码优化前后所需的带宽。这些图像具有不同的复杂度,因而结果也不一样。 表4 对不同序列的优化结果(15fps QCIF格式)
注: ① 为标准视频测试序列。 解码速度基本取决于图像画面的运动情况和颜色是否丰富。从上面的数据可以看出对于不同的序列,其解码速度也不同。news、salesman和miss_am之所以很快,是因为图像背景静止,只有肩部和头部有运动,所以P帧的编码数据量较少,解码速度较高。另外,如果图像很简单(单调),其能量集中到DC系数(直流分量)上,交流系数会出现多个零,因此变长解码速度就会较高,从而节约了解码时间。 从仿真速度分析 |







