x264之c64x+平台移植

个主要的开源h264编码器:x264,t264,jm参考模型。在pc上试过hm也就是将来的h265的压缩,几个小时才能压完60帧!所以t264跟jm用于写论文似乎最适合了,再怎么比都比这他们强(t264性能没实测过,据说不错,但是支持特性太少兼容性也不好),所以选了x264,测试结果是在core 2 duo上大概720p 30fps.

首先要有编译脚本,看到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

  1. import os  
  2. import sys  
  3.   
  4. #C6X_DIR='C:\\Program Files\\Texas Instruments\\C6000 Code Generation Tools 7.2.2'  
  5. C6X_DIR='/media/work/sdk/codec_engine_3_21_00_19/TI_CGT_C6000_7.3.0'  
  6. #C6X_DIR='/media/work/sdk/dvsdk_dm3730/cgt6x_6_1_14'  
  7. CC=os.path.normpath(C6X_DIR+'/bin/cl6x')  
  8. AR=os.path.normpath(C6X_DIR+'/bin/ar6x')  
  9. if sys.platform == "win32":  
  10.     CC='\"' + CC + '\"'  
  11.     AR='\"' + AR + '\"'  
  12.   
  13. tienv = Environment()  
  14. tienv['CC']=CC  
  15. tienv['AR']=AR  
  16. tienv['OBJSUFFIX']='.o'  
  17. tienv['ARFLAGS']='r'  
  18. tienv['CCCOM']='$CC -fs=${TARGET.dir} -fr=${TARGET.dir} -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'  
  19. tienv['ARCOM']='$AR $ARFLAGS $TARGET $SOURCES'  
  20. tienv['LIBPREFIX']='lib'  
  21. tienv['LIBSUFFIX']='.ae65P'  
  22. tienv['RANLIBCOM']=''  
  23. tienv['CCFLAGS']=['-I' + os.path.normpath(C6X_DIR+'/include')]  
  24.   
  25. SRCS =[ 'common/mc.c','common/predict.c','common/pixel.c','common/macroblock.c']  
  26. SRCS +=['common/frame.c','common/dct.c','common/cpu.c','common/cabac.c']  
  27. SRCS +=['common/common.c','common/osdep.c','common/rectangle.c']  
  28. SRCS +=['common/set.c','common/quant.c','common/deblock.c','common/vlc.c']  
  29. SRCS +=['common/mvpred.c','common/bitstream.c']  
  30. SRCS +=['encoder/analyse.c','encoder/me.c','encoder/ratecontrol.c']  
  31. SRCS +=[ 'encoder/set.c','encoder/macroblock.c','encoder/cabac.c']  
  32. SRCS +=['encoder/cavlc.c','encoder/encoder.c','encoder/lookahead.c']  
  33. SRCS +=['common/compact.c']  
  34.   
  35. tienv['CFLAGS']+=['-I.','-eo=.o','--gcc','--symdebug:none','-mi10','-mo']  
  36.   
  37. OPTFLAGS=['-mv6400+''-O3','-mt','-pm','-mw','-k']  
  38. #tienv['CFLAGS']+=OPTFLAGS  
  39.   
  40. #print tienv.Dump()  
  41. 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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值