mplayer 交叉编译

来源:互联网 发布:非洲新闻数据 编辑:程序博客网 时间:2024/05/16 08:59

一、为支持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

原创粉丝点击