基于TMS320DM642的MPEG4编码器设计与实现
发布时间:2008/5/29 0:00:00 访问次数:376
近年来,随着网络和多媒体技术的发展,视频信息通信的重要性和需求急剧增长,而其中的关键就在于视频压缩编码技术的应用。文献[1]曾提出了一种基于tms320dm642 dsp的视频编码方案,实现了h.264算法。同h.264相比,mpeg4具有软硬件开发成本低和更容易实现的优势,是目前视频编码应用的主流。本文提出了一种基于tms320dm642 dsp的mpeg4视频编码器的实现方法,该方案可用于远程视频监控、视频会议等诸多领域。
mpeg4是由国际运动图像专家组(mpeg)开发制定的国际通用视频压缩编码标准,目前已经发展成为可适应不同传输带宽、可用最少的数据来获得最佳质量图像的高效压缩算法和工具。mpeg采用了dct、量化、熵编码等算法,通过对形状、运动、纹理等信息的分析,消除图像数据在时间和空间上的相关性,具有高效压缩性及普遍适用性等独特优势,为视频信息高效存储、传输提供了方便。
mpeg4为不同的应用对应的码率、分辨率、质量和服务定义了编码器和码流的不同框架和级别,其中的简单框架提供了对矩形视频对象的编码功能。本文所实现的就是mpeg4视频编码算法的简单框架。
2 mpeg4编码器硬件平台
实现mpeg4编码器的硬件平台以tms320dm642dsp为核心,并配合以适当的外部存储器sdram,flash等外围设备。
2.1 tms320dm642特性
tms320dm642是ti为多媒体应用而开发的基于c64x内核的高性能定点数字信号处理器,时钟频率600 mhz,最高处理能力可达4 800 mips。dm642具有c6000系列dsp的公共定点指令集,增加了多媒体扩展指令,可以更加方便快速地执行图像处理中的算法。dm642的这些特点,使其非常适合于视频图像处理,是实现mpeg4视频编码器的理想硬件平台。
2.2 硬件系统结构
dm642作为整个系统的核心,对视频数据进行高速处理,完成mpeg4编码算法;可编程视频格式转换电路将输入的原始视频数据进行预处理,转换成编码器可接受的视频格式的数字信号;e2prom和flash用来固化应用程序和初始化参数,sdram作为片外存储器,在编码过程中存储待处理的视频数据,以上三者通过emif总线与dm642连接;通过jtag接口,利用ccs,可方便地实现系统软硬件仿真与调试;实时时钟为数字视频提供实时时间基准信息。
3 mpeg4编码器的软件实现和优化
3.1 mpeg4的软件实现
mpeg4是一个开放的框架标准,并没有规定具体的算法和程序,用户可根据需要自行开发代码,我们采用了xvid 1.1.0开放源码来实现mpeg4编码器。xvid代码实现了mpeg4的简单框架算法,不需要形状编码,只对i-vop和p-vop进行编码。但xvid是针对pc机应用而设计开发的,要将他移植到dsp中,必须对代码进行分析,结合dsp的指令结构和特点进行修改。
xvid代码实现的mpeg4编码器,以原始视频数据中的每一帧作为一个视频对象,首先判断是i帧还是p帧,i帧需要对整帧图像数据进行编码存储,p帧则进行运动估计和补偿,只编码当前帧与参考帧之间的图像残差和运动矢量。每帧数据都被分为16×16宏块,每个宏块又分为8×8子块,在宏块和子块的基础上进行dct、量化、vlc编码。基于不高的图像质量需求,我们减化了xvid的某些功能,如gmc(全局运动补偿)、rvlc等,减少了代码运算量,降低了复杂度。
3.2 代码优化
为提高代码执行效率,必须结合dsp的特点对代码进行优化,优化主要分为3个层次:
3.2.1 项目级优化
ti提供了功能强大的集成开发环境ccs,包含了各种高效的编译工具,在代码编译过程中,通过使用编译器提供的编译选项(如-o3和-pm等),编译器可自动改善代码结构,减少代码中指令的相关性,通过软件流水等方法,提高指令并行性,改善循环性能,并可以优化代码的尺寸。
3.2.2 c语言程序级优化
通过使用ccs中的profile工具,对c代码进行评估,找出运算量最大的程序段,如dct、量化、运动估计等,这部分代码的优化对提高编码器性能有显著影响,我们采用了以下c程序级优化方法:
(1) 使用c6000 dsp特有的关键字和内联函数来改写c代码,如使用关键字restrict可消除数据间的相关性以提高代码并行执行能力,而使用内联函数(如_add2(),nassert())可快速优化c代码,作为直接映射为内联c6000指令的特殊函数,可提高代码在dsp中的执行效率。
(2) 使用整型访问短型数据,使用32位整型一次访问2个16位短型数据,分别存放在32位寄存器的高、低16位字段,可减少对内存的访问次数,将程序读取数据的效率提高一倍,再使用能同时对2个寄存器对应高低16位进行操作的内联函数,如add2();mpy2()等,可大大提高代码执行效率。
(3) 采用循环展开的方法,将多循环变为少循环甚至单循环
近年来,随着网络和多媒体技术的发展,视频信息通信的重要性和需求急剧增长,而其中的关键就在于视频压缩编码技术的应用。文献[1]曾提出了一种基于tms320dm642 dsp的视频编码方案,实现了h.264算法。同h.264相比,mpeg4具有软硬件开发成本低和更容易实现的优势,是目前视频编码应用的主流。本文提出了一种基于tms320dm642 dsp的mpeg4视频编码器的实现方法,该方案可用于远程视频监控、视频会议等诸多领域。
mpeg4是由国际运动图像专家组(mpeg)开发制定的国际通用视频压缩编码标准,目前已经发展成为可适应不同传输带宽、可用最少的数据来获得最佳质量图像的高效压缩算法和工具。mpeg采用了dct、量化、熵编码等算法,通过对形状、运动、纹理等信息的分析,消除图像数据在时间和空间上的相关性,具有高效压缩性及普遍适用性等独特优势,为视频信息高效存储、传输提供了方便。
mpeg4为不同的应用对应的码率、分辨率、质量和服务定义了编码器和码流的不同框架和级别,其中的简单框架提供了对矩形视频对象的编码功能。本文所实现的就是mpeg4视频编码算法的简单框架。
2 mpeg4编码器硬件平台
实现mpeg4编码器的硬件平台以tms320dm642dsp为核心,并配合以适当的外部存储器sdram,flash等外围设备。
2.1 tms320dm642特性
tms320dm642是ti为多媒体应用而开发的基于c64x内核的高性能定点数字信号处理器,时钟频率600 mhz,最高处理能力可达4 800 mips。dm642具有c6000系列dsp的公共定点指令集,增加了多媒体扩展指令,可以更加方便快速地执行图像处理中的算法。dm642的这些特点,使其非常适合于视频图像处理,是实现mpeg4视频编码器的理想硬件平台。
2.2 硬件系统结构
dm642作为整个系统的核心,对视频数据进行高速处理,完成mpeg4编码算法;可编程视频格式转换电路将输入的原始视频数据进行预处理,转换成编码器可接受的视频格式的数字信号;e2prom和flash用来固化应用程序和初始化参数,sdram作为片外存储器,在编码过程中存储待处理的视频数据,以上三者通过emif总线与dm642连接;通过jtag接口,利用ccs,可方便地实现系统软硬件仿真与调试;实时时钟为数字视频提供实时时间基准信息。
3 mpeg4编码器的软件实现和优化
3.1 mpeg4的软件实现
mpeg4是一个开放的框架标准,并没有规定具体的算法和程序,用户可根据需要自行开发代码,我们采用了xvid 1.1.0开放源码来实现mpeg4编码器。xvid代码实现了mpeg4的简单框架算法,不需要形状编码,只对i-vop和p-vop进行编码。但xvid是针对pc机应用而设计开发的,要将他移植到dsp中,必须对代码进行分析,结合dsp的指令结构和特点进行修改。
xvid代码实现的mpeg4编码器,以原始视频数据中的每一帧作为一个视频对象,首先判断是i帧还是p帧,i帧需要对整帧图像数据进行编码存储,p帧则进行运动估计和补偿,只编码当前帧与参考帧之间的图像残差和运动矢量。每帧数据都被分为16×16宏块,每个宏块又分为8×8子块,在宏块和子块的基础上进行dct、量化、vlc编码。基于不高的图像质量需求,我们减化了xvid的某些功能,如gmc(全局运动补偿)、rvlc等,减少了代码运算量,降低了复杂度。
3.2 代码优化
为提高代码执行效率,必须结合dsp的特点对代码进行优化,优化主要分为3个层次:
3.2.1 项目级优化
ti提供了功能强大的集成开发环境ccs,包含了各种高效的编译工具,在代码编译过程中,通过使用编译器提供的编译选项(如-o3和-pm等),编译器可自动改善代码结构,减少代码中指令的相关性,通过软件流水等方法,提高指令并行性,改善循环性能,并可以优化代码的尺寸。
3.2.2 c语言程序级优化
通过使用ccs中的profile工具,对c代码进行评估,找出运算量最大的程序段,如dct、量化、运动估计等,这部分代码的优化对提高编码器性能有显著影响,我们采用了以下c程序级优化方法:
(1) 使用c6000 dsp特有的关键字和内联函数来改写c代码,如使用关键字restrict可消除数据间的相关性以提高代码并行执行能力,而使用内联函数(如_add2(),nassert())可快速优化c代码,作为直接映射为内联c6000指令的特殊函数,可提高代码在dsp中的执行效率。
(2) 使用整型访问短型数据,使用32位整型一次访问2个16位短型数据,分别存放在32位寄存器的高、低16位字段,可减少对内存的访问次数,将程序读取数据的效率提高一倍,再使用能同时对2个寄存器对应高低16位进行操作的内联函数,如add2();mpy2()等,可大大提高代码执行效率。
(3) 采用循环展开的方法,将多循环变为少循环甚至单循环