2009年8月13日 星期四

ffmpeg 瘦身 & 剪影片

將學長交給我的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月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這個 但是實在不知道 他是怎麼設的

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

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太多了就先不看

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的樣子

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吧

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沒有
目前就看到這裡 其他之後再看