主要介绍CE_DIR/examples/ti/sdo/ce/examles/servers文件夹
上一篇看了codecs的代码,了解到codecs提供了一个实现了IVIDENC接口的视频编码器。与他并行的还有一个viddec_copy文件夹里 面实现的是视频解码器。这里的servers/video_copy文件夹里面的代码,是将编码器和解码器集成在一起组成一个视频的codec server.
实际为dm6446编译的代码实际上是存在于evmDM6446文件夹下的:
j@j-desktop:/..../examples/servers/video_copy$ ls
evm2530 evm3530 evmDM6446 evmDM6467 evmOMAPL137 makefile package package.xdc
j@j-desktop:/..../examples/ti/sdo/ce/examples/servers/video_copy$ cd evmDM6446/
j@j-desktop:/..../examples/ti/sdo/ce/examples/servers/video_copy/evmDM6446$ ls
link.cmd main.c makefile video_copy.cfg video_copy.tcf
做成服务器的代码很简单,总共五个文件。这里我们还得把父目录server/video_copy中的文件package.xdc和makefile算上,总共七个文件。我们先看package.xdc,它简单的要命,只是声明了一个包:
/*!
package ti.sdo.ce.examples.servers.video_copy [1, 0, 0] {
}
然后是与它同级的makefile,它仅仅是根据目标设备的不同选不同的文件夹编译:
all:
%::
ifneq (,$(findstring OMAP2530,$(DEVICES)))
$(MAKE) -C evm2530 $@
endif
ifneq (,$(findstring OMAP3530,$(DEVICES)))
$(MAKE) -C evm3530 $@
endif
ifneq (,$(findstring DM6446,$(DEVICES)))
$(MAKE) -C evmDM6446 $@
endif
ifneq (,$(findstring DM6467,$(DEVICES)))
$(MAKE) -C evmDM6467 $@
endif
ifneq (,$(findstring OMAPL137,$(DEVICES)))
$(MAKE) -C evmOMAPL137 $@
endif
然后我们进入evmDM6446文件夹下,它的makefile控制编译流程, XDC工具使用示例 里面有讲,这里就不多讲了,接着我们看video_copy.cfg文件,这里面:
1,声明了server所需要的模块:
var osalGlobal = xdc.useModule('ti.sdo.ce.osal.Global');
osalGlobal.runtimeEnv = osalGlobal.DSPLINK_BIOS;
osalGlobal.defaultMemSegId = "DDR2";
var LogServer = xdc.useModule('ti.sdo.ce.bioslog.LogServer');
var VIDDEC_COPY =
xdc.useModule('ti.sdo.ce.examples.codecs.viddec_copy.VIDDEC_COPY');
var VIDENC_COPY =
xdc.useModule('ti.sdo.ce.examples.codecs.videnc_copy.VIDENC_COPY');
var Server = xdc.useModule('ti.sdo.ce.Server');
需要的模块包括VIDDEC_COPY和VIDENC_COPY,这两个模块是在codecs里的那两个。
还有Server模块,用于使用一个Server.然后对Server进行配置:
Server.threadAttrs.stackSize = 2048;
Server.threadAttrs.priority = Server.MINPRI;
Server.algs = [
{
name: "viddec_copy", // 解码器的C语言明子。
mod: VIDDEC_COPY, // 上面定义的var VIDDEC_COPY模块
threadAttrs: {
stackMemId: 0, // 任务栈的ID
priority: Server.MINPRI + 1 // 任务优先级
},
groupId : 0, //组ID
},
{
name: "videnc_copy", //下同理
mod: VIDENC_COPY,
threadAttrs: {
stackMemId: 0,
priority: Server.MINPRI + 1
},
groupId : 0,
},
];
另外还有一些其他的东西配制,这里不说了。只在知道,这里包含了codecs里面的两个自建的模块和Server模块就可以了。
然后是main.c里面只有一个main函数:
Void main(Int argc, Char *argv[])
{
/* init Codec Engine */
CERuntime_init(); //这句初始化Codec Engine.下面的语句都没有太大意思,是用于代码trace的。
/* init trace */
GT_init();
/* create a mask to allow a trace-print welcome message below */
GT_create(>Mask, "servers.video_copy.evmDM6446");
/* ...and initialize all masks in this module to "on" */
GT_set("servers.video_copy.evmDM6446=01234567");
GT_0trace(gtMask, GT_4CLASS, "main> Welcome to DSP server's main().\n");
}
也就是说main.c只要一句CERuntime_init就可以了。这就使所含了两个codecs算法的server跑起来了。
link.cmd是空,我们知道,它应该是在configuro运行时产生的,不知为什么make clean没去掉。
好了,server也说完了。下篇说app.