Codec Engine主要有两部分:
ARM端应用适配层,提供了精简的API和对应的库给应用层使用。
DSP的算法调用层,提供了DSP算法的接口封装规范,是的所有的算法通过简单的配置就可以编译到DSP的可执行程序中。
也就是说,在TI的这套框架中只用通过Codec Engine,ARM和DSP才能进行交互并协同工作。那么Codec Engine是如何工作的呢?
Codec Engine工作流程&原理:
参照达芬奇软件结构框图(下图),可以大致地了解Codec Engine工作流程:
首先,ARM应用程序调用Codec Engine的VISA (Video, Image, Speech, Audio)API,VIDENC_process(a, b, c )。Codec Engine的stub (ARM侧)会把参数a, b, c以及要调用DSP侧process这个信息打包。然后通过消息队列(message queue)传递到DSP。Codec Engine的skeleton(DSP侧)会解开这个参数包,把参数a, b, c转换成DSP侧对应的参数x, y, z(比如ARM侧传递的是虚拟地址,而DSP只能认物理地址),DSP侧的server(优先级较低,负责和ARM通信的任务)会根据process这一信息创建一个DSP侧的process(x, y, x)任务最终实现VIDENC_process(a, b, c)的操作。
应用工程师通过调用Codec Engine的API来调用和运行符合xDAIS的算法,在Davinci软件中,符合 xDAIS的音视频编解码算法(即xDM算法)的调用是通过Codec Engine的VISA API完成的。Codec Engine通过这套API为算法的执行提供了一个标准的软件架构和接口,体现在以下几个方面:
1. 通过Codec Engine API调用的算法可以运行在本地(ARM侧)或者远端(DSP侧);
2. Codec Engine可以基于ARM+DSP、DSP或ARM上运行;
3. 无论Codec Engine运行在ARM还是DSP上,对应的Codec Engine API都是完全一致的;
4. Codec Engine的API与操作系统无关。比如Linux、VxWorks和WinCE环境下的Codec Engine API都是完全一致的。
Codec Engine是介于应用程序和具体算法之间的软件模块,其中的VISA API通过stub和skeleton访问Engine SPI最终调用具体的算法。因此,Codec Engine的工作是通过完成VISA API的任务来体现的。VISA API分为四部分VISA create/control/process/delete,我们以codec算法运行在DSP为例,通过VISA API的执行过程了解Codec Engine的工作原理。
在调用VISA API之前需要在应用程序中通过Engine_open()这个Engine API把DSP的可执行程序加载到DSP的memory,同时把DSP从复位状态释放,这时DSP开始运行DSP Server的初始化程序在DSP侧创建一个优先级最低的任务RMS(Remote Management Server),RMS负责管理和维护对应到具体codec算法的Instances。如图3所示,应用程序调用VISA create API,相应的VISA create函数到Engine SPI中的Codec table中查到这个codec运行在远端DSP侧。
接着Engine SPI通过OSAL(Operating System Abstraction Layer)、DSP Link把VISA create的命令传到DSP侧的RMS。RMS通过DSP侧Engine SPI的codec table找到要调用的codec算法后,就会在RMS中创建一个相应的Instance(即一个DSP/BIOS系统中的任务)。VISA create会返回一个Instance的Handle,以便于给这个Instance做后续的VISA control/process/delete提供信息。VISA delete和VISA create原理类似,只是RMS删除掉相应的codec算法的Instance和执行codec算法的任务。
(VISA create/delete ↑)
概括来说,VISA control用来动态的修改codec instance的属性,VISA process用来对算法的输入数据流做处理并返回一个输出数据流。应用程序在调用VISA process/control时会通过xDM Stub把传递给codec算法的参数收集起来,并且转换成DSP可以识别的物理地址。Stub把这些参数和相关的命令通过Engine SPI、OSAL和DSP Link传递到DSP侧的Instance。Instance再通过Skeleton把传递过来的参数和命令解析出来,通过DSP侧VISA control/process对codec算法执行control/process。
(VISA contrlo/process ↑)
接触ARM+DSP架构和DVSDK这套框架也就短短不到半年时间,学习嵌入式也没有多长时间,学习起来也很吃力,但好在别人的帮助下完成了DM6467上的相关工作,对这套框架也有了一点点理解。
了解以上DVSDK中Codec Engine工作流程和原理后,就基本可以开始进行开发了。开发时首先要对算法进行开发,算法要符合xdais标准。DVSDK中有一个gencodecpkg工具,可以帮助生成算法包和代码的框架(这套框架是基于xDM的,是基于xdais上轻量级,更宽泛的框架,底层依然沿用的xdais)。完成算法的开发后,DVSDK中还有一个genserver工具帮助生成server包,基本框架和默认配置也都帮忙弄好了。根据自己的需要修改或添加配置就可以。包含了相应的算法后就可编译生成可在DSP端可运行的二进制文件。最后编写ARM端调用的应用程序。
参考资料:
《帮您快速入门TI的Codec Engine》
作者:德州仪器半导体技术(上海)有限公司 通用DSP 技术应用工程师 崔晶
《如何搭建达芬奇的DSP SERVER》
作者:德州仪器半导体技术(上海)有限公司 通用DSP 技术应用工程师 崔晶
理解有限,如有错误请指正!
条例不清晰不明白处,请指出以便修改!
本文图片和大部分讲解版权非本人所有!如有侵权请联系我!