基于MIPS体系结构的嵌入式MPEG-2 音视频解码设计

摘 要:
本文介绍了基于 MIPS 体系结构的 32 位 SOC 芯片 GC3210 和嵌入式Linux 操作系统的 MPEG-2 音视频解码器的软件优化以及音视频同步机制的设计。采用多媒体指令对MPEG-2 视频解码关键模块IDCT 和 MC 进行软件优化,利用环路缓冲与 Linux多线程机制实现了音视频同步。

1 引言
随着嵌入式CPU速度的提高和数据压缩技术的发展, 多媒体技术在嵌入式产品得到了广泛的应用。MPEG-2作为目前主流的数字电视标准,被广泛应用于数字电视机顶盒、移动数字电视终端设备等领域。本文基于SOC芯片GC3210和Linux操作系统,设计了一个MPEG-2的音视频解码器,设计了一个基于Linux系统多线程音视频同步机制,解决了音视频同步问题,并对MPEG-2视频解码器的关键模块IDCT和MC进行了软件优化。

2 同步机制设计
由于 MPEG 音频和视频的基本元素流 ES 是分别打包成 PES 包,并按顺序存放在程序流 PS 或传输流 TS,如果按照原来 PES 包的存放顺序,依次对音视频进行解码,则会导致音视频不同步[1]。本文设计的解码器采用了 Linux 多线程与环路缓冲管理机制,实现音视频数据的同时解码,并采用一种以音频为主的同步控制算法,实现音视频的同步。

2.1 整体架构设计
本解码器采用的是基于 MIPS 体系结构的 32 位 SOC 芯片 GC3210 和源码开放、功能强大的 Linux-2.6.18 操作系统[3],音频 codec 采用 ALC203,通过 AC97 Link 接口与 GC3210片内的 AC97 控制相连,视频播放采用的是分辨率为 320*240 的 TFT 彩屏,数据格式为RGB565,即一个像素值为两个字节,采用直接写 framebuffer显存的方式输出视频数据; 设计中创建了两个 PES数据包环路缓冲区,分别存放解复用后音频和视频 ES数据包,每个缓冲区包含 N个 buffer,每个 buffer用于存放一个 PES数据包。

设计了三个线程用于音视频解码:
1.demux_thread 解复用线程,用于解复用 PS流和 TS流,并缓冲到相应的缓冲区中;

2.audio_decoder_thread 音频解码线程,用于解码缓冲区中的音频数据,解码后的 PCM
数据通过 AC97 Link 输出到音频 codec;

3.video_decoder_thread 视频解码线程, 用于解码缓冲区中的视频数据, 将解码后的 RGB
数据写到 framebuffer中从而显示出来;

由于解复用线程与音视频解码线程具有同步问题,采用 Linux 的信号量线程同步机制,设计两个信号量,videobuffer_sem和 audiobuffer_sem,demux_thread 填满一个缓冲 buffer 后 P 操作信量,继续填充下个缓冲区,demux_thread 填满最后一个缓冲 buffer[N]后回到第一个缓冲 buffer[0],接着填充数据,从而形成一个包含 N 个缓冲的环路缓冲区。

audio_decoder_thread 和 video_decoder_thread 在解码前对相应信号量 V 操作,一直等待到
demux_thread 填满一个缓冲后,开始解码 buffer中的音视频数据。
MPEG-2 解码器的整体架构如图一所示:

1

图一、MPEG-2 解码器整体结构
常规的音视频同步方法为:首先解出 PS中的系统参考时钟 SCR 或 TS流中的节目参考时钟,以此作为调整本地系统时钟的基准,然后按照 PES中的解码时间标签 DTS和显示时间标签 PTS 进行解码和播放。因而调整本地系统参考时钟是音视频同步方法的基础,系统参考时钟的精度直接影响了音视频同步的效果[1]。本文提出并实现了一种音视频同步控制算法, 该算法无须调整本地系统时钟, 而是以音频为主媒体, 在实现音频连续播放的基础上,通过比较基于相同时间基点的视频 PTS 与音频 PTS 的差值,调整视频的播放帧率,从而实现音视频同步。

