http://www.usr.cc/thread-52045-1-1.html
里面两个.c文件,一个.cfg文件,两个package.*文件是讨论的重点。
as always,let's have a look at package.xdc, whose content is as the following:
这里的内容也是只是声明了一个包,其他的什么也没有。然后是package.bld.这里面也没什么内容:
只是提到使用了PackageContents模块,包含两个文件makefile和in.dat.
然后我们来看这里真正的主角ceapp.cfg:
有了上述内容,我们就可以使用服务器中的引擎了,然后我们看看app的代码是干什么的,ceapp.c:
为不致于太长,楼下继续.
这里先对ceapp.c中的代码进行一下总结:
它里面的代码是为app.c调用服务的.里面的函数有这么几个:
ceapp_init()//这是使用引擎的第一步,初始化引擎
ceapp_allocContigBuf 开辟缓冲区,第二步,开辟缓冲区,然后app.c会打开文件,把文件内容一部分一部分地放入缓冲区
ceapp_validateBufSizes验证缓冲区大小时否正确
ceapp_encodeBuf 对缓冲区的内容进行编码
ceapp_decodeBuf 对缓冲区的内容进行解码
ceapp_freeContigBuf 释放缓冲区
ceapp_exit() 关闭引擎
这些函数里面的实现常常会调用IVIDENC,IVIDDEC接口的中的函数.
而这些函数的实现对应都是在codecs中实现的.
下面说app.c了:
简化后的main函数为:
main函数调用encodeDecodeFile来编解码,简化后的encodeDecodeFile函数为:
本篇说完总的工作流程就差不多了解了,接下来将会结合文档,说具体代码细节,并做一些示例程序.
这一篇来看应用,针对于dm6446的apps代码在:apps/video_copy/dualcpu/evmDM6446下面:
apps/video_copy/dualcpu/evmDM6446$ ls
app.c ceapp.c ceapp.cfg in.dat makefile package package.bld package.xdc
里面两个.c文件,一个.cfg文件,两个package.*文件是讨论的重点。
as always,let's have a look at package.xdc, whose content is as the following:
/*!
* ======== package.xdc ========
* Codec Engine build support package for the video_copy example.
*
* This package simply provides a makefile which builds each application.
*/
package ti.sdo.ce.examples.apps.video_copy.dualcpu.evmDM6446 [1, 0, 0] {
}
这里的内容也是只是声明了一个包,其他的什么也没有。然后是package.bld.这里面也没什么内容:
var Pkg = xdc.useModule('xdc.bld.PackageContents');
/* when constructing a release, release everything */
Pkg.attrs.exportAll = true;
Pkg.otherFiles = [
"makefile",
"in.dat",
];
只是提到使用了PackageContents模块,包含两个文件makefile和in.dat.
然后我们来看这里真正的主角ceapp.cfg:
/* use the tracing utility module 使用代码追踪工具模块*/
var TraceUtil = xdc.useModule('ti.sdo.ce.utils.trace.TraceUtil');
//TraceUtil.attrs = TraceUtil.SOCRATES_TRACING;
/* use and configure the osal. 使用并配置osal */
var osalGlobal = xdc.useModule('ti.sdo.ce.osal.Global');
osalGlobal.runtimeEnv = osalGlobal.DSPLINK_LINUX;
/*
* ======== Engine Configuration CE配置========
*/
var Engine = xdc.useModule('ti.sdo.ce.Engine');// 使用engine模块。
var myEngine = Engine.createFromServer( //从 服务器创建引擎
"video_copy", // Engine name (as referred to in the C app)// 指定引擎的名字
"./video_copy.x64P", // path to server exe, relative to its package dir// 服务器可执行文件的位置
"ti.sdo.ce.examples.servers.video_copy.evmDM6446" // server package 服务器包名
);
有了上述内容,我们就可以使用服务器中的引擎了,然后我们看看app的代码是干什么的,ceapp.c:
int ceapp_init()
{
int status = -1; /* nonzero means failure */
/* initialize Codec Engine runtime first 初始化CE runtime*/
CERuntime_init();
/* reset, load, and start DSP Engine 复位,加载,启动DSP引擎*/
if ((ceHandle = Engine_open(engineName, NULL, NULL)) == NULL) {
printf("CEapp-> ERROR: can't open engine %s\n", engineName);
goto init_end;
}
/* activate DSP trace collection thread */
TraceUtil_start(engineName);
/* allocate and initialize video encoder on the engine 在引擎上开辟并初始化视频编译器 */
encHandle = VIDENC_create(ceHandle, encoderName, NULL);
if (encHandle == NULL) {
printf("CEapp-> ERROR: can't open codec %s\n", encoderName);
goto init_end;
}
/* allocate and initialize video decoder on the engine 在引擎上开辟并初始化视频解码器 */
decHandle = VIDDEC_create(ceHandle, decoderName, NULL);
if (decHandle == NULL) {
printf("CEapp-> ERROR: can't open codec %s\n", decoderName);
goto init_end;
}
status = 0; /* success */
init_end:
return status;
}
为不致于太长,楼下继续.
这里先对ceapp.c中的代码进行一下总结:
它里面的代码是为app.c调用服务的.里面的函数有这么几个:
ceapp_init()//这是使用引擎的第一步,初始化引擎
ceapp_allocContigBuf 开辟缓冲区,第二步,开辟缓冲区,然后app.c会打开文件,把文件内容一部分一部分地放入缓冲区
ceapp_validateBufSizes验证缓冲区大小时否正确
ceapp_encodeBuf 对缓冲区的内容进行编码
ceapp_decodeBuf 对缓冲区的内容进行解码
ceapp_freeContigBuf 释放缓冲区
ceapp_exit() 关闭引擎
这些函数里面的实现常常会调用IVIDENC,IVIDDEC接口的中的函数.
而这些函数的实现对应都是在codecs中实现的.
下面说app.c了:
简化后的main函数为:
int main(int argc, char *argv[])
{
char *inFileName, *outFileName;
inFileName = "in.dat";
outFileName = "out.dat";
createInFileIfMissing(inFileName);
encodeDecodeFile(inFileName, outFileName)
return 0;
}
main函数调用encodeDecodeFile来编解码,简化后的encodeDecodeFile函数为:
static int encodeDecodeFile(char *inFileName, char *outFileName)
{
inFile = fopen(inFileName, "rb")) ;
//打开两个文件,一个用于输入,一个用于输出
outFile = fopen(outFileName, "wb")) ;
ceapp_init();
//初始化引擎
inBuf = ceapp_allocContigBuf(INFRAMESIZE, "input data");
//开辟输出缓冲区
encodedBuf = ceapp_allocContigBuf(ENCODEDFRAMESIZE, "encoded data");
//开辟编解缓冲区
outBuf = ceapp_allocContigBuf(OUTFRAMESIZE, "output data");
//开辟输出缓冲区
status = ceapp_validateBufSizes(INFRAMESIZE, ENCODEDFRAMESIZE,
//验证编码缓冲区大小是否正常
for (n = 0 ;; n++) {
//for loop,不停地.....
(fread(inBuf, INFRAMESIZE, 1, inFile) == 0) {
//从输入文件读数据到输入缓冲区
status = ceapp_encodeBuf(inBuf, INFRAMESIZE,
encodedBuf, ENCODEDFRAMESIZE);
//将输入缓冲区数据编码后放入编码缓冲区
status = ceapp_decodeBuf(encodedBuf, ENCODEDFRAMESIZE,
outBuf, OUTFRAMESIZE);
//从编码缓冲区中解码,放入输出缓冲区
fwrite(outBuf, OUTFRAMESIZE, 1, outFile);
//从输出缓冲区写入输出文件
fclose(inFile);
//关闭文件
fclose(outFile);
ceapp_freeContigBuf(inBuf, INFRAMESIZE);
//释放各种缓冲区
ceapp_freeContigBuf(encodedBuf, ENCODEDFRAMESIZE);
ceapp_freeContigBuf(outBuf, OUTFRAMESIZE);
ceapp_exit();
//退出引擎
return status;
//返回
}
本篇说完总的工作流程就差不多了解了,接下来将会结合文档,说具体代码细节,并做一些示例程序.