北京理工大学 20981 陈罡
呵呵,终于可以用了。闹了半天,原来问题在于我得到的mplayer的源代码是有一些没有清理过的.o
遗留文件的,这次写了一个clean.sh,把所有的目录都情理一下。仍然采用“想说爱你不容易_2”
中提到的configure方法编译:
./configure --cc=arm-linux-gcc --as=arm-linux-gas --host-cc=gcc --disable-rtc --disable-tv --enable-fbdev --target=arm-armv5te-linux --disable-x11 --disable-sdl
clean.sh清理脚本的内容如下:
#!/bin/bash
make clean
make -C liba52 clean
make -C libaf clean
make -C libao2 clean
make -C libavformat clean
make -C libavutil clean
make -C libmenu clean
make -C libmpdvdkit2 clean
make -C libmpeg2 clean
make -C libpostproc clean
make -C libvo clean
make -C mp3lib clean
make -C osdep clean
make -C postproc clean
make -C tremor clean
make -C drivers clean
make -C help clean
make -C libfaad2 clean
make -C libmpcodecs clean
make -C libmpdemux clean
make -C vidix clean
make -C Gui clean
make -C loader clean
make -C libdha clean
make -C libavcodec clean
make -C TOOLS clean
执行清理脚本,从新configure以后,就是漫长的编译过程了。
中断编译的地方主要有如下三个地方:
第一个地方在libfaad2目录下面的ps_dec.c的编译,不知为何,用configure生成的Makefile
的-O4选项编译的时候,会出现错误无法编译,换成下面的-O2,手工运行一下,就可以
生成.o文件了。
arm-linux-gcc -c -I. -I../libvo -I../../libvo -O2 -pipe -ffast-math -fomit-frame-pointer -D_GNU_SOURCE -o ps_dec.o ps_dec.c
第二个地方是libavcodec目录下面的dsputil.c文件的rd8x8_c这个函数:
似乎是我自己编译的arm-linux-gcc编译器版本有问题导致的,网上看别的DX编译,没有提到这个
地方。只要打开dsputil.c按照下面的修改即可编译通过。
DECLARE_ALIGNED_8 (uint64_t, aligned_temp[sizeof(DCTELEM)*64/8]);
//这里把宏定义注释掉,改为下面的直接定义即可
//DECLARE_ALIGNED_8 (uint64_t, aligned_bak[stride]);
uint64_t aligned_bak[stride] ;
DCTELEM * const temp= (DCTELEM*)aligned_temp;
// 这里需要加上强制类型转换一下
uint8_t * bak= (uint8_t *)(aligned_bak);
修改完毕后保存文件,直接用继续make一下,采用缺省的-O4参数即可编译过去。
第三个地方是libfaad2目录下面的dsp_dec.c文件,以及libavutil目录下的intfloat_readwrite.c
这两个文件还是-O4编译不过去,但是-O2是没有问题的。(这一点我不太肯定,不过确实像死机了
一样,很久机器都没有什么反映,也许我没有耐心再等下去了)把编译选项改为-O2,跑到对应的
目录下面手工编译一下即可。
命令行如下:
arm-linux-gcc -I../libvo -I../../libvo -O2 -pipe -ffast-math -fomit-frame-pointer -DHAVE_AV_CONFIG_H -DBUI -LD_AVUTIL -I.. -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE -c -o intfloat_readwrite.o intfloat_readwrite.c
arm-linux-gcc -c -I. -I../libvo -I../../libvo -O2 -pipe -ffast-math -fomit-frame-pointer -D_GNU_SOURCE -o ps_dec.o ps_dec.c
好了,到此为止就应该已经可以完全编译成功了。而且“爱你不容易_2”文章中所提到的mencoder编码的mpeg4视频avi也完全可以播放了。
这让我非常兴奋,编译出来的大小大概在5.09M左右,完全从cygwin环境下编译的。
真机播放的抓图如下:
总结一下,这次mplayer移植,确实给了我很大的考验。主要是心态上的考验,看到很多DX都成功的移植
了mplayer,我心里也痒痒的,但是我清楚的知道mplayer是杰出的open source多媒体播放软件,众多DX在此倾注了无数心血,不要说移植,即使是编译它也不是一个简单的事情。我害怕自己会半途而废,所以在博客中把mplayer编译过程写出来,是想让大家监督一下我。看着时间一天天过去,很多网友都在热情地支持我,而我这边又没有突破性的进展,真是着急啊。
我曾经不只一次的动摇过,做好自己的工作就行了,干嘛浪费时间做这种吃力不讨好的事情,而且一段时间
解决不了,又会被人看笑话。看到大家的热情鼓励,我的信心又慢慢回来了,尤其觉得如果自己知难而退的
话对不起这些关心我的朋友。这里最值得一提的是我这个小小的博客竟然引来了“美丽人生”DX对我的无私
帮助,真是太及时了。虽然我坚信坚持一段时间(或许会很久),mplayer 24118的问题也会被我找到,
但是有了DX的帮助,我已经在如此短的时间里解决了手机上运行mplayer的问题。
在这里再次郑重地感谢“美丽人生”大侠,虽然我不知道您的真正的姓名,
但是您给我的帮助还是让我印象深刻。
做这种大规模的代码移植(超过1900多个源文件),很多时候,我相信没人能够把全部代码都看明白然后再
开始移植的,通常都是尝试性的编译一下,修改Makefile或者尝试不同的configure配置,然后如果再出了
问题,就从错误本身来找原因,是编译器版本不对?还是某些语法在目前的编译器上无法执行,再或者打开源文件,仔细查看出错的代码,分析原因。但是这些都是假定得到的代码逻辑上是完全按正确的前提下的,能够不改移植代码的逻辑,就尽量不改,因为修改可能会引入新的bug,最终使人无法判断是自己新增代码引入的问题,还是原来代码在移植上的问题。
后记,可以播放avi文件固然很好,但是缺少一个完整的使用手册或者方法。有时间我会写一个比较详细的说明。还有就是命令行的mplayer虽然可以用了,不过广大a1200手机用户多喜欢mpkg或者pkg形式的安装包,喜欢有界面的可以选择文件播放的mplayer,这对我又是一个考验,需要编写一个简单的界面,方便手机用户
使用这个程序。
我对界面设计不在行,还需要朋友们多多提一些意见和想法,我会努力去实现的。
最后,这个mplayer编译出来有5.09M,偶的博客空间不够,所以不能上传了,这点还请各位朋友见谅。
如有好心人愿意提供ftp或者上传空间的请与我联系,我的邮件地址参见blog的留言。谢谢
阅读(5831) | 评论(25) | 转发(0) |