mplayer 交叉編譯

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章