2.2 音频播放同步控制
音频解码与连续播放是多线程音视频同步设计的基础,audio_decoder_thread 不断解码缓冲区中 MPEG音频数据,将解码输出的 PCM 数据写入 DMA缓冲区。解码线程写入数据时,首先 AC97 驱动尝试获取 DMA 通道信号量,若获取成功则将 PCM 数据写入 DMA 缓冲区的 fragment 中,否则挂起等待;当 fragment 写满数据时,启动 DMA 通道将数据写入AC97 控制器的输出 FIFO,播放出声音。DMA操作完成后产生 DMA中断信号,释放 DMA通道信号量后,audio_decoder_thread继续向 DMA缓冲区中写入数据。采用该机制,通过调整 fragment 的大小以及 fragment 的数量使得音频解码速度与播放速度匹配,从而达到了声音播放的连续性。

图二、MPEG-2 音频播放同步机制
2.3 视频播放同步控制
在音频连续播放的基础上,通过比较视频 PTS 与音频 PTS,根据两者的差值调整视频的播放帧率,可实现音视频的同步播放。在播放开始时,根据第一帧音频数据的 PTS 找到具有相同时间值的视频帧,同时播放,从而音视频播放具有相同的时间基准。然后,没播放N帧的音频数据,进行一次音视频同步调整。调整时,比较当前播放音频帧的时间 TAP 和当前视频帧的时间 TVP,存在以下三种情况:

1. 若|TAP-TVP|<=80ms,音视频播放处于同步状态,不需要调整;
2. 若 80ms<=|TAP-TVP|<=160ms,音视频播放处于临街同步状态,需进行同步调整;
3. 若|TAP-TVP|>160ms,音视频播放不同步,必须进行同步调整;

进行同步调整时,分两种情况:
1. TAP-TVP>0,音频播放快于视频播放,采用每两帧视频丢弃一帧的方式,加快视频
播放直到第(TAP-TVP)/fps帧为止;
2. TAP-TVP<0,视频频播放快于音频播放,则降低视频播放帧率,没播放一帧视频后
延时Δt后在进行解码,共延时(TAP-TVP)/Δt次。
3 视频解码器优化
嵌入式 MPEG-2 视频解码器优化的关键在于如何减少对内存的访问和更加有效的进行并行处理,方法如下:

1.内嵌 MIPS汇编,采用多媒体指令,包括并行加减、存取指令、饱和运算等[2],将
4 个8 位或2个 16 位的数据进行并行处理,提高 CPU的处理效率。
2.减小内存访问次数,CPU处理速度远远高于 SDRAM 的存取速度,视频解码的一个
瓶颈就在于对内存访问的等待,优化 codec 中数据 buffer的流程,减小内存访问。
3.提高cache 的使用率,GC3210具有 16KB的 Icache 和16KB 的 Dcache,应保持数据
的连续性,数据尽量不超过 cache 的大小,成组进行数据的存取,尽量使用 cache 中的数据,
使用寄存器代替对 SDRAM 的访问以及预存数据到 cacahe中。

4.使用 inline 函数,减少函数调用时间。
3.1 核心函数分析
视频解码器中总会有一些函数, 从静态指令的角度看, 占用整个应用的指令数比例很小,但是在运行程序时,这些代码却覆盖了大部分的动态执行指令,称这些函数为 codec 的核心函数。本文采用 Linux 的 gprof 工具,计算出 mpeg-2 视频解码器的各个函数的静态指令比和动态指令,可以看到,idct_copy、idct_add、MC_put_*、MC_avg_*等18 个函数,程序中19.95%的静态指令,却占据了 86.29%的运行时间,因而本文采用多媒体指令对这些函数进行优化。

