一、为支持mp3的解码,在交叉编译mplayer时,加上 –enable-mad,否则在make的时候出现了:找不到 mad.h 的错误。
1.交叉编译libmad
下载libmad包(libmad-0.15.1b.tar.gz);
打开一个终端,进入libmad的目录,输入配置命令:
./configure --enable-fpm=arm --host=arm-linux --disable-shared(这个选项就是说明要静态编译) --disable-debugging --prefix=/usr/local/Program/libmad0.15/
CC=arm-linux-gcc(要保证arm-linux-gcc的路径已经有 export过,否则给出完整路径。)
make
make install
这样就可以看到 /usr/local/Program/libmad0.15/ 目录下多了include和lib目录,这些就是libmad相关的库。
二、MPlayer 的移植
在准备好LIBMAD库以后,就可以进行mplayer的移植了,先下载mplayer的源文件,再进行解压缩。
其中:mplayer版本:mplayer-export-2010-03-07 最新版
交叉编译链:4.2.2
1、 在mplayer-1.0pre7 目录下建立一个setup.sh的文件,把configure配置放里面。命令:touch setup.sh , chmod 777 setup.sh
2、 编辑setup.sh ,在 setup.sh 里加入一行configure的命令,./configure --host-cc=gcc --cc=arm-linux-gcc --target=arm-armv6-linux --enable-static --prefix=/usr/local/software/mplayer --disable-win32waveout --disable-dvdread --enable-fbdev --disable-mencoder --disable-live --disable-mp3lib --enable-mad --enable-libavcodec_a 后面去掉--with-extraincdir=/usr/local/Program/libmad0.15/include –with-extralibdir=/usr/local/arm/Program/libmad0.15/lib 其中-with…这个参数已经在上面说明了,--host-cc=gcc 必须要有,不然就编译不通过,因为有个文件需要GCC来生成,而不是arm-linux-gcc
注意:由于新下载的mplayer源代码在配置的时候--with-extraincdir –with-extralibdir提示没有此配置选项,因此需手动添加libmad库的支持,我的解决方法是将/usr/local/Program/libmad0.15/include下文件直接拷贝到mplayer源代码中,而对于其下面的库libmad.a,则修改config.mak中在-lmad -L/usr/local/Program/libmad0.15/lib,然后执行下一步即可。(上面仅是本人做法,并不保证正确)
注意:由于版本原因,编译此版本时并未出现下面总结的错误,而是在libmpeg处出现:libmpeg2/motion_comp_arm_s.S:29: Error: selected processor does not support `pld [r1]' 但解决方法参照下面最后一个错误的解决方法。
三、 配置好以后就进行编译make,一切顺利。到此已经移植完成了。
参数解释:
--cc
交叉编译工具,如果没添加到环境变量,就要指定完整路径
--target
在pre版本中,对于--target和这个配置参数是这样描述的:
===============================================
--target=arm- armv4l-linux这个参数要注意的是一个分三部分,第一部分的arm是指arch,这里设定为arm;第二部分的armv4l是指具体的版本,这 个要注意了,一定要跟libavcodec目录下的平台目录名一致,否则为这个平台的优化代码没办法编译进去(据我观察是这样的);第三部分是系统平台。
===============================================
但是在rc2版本中,只需要--target=arm-linux这样指定就好了。
--enable-static
是设定静态连接,不需要一堆乱七八糟的动态库,尤其对我们这些新手来说省了很多的麻烦。如果设置了这个参数就不用设置--prefix了,另外也不用执行make install。
--prefix=/tmp/mplayer-rc2
make install后,可执行程序就安装在/tmp/mplayer-rc2目录下。
--disable-win32dll
禁用win32动态链接库支持。在pre版本中该参数为
--disable-dvdread
禁用libdvdread.
--enable-fbdev
支持fbdev,这个一定要选上。
--disable-mp3lib 和 --enable-mad
arm系列的cpu,一般都没 浮点运算 单元,而mplayer的mp3解码默认使用mp3lib,这个是 浮点运算 库,在arm上肯定跑不了,使用ffmp3或者libmad(需要外部库libmad支持)应该就没问题了。所以这里需要禁止掉mencoder和使能libmad。
--disable-mencoder
禁止编码功能。项目上不需要此功能,禁掉以缩小尺寸。而且听说在这里编译mencoder会有问题,听说而已,没试过。
--disable-live
禁止live 555流媒体。(不知道干啥用)
--enable-libavcodec_a
启用静态的libavcodec解码。在pre版本中该参数为--enable-libavcodec。
--disable-armv5te --disable-armv6
禁用armv5te、armv6指令扩展。
--with-extraincdir和-with-extralibdir
指定libmad和mad.h的路径。mad的路径被添加到编译参数-I和-L后面,替换libmad后需要指定。
注:在pre版本中需要指定--host-cc=gcc配置参数。用来编译一些需要在host上执行的中间文件的,如codec-cfg,切记不能缺少。但在rc2版本中该参数可以省略掉。
四、转载其他人遇到的问题
mplayer破坏.
修改源码:
libavcodec/bitstream.h:181行
加入如下语句.
-------------------------------------------------
#if defined(ARCH_ARMV4L)
typedef int32_t intptr_t ; /* Add by Andrew Huang*/
#endif
---------------------------------------------------
否则将会有如下编译错误
编译错误:
arm-linux-gcc -I../libswscale -I../libavcodec -DHAVE_AV_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_ISOC9X_SOURCE -I.. -I.. -I../libavutil -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -I. -I.. -I../libavutil -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -pipe -ffast-math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DHAVE_CONFIG_H -I/usr/X11R6/include -c -o cyuv.o cyuv.c
cc1: warning: include location "/usr/X11R6/include" is unsafe for cross-compilation
In file included from mpegvideo.h:32,
from cyuv.c:38:
bitstream.h: In function ''put_bits'':
bitstream.h:233: error: ''intptr_t'' undeclared (first use in this function)
bitstream.h:233: error: (Each undeclared identifier is reported only once
bitstream.h:233: error: for each function it appears in.)
bitstream.h:233: error: expected '')'' before ''s''
bitstream.h: In function ''init_get_bits'':
bitstream.h:777: error: ''intptr_t'' undeclared (first use in this function)
bitstream.h:777: error: expected '')'' before ''buffer''
bitstream.h:778: error: expected '')'' before ''buffer''
make[1]: *** [cyuv.o] Error 1
1.修改源码 libavcodec/armv4l/dsputil_arm_s.S, motion_comp_arm_s.S
在其开始的加入
-------------------------
#ifndef HAVE_PLD
.macro pld reg
.endm
#endif
-------------------------
否则会造成如下编译错误,
arm-linux-gcc -I../libswscale -I../libavcodec -DHAVE_AV_CONFIG_H -D_FILE_OFFSET _BITS=64 -D_LARGEFILE_SOURCE -D_ISOC9X_SOURCE -I.. -I.. -I../libavutil -Wdisable d-optimization -Wno-pointer-sign -Wdeclaration-after-statement -I. -I.. -I../lib avutil -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -pipe -ffast-ma th -fomit-frame-pointer -D_REENTRANT -DHAVE_CONFIG_H -I/home/workspace/MPlayer/M Player-1.0rc2/../output/linux_arm/include -I/usr/X11R6/include -c -o armv4l/dsp util_arm_s.o armv4l/dsputil_arm_s.S
cc1: warning: include location "/usr/X11R6/include" is unsafe for cross-compilat ion
armv4l/dsputil_arm_s.S: Assembler messages:
armv4l/dsputil_arm_s.S:79: Error: selected processor does not support `pld [r1]''
armv4l/dsputil_arm_s.S:90: Error: selected processor does not support `pld [r1]''
armv4l/dsputil_arm_s.S:100: Error: selected processor does not support `pld [r1] ''
armv4l/dsputil_arm_s.S:111: Error: selected processor does not support `pld [r1] ''
armv4l/dsputil_arm_s.S:122: Error: selected processor does not support `pld [r1] ''
armv4l/dsputil_arm_s.S:141: Error: selected processor does not support `pld [r1]
错误原因是pld指令只在armv5te以上版本有效,在2440(armv4l)无效
预读取PLD指令
功能:cache预读取(PLD,PreLoad),使用PLD指示存储系统从后面几条指令所指定的存储器地址读取,存储系统可使用这种方法加速以后的存储器访问。
格式:
PLD[Rn,{offset}]
其中:
Rn 存储器的基址寄存器。
Offset 加在Rn上的偏移量。含义同3。2。3节第1条指令。
五、其他
http://blog.chinaunix.net/u3/105675/showart_2148571.html