达芬奇工具链的建立(工程编译步骤DM6446)

工具链是指的Linux下对程序的编译环境。在这里通过codec_engine_1_02/examples/codecs 下的videnc_copy工程封装CCS下调试好的程序并生成videnc_copy.a64P,再通过codec_engine_1_02/examples/servers/video_copy工程把videnc_copy.a64P封装成all.x64P。最后通过encodedecode工程调用all.x64P

 

步骤如下:

1、把ccs下编写好的文件复制到Linux codec_engine_1_02/examples/codecs 下的videnc_copy工程中。

2、修改该工程中的package.bld文件,修改var SRCS = ["videnc_copy","blob","cornerdetection","him","imc","morph","objectrecognition"]; 中括号里只选择工程下的C文件。修改该文件中的

for (var i = 0; i <1 /*Build.targets.length*/; i++) { 选择DSP端只用cgtool来编译。

3、修改codec_engine_1_02/examples下的user.bld,linux86注掉,选择用C64P,跟第二步中对应。

<!--[if !supportLists]--><!--[endif]--><!--[endif]-->

 

Build.targets = [

//    Linux86,

C64P,

MVArm9

4、修改DSP算法占用的空间

 

修改server/all.tcf

 

    var mem_ext = [

 

{

 

    comment:    "DDRALGHEAP: off-chip memory for dynamic algmem allocation",

 

    name:       "DDRALGHEAP",

 

    base:       0x88000000,   // 128MB

 

    len:        0x07A00000,   // 122MB

 

    space:      "code/data"

 

},

 

{

 

    comment:    "DDR: off-chip memory for application code and data",

 

    name:       "DDR",

 

    base:       0x8FA00000,   // 250MB

 

    len:        0x00400000,   //   4MB

 

    space:      "code/data"

 

},

 

{

 

    comment:    "DSPLINK: off-chip memory reserved for DSPLINK code and data",

 

    name:       "DSPLINKMEM",

 

    base:       0x8FE00000,   // 254MB

 

    len:        0x00100000,   //   1MB

 

    space:      "code/data"

 

},

 

{

 

    comment:    "RESET_VECTOR: off-chip memory for the reset vector table",

 

    name:       "RESET_VECTOR",

 

    base:       0x8FF00000,

 

    len:        0x00000080,

 

    space:      "code/data"

 

},

 

];

 

修改为:

 

var mem_ext = [

 

{

 

    comment:    "DDRALGHEAP: off-chip memory for dynamic algmem allocation",

 

    name:       "DDRALGHEAP",

 

    base:       0x88000000,   // 128MB

 

    len:        0x07400000,   // 122MB

 

    space:      "code/data"

 

},

 

{

 

    comment:    "DDR: off-chip memory for application code and data",

 

    name:       "DDR",

 

    base:       0x8F400000,   // 250MB

 

    len:        0x00A00000,   //   4MB

 

    space:      "code/data"

 

},

 

{

 

    comment:    "DSPLINK: off-chip memory reserved for DSPLINK code and data",

 

    name:       "DSPLINKMEM",

 

    base:       0x8FE00000,   // 254MB

 

    len:        0x00100000,   //   1MB

 

    space:      "code/data"

 

},

 

{

 

    comment:    "RESET_VECTOR: off-chip memory for the reset vector table",

 

    name:       "RESET_VECTOR",

 

    base:       0x8FF00000,

 

    len:        0x00000080,

 

    space:      "code/data"

 

},

 

];

 5、修改loadmodules.sh

insmod dsplinkk.ko ddr_start=0x8f400000 ddr_size=0xA00000

6、在编译codec_engine_1_02/examples/codecs/videnc_copy之前,要修改算法的主程序main函数

 

void ObjectRecognition(unsigned char* inbuf, int* flag,unsigned char* outbuf, int* kind, float *inIM)。其中输入输出参数是由

 

XDAS_Int32 VIDENCCOPY_TI_process(IVIDENC_Handle h, XDM_BufDesc *inBufs,XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs)决定。由于输入输出参数由IVIDENC_InArgsIVIDENC_OutArgs结构体来决定,所以为了增加输出输入参数,应该修改这两个结构体。为此修改xdais_5_00/packages/ti/xdais/dm中的ividdec.h文件。添加kindIM[25]

 

typedef struct IVIDENC_OutArgs {

 

XDAS_Int32 size;                                          XDAS_Int32 extendedError;

 

XDAS_Int32 bytesGenerated;   

 

XDAS_Int32 encodedFrameType; 

 

XDAS_Int32 inputFrameSkip;

 

XDAS_Int32 kind;               /*what's kind of the target*/

 

 float  IM[25];                     /*return value*/

 

    IVIDEO_BufDesc reconBufs;   /**< Reconstruction Frames. */

 

} IVIDENC_OutArgs;

 

为了区分输入帧存的性质(从jpeg读取的数据还是ccd采集的数据)增加一个flag作为标志。

 

typedef struct IVIDENC_InArgs {

 

    XDAS_Int32 size;          

 

    XDAS_Int32 flag;//is picture saved on U or captured from CCD

 } IVIDENC_InArgs;

7、在videnc_copy中调用算法:在VIDENCCOPY_TI_process函数中添加:ObjectRecognition(inBufs->bufs[curBuf],&(inArgs->flag),outBufs->bufs[curBuf],&(outArgs->kind),(outArgs->IM));

由于使用了#ifdef USE_ACPY3 宏,故而要选择是否使用DMA,为了避免CacheDMA的冲突,选择不使用DMA。修改codec_engine_1_02/examples/servers/video_copy下的video_copy.cfg文件关闭DMA

/* we can use DMA in certain codecs! */

VIDENC_COPY.useDMA = false;

8、编译videnc_copy生成videnc_copy.a64P

9、修改server,编译生成all.x64P

10、下面就是编译encodedecode调用all.x64P

 •首先修改Encodedecode下的Makefile文件,让encodedecode包含servercodec工程。XDC_PATH = $(CODEC_INSTALL_DIR)/packages;$(CE_INSTALL_DIR)/examples;

$(CE_INSTALL_DIR)/packages;$(LINK_INSTALL_DIR)/packages;

$(XDAIS_INSTALL_DIR)/packages;$(CMEM_INSTALL_DIR)/packages

其次为了使用新的算法videnc_copy,要修改encodedecode.cfg文件把H264算法替换为videnc_copy算法:

//var H264ENC =xdc.useModule('ti.sdo.codecs.h264enc.H264ENC');

//var H264DEC = xdc.useModule('ti.sdo.codecs.h264dec.H264DEC');

var VIDDEC_COPY = xdc.useModule('codecs.viddec_copy.VIDDEC_COPY');

var VIDENC_COPY = xdc.useModule('codecs.videnc_copy.VIDENC_COPY');

/* *  ======== Engine Configuration ======== */

var Engine = xdc.useModule('ti.sdo.ce.Engine');

/*var vcr = Engine.create("loopback", [

    {name: "h264enc", mod: H264ENC, local: false},

    {name: "h264dec", mod: H264DEC, local: false},

]);*/

var demoEngine = Engine.create("encodedecode", [

    {name: "videnc_copy", mod: VIDENC_COPY, local: false}, 

    {name: "viddec_copy", mod: VIDDEC_COPY, local: false}

]);

//vcr.server = "./loopbackCombo.x64P";

demoEngine.server = "./all.x64P";<!--[if !supportLists]-->

•修改encodedecode工程中创建算法函数

 

static String decoderName  = "viddec_copy";

 

static String encoderName  = "videnc_copy";

 

static String engineName   = "video_copy";

 

hDecode = VIDDEC_create(hEngine, decoderName, &params);

 

hEncode = VIDENC_create(hEngine, encoderName, &params);

 

在工程里用到的是hEncode

 

修改status = VIDENC_process(hEncode, &inBufDesc,&outBufDesc,&inArgs, &outArgs);<!--[endif]-->的输入输出参数,使之符合封装算法是的函数参数。

你可能感兴趣的:(达芬奇工具链的建立(工程编译步骤DM6446))