3.2 IDCT 模块优化
idct_copy()函数实现帧内编码块的二维 IDCT 变换和限幅处理,其中 IDCT 采用文献[3]中的快速算法,将二维 IDCT 变换转化为 8 个一维行变换和 8 个一维列变换,本文优化时采用 16 位饱和加减指令以及 16 位半字乘指令,每次运算四行或四列,从而将 IDCT 的速度提高一倍左右。限幅处理是将 IDCT 变换输出结果限制在[0-255],即将 16 位有符号数饱和转换成 8 位无符号数,设计中采用多媒体饱和指令实现[2]。idct_add()函数进行帧间编码块的二维 IDCT 变换、块相加和限幅处理。IDCT 变化和限幅处理的优化同 idct_copy()。块相加由于像素间的不相关性,采用多媒体指令并行处理。

3.3 MC 模块优化
MC_put_*、MC_avg_*等 16 个函数用于在进行运动补偿时,从内存中取出参考块,共同的操作为 load 数据、store 数据,根据不同的取像素值的方法,再求解两个或四个像素值的平均值。由于不同像素数据不具有相关性,因而利用多媒体指令同时处理多个像素值。这16 个函数根据功能可分为 12 种存取情况。优化时,8 个字节的 load 操作,先用非对齐双字指令 ldr 寄存到一个定点寄存器,再用定点寄存器到浮点寄存器传输指令 dmtc1,将其转移到浮点寄存器中。8 个字节的 store 操作,可以用一个浮点的 store 双字操作实现。求两个 8位无符号的平均值、两个 16 位无符号数平均值以及四个 8 位无符号数的平均值,分别采用多媒体指令 pavgb、pavgh和两次 pavgb 实现。

3.3 性能测试
视频解码器优化前后各个函数占用 CPU 情况如图四所示, 可以看到优化前, idct_cpoy()、
dct_add()、和 MC_put_*/MC_avg_*占中播放时间的百分比为 8%、21%和30%,这三部分占播放时间的中百分比为 59%,优化后,idct_cpoy()、idct_add()、和 MC_put_*/MC_avg_*占中播放时间的百分比为 5%、8%和 26%,这三部分占播放时间的中百分比为 39%,优化函数性能提高了接近一倍。

3

图四、性能测试
4 结束语
本文运用 Linux 多线程机制实现了音视频的同步播放,针对 MIPS 架构采用多媒体指令对视频解码器的核心函数进行了优化,优化后解码器性能提高了接近一倍。

参考文献:
[1] MPEG-2 standard. Generic Coding of Moving Pictures and Associated Audio(MPEG-2).
ISO/IEC, 1995
[2] 李祖松.Godson-2 处理器运算功能部件指令集.龙芯 CPU研制组技术报告,2003 年10 月
[3] 许建龙.Linux 嵌入式软件在嵌入式多媒体终端中的应用.微计算机信息, 2004, 20-1, 10-11
本文的创新点:基于 MIPS体系结构与 Linux 操作系统的 MPEG-2 音视频解码器,设计了基
于 Linux 多线程和环路缓冲的音视频同步机制,提出一种简单而高效的音视频同步控制算
法,并基于多媒体指令集,实现 MPEG-2 视频解码软件优化,性能提高 1 倍左右。
作者简介:庄厝边(1983-) ,男(汉),中山大学硕士研究生,研究方向主要为嵌入式软件设
计和音视频算法优化;陈弟虎(1963-) ,男(汉),中山大学教授,博士生导师,主要从事微
电子技术和集成电路设计方向研究;伍康文(1967-) ,男(汉),广州鸿芯微电子有限公司总
经理,主要从事音视频编解码算法和集成电路设计。
Biography:ZHUANG Cuo-Bian(1983-),Male(han), master of Sun Yat-Sen University, Primarily
engaged in research software design of embedded Linux system and video codec arithmetic
optimization ; CHEN Di-hu(1963-),Male(han),professor of Sun Yat-sen University, Primarily
engaged in microelectronic technology and design of integration circuits; WU Kang-wen (197),
Male (han), Guangzhou Grandchips Microelectronic Co. Ltd. Primarily engaged in the Encode
/Decode arithmetic of Audio/ Video codec and design of integration circuits.

基金颁发部门:广东省科技计划项目;项目名称:基于龙芯1号IP核的SOC芯片设计平台的
研究与应用;编号:2007B060401051 基金申请人: 陈弟虎

--电子创新网--
粤ICP备12070055号