首先要有编译脚本,看到rt-thread从makefile转到scons,应该scons还是很不错的,写了个脚本还算简单,跨平台支持也简单,缺点就是得再学下python.
直接在pc上configure生成config.h,x264_config.h,config.mak,修改相关的宏。scons一下,会发现看都看不完的错误,因为ti的编译器不支持c99,而x264到处用了c99里的特性:for循环里面声名局部变量。硬着头皮全改了,现在回过头来看下git diff的输出才发现居然有285K,6000多行的补丁。。。
最后发现c6x的C库缺少的,上网找了几个简单的实现补上strcasecmp,strncasecmp,strdup。
附SConstruct
- import os
- import sys
- #C6X_DIR='C:\\Program Files\\Texas Instruments\\C6000 Code Generation Tools 7.2.2'
- C6X_DIR='/media/work/sdk/codec_engine_3_21_00_19/TI_CGT_C6000_7.3.0'
- #C6X_DIR='/media/work/sdk/dvsdk_dm3730/cgt6x_6_1_14'
- CC=os.path.normpath(C6X_DIR+'/bin/cl6x')
- AR=os.path.normpath(C6X_DIR+'/bin/ar6x')
- if sys.platform == "win32":
- CC='\"' + CC + '\"'
- AR='\"' + AR + '\"'
- tienv = Environment()
- tienv['CC']=CC
- tienv['AR']=AR
- tienv['OBJSUFFIX']='.o'
- tienv['ARFLAGS']='r'
- tienv['CCCOM']='$CC -fs=${TARGET.dir} -fr=${TARGET.dir} -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
- tienv['ARCOM']='$AR $ARFLAGS $TARGET $SOURCES'
- tienv['LIBPREFIX']='lib'
- tienv['LIBSUFFIX']='.ae65P'
- tienv['RANLIBCOM']=''
- tienv['CCFLAGS']=['-I' + os.path.normpath(C6X_DIR+'/include')]
- SRCS =[ 'common/mc.c','common/predict.c','common/pixel.c','common/macroblock.c']
- SRCS +=['common/frame.c','common/dct.c','common/cpu.c','common/cabac.c']
- SRCS +=['common/common.c','common/osdep.c','common/rectangle.c']
- SRCS +=['common/set.c','common/quant.c','common/deblock.c','common/vlc.c']
- SRCS +=['common/mvpred.c','common/bitstream.c']
- SRCS +=['encoder/analyse.c','encoder/me.c','encoder/ratecontrol.c']
- SRCS +=[ 'encoder/set.c','encoder/macroblock.c','encoder/cabac.c']
- SRCS +=['encoder/cavlc.c','encoder/encoder.c','encoder/lookahead.c']
- SRCS +=['common/compact.c']
- tienv['CFLAGS']+=['-I.','-eo=.o','--gcc','--symdebug:none','-mi10','-mo']
- OPTFLAGS=['-mv6400+', '-O3','-mt','-pm','-mw','-k']
- #tienv['CFLAGS']+=OPTFLAGS
- #print tienv.Dump()
- tienv.StaticLibrary('x264',SRCS)
x264之c64x+平台移植(二):arm端应用程序编译
参考codec server的html文档写app.cfg:
var osalGlobal = xdc.useModule('ti.sdo.ce.osal.Global');
osalGlobal.runtimeEnv = osalGlobal.LINUX;
xdc.useModule('ti.sdo.xdcruntime.linux.Settings');
xdc.useModule('ti.sdo.ce.ipc.dsplink.Ipc');
xdc.useModule('ti.sdo.ce.ipc.dsplink.Processor');//注意这行,漏掉的话会链接失败。
var Engine = xdc.useModule('ti.sdo.ce.Engine');
var myEngine = Engine.createFromServer(
"x264server", // Engine name (as referred to in the C app)
"bin/x264server.xe64P", // path to server exe, relative to its package dir
"xmu.x264server" // full server package name
);
var SCPY = xdc.useModule('ti.sdo.fc.scpy.SCPY');
var SDMA = xdc.useModule('ti.sdo.linuxutils.sdma.SDMA');
app.bld:
var GCArmv5T = xdc.useModule('gnu.targets.arm.GCArmv5T');GCArmv5T.LONGNAME = 'bin/arm-none-linux-gnueabi-gcc';
GCArmv5T.platform = "ti.platforms.evm3530";
//GCArmv5T.rootDir = "C:\\Program Files\\CodeSourcery\\Sourcery G++ Lite";
GCArmv5T.rootDir = "/media/work/sdk/Sourcery_G++_Lite";
Build.targets = [
];
运行XDCPATH="/media/work/sdk/codec_engine_3_21_00_19/packages;/media/work/sdk/codec_engine_3_21_00_19/cetools/packages;/media/work/sdk/codec_engine_3_21_00_19/syslink_2_00_02_80/packages;/media/develop/git/x264dsp" "/media/work/sdk/codec_engine_3_21_00_19/xdctools_3_22_02_27/xs" xdc.tools.configuro -o cfg_tmp -t gnu.targets.arm.GCArmv5T -p ti.platforms.evm3530 -b app.bld app.cfg
生成codec server的配置
删除linker.cmd的后面SECTIONS开始至文件尾部分,注意不能用-T linker.cmd编译,否则会莫名其妙地链接失败^_^
最后编译app对应的代码:
/opt/CodeSourcery/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc -o x264app v4l2_x264.o cfg_tmp/linker.cmd -lpthread -ldl -lrt
注意:
1、 linker.cmd与输入文件的顺序,并且不能加"-T"
2、链接时要加上-ldl -lrt。