將學長交給我的l4跟l4linux成功跑再davinci的版上
目前看來是沒什麼問題的 都有成功跑起來 再接下來是ffmpeg的問題了
因為之前產生的ffmpeg的binary有一點大 所以說我想要將他縮小一下
我想其實我要用的就只有h.264的decoder其他沒放進來又沒差 我是embeded system
我看了一下ffmpeg的其他configure 就發現了有幾個重要的東西
--disable-decoders 這個可以將全部的decoder都取消
--enable-decoder=NAME 這個NAME是要使用的decoder
那我要怎麼知道有哪些decoder可以用就用--list-decoders就可以知道有哪些了
我之前編譯的時候 是全部default的decoder都放進去 編完是5.1MB
後來只有用H.264的decoder的時候 編完就只剩下1.9MB
不過還沒有測試是不是可以用
如果可以的話 接下來是將encoder弄到剩下重要的encoder 一定會在變小
接下來我還需要準備H.264的檔案 但是網路上下載到的檔案都太大了
我想我就將網路上的影片檔來做一下切割 看能不能切到1MB以內
因為我想要找在linux上的影片編輯軟體 當然要可以編輯H.264檔
其實linux上面的影片編輯軟體很多 以下的網址就有介紹7套可以用的
http://www.makeuseof.com/tag/7-free-open-source-video-editor-for-linux/
我看看第一套在ubuntu的package就有了 好像還蠻多人用的(看popular的指數)
所以說我就用avidemux這套了
下載一下就下完了
然後這套的介面還不錯 他附的document還不錯 該有的都有
我主要的功能是剪影片的長短
http://www.avidemux.org/admWiki/index.php?title=Cutting
還有可能會放大縮小影片
http://www.avidemux.org/admWiki/index.php?title=Video_filter_Resize
放大縮小類的是要用他的filter來做
還有要記得對影片用filter 不要以為設定完了就已經做完filter的功能
這是不可能的 正常來講都要做很久的
這樣就可以切適合的大小來測試H.264
之後要做的事 是還要去了解parser跟muxer跟demuxer是在哪裡用的
要怎麼去掉沒用到的
2009年8月13日 星期四
2009年8月12日 星期三
linux ramdisk
本來我只是要看u-boot有沒有像grub一樣的multiload的功能
結果看一看好像沒有 好像一定是要包成一個binary才可以
但是卻不小心看到可以修改linux的ramdisk的大小
就是一個u-boot的官方網站
http://www.denx.de/wiki/view/DULG/RamdiskGreaterThan4MBCausesProblems
這是教學 如何修改linux中的預設ramdisk的大小(4096K)
主要就是在bootargs的部份多增加一個參數 ramdisk_size=(所需要的大小)
這個單位是以kilo byte來計算的
我本來想看看linux是怎麼處理這些boot arg的 我看了x86的
就看到看到boot_params的struct 中有setup_header這個struct
在這裡面就有ramdisk_size這個 但是實在不知道 他是怎麼設的
結果看一看好像沒有 好像一定是要包成一個binary才可以
但是卻不小心看到可以修改linux的ramdisk的大小
就是一個u-boot的官方網站
http://www.denx.de/wiki/view/DULG/RamdiskGreaterThan4MBCausesProblems
這是教學 如何修改linux中的預設ramdisk的大小(4096K)
主要就是在bootargs的部份多增加一個參數 ramdisk_size=(所需要的大小)
這個單位是以kilo byte來計算的
我本來想看看linux是怎麼處理這些boot arg的 我看了x86的
就看到看到boot_params的struct 中有setup_header這個struct
在這裡面就有ramdisk_size這個 但是實在不知道 他是怎麼設的
ffmpeg for l4linux
將ffmpeg用l4用的compiler來compile
好其實設定的部份 之前就知道了
以下是新的configure
../configure --arch=armv5tel --cpu=armv5 --cross-prefix=arm-softfloat-linux-gnu- --enable-cross-compile --prefix=/home/liuin/ffmpeg/install_new/ --enable-static --disable-shared --enable-gpl --disable-stripping --disable-network --disable-ipv6 --disable-parsers --disable-debug --disable-ffplay --disable-ffserver
基本上都是跟上次的差不多
這次的arch是根據configure檔來設定的 一定要以l結尾 這樣configure才會知道這是arm
雖然說我有給定cpu 但是他還是沒有compile armv5te的最佳化程式
我看一下configure發現 他花了時間試試看compiler接不接受 qadd來看看是不是能compile armv5
結果好像是不行 不知道是不是comiler的問題
我還把--enable-small拿掉了 應該沒差吧
多增加一個--disable-ffserver 這樣的話會少compile不必要的東西
這樣compile完
libm.so.6
libdl.so.2
libc.so.6
ld-linux.so.3
是需要的share library
比之前少 可能是因為ffserver沒compile的關係吧
上面這些是用davinci的tool-chain看的share library
因為l4的compile居然沒有ldd 這什麼compiler
好其實設定的部份 之前就知道了
以下是新的configure
../configure --arch=armv5tel --cpu=armv5 --cross-prefix=arm-softfloat-linux-gnu- --enable-cross-compile --prefix=/home/liuin/ffmpeg/install_new/ --enable-static --disable-shared --enable-gpl --disable-stripping --disable-network --disable-ipv6 --disable-parsers --disable-debug --disable-ffplay --disable-ffserver
基本上都是跟上次的差不多
這次的arch是根據configure檔來設定的 一定要以l結尾 這樣configure才會知道這是arm
雖然說我有給定cpu 但是他還是沒有compile armv5te的最佳化程式
我看一下configure發現 他花了時間試試看compiler接不接受 qadd來看看是不是能compile armv5
結果好像是不行 不知道是不是comiler的問題
我還把--enable-small拿掉了 應該沒差吧
多增加一個--disable-ffserver 這樣的話會少compile不必要的東西
這樣compile完
libm.so.6
libdl.so.2
libc.so.6
ld-linux.so.3
是需要的share library
比之前少 可能是因為ffserver沒compile的關係吧
上面這些是用davinci的tool-chain看的share library
因為l4的compile居然沒有ldd 這什麼compiler
2009年8月11日 星期二
trace ffmpeg finding arm specific code III
繼續將ffmpeg中加速arm的code看完
在剩下的檔案中 我先看mpegvideo開頭的檔案
這一部份的檔案 是跟libavcodec/mpegvideo.h和libavcodec/mpegvideo.c有關
在mpegvideo.h中有MPV_common_init_arm的function
他功用跟dsputil_init_arm是一樣的 是做function的pointer替換用的
不過這邊替換的是MpegEncContext這個struct
所以說mpegvideo_armv5te_s.S mpegvideo_arm.c mpegvideo_armv5te.c
就是做mpeg encode相關的function
mathops.h主要是定義一些原本在libavutil/mathops.h中有定義的macro
這邊的話 ffmpeg會有arm的instruction直接做 這樣會比較快
asm.S這裡試定義一些給其他.S檔案用的 macro 根據我查的結果
這些macro所用的一些directive還蠻新的 gcc3.x會compile不過
dsputil_arm.c是dsputil在arm這個資料夾最一開始的檔案
他有dsputil_init_arm的funciton
而mpegvideo_arm.c就是mpegvideo在arm這個資料夾最一開始的檔案
目前就看到這裡 x86太多了就先不看
在剩下的檔案中 我先看mpegvideo開頭的檔案
這一部份的檔案 是跟libavcodec/mpegvideo.h和libavcodec/mpegvideo.c有關
在mpegvideo.h中有MPV_common_init_arm的function
他功用跟dsputil_init_arm是一樣的 是做function的pointer替換用的
不過這邊替換的是MpegEncContext這個struct
所以說mpegvideo_armv5te_s.S mpegvideo_arm.c mpegvideo_armv5te.c
就是做mpeg encode相關的function
mathops.h主要是定義一些原本在libavutil/mathops.h中有定義的macro
這邊的話 ffmpeg會有arm的instruction直接做 這樣會比較快
asm.S這裡試定義一些給其他.S檔案用的 macro 根據我查的結果
這些macro所用的一些directive還蠻新的 gcc3.x會compile不過
dsputil_arm.c是dsputil在arm這個資料夾最一開始的檔案
他有dsputil_init_arm的funciton
而mpegvideo_arm.c就是mpegvideo在arm這個資料夾最一開始的檔案
目前就看到這裡 x86太多了就先不看
2009年8月10日 星期一
trace ffmpeg finding arm specific code II
繼續trace ffmpeg
目前是先trace ps2的code 因為這部份的code較少
在libavcodec/ps2/dsputil_mmi.c 就是實作出這些加速的function
而這些加速的function要怎麼用勒
其實很簡單 他會在libavcodec/dsputil.h底下有一個struct DSPContext
在這個struct會有很多function的pointer 我們可以替換掉這些function pointer
這裡會有像idct的function pointer替換掉這個就會變成我們用的硬體加速
這樣使用的就是我們有加速過的function
但是現在問題有來了 我們要在哪裡換掉這些function pointer
其實每個arch或是加速的instruction set都會有一個dsputil_init_(加速的名稱)
像ps2就是dsputil_init_mmi(像這個function的實做就是擺在libavcodec/ps2/dsputil_mmi.c)
(但是這個function的宣告是擺在libavcodec/dsputil.h)
在這裡就是用來寫function pointer的轉換
而這些dsputil_init_mmi dsputil_init_arm都是放在dsputil_init的function(在libavcodec/dsputil.c)
dsputil_init會根據不同的arch來call不同的function
接下就是說他在哪裡設定原本這些可以加速的function
其實就是在libavcodec/dsputil.c的dsputil_init裡面
這裡就寫著原本可以加速的function是指到哪一個function
好 看完ps2簡單的版本 現在就可以開始看arm的部份
因為我用的arm926ejs 沒有neon iwmmxt vfp armv6的code要看 但是要看armv5的
從libavcodec/Makefile 我們知道至少有8個檔要看 當然實際上有10個
根據剛剛ps2的經驗 就從/libavcodec/arm/dsputil_arm.c
以下是每個檔案大致上的功用
jrevdct_arm.S 這個是實做j_rev_dct_ARM這個function
simple_idct_arm.S 這個是實做simple_idct_ARM這個function
simple_idct_armv5te.S 主要是實做simple_idct_armv5te simple_idct_add_armv5te simple_idct_put_armv5te 三個function
dsputil_arm_s.S 主要是實做跟pixel相關的function
現在就先trace到這裡
還有asm.S mpegvideo_armv5te_s.S
dsputil_arm.c mathops.h
mpegvideo_arm.c mpegvideo_armv5te.c
需要去trace
還要去看看如何只使用libavcodec的功能 好像有個檔案叫做dct-test.c的樣子
目前是先trace ps2的code 因為這部份的code較少
在libavcodec/ps2/dsputil_mmi.c 就是實作出這些加速的function
而這些加速的function要怎麼用勒
其實很簡單 他會在libavcodec/dsputil.h底下有一個struct DSPContext
在這個struct會有很多function的pointer 我們可以替換掉這些function pointer
這裡會有像idct的function pointer替換掉這個就會變成我們用的硬體加速
這樣使用的就是我們有加速過的function
但是現在問題有來了 我們要在哪裡換掉這些function pointer
其實每個arch或是加速的instruction set都會有一個dsputil_init_(加速的名稱)
像ps2就是dsputil_init_mmi(像這個function的實做就是擺在libavcodec/ps2/dsputil_mmi.c)
(但是這個function的宣告是擺在libavcodec/dsputil.h)
在這裡就是用來寫function pointer的轉換
而這些dsputil_init_mmi dsputil_init_arm都是放在dsputil_init的function(在libavcodec/dsputil.c)
dsputil_init會根據不同的arch來call不同的function
接下就是說他在哪裡設定原本這些可以加速的function
其實就是在libavcodec/dsputil.c的dsputil_init裡面
這裡就寫著原本可以加速的function是指到哪一個function
好 看完ps2簡單的版本 現在就可以開始看arm的部份
因為我用的arm926ejs 沒有neon iwmmxt vfp armv6的code要看 但是要看armv5的
從libavcodec/Makefile 我們知道至少有8個檔要看 當然實際上有10個
根據剛剛ps2的經驗 就從/libavcodec/arm/dsputil_arm.c
以下是每個檔案大致上的功用
jrevdct_arm.S 這個是實做j_rev_dct_ARM這個function
simple_idct_arm.S 這個是實做simple_idct_ARM這個function
simple_idct_armv5te.S 主要是實做simple_idct_armv5te simple_idct_add_armv5te simple_idct_put_armv5te 三個function
dsputil_arm_s.S 主要是實做跟pixel相關的function
現在就先trace到這裡
還有asm.S mpegvideo_armv5te_s.S
dsputil_arm.c mathops.h
mpegvideo_arm.c mpegvideo_armv5te.c
需要去trace
還要去看看如何只使用libavcodec的功能 好像有個檔案叫做dct-test.c的樣子
texinfo 的使用
早上本來要看看ffmpeg中dsputil.h中的function
但是function實在是太多了 不知道要怎麼下手
後來就在看ps2的資料夾 發現檔案還蠻少的
大部分是在idct的部份 不過我不太懂他的naming convention
我就想看看他的doc中到底有沒有說
之前看得結果就是知道他是有很奇怪的副檔名.texi
我就看看.texi是怎麼用的
他其實就是texinfo的檔案 詳細的資料在http://www.gnu.org/software/texinfo/
其實他主要的想法是要建立起一個文件系統是用同一個原始碼
只要照著他的格式寫 可以將他轉換成各種不同的文件格式像html pdf dvi docbook xml info檔
這裡有幾個重要的指令makeinfo可以將.texi轉成.info
texi2pdf可以將.texi轉成.pdf
texinfo感覺上是可以學得東西 好像還不錯
但是我看完ffmpeg中的info檔發現好像沒什麼用 還是去trace code吧
但是function實在是太多了 不知道要怎麼下手
後來就在看ps2的資料夾 發現檔案還蠻少的
大部分是在idct的部份 不過我不太懂他的naming convention
我就想看看他的doc中到底有沒有說
之前看得結果就是知道他是有很奇怪的副檔名.texi
我就看看.texi是怎麼用的
他其實就是texinfo的檔案 詳細的資料在http://www.gnu.org/software/texinfo/
其實他主要的想法是要建立起一個文件系統是用同一個原始碼
只要照著他的格式寫 可以將他轉換成各種不同的文件格式像html pdf dvi docbook xml info檔
這裡有幾個重要的指令makeinfo可以將.texi轉成.info
texi2pdf可以將.texi轉成.pdf
texinfo感覺上是可以學得東西 好像還不錯
但是我看完ffmpeg中的info檔發現好像沒什麼用 還是去trace code吧
2009年8月2日 星期日
trace ffmpeg finding arm specific code I
為了要使ffmpeg要能在davinici(上面的arm是armejs 屬於armv5e的instruction)上面跑
我必須要尋找看看在ffmpeg裡面哪些部份有用到硬體的加速
不管是dsp或是mmx或sse等等的 我看看有哪些是可以有用到硬體加速的
我看的是ffmpeg 0.5的版本 (不是svn上面的版本)
目前才資料夾方面來看
基本上從top的資料夾看應該只有兩個資料夾有硬體相關的code
libavutil跟libavcodec這兩個
而在libavutil中 不管是哪一個硬體架構都只有一個檔案bswap.h
在這幾個檔案主要是處理endian的問題 雖然說可以用c code來完成
但是其實也可以用cpu提供的instruction來完成 這會更快
像其中個bswap裡面的function是bswap_32就是將32bit的變數轉換endian
如果是armv6的話 因為有armv6提供的instruction rev就可以用一個instruction來完成
這樣就可以加速程式了
在arch這邊我看到了 沒看過的arch就順便查一下
bfin是blackfin 這種processor 沒看過耶
sh4這是hitachi 發展的cpu 網路上可以查 Renesas superH
這裡他區分arch dependent的code的方式是在bswap.h的檔案中
根據config的macro來決定include哪一個arch
我的arm architecutre的manual在這裡下載的
http://www.arm.com/miscPDFs/14128.pdf
接下來是看libavcodec的部份
先看一下這資料夾底下 在這個底下 有一些資料夾
我稍微看了一下 發現大部分都是arch的名稱 除了mlib不知道是什麼
我稍微查了一下 這是hp的一個 數學lib耶 不想看下去了
在看這一部份的code之前 我發現了ffmpeg自己寫得一份文件
在(ffmpeg top directory)/doc/optimization.txt裡面
他有提到要怎麼做optimization.txt大部分的最佳化在x86里面都有做
可以先看x86的最佳化 就知道其他最佳化是怎麼做的
我開始看arm相關的optimization的部份
首先看到一個有趣的東西是neon 這是arm新推出來的東西
這是提供一些SIMD的instruction 不過我找不到文件可以看
但是因為davinici的MPU沒這麼新 就先不用看這部份
接下來我又看到另一樣東西iwMMXt 這應該是intel的processor才會有的東西
這是像intel普通的processor才會有的MMX
不過davinici沒有
目前就看到這裡 其他之後再看
我必須要尋找看看在ffmpeg裡面哪些部份有用到硬體的加速
不管是dsp或是mmx或sse等等的 我看看有哪些是可以有用到硬體加速的
我看的是ffmpeg 0.5的版本 (不是svn上面的版本)
目前才資料夾方面來看
基本上從top的資料夾看應該只有兩個資料夾有硬體相關的code
libavutil跟libavcodec這兩個
而在libavutil中 不管是哪一個硬體架構都只有一個檔案bswap.h
在這幾個檔案主要是處理endian的問題 雖然說可以用c code來完成
但是其實也可以用cpu提供的instruction來完成 這會更快
像其中個bswap裡面的function是bswap_32就是將32bit的變數轉換endian
如果是armv6的話 因為有armv6提供的instruction rev就可以用一個instruction來完成
這樣就可以加速程式了
在arch這邊我看到了 沒看過的arch就順便查一下
bfin是blackfin 這種processor 沒看過耶
sh4這是hitachi 發展的cpu 網路上可以查 Renesas superH
這裡他區分arch dependent的code的方式是在bswap.h的檔案中
根據config的macro來決定include哪一個arch
我的arm architecutre的manual在這裡下載的
http://www.arm.com/miscPDFs/14128.pdf
接下來是看libavcodec的部份
先看一下這資料夾底下 在這個底下 有一些資料夾
我稍微看了一下 發現大部分都是arch的名稱 除了mlib不知道是什麼
我稍微查了一下 這是hp的一個 數學lib耶 不想看下去了
在看這一部份的code之前 我發現了ffmpeg自己寫得一份文件
在(ffmpeg top directory)/doc/optimization.txt裡面
他有提到要怎麼做optimization.txt大部分的最佳化在x86里面都有做
可以先看x86的最佳化 就知道其他最佳化是怎麼做的
我開始看arm相關的optimization的部份
首先看到一個有趣的東西是neon 這是arm新推出來的東西
這是提供一些SIMD的instruction 不過我找不到文件可以看
但是因為davinici的MPU沒這麼新 就先不用看這部份
接下來我又看到另一樣東西iwMMXt 這應該是intel的processor才會有的東西
這是像intel普通的processor才會有的MMX
不過davinici沒有
目前就看到這裡 其他之後再看