移植Mplayer到arm
0赞
MPlayer的简单移植
按照移植规范,libmad在libs目录下,MPlayer本身在项目目录下.
libmad的移植
CC=arm-linux-gcc ./configure --prefix=$PWD/../../output/arm_linux --enable-fpm=arm --host=arm-linux --disable-debugging --enable-shared --enable-static
修改Makefile 去掉129行 -fforce-mem标志,因为arm-eabi编译器都不支持这个选项,否则将会报错
cc1: error: unrecognized command line option "-fforce-mem"
make[2]: *** [version.lo] Error 1
make[2]: Leaving directory `/arm/madplay/libs/libmad-0.15.1b''
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/arm/madplay/libs/libmad-0.15.1b''
make: *** [all] Error 2
make
make install
MPlayer 的移植
0.下载
MPlayer v1.0rc2
http://www1.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc2.tar.bz2
编译环境:
在arm-linux-gcc 3.3.2 +ARM-Linux 2.6.13.
arm-linux-gcc 4.3.2 + ARM-Linux 2.6.29
arm-linux-gcc 4.3.3 + ARM-Linux 2.6.30 均测试通过.
1.生成Makefile
./configure --prefix=$PWD/../../output/arm_linux --cc=arm-linux-gcc --ar=arm-linux-ar \ --ranlib=arm-linux-ranlib --disable-gui \
--target=arm-armv4-linux --target=arm-linux --disable-freetype \ --enable-fbdev --enable-network --enable-live--disable-mencoder --disable-sdl --disable-dvdread \ --disable-libdvdcss-internal --disable-x11--enable-cross-compile --disable-mp3lib --enable-mad \
--with-extraincdir="$PWD/../../output/arm_linux/include/ :$PWD/../../../usr/include/ :$PWD/../../o
utput/arm_linux/arm/sys-include/ " \
--with-extralibdir="$PWD/../../output/arm_linux/lib/ :$PWD/../../output/arm_linux/arm/lib/ " --with-extralibdir="$PWD/../../output/arm_linux/live " \
--disable-dvdnav --disable-dvdread-internal --disable-jpeg --disable-tga \
--disable-dvbhead --disable-pnm --disable-tv --disable-ivtv \
--disable-fontconfig --disable-xanim --disable-win32dll --disable-armv5te --disable-armv6
MPlayer不支持常见的--host来修改编译工具前缀.必须用--cc,--ar,--ranlib这样参数来修改.而且交叉编译 --enable-cross-compile 是必须的.
--disable-gui 关闭图形界面,只采用字符界面控制
--disable-mp3lib是关闭默认的MP3解码库,--enable-mad 是使用libmad支持.
--disable-dvbhead --disable-dvdread --disable-dvdnav --disable-dvdread-internal 都是跟DVD相关库,基本版可以不用安装.
--disable-x11 --enable-fbdev 关闭X11视频输出,打开framebuffer支持.ARM开发板必须的.
--enable-static 如果使用静态编译尺寸大约是8M,动态编译是6M多,这样可能是无论哪种编译方式,mplayer都把自带的解码库链接到自身,多出2M应该是系统标准库的尺寸。
#if defined(ARCH_ARMV4L)
typedef int32_t intptr_t ; /* Add by Andrew Huang*/
#endif
否则会产生如下编译错误,intptr_t在标准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
去掉ARM pld指令的支持
修改源码 libavcodec\armv4l\dsputil_arm_s.S, libmpeg2\motion_comp_arm_s.S
在其开始的加入,这段代码意思是定义一个空的ARM汇编宏 pld,这样当代码出现pld指令,就变成一条空指令
.macro pld reg
.endm
#endif
功能:cache预读取(PLD,PreLoad),使用PLD指示存储系统从后面几条指令所指定的存储器地址读取,存储系统可使用这种方法加速以后的存储器访问。
格式:
PLD[Rn,{offset}]
其中:
Rn 存储器的基址寄存器。
Offset 加在Rn上的偏移量。含义同3。2。3节第1条指令。
如果不取消,将会产生如下错误
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]
make
MPlayer-1.0rc2/../output/arm_linux/bin
strip: Unable to recognise the format of the input file
`/home/hxy/MPlayer/MPlayer-1.0rc2/../output/arm_linux/bin/mplayer'
查资料看install带-s 参数时会自动调用strip来strip应用程序。但是arm编译时要调用arm-linux-strip才有正确处理。解决办法是取消-s参数,查看Makefile可以发现-s是如下
4.执行:
export LD_LIBRARY_PATH=$APP_ROOT,OOT/lib;./mplayer -ac mad 2.mpg
测试mpg,avi,mp3,mp4均可播放,默认是按视频的原始分辨率播放的。如果想让MPlayer完整在LCD上显示,可以用video filter 参数 scale来设置
export LD_LIBRARY_PATH=$APP_ROOT,OOT/lib;./mplayer -ac mad 2.mpg -quiet \
-vf scale=320:240 2>&1 1>/dev/null &&
如果搞不清自己分辩率的,可在MPlayer用 -fullscreen参数 .或者执行busybox shell命令fbset查看自n己板的分辩率
