目前,我们在开拓的嵌入式视觉系统中,考虑移植TI官方供应的C6Accel视觉库。C6Accel是一个包括许多旗子暗记处理和数学打算的算法包,它供应了一系列API,可以供ARM端程序调用。C6Accel符合TI的xDAIS算法标准,可以很随意马虎地通过Codec Engine来调用并快速实行。我们可以利用C6Accel来加速干系运用程序的开拓,也可以添加自定义的DSP算法来扩展C6Accel。
C6Accel紧张包含3种类型的库文件,如下图所示:
详细移植步骤:

1、下载准备
首先,要下载两个软件包:c6accel_1_01_00_00_Linux-x86_Setup.bin和C6acceldm6467.tar.gz。下载地址分别为:
http://software-dl.ti.com/dsps/dsps_public_sw/c6000/web/c6accel/latest/index_FDS.html
http://processors.wiki.ti.com/index.php?title=Using_C6Accel_on_DM6467_with_DVSDK_3.x
创建一个新的文件夹,后面的所有操作都在该文件夹下进行。我们这里选择的路径为/opt/ti/dvsdk_3_10_00_19_c6accel_example。路径最好一样,要不然后面在打补丁的时候会有麻烦。
将原DVSDK安装目录下的/examples、/dvsdk_demos_3_10_00_16/data、/cs2dm6467_1_00_00_10和/dvsdk_demos_3_10_00_16/packages复制到当前目录下。将c6accel_1_01_00_00和C6acceldm6467.tar.gz也解压到当前目录。
2、修正环境变量
接下来,须要修正一些环境变量,这些都包含在Rules.make文件中。修正过后的Rules.make文件如下所示
DVSDK_INSTALL_DIR=/opt/dvsdk/dvsdk_3_10_00_19
DVSDK_NEW_DEMO_INSTALL_DIR=/opt/ti/dvsdk_3_10_00_19_c6accel_example
C6ACCEL_INSTALL_DIR=$(DVSDK_NEW_DEMO_INSTALL_DIR)/c6accel_1_01_00_00
DVEVM_INSTALL_DIR=$(DVSDK_INSTALL_DIR)
BIOS_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/bios_5_41_00_06
BIOSUTILS_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/biosutils_1_02_02
CE_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/codec_engine_2_25_05_16
LINK_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/dsplink_linux_1_64
ifeq ($(PLATFORM),dm6467)
CODEC_INSTALL_DIR=$(DVSDK_NEW_DEMO_INSTALL_DIR)/cs2dm6467_1_00_00_10
endif
DMAI_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/dmai_2_10_00_12
DEMO_INSTALL_DIR=$(DVSDK_NEW_DEMO_INSTALL_DIR)/dvsdk_demos_3_10_00_16
DVTB_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/dvtb_4_20_10
EDMA3_LLD_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/edma3_lld_01_11_00_03
FC_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/framework_components_2_25_02_06
LINUXUTILS_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/linuxutils_2_25_04_10
CMEM_INSTALL_DIR=$(LINUXUTILS_INSTALL_DIR)
XDAIS_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/xdais_6_25_02_11
XDC_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/xdctools_3_16_01_27
CODEGEN_INSTALL_DIR=/opt/ti/C6000CGT7.3.5
LINUXKERNEL_INSTALL_DIR=/home/tirvideo/lyb/kernel/dm6467
LINUXLIBS_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/linuxlibs-2009.11-armv5te
CSTOOL_DIR=/opt/arm-2009q1
CSTOOL_PREFIX=$(CSTOOL_DIR)/bin/arm-none-linux-gnueabi-
MVTOOL_DIR=$(CSTOOL_DIR)
MVTOOL_PREFIX=$(CSTOOL_PREFIX)
EXEC_DIR=/home/tirvideo/lyb/armfs/opt/dvsdk/c6accel
EXEC_DIR_C6ACCEL = $(EXEC_DIR)/c6accel_app
3、添加C6Accel到DM6467 DVSDK
C6acceldm6467.tar.gz软件包供应了patch功能,自动对C6Accel安装目录下的许多文件进行修正,免去了不少人工修正的花费。要利用其patch功能,只须要在当前目录下实行命令:
patch -p1 < dm6467_patch/dm6467_c6accel.patch
接下来,须要编译C6Accel,编译的命令如下所示。编译完成之后,在之前Rules.make中指定的install路径/home/tirvideo/lyb/armfs/opt/dvsdk/c6accel中会涌现编译好的运用程序以及codec server和loadmodule.sh等文件。
~/dvsdk_3_10_00_19_c6accel_example$ make c6accel_clean
~/dvsdk_3_10_00_19_c6accel_example$ make c6accel
~/dvsdk_3_10_00_19_c6accel_example$ make c6accel_insta
4、集成C6Accel到demo程序
要利用C6Accel,我们选用已有的Encodedemo,在其根本上进行修正,将采集的视频进行Sobel处理,然后进行H264编码。
修正./ cs2dm6467_1_00_00_10/Makefile,将C6Accel添加进XDC的环境变量。
# Set XDCPATH to contain necessary repositories.
# Please do not modify anything below
XDCPATH= $(CURDIR);$(C6ACCEL_INSTALL_DIR)/soc/packages;$(CODEC_INSTALL_DIR)/packages;$(XDAIS_INSTALL_DIR)/packages;$(FC_INSTALL_DIR)/packages;$(FC_INSTALL_DIR)/fctools/packages;$(BIOS_INSTALL_DIR)/packages;$(BIOSUTILS_INSTALL_DIR)/packages;$(CMEM_INSTALL_DIR)/packages;$(LINK_INSTALL_DIR)/packages;$(LINK_INSTALL_DIR);$(CE_INSTALL_DIR)/packages;$(CE_INSTALL_DIR)/cetools/packages;$(EDMA3_LLD_INSTALL_DIR)/packages
修正./cs2dm6467_1_00_00_10/packages/ti/sdo/server/cs/codec.cfg,将C6Accel添加进codecserver的codec列表。
/ "Use" the various codec modules; i.e., implementation of codecs.
All these "xdc.useModule" commands provide a handle to the codecs,
which we'll use to initialize config params and add the codecs to
the Server.algs array.
/
var C6ACCEL = xdc.useModule('ti.c6accel.ce.C6ACCEL');
C6ACCEL.serverFxns = undefined;
C6ACCEL.stubFxns = undefined;
C6ACCEL.serverFxns = "UNIVERSAL_SKEL";
C6ACCEL.stubFxns = "UNIVERSAL_STUBS";
C6ACCEL.alg.FLOAT = false;
C6ACCEL.alg.watermark = false;
C6ACCEL.alg.codeSection = "DDR2";
C6ACCEL.alg.udataSection = "DDR2";
C6ACCEL.alg.dataSection = "DDR2";
……
/
The array of algorithms this server can serve up. This array also
configures details about the threads which will be created to run the
algorithms (e.g. stack sizes, priorities, etc.).
/
Server.algs = [
{name: "c6accel", mod: C6ACCEL , threadAttrs: {
stackMemId: 0, priority: Server.MINPRI + 1},
groupId : 0,
},
将DVSDK中的encode demo复制过来,将该文件夹重命名为encodesobel,并重命名encode.cfg为encodesobel.cfg,然后修正该文件,利用新的codec server。
var demoEngine = Engine.createFromServer(
"dm6467",
"./c6accel_dm6467.x64P",
"ti.c6accel_unitservers.dm6467"
);
修正./dvsdk_demos_3_10_00_16/dm6467/encodesobel/Makefile,将C6Accel添加进XDC环境变量。
# Package path for the XDC tools
XDC_PATH= $(USER_XDC_PATH);../../packages;$(C6ACCEL_INSTALL_DIR)/soc/packages;$(DEMO_INSTALL_DIR)/packages;$(DMAI_INSTALL_DIR)/packages;$(CE_INSTALL_DIR)/packages;$(FC_INSTALL_DIR)/packages;$(LINK_INSTALL_DIR)/packages;$(LINK_INSTALL_DIR);$(XDAIS_INSTALL_DIR)/packages;$(CMEM_INSTALL_DIR)/packages;$(CODEC_INSTALL_DIR)/packages;$(CE_INSTALL_DIR)/examples
C6ACCEL_LIB = $(C6ACCEL_INSTALL_DIR)/soc/c6accelw/lib/c6accelw_dm6467.a470MV
C6ACCEL_BINARY= $(C6ACCEL_INSTALL_DIR)/soc/packages/ti/c6accel_unitservers/dm6467/c6accel_dm6467.x64P
……
install_$(TARGET):
@install -d $(EXEC_DIR)
@install $(TARGET) $(EXEC_DIR)
@install $(TARGET).txt $(EXEC_DIR)
@install $(C6ACCEL_BINARY) $(EXEC_DIR)
@echo
@echo Installed $(TARGET) binaries to $(EXEC_DIR)..
$(TARGET): $(OBJFILES) $(C6ACCEL_LIB) $(XDC_LFILE)
@echo
@echo Linking $@ from $^..
$(LINK.c) -o $@ $^
修正video.c。这部分的修正比较多,添加的代码紧张包括创建C6Accel句柄,进行Sobel处理等。详细修正请参看源文件,这里不再详细讲解,须要特殊把稳程序中buffer的利用以及句柄的创建和删除。
5、编译
~/dvsdk_3_10_00_19$ make all
~/dvsdk_3_10_00_19$ cd ../dvsdk_3_10_00_19_c6accel_example
~/dvsdk_3_10_00_19_c6accel_example$ make codecs_clean
~/dvsdk_3_10_00_19_c6accel_example$ make codecs
~/dvsdk_3_10_00_19_c6accel_example$ make demos
~/dvsdk_3_10_00_19_c6accel_example$ make install
末了,在/home/tirvideo/lyb/armfs/opt/dvsdk/c6accel中,就会涌现所有的运用程序以及运行程序所需的驱动、脚本文件和codec server(.x64p文件)。
运行测试
在CE的框架下,调用C6Accel中供应的sobel函数,修正CS开拓包和encode demo程序,实现视频流的sobel处理功能。
在基本类似的条件下,修正encodedecode demo程序,实现视频流的encode、decode和sobel处理功能。
小结
理清各个模块之间的关系,比如DVSDK、C6Accel、Codec Engine、Codec Server、demo decode和sobel等各自的浸染和相互之间的调用关系。这样,在做程序移植的时候,才不会被各种解释文档牵着鼻子走,而忽略了建立这些功能模块的实际意义。