APP下载

BSAC音频编码器在TI DaVinci平台上的实现

2012-03-15兰,吕卫,宋

电视技术 2012年15期
关键词:配置文件编码器实例

徐 兰,吕 卫,宋 垣

(天津大学电视与图像信息研究所,天津300072)

随着数字化移动终端的日益普及以及地面数字多媒体广播标准的广泛应用,BSAC(Bit-Sliced Arithmetic Coding,比特分片算术编码)成为目前最流行的的音频压缩标准之一。BSAC采用了精细粒度可分级技术,适合运用在非平稳通信信道或多播环境中传输实时音频流,为了使其优势得到较好实现,且出于对开发时间的考虑,本文选择TI DaVinci(达芬奇)平台。

为了使BSAC能够在DaVinci平台上实现,必须使其符合xDM接口标准,这也是本文的研究重点,本文还对BSAC音频压缩编码在DM6446平台上的应用程序进行了开发。

1 BSAC编码概述

MPEG-4 BSAC是在AAC基础上发展而来的,保留了AAC编码中引入的心理声学模型、尺度因子编码,用算术编码代替了AAC的Huffman编码,同时改变了码率的分级系数和量化的频谱成分,并提供差错复原技术,从而极大改善了在易出错信道上传输的音频信号质量。AAC可分级性允许的典型步长为16 kbit/s,而BSAC能使每个音频频道以1 kbit/s的步长从16 kbit/s变化到64 kbit/s,实现码率的可分级,立体声以步长2 kbit/s实现分级[1]。通常情况下,噪声和多径传播会引起信道容量的减少,进而影响移动通信网络和数字广播系统的性能,BSAC的精细粒度可分级技术可以对动态自适应纠错编码提供支持,因此能够有效抑制移动通信网络和数字广播系统性能的降低。

2 xDAIS和xDM算法接口标准

TI公司开发的标准xDAIS(eXpressDSP Algorithm Interface Standard)使通过组件构建复杂系统的过程变得更加快捷和可靠,也使编解码算法的改进和移植更加方便[2]。所有xDAIS标准的算法必须实现IALG接口[3],IALG接口函数的调用顺序如图1所示。xDM(eXpressDSP Digital Media Standard)是在xDAIS基础上增加了一些双核通信的协议,从而适合DaVinci技术应用的开发,xDM比xDAIS增加了两个扩展函数process()和control()。

图1 IALG接口函数的调用顺序

3 DaVinci软件架构

DaVinci的软件架构能够使片上系统的硬件和软件无缝地组合起来,它规定了应用程序和算法库之间统一、标准的API接口,从而大大缩短了系统研究与开发的时间。DaVinci软件架构如图2所示。用户层进行Linux应用程序的开发,通过EPSI(Easy Peripheral Software Interface,外围软件接口)API来访问和操作I/O及控制各种外设,通过Codec Engine(编解码引擎)提供的VISA(Video,Image,Speech,Audio)API来调用DSP侧兼容xDM标准的音视频编码器算法[4]。

图2 DaVinci软件架构

4 BSAC音频编码器实现

4.1 编码器开发流程

TMS320DM6446是采用双核架构(DSP+ARM)的SoC芯片,通过Codec Engine和Codec Server(编解码服务器)来管理ARM和DSP的协同工作。DSP端通过DSP/BIOS运行高性能的BSAC音频编码,ARM端通过Monta Vista Linux操作系统实现对外设的管理以及音频的采集和处理。

BSAC编码器的开发流程如图3所示。首先在DSP集成开发环境CCS3.3工程下将BSAC编码器按xDM标准进行封装,生成编码库文件bsacenc.l64P,加上配置文件(.xs.xdc package.bld)生成能够被Codec Engine配置套件所用的Codec包(ti.sdo.codecs.bsacenc),然后配置DSP的操作系统DSP/BIOS,以及通过XDC工具配置其他组件,生成DSP端的可执行代码(Codec Server),最后ARM端通过Codec Engine的VISA API接口函数调用符合xDM标准的BSAC编码算法。

图3 BSAC编码器开发流程

4.2 Codec包封装

4.2.1 BSAC算法的xDM封装

将BSAC编码器构建成符合xDM标准的算法,IALG接口函数中的 algNumAlloc(),algActivate(),algControl(),algDeactivate()可不完成任何处理,为了减少函数的调用,节省代码空间,本文设计的BSAC编码器将上述函数指针置为NULL。BSAC算法实例接口函数IBSACENC_Fxns如图4所示。IBSACENC_Fxns结构体的第一个成员表示模块BSACENC的地址,用来标明具体模块实例;BSACENC_TI_alloc()表示BSAC编码器申请的内存资源,本文申请了3块内存空间,分别用来存储BSAC算法实例对象,采集的原始音频数据,编码后的输出码流;BSACENC_TI_init()初始化BSAC算法实例对象,只有该函数成功返回后,算法实例才能开始处理数据;BSACENC_TI_Moved()允许移动BSAC算法实例对象,重新定位存储器资源;BSACENC_TI_process()实现将输入的PCM数据进行BSAC编码,并输出编码后的码流及帧长;BSACENC_TI_control()实现对BSAC音频编码器参数(如比特率、采样率、通道模式、量化位数等)的设置及BSAC算法状态信息的查询;BSACENC_TI_free()释放BSACENC_TI_alloc()申请的内存空间。

图4 BSAC算法实例接口函数

4.2.2 Codec包创建

为了使兼容xDM标准的BSAC音频编码算法能够被编解码引擎调用,须将该算法打包生成1个Codec,即“包”。1个包对应1个目录,目录中包含了1个独立组件需要的所有文件以及相关的元数据。

本文使用TI RTSC(实时系统组件)编解码器包向导来创建BSAC Codec包,首先下载安装必要组件(ceutils(Codec Engine工具),cg_xml(代码生成工具)),设置XDCPATH(具体方法如下所示),然后在xdc工具安装路径下执行./xs ti.sdo.codecutils.genpackage-g,生成codec包所需的5个配置的文件:1)package.xdc定义的BSAC codec包的名称为ti.sdo.codecs.bsacenc,包含了1个算法模块BSACENC;2)package.xs定义了BSAC Codec包所需要的库文件名称(lib="lib/bsacenc.l64P");3)package.bld定义了build相关的属性;4)BSACENC.xdc声明和定义了模块BSACENC,该文件名必须和package.xdc文件中定义的模块名称(BSACENC)一致;5)BSACENC.xs实现了BSACENC.xdc中声明的方法。具体代码为:

export XDCPATH="/home/user/dvsdk_2_00_00_22/codec_engine_2_23_01/packages;

/home/user/dvsdk_2_00_00_22/xdais_6_23/packages;/home/user/dvsdk_2_00_00_22/ceutils_1_06/packages"

4.3 Codec Server创建

在将BSAC编码器打包成Codec后,为了支持Codec Engine调用运行在DSP上的音频编码算法,必须生成一个DSP端的可执行代码Codec Server(bsacenc.x64P),该服务器结合了Codecs,Framework组件和系统代码。为了生成 Codec Server,需要一些配置文件如.tcf,.cfg,main()等。Tconf脚本语言的配置文件bsacenc.tcf配置了DSP/BIOS,它分配了数据和代码段的存储空间、使能任务管理器和动态分配堆,创建和初始化其他DSP/BIOS数据对象等。main()用来初始化Codec Engine。通过XDC配置其余组件(如框架组件、DSP/BIOS Link、Codec Engine),BSAC Server配置文件(bsacenc.cfg)部分代码如下所示,它定义了 Server的模块属性,获得编码模块BSACENC,说明Codec Server中可用的算法bsacenc。具体代码为:

4.4 ARM端BSAC应用程序创建

ARM端的应用程序主要是完成Codec Engine的配置及BSAC编码器的多线程设计。Codec Engine的配置文件是通过*.cfg文件存储的,本文的BSAC编码器引擎配置文件部分代码如下所示,它定义了引擎的名字,设置了全局模块来使配置文件生效,设置引擎的运行环境和与Codec Server相对应的名称。BSAC应用程序的Linux多线程程序设计主要包括原始音频信号的采集,音频信号的压缩编码,最后编码后的码流存到本地磁盘用于解码输出。具体代码为:

5 测试结果与分析

BSAC编码器在封装的过程中,进行了一些优化操作,如浮点运算转换为定点运算、结构的优化、将使用频繁的变量直接存储到DSP的L1DSRAM中等,这样可大大降低DSP的占用率且提高编码算法的稳定性。实验表明,经代码优化后,DSP的占用率从36%减少到18%,大大节约了DSP资源,为同时执行多种编码器提供了可能。本文的BSAC编码器能够支持多种采样率(48 kHz,44.1 kHz,24 kHz),量化精度能实现8位或16位,并且能够压制出不超过96 kbit/s码率的码流。经反复测试,编码器稳定性能相对较好,编码速度快,能够达到音频编码的实时要求,且压缩后的码流经解码器还原的声音从主观感觉上无法分辨与原始音频的差别。

6 结束语

针对达芬奇平台双核架构的特点,本文采用TMS320DM6446实现了BSAC音频编码器的设计,与传统的方法相比,大大缩短了开发时间。本文介绍了xDM算法接口标准及DaVinci的软件架构,成功地将BSAC算法按照xDM接口标准进行了封装,并且在TMS320DM6446的DSP上实现,在ARM端开发的BSAC音频编码应用程序可根据用户需求,自行设置不同的采样率及码率,编码性能均较好。

[1]ISO/IEC JTC1/SC29/WG11.Information technology-coding of audiovisual objects Part3:Audio[S].2001.

[2]赵勇.DAVINCI技术原理与应用指南[M].南京:东南大学出版社,2008.

[3]刘书洋,李凤亭.基于DSP平台的AVS实时编码系统设计[J].电视技术,2009,33(S1):60-64.

[4]张起贵.最新DSP技术:“达芬奇”系统、框架和组件[M].北京:国防工业出版社,2009.

猜你喜欢

配置文件编码器实例
互不干涉混用Chromium Edge
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
基于FPGA的同步机轴角编码器
基于双增量码道的绝对式编码器设计
为View桌面准备父虚拟机
JESD204B接口协议中的8B10B编码器设计
完形填空Ⅱ
完形填空Ⅰ
多总线式光电编码器的设计与应用