codec engine代码阅读五---CE_DIR/examples/ti/sdo/ce/examles/servers/video_copy下的文件

来源:互联网 发布:a算法八数码问题 编辑:程序博客网 时间:2024/05/25 13:33

[转载] http://blog.csdn.net/chenbang110/article/details/8770060


      上一篇看了codecs/videnc_copy的代码,了解到codecs提供了一个实现了IVIDENC接口的视频编码器。与他并行的还有一个viddec_copy文件夹里面实现的视频解码器。

     这一篇要说的servers/video_copy文件夹里面的代码,是将编码器和解码器集成在一起组成一个视频的codec server。


CE_DIR/examples/ti/sdo/ce/examles/servers/video_copy下的文件


为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 (,$(findstringOMAP2530,$(DEVICES)))
       $(MAKE) -C evm2530 $@
endif
ifneq (,$(findstringOMAP3530,$(DEVICES)))
       $(MAKE) -C evm3530 $@
endif
ifneq (,$(findstringDM6446,$(DEVICES)))
       $(MAKE) -C evmDM6446 $@
endif
ifneq (,$(findstringDM6467,$(DEVICES)))
       $(MAKE) -C evmDM6467 $@
endif
ifneq (,$(findstringOMAPL137,$(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.

0 0
原创粉丝点击