codec engine代码阅读五---CE_DIR/examples/ti/sdo/ce/examles/servers/video_copy(转)

http://www.usr.cc/thread-52044-1-1.html

主要介绍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(&gtMask, "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.

你可能感兴趣的:(codec engine代码阅读五---CE_DIR/examples/ti/sdo/ce/examles/servers/video_copy(转))