這一篇主要是參考fiasco官方網站上面的文件所寫的
但是fiasco的官方網站上面只有說明他scheduler的概念並沒有說明對應的檔案是在哪裡
根據官方的文件 fiasco的scheduler是preemptive prioriy-based的scheduler
他總共有256的priority level 數字越高代表 priority越高
當有兩個priority一樣的時候 這個時候就是用round-robin來決定各自要run多久
在fiasco中有一個256個element的array 每一個entry代表一個priority
每個entry裡面都有doubly-linked circular list 串成一環ready threads
fiasco另外為了加速還會存有一個變數是現在最高的priority
大概是這個樣子 主要有關的檔案是
(fiasco top)/fiasco/src/kern/Context.cpp -> execution context
(fiasco top)/fiasco/src/kern/sched_context.cpp -> scheduling context
這兩個檔案分別對應到官方文件上的兩個context
跟scheduling有關的內容是存在 scheduling context
也就是說像priority跟time quantum等等的資訊是存在這裡
看了一下要怎麼修改這些scheduling的參數
fiasco提供system call的方式來 給定新的參數
l4_thread_schedule就有提供這些修改的參數
=====================================
另外我無聊在看一些data type就看到Cpu_time 這個data type
這個data type的真實type是Unsigned64 就是64bit的unsigned int
這個的重點是說這個data type在不同的arch底下會定義在不同的file中
像arm的話是定義在(fiasco top)/src/types/arm/types-arch.h中
還有就是這個data type的目的是要當作clock來用
2009年8月31日 星期一
2009年8月30日 星期日
linux上的svn client
最近為了要看學長的repository
本來我是想說用在linux上用command line就可以解決一切的問題了
但是用一用覺得好麻煩 要打一堆重複的指令 後來受不了 就找了一個svn client來用
我用的是哪一個勒 其實我以前聽過很多個 以前都是用ide(netbeans跟eclipse)上面附的
現在我在google上面隨便搜尋 就看到rapidsvn 感覺還不錯 就灌這個吧
這應該是隨便灌都會成功
我想說的是ubuntu 8.04上的套件庫不是最新 不過隨便啦
用一用的感覺是他常常在做refresh 本來我覺得refresh是沒差
但是他refresh完 會將整個檔案清單又移到檔案清單的最上頭
像我的檔案清單很長 每次都要重拉有點不爽
還有就是一開始當我用的時候 檔案都不能點選(本來以為會自動開啟)
是因為沒有設定編輯器
這裡就要打開view中的preferences裡的programs來修改
這裡我editor是用gedit 下一格選項打%1
diff tool是用meld 下一格的選項就打%1 %2
中間的standard file explorer就不理他了
這樣應該就可以用很爽了
meld是一個用來看diff檔的工具 我沒什麼研究 一打開就可以用了
還算清晰
本來我是想說用在linux上用command line就可以解決一切的問題了
但是用一用覺得好麻煩 要打一堆重複的指令 後來受不了 就找了一個svn client來用
我用的是哪一個勒 其實我以前聽過很多個 以前都是用ide(netbeans跟eclipse)上面附的
現在我在google上面隨便搜尋 就看到rapidsvn 感覺還不錯 就灌這個吧
這應該是隨便灌都會成功
我想說的是ubuntu 8.04上的套件庫不是最新 不過隨便啦
用一用的感覺是他常常在做refresh 本來我覺得refresh是沒差
但是他refresh完 會將整個檔案清單又移到檔案清單的最上頭
像我的檔案清單很長 每次都要重拉有點不爽
還有就是一開始當我用的時候 檔案都不能點選(本來以為會自動開啟)
是因為沒有設定編輯器
這裡就要打開view中的preferences裡的programs來修改
這裡我editor是用gedit 下一格選項打%1
diff tool是用meld 下一格的選項就打%1 %2
中間的standard file explorer就不理他了
這樣應該就可以用很爽了
meld是一個用來看diff檔的工具 我沒什麼研究 一打開就可以用了
還算清晰
2009年8月27日 星期四
ffmpeg播放h.264影片的work load
我為了做實驗的需要 在沒有frame buffer driver的情形下
我想要得到h.264的work load
我研究了了很久ffmpeg的選項 我本來想這應該是不可能這麼方面
原本想算了 就用ffplay看看可不可以不要播放
就先compile ffplay了 但是一開始我明明configure沒有設disable-ffplay的選項
結果他卻沒有compile ffplay 我上網找了一下 原來要先裝sdl才可以
看了一下ubuntu的套件庫 我就裝libsdl1.2-dev來試試看
結果就compile成功了 他的確可以播影片 但是他不讓我拿掉display的視窗(在x86上 還沒上到板子)
這樣當然是不能放到板子上
之後上網查了一下 發現其實ffmpeg有這樣的選項可以用
就是-re 這會讓encode h.264成其他格式 會依照h.264本來的fps來作
這樣就會像是在看影片
除了這個選項外 我另外發現其他有用的選項-debug
這裡的flag可以設很多種 但是H.264會回應你的只有三種 startcode MMCO pict(我是直接看h.264.c中的macro)
我覺得這裡比較有用的是startcode 他似乎是可以看到每一個NAL的大小(也就是dst_length) 但是我並不確定
其他兩個 對我的用處不大
我想要得到h.264的work load
我研究了了很久ffmpeg的選項 我本來想這應該是不可能這麼方面
原本想算了 就用ffplay看看可不可以不要播放
就先compile ffplay了 但是一開始我明明configure沒有設disable-ffplay的選項
結果他卻沒有compile ffplay 我上網找了一下 原來要先裝sdl才可以
看了一下ubuntu的套件庫 我就裝libsdl1.2-dev來試試看
結果就compile成功了 他的確可以播影片 但是他不讓我拿掉display的視窗(在x86上 還沒上到板子)
這樣當然是不能放到板子上
之後上網查了一下 發現其實ffmpeg有這樣的選項可以用
就是-re 這會讓encode h.264成其他格式 會依照h.264本來的fps來作
這樣就會像是在看影片
除了這個選項外 我另外發現其他有用的選項-debug
這裡的flag可以設很多種 但是H.264會回應你的只有三種 startcode MMCO pict(我是直接看h.264.c中的macro)
我覺得這裡比較有用的是startcode 他似乎是可以看到每一個NAL的大小(也就是dst_length) 但是我並不確定
其他兩個 對我的用處不大
2009年8月23日 星期日
選擇c的文件
今天本來去天瓏想買本c的書來看 因為最近再看ffmpeg的關係 發現了一大堆我都不知道的功能
而且是真的很多 多到我當不知道該怎麼辦了 想說買一本來看看
我本來是想要買C Programming Language (2nd Edition)
評價非常好 結果錢帶的不夠 所以說看看就好 翻了一下真的很多 我沒看過的功能
這時就無聊翻翻旁邊相關的c書籍 就發現了另一本書C: A Reference Manual (5th Edition)
哇更覺得這本書不錯了 該有的內容都有 不過奇怪的是他為什麼會特別分 C89 C99
原來這是因為C99是新的標準 一堆沒看過的東西 這本書真不錯 都有
後來才發現原來C Programming Language 雖然說是第二版 不過這是1988年出的
哇不會吧 這樣應該會有很多東西沒寫到 這樣會有一點糟
後來在一下C: A Reference Manual 也太貴了吧要1780 還有後面真的附了一堆我不想要的reference
還看了一下其他相關的書 有本事let us c這本感覺不也不錯
大概就是這樣
而且是真的很多 多到我當不知道該怎麼辦了 想說買一本來看看
我本來是想要買C Programming Language (2nd Edition)
評價非常好 結果錢帶的不夠 所以說看看就好 翻了一下真的很多 我沒看過的功能
這時就無聊翻翻旁邊相關的c書籍 就發現了另一本書C: A Reference Manual (5th Edition)
哇更覺得這本書不錯了 該有的內容都有 不過奇怪的是他為什麼會特別分 C89 C99
原來這是因為C99是新的標準 一堆沒看過的東西 這本書真不錯 都有
後來才發現原來C Programming Language 雖然說是第二版 不過這是1988年出的
哇不會吧 這樣應該會有很多東西沒寫到 這樣會有一點糟
後來在一下C: A Reference Manual 也太貴了吧要1780 還有後面真的附了一堆我不想要的reference
還看了一下其他相關的書 有本事let us c這本感覺不也不錯
大概就是這樣
2009年8月22日 星期六
trace h.264 in ffmpeg II
目前開始trace decode_frame這個function
現在trace到decode_nal_units這個重要的function
我現在知道nalu這是引進網路的概念
我也去翻了spec了 大概在200901的這一份的p.84 有10幾種的type
不過我實在不懂 到底每個是什麼 所以說我就上網找了教學文章
現在我大概知道nulu分成兩種 一種是VCL-NAL-unit跟non-VCL NAL-unit
VCL-NAL-unit是真正存影片的內容
non-VCL NAL-unit則是存其他的metadata 像是影片的參數sequenc跟slice header之類的參數
還有另一項是sei這是存關於影片的簡介跟版權之類的 不關影片的編碼的參數
好我終於知道什麼事CAVLC是什麼東西了 這是一種特殊的編碼技巧 會根據先在影片symbol出現的特性來改變
現在的variable length code table
接下來我開始trace nalu在我code中的使用
我發現主要用的的ualu的type只有幾種 7 8 5 1
6的話只用了一次 反正應該是影片的簡介吧
7是sequence parameter
8是picture parameter
5是沒有reference其他picture的picture
1是有reference其他picture的picture
雖然這邊1跟5是叫做coded clice of a non-IDR picture跟coded slice of an IDR picture
但是我看的結果 1跟5解出來就已經是一個frame了
不知道是為什麼
我看了一篇wiki上面附的H.264介紹的paper 我覺得寫得還不錯
全名是overview of the H.264/AVC video coding standard
他有寫到picture parameter set的功用 是要用在一個或多個picture上 所以說
這篇paper也有說到frame中可以多個slice group 為什麼會有很多個slice group勒
是因為他要有FMO的功能 flexiable macroblock ordering
這就是說slice不一定要從最左上角的macroblock開始 可以從任一個macroblock開始
這裡的frame跟picture是一樣的 就是一個畫面 好
然後field是一半的frame frame分成top field跟bottom field
這個意思就是偶數行是top field 奇數行是bottom field
如果是沒有分兩個field的frame 就是progressive field(根本就沒用)
我現在總算懂了什麼事residual了 這就是要decode的frame減掉reference的frame
接下來算是比較有進展 我發現有關macroblock的decode的東西都集中在hl_decode_mb_internal這個function
對 然後我知道h.264的idct是特別的idct雖然說要用dspContext中的h.264 idct function
不過這些function全部寫在(ffmpeg top)/libavcodec/h264idct.c中
不過沒發現quantization的function 有發現dc_dequantization_idct
接下來是deblock的相關內容是在hl_decode_mb_internal的最後幾行
沒仔細看 先看到這裡 快看完了 加油
現在trace到decode_nal_units這個重要的function
我現在知道nalu這是引進網路的概念
我也去翻了spec了 大概在200901的這一份的p.84 有10幾種的type
不過我實在不懂 到底每個是什麼 所以說我就上網找了教學文章
現在我大概知道nulu分成兩種 一種是VCL-NAL-unit跟non-VCL NAL-unit
VCL-NAL-unit是真正存影片的內容
non-VCL NAL-unit則是存其他的metadata 像是影片的參數sequenc跟slice header之類的參數
還有另一項是sei這是存關於影片的簡介跟版權之類的 不關影片的編碼的參數
好我終於知道什麼事CAVLC是什麼東西了 這是一種特殊的編碼技巧 會根據先在影片symbol出現的特性來改變
現在的variable length code table
接下來我開始trace nalu在我code中的使用
我發現主要用的的ualu的type只有幾種 7 8 5 1
6的話只用了一次 反正應該是影片的簡介吧
7是sequence parameter
8是picture parameter
5是沒有reference其他picture的picture
1是有reference其他picture的picture
雖然這邊1跟5是叫做coded clice of a non-IDR picture跟coded slice of an IDR picture
但是我看的結果 1跟5解出來就已經是一個frame了
不知道是為什麼
我看了一篇wiki上面附的H.264介紹的paper 我覺得寫得還不錯
全名是overview of the H.264/AVC video coding standard
他有寫到picture parameter set的功用 是要用在一個或多個picture上 所以說
這篇paper也有說到frame中可以多個slice group 為什麼會有很多個slice group勒
是因為他要有FMO的功能 flexiable macroblock ordering
這就是說slice不一定要從最左上角的macroblock開始 可以從任一個macroblock開始
這裡的frame跟picture是一樣的 就是一個畫面 好
然後field是一半的frame frame分成top field跟bottom field
這個意思就是偶數行是top field 奇數行是bottom field
如果是沒有分兩個field的frame 就是progressive field(根本就沒用)
我現在總算懂了什麼事residual了 這就是要decode的frame減掉reference的frame
接下來算是比較有進展 我發現有關macroblock的decode的東西都集中在hl_decode_mb_internal這個function
對 然後我知道h.264的idct是特別的idct雖然說要用dspContext中的h.264 idct function
不過這些function全部寫在(ffmpeg top)/libavcodec/h264idct.c中
不過沒發現quantization的function 有發現dc_dequantization_idct
接下來是deblock的相關內容是在hl_decode_mb_internal的最後幾行
沒仔細看 先看到這裡 快看完了 加油
2009年8月21日 星期五
trace h.264 in ffmpeg
目前算是看完(ffmpeg top)/libavcodec/h264pred.c跟h264pred.h這兩個檔
這兩個檔主要是做h.264中的 intra prediction的部份
雖然我大致上知道會有哪些prediction mode 但是不知道為什麼ffmpeg中的居然比spec還多
可能是最新的spec吧 我的spec是200901的 最新的是200903的樣子 這code是200903的
這邊的話 我有看過最初的spec跟200901的spec
我發現新的spec在chrominance的部份 由四個intra prediction變成8個
那我想luminance變多也是有可能的
大概是最新 這兩檔就這樣先結束
接下來我看了有關variable length code的部份
這部份的code在(ffmpeg top)/libavcodec/bitstream.c跟bitstream.h
這邊適用於所有的codec 是一種generic的vlc
我在這邊一直看到av_log2的function 我一直以為這是要建log檔
結果才發現這是取log然後2為底
這個function在(ffmpeg top)/libavutil/common.h
看到一個sei的東西 但是我不知道這是什麼
我發現了av_log這個function 在這裡我發現沒錯的話 這是真的在做log
他的實做在(ffmpeg top)/libavutil/log.c
以上是我看完decode_init的部份 但是還有一大堆是不懂的
這兩個檔主要是做h.264中的 intra prediction的部份
雖然我大致上知道會有哪些prediction mode 但是不知道為什麼ffmpeg中的居然比spec還多
可能是最新的spec吧 我的spec是200901的 最新的是200903的樣子 這code是200903的
這邊的話 我有看過最初的spec跟200901的spec
我發現新的spec在chrominance的部份 由四個intra prediction變成8個
那我想luminance變多也是有可能的
大概是最新 這兩檔就這樣先結束
接下來我看了有關variable length code的部份
這部份的code在(ffmpeg top)/libavcodec/bitstream.c跟bitstream.h
這邊適用於所有的codec 是一種generic的vlc
我在這邊一直看到av_log2的function 我一直以為這是要建log檔
結果才發現這是取log然後2為底
這個function在(ffmpeg top)/libavutil/common.h
看到一個sei的東西 但是我不知道這是什麼
我發現了av_log這個function 在這裡我發現沒錯的話 這是真的在做log
他的實做在(ffmpeg top)/libavutil/log.c
以上是我看完decode_init的部份 但是還有一大堆是不懂的
2009年8月20日 星期四
trace ffmpeg codec framework
我用的netbeans 6.7 以及他所附的debugger(其實他是用gdb)
其實netbeans現在還是有一個小bug 是跟macro有關的
就是有太多macro的檔案(特別是用一次macro用很多行的檔案)
他在右邊的status bar會顯示不正確 大概就這個bug
從main開始看 這main在哪裡勒
在(ffmpeg top)/ffmpeg.c 的最下面
從第一個function開始 avcodec_register_all() 在(ffmpeg top)/libavcodec/allcodec.c
這個function主要是將有經過configure決定需要用到的codec用linked list串起來
串起來的過程是在(ffmpeg top)/libavcodec/utils.c 有重要的global variable first_avcodec
串起來之前還會先call dsputil_static_init在(ffmpeg top)/libavcodec/dsputil.c
這是要初始化一些有關dsputil的gloabal variable
而configure中沒有說要的codec 因為根本就沒有compile object根本就沒有存在
當然就串不起來 這些他都是靠extern這個key word來達成的 這個我需要好好研究
像在這裡 就只有enable h.264 decoder跟 rawvideo encoder
他註冊的時候 就只會有h264_decoder跟rawvideo_encoder這兩個會分別註冊
他們的struct 分別在(ffmpeg top)/libavcodec/h264.c跟(ffmpeg top)/libavcodec/rawenc.c中
他們的type是AVCodec 在(ffmpeg top)/libavcodec/avcodec.h是他的宣告
好下一個是avdevice_register_all在(ffmpeg top)/libavdevice/alldevice.c
這裡做的是大致上跟上一個function是一樣的 將所有的avdevice用linked list串起來
這邊我用的是預設的configure 所以說串了一堆不知道的東西 以後有空再看
串的過程主要是call av_register_output_format跟av_register_input_format
在(ffmpeg top)/libavformat/utils.c
下一個是av_register_all在(ffmpeg top)/libavformat/allformats.c
他做的是跟前一個幾乎是一樣 是將muxer跟demuxer串起來(分別output跟input)
他是跟avdevice串在同兩條上面(first_iformat跟first_oformat)
這裡我一樣使用預設的設定
其實netbeans現在還是有一個小bug 是跟macro有關的
就是有太多macro的檔案(特別是用一次macro用很多行的檔案)
他在右邊的status bar會顯示不正確 大概就這個bug
從main開始看 這main在哪裡勒
在(ffmpeg top)/ffmpeg.c 的最下面
從第一個function開始 avcodec_register_all() 在(ffmpeg top)/libavcodec/allcodec.c
這個function主要是將有經過configure決定需要用到的codec用linked list串起來
串起來的過程是在(ffmpeg top)/libavcodec/utils.c 有重要的global variable first_avcodec
串起來之前還會先call dsputil_static_init在(ffmpeg top)/libavcodec/dsputil.c
這是要初始化一些有關dsputil的gloabal variable
而configure中沒有說要的codec 因為根本就沒有compile object根本就沒有存在
當然就串不起來 這些他都是靠extern這個key word來達成的 這個我需要好好研究
像在這裡 就只有enable h.264 decoder跟 rawvideo encoder
他註冊的時候 就只會有h264_decoder跟rawvideo_encoder這兩個會分別註冊
他們的struct 分別在(ffmpeg top)/libavcodec/h264.c跟(ffmpeg top)/libavcodec/rawenc.c中
他們的type是AVCodec 在(ffmpeg top)/libavcodec/avcodec.h是他的宣告
好下一個是avdevice_register_all在(ffmpeg top)/libavdevice/alldevice.c
這裡做的是大致上跟上一個function是一樣的 將所有的avdevice用linked list串起來
這邊我用的是預設的configure 所以說串了一堆不知道的東西 以後有空再看
串的過程主要是call av_register_output_format跟av_register_input_format
在(ffmpeg top)/libavformat/utils.c
下一個是av_register_all在(ffmpeg top)/libavformat/allformats.c
他做的是跟前一個幾乎是一樣 是將muxer跟demuxer串起來(分別output跟input)
他是跟avdevice串在同兩條上面(first_iformat跟first_oformat)
這裡我一樣使用預設的設定
trace mpeg1 video in ffmpeg
為什麼會突然要trace mpeg1勒 因為我忽然想一想發現我不大懂H.264的codec
應該至少先了解H.264這樣才可以開始trace
但是我還是要trace一些ffmpeg的部份才對 我就想到我有寫過mpeg1的decoder
那不如就先trace在ffmpeg中的mpeg1 這樣可以很快了解ffmpeg是怎麼處理各種codec
這樣以後看H.264也會比較好 更快找到有用的東西
好 我現在就來找找mpeg1在ffmpeg中是什麼名稱的codec
有發現了幾個好像是的 mpeg1video, mpeg1video_vdpau, mpegvideo
以上是看起來比較像的codec
我查了一下mpeg1video_vdpau 後面這個詞是個特殊的詞
vdpau是指video decode and presentation API for Unix
這是ndidia設計的API 主要是為了他的GPU設計的 這樣使他的GPU可以做decode的加速
目前試的結果是mpeg1video可以成功deocde mpeg1的video就暫時用這個好了
反正他真的可以decode
不過這裡要注意的是我configure的時候 又很聰明的將encoder全部disable 居然不能decode
所以要記得enable rawvideo這個encoder 才不會不能轉成raw data
後來我發現ffmpeg中mpeg跟h.264取名的小特性
通常encoder都會是以格式來命名
但是decoder就是用格式後面再接其他字 這些字會是代表用了什麼特殊的東西 如vdpau xvmc
(後來發現這好像沒什麼用)
應該至少先了解H.264這樣才可以開始trace
但是我還是要trace一些ffmpeg的部份才對 我就想到我有寫過mpeg1的decoder
那不如就先trace在ffmpeg中的mpeg1 這樣可以很快了解ffmpeg是怎麼處理各種codec
這樣以後看H.264也會比較好 更快找到有用的東西
好 我現在就來找找mpeg1在ffmpeg中是什麼名稱的codec
有發現了幾個好像是的 mpeg1video, mpeg1video_vdpau, mpegvideo
以上是看起來比較像的codec
我查了一下mpeg1video_vdpau 後面這個詞是個特殊的詞
vdpau是指video decode and presentation API for Unix
這是ndidia設計的API 主要是為了他的GPU設計的 這樣使他的GPU可以做decode的加速
目前試的結果是mpeg1video可以成功deocde mpeg1的video就暫時用這個好了
反正他真的可以decode
不過這裡要注意的是我configure的時候 又很聰明的將encoder全部disable 居然不能decode
所以要記得enable rawvideo這個encoder 才不會不能轉成raw data
後來我發現ffmpeg中mpeg跟h.264取名的小特性
通常encoder都會是以格式來命名
但是decoder就是用格式後面再接其他字 這些字會是代表用了什麼特殊的東西 如vdpau xvmc
(後來發現這好像沒什麼用)
2009年8月18日 星期二
trace ffmpeg裡面的H.264相關code I
我覺得這樣直接看code好累喔
所以我就用別的方法看code
本來想用valgrind來直接profiling整個程式
但是這樣只能知道在程式哪裡花最多的時間 這應該是我下一步要做的事
好吧 就用debugger來看code吧
就是用netbeans來看code(第一次用ide來看code)
其實上網找了一下 沒發現有人將ffmpeg放到netbeans上開發(可能是隨便放都放得上去..)
但是這時出現了一個問題 就是ffmpeg是一個要先configure才能make的程式
ffmpeg再configure的時候後會產生一個config.h的檔 沒有這個檔是沒辦法成功compile的
我一時之間想不到比較好的方法 就先用confiure產生了config.h 就將這個檔寫死 就當成source code原有的檔
蠻想知道如果是一個要先configure再make的project 要怎麼放到netbeans 才會比較好
我現在的這種放法 就會鎖死configure 但是開發的時候好像也會只用一種configure
好我放上去了 主要就是選擇c/c++ project with existing source
接下來這邊的的設定很簡單 我設定的是將source跟編譯出來的object跟執行檔放在同樣的資料夾下
這是很糟的方式 全部都混在一起 但是比較不會錯
然後我不小心發現netbeans可以接受先configure再make的編譯方式....(其中一個選項)
一完成新project的設定 他馬上就開始make之後就是產code assistance的東西
但是這邊會有一些failed的 我不太清楚原因 我猜可能是我的configure會讓他少編譯很多東西
結果導致一些code assistance做不出來 不過我是用來trace程式的 就隨便他了
這樣就是設定好了
我就要開始利用netbeans來trace code了 這時發現他居然不理breakpoint
我看了一下 因為makefile是用ffmpeg的makefile 所以說我必須要再compile的option中開啟debug來
找了一下不知道再那 突然想到我在configure的時候有設一個option --disable-debug
這原本是要讓binary變小的(少compile debug information)
我就將他去掉 果然就可以使用debug了
所以我就用別的方法看code
本來想用valgrind來直接profiling整個程式
但是這樣只能知道在程式哪裡花最多的時間 這應該是我下一步要做的事
好吧 就用debugger來看code吧
就是用netbeans來看code(第一次用ide來看code)
其實上網找了一下 沒發現有人將ffmpeg放到netbeans上開發(可能是隨便放都放得上去..)
但是這時出現了一個問題 就是ffmpeg是一個要先configure才能make的程式
ffmpeg再configure的時候後會產生一個config.h的檔 沒有這個檔是沒辦法成功compile的
我一時之間想不到比較好的方法 就先用confiure產生了config.h 就將這個檔寫死 就當成source code原有的檔
蠻想知道如果是一個要先configure再make的project 要怎麼放到netbeans 才會比較好
我現在的這種放法 就會鎖死configure 但是開發的時候好像也會只用一種configure
好我放上去了 主要就是選擇c/c++ project with existing source
接下來這邊的的設定很簡單 我設定的是將source跟編譯出來的object跟執行檔放在同樣的資料夾下
這是很糟的方式 全部都混在一起 但是比較不會錯
然後我不小心發現netbeans可以接受先configure再make的編譯方式....(其中一個選項)
一完成新project的設定 他馬上就開始make之後就是產code assistance的東西
但是這邊會有一些failed的 我不太清楚原因 我猜可能是我的configure會讓他少編譯很多東西
結果導致一些code assistance做不出來 不過我是用來trace程式的 就隨便他了
這樣就是設定好了
我就要開始利用netbeans來trace code了 這時發現他居然不理breakpoint
我看了一下 因為makefile是用ffmpeg的makefile 所以說我必須要再compile的option中開啟debug來
找了一下不知道再那 突然想到我在configure的時候有設一個option --disable-debug
這原本是要讓binary變小的(少compile debug information)
我就將他去掉 果然就可以使用debug了
2009年8月16日 星期日
makefile for u-boot image
在等compile的時候 我將寫了一個u-boot script的makefile
就順便當作我看makefile manual的筆記吧
tftpDirectory := /var/lib/tftpboot
uBootImage := nfsLinux.img hdLinux.img
.PHONY : all clean
all: $(uBootImage)
@echo "finish make u-boot image"
$(uBootImage) : %.img : %
mkimage -T script -C none -n "set $<" -d $< $@
cp $@ $(tftpDirectory)
clean:
rm *.img
rm $(tftpDirectory)/*.img
一開始定義兩個variable 這裡定義的方式是用:= 這表示是立即要輸入進去兩個variable
接下來出現.PHONY這是代表後面寫得clean跟all 是特別的字
寫all跟clean的意義是要跟make說
不會因為檔案名稱是clean跟all存在檔案系統中 就根據檔案系統中的clean跟all的時間來決定是不是要執行下面的指令
接下來的all是在所有u-boot image都要執行完 才執行的 這裡只是輸出一些結束資訊
接下這行是根據每個不同的img 各自執行自己對應的command
這裡用的是makefile中的static pattern rule這就去查makefile的manual
重要的是他的command用了$<$@
$<這是指:過來的第一個名稱也就是這裡%所代表的東西
$@這是指:左邊的檔名也就是nfsLinux.img或hdLinux.img
這裡還要注意的是當reference的時候要記得要家括號 也就是要打$(tftpDirectory)不能打$tftpDirectory
大致上就是這些
就順便當作我看makefile manual的筆記吧
tftpDirectory := /var/lib/tftpboot
uBootImage := nfsLinux.img hdLinux.img
.PHONY : all clean
all: $(uBootImage)
@echo "finish make u-boot image"
$(uBootImage) : %.img : %
mkimage -T script -C none -n "set $<" -d $< $@
cp $@ $(tftpDirectory)
clean:
rm *.img
rm $(tftpDirectory)/*.img
一開始定義兩個variable 這裡定義的方式是用:= 這表示是立即要輸入進去兩個variable
接下來出現.PHONY這是代表後面寫得clean跟all 是特別的字
寫all跟clean的意義是要跟make說
不會因為檔案名稱是clean跟all存在檔案系統中 就根據檔案系統中的clean跟all的時間來決定是不是要執行下面的指令
接下來的all是在所有u-boot image都要執行完 才執行的 這裡只是輸出一些結束資訊
接下這行是根據每個不同的img 各自執行自己對應的command
這裡用的是makefile中的static pattern rule這就去查makefile的manual
重要的是他的command用了$<$@
$<這是指:過來的第一個名稱也就是這裡%所代表的東西
$@這是指:左邊的檔名也就是nfsLinux.img或hdLinux.img
這裡還要注意的是當reference的時候要記得要家括號 也就是要打$(tftpDirectory)不能打$tftpDirectory
大致上就是這些
ffmpeg for l4linux ||
今天我就將ffmpeg擺到l4linux上了
一開始我先試試看要解的H.264檔解出來會有多大
本來想說解解看成rawvideo(ffmpeg option)看看 結果解出來 4MB變成快200MB這當然不行
後來想說解成其他格式好了 雖然會多一個encode但是至少檔案不會太大
結果居然不能解 我明明只有disable全部的decoder(除了H.264) 都沒有動encoder阿
不過後來想想還蠻合理的 因為大部分的encoder裡面其實都有包含decoder所以說取消decoder當然不行encode了
最後其實我是講H.264解成mpeg1video的檔案(沒有audio檔) 4MB解成3MB多 這很合理 mpeg裡面的資訊比較少
後來我為了要解快一點 我又將影片檔截成原來的1/4 這樣會解比較快
接下來就真的放到l4linux上解了 在上面解的很順利 後來用serial output也蠻容易的
當然也很順利的驗證是正確的 uuencode跟uudecode真棒
後來的ffmpeg的compile選項在這裡
--arch=armv5 --cross-prefix=arm_v5t_le- --enable-cross-compile --prefix=/home/liuin/ffmpeg/install/ --enable-static --disable-shared --enable-gpl --disable-stripping --disable-network --disable-ipv6 --enable-small --disable-parsers --disable-debug --disable-ffplay --disable-ffserver --disable-decoders --enable-decoder=h264 --enable-decoder=mpeg1video --disable-encoders --enable-encoder=mpeg1video 又差別的是最後的五個 decode只能是h.264跟mpeg1video
而encode只能是mpeg1video
以下是講解ffmpeg的執行檔的interface (不自己紀錄一下 下次很容易忘了)
主要的格式是
ffmpeg [[infile options][-i infile]]...{[outfile optioins] outputfile}
以上是抄官網上的
主要的設法是前面會指定輸入的檔名 也可以在檔名的前面有多加註一些選項(沒用過)
接下來是輸出的選項跟輸入的檔名 很容易理解
以下是一個例子 將H.264檔 轉換 成mpeg1的video(只有video而已 就算H.264檔中有audio也不管)
ffmpeg -i hello.mp4 -f mpeg1video hello.mpeg
這裡我的輸入檔是hello.mp4 輸入檔沒有多給任何的選項
輸出檔指定格式是mpeg1video(這是ffmpeg定的名稱) 輸出的檔名是hello.mpeg
好 那我要怎麼知道有哪些格式可以選
ffmpeg -formats
打以上這行就會有可以用的格式
一開始我先試試看要解的H.264檔解出來會有多大
本來想說解解看成rawvideo(ffmpeg option)看看 結果解出來 4MB變成快200MB這當然不行
後來想說解成其他格式好了 雖然會多一個encode但是至少檔案不會太大
結果居然不能解 我明明只有disable全部的decoder(除了H.264) 都沒有動encoder阿
不過後來想想還蠻合理的 因為大部分的encoder裡面其實都有包含decoder所以說取消decoder當然不行encode了
最後其實我是講H.264解成mpeg1video的檔案(沒有audio檔) 4MB解成3MB多 這很合理 mpeg裡面的資訊比較少
後來我為了要解快一點 我又將影片檔截成原來的1/4 這樣會解比較快
接下來就真的放到l4linux上解了 在上面解的很順利 後來用serial output也蠻容易的
當然也很順利的驗證是正確的 uuencode跟uudecode真棒
後來的ffmpeg的compile選項在這裡
--arch=armv5 --cross-prefix=arm_v5t_le- --enable-cross-compile --prefix=/home/liuin/ffmpeg/install/ --enable-static --disable-shared --enable-gpl --disable-stripping --disable-network --disable-ipv6 --enable-small --disable-parsers --disable-debug --disable-ffplay --disable-ffserver --disable-decoders --enable-decoder=h264 --enable-decoder=mpeg1video --disable-encoders --enable-encoder=mpeg1video 又差別的是最後的五個 decode只能是h.264跟mpeg1video
而encode只能是mpeg1video
以下是講解ffmpeg的執行檔的interface (不自己紀錄一下 下次很容易忘了)
主要的格式是
ffmpeg [[infile options][-i infile]]...{[outfile optioins] outputfile}
以上是抄官網上的
主要的設法是前面會指定輸入的檔名 也可以在檔名的前面有多加註一些選項(沒用過)
接下來是輸出的選項跟輸入的檔名 很容易理解
以下是一個例子 將H.264檔 轉換 成mpeg1的video(只有video而已 就算H.264檔中有audio也不管)
ffmpeg -i hello.mp4 -f mpeg1video hello.mpeg
這裡我的輸入檔是hello.mp4 輸入檔沒有多給任何的選項
輸出檔指定格式是mpeg1video(這是ffmpeg定的名稱) 輸出的檔名是hello.mpeg
好 那我要怎麼知道有哪些格式可以選
ffmpeg -formats
打以上這行就會有可以用的格式
2009年8月15日 星期六
put ffmpeg on l4linux
一開始因為我的l4linux上面 只有ram disk 所以說在上面解H.264的話 應該要準備一個答案在上面
所以說我先在別的地方產生出這個答案 就用原本davinci上的linux來產生
還有因為compiler不同的關係 所以說我打算davinci上面的linux是用nfs掛載的
好現在的工作很簡單 掛載linux的root在nfs上面
一開始我一直掛載不上去 後來才發現是因為我在linux上面的bootargs設錯了
以下這個才是正確的bootargs 總共有三的u-boot的command
setenv nfshost 192.168.48.244
setenv rootpath /home/liuin/fm/filesys
setenv bootargs console=ttyS0,115200n8 noinitrd rw ip=192.168.48.243:192.168.48.244::255.255.255.0::eth0:off root=/dev/nfs nfsroot=${nfshost}:${rootpath},nolock mem=120M
這裡主要的差別是ip的部份 我一開始是用dhcp 但是我這裡沒有dhcp的server 所以說他抓不到我的host
ip第一個是client的ip 第二個是host的ip 第三個是gateway不知道要設什麼 第四個是netmask(亂設)
第五個是名稱 第六個是哪一張網卡 第七個不知道(再查)
掛在nfs後 我本來算在上面執行 由另一個compiler所編譯出來的ffmpeg
我本來以為換掉原本file system中的shared library就可以了
我就照者執行的時候抓不到library一個一個替換掉了
替換到一半就發現居然ls不能用了 愈替換跑出愈來愈多需要的library
我就發現這樣不行 ffmpeg不能在這裡執行
(我ffmpeg的library是拿compile他的compiler的library來用)
這個時候我發現我沒辦法產生出ffmpeg decode的答案
不過這時我早就想到了解決的方法了
因為l4linux上面只有ram disk 好吧 沒辦法就用serial output來output影片檔吧
但是影片檔是有編碼過的 而且serial outupt不知道是不是只能output ASCII
我就想到可以用xxd將影片檔變成xxd的輸出檔 在把serial output存成檔來做處理
不過這時候發現 l4linux上面的ramdisk好像沒有xxd
還好這時發現了uuencode跟uudecode這兩個好東西
先來說明一下uuencode跟uudecode
這兩個東西主要是將binary轉換成ASCII來輸出(完全就是我要的檔案)
uuencode是binary => ASCII
uudecode是ASCII => binary
在ubuntu預設是沒有安裝的 要安裝sharutils 才會有
接下來是這兩個指令的使用方法(主要是uuencode)
假設我現在有一個binary a要轉換成只有ASCII的檔b 就可以打以下的指令
uuencode a <> b
這裡會覺得很奇怪 為什麼a要打兩次 因為uuencode預設輸入跟輸出是std input跟std output
但是在編碼後的b檔中 又要有a的名稱 所以說還要給uuencode檔名作為參數
傳完後我要將b變回a
uudecode b
這樣就行 不過要注意 解碼完會產生一個跟a一模一樣的檔 所以說解碼的資料夾不能也有檔的檔名是a
如果說minicom要將serial output存起來的話
要多設一個flag是-C 檔名 這樣就會紀錄下serial output了
有了以上的工具 我就可以不需要先做答案在l4linux的ram disk中了
將ffmpeg擺到ram disk還蠻容易的
因為就利用學長做好的makefile就好 初步執行一下 可以產生出ffmpeg的help資訊
就作到這裡
所以說我先在別的地方產生出這個答案 就用原本davinci上的linux來產生
還有因為compiler不同的關係 所以說我打算davinci上面的linux是用nfs掛載的
好現在的工作很簡單 掛載linux的root在nfs上面
一開始我一直掛載不上去 後來才發現是因為我在linux上面的bootargs設錯了
以下這個才是正確的bootargs 總共有三的u-boot的command
setenv nfshost 192.168.48.244
setenv rootpath /home/liuin/fm/filesys
setenv bootargs console=ttyS0,115200n8 noinitrd rw ip=192.168.48.243:192.168.48.244::255.255.255.0::eth0:off root=/dev/nfs nfsroot=${nfshost}:${rootpath},nolock mem=120M
這裡主要的差別是ip的部份 我一開始是用dhcp 但是我這裡沒有dhcp的server 所以說他抓不到我的host
ip第一個是client的ip 第二個是host的ip 第三個是gateway不知道要設什麼 第四個是netmask(亂設)
第五個是名稱 第六個是哪一張網卡 第七個不知道(再查)
掛在nfs後 我本來算在上面執行 由另一個compiler所編譯出來的ffmpeg
我本來以為換掉原本file system中的shared library就可以了
我就照者執行的時候抓不到library一個一個替換掉了
替換到一半就發現居然ls不能用了 愈替換跑出愈來愈多需要的library
我就發現這樣不行 ffmpeg不能在這裡執行
(我ffmpeg的library是拿compile他的compiler的library來用)
這個時候我發現我沒辦法產生出ffmpeg decode的答案
不過這時我早就想到了解決的方法了
因為l4linux上面只有ram disk 好吧 沒辦法就用serial output來output影片檔吧
但是影片檔是有編碼過的 而且serial outupt不知道是不是只能output ASCII
我就想到可以用xxd將影片檔變成xxd的輸出檔 在把serial output存成檔來做處理
不過這時候發現 l4linux上面的ramdisk好像沒有xxd
還好這時發現了uuencode跟uudecode這兩個好東西
先來說明一下uuencode跟uudecode
這兩個東西主要是將binary轉換成ASCII來輸出(完全就是我要的檔案)
uuencode是binary => ASCII
uudecode是ASCII => binary
在ubuntu預設是沒有安裝的 要安裝sharutils 才會有
接下來是這兩個指令的使用方法(主要是uuencode)
假設我現在有一個binary a要轉換成只有ASCII的檔b 就可以打以下的指令
uuencode a <> b
這裡會覺得很奇怪 為什麼a要打兩次 因為uuencode預設輸入跟輸出是std input跟std output
但是在編碼後的b檔中 又要有a的名稱 所以說還要給uuencode檔名作為參數
傳完後我要將b變回a
uudecode b
這樣就行 不過要注意 解碼完會產生一個跟a一模一樣的檔 所以說解碼的資料夾不能也有檔的檔名是a
如果說minicom要將serial output存起來的話
要多設一個flag是-C 檔名 這樣就會紀錄下serial output了
有了以上的工具 我就可以不需要先做答案在l4linux的ram disk中了
將ffmpeg擺到ram disk還蠻容易的
因為就利用學長做好的makefile就好 初步執行一下 可以產生出ffmpeg的help資訊
就作到這裡
u-boot的script
因為u-boot的command line輸入實在是不方便
舉例像他沒有history這樣要看前幾個指令是打什麼還蠻麻煩的
不過這其實是還好 更麻煩的是如過要打很長的指令 打到後面就會不見了(他不會跳到下一行...)
這裡其實會有一個方法 只針對setenv用(如果不想寫u-boot script的話)
常見的就是setenv bootargs console=ttyS0,115200n8........(超長)
這樣的話可以用setenv bootargs concole=ttyS0,115200n8(後面還有 但是先打到這裡)
下一行 setenv bootargs ${bootargs} noinitrd....(還有很長 但是可以這樣串起來)
這樣的話可以解決 有時候setenv超長的問題 但是在printenv的時候 還是會因為太長看不到
還是用u-boot script來解決吧
需要的東西mkimage這個utility 這樣在u-boot裡面的tool(基本上toolchain都會有 compile kernel完也要用)
就將需要的u-boot的command寫在一個檔案
以下就會是一個u-boot的script example 名稱是hdLinux
echo ====== set linux bootargs ======
setenv bootargs console=ttyS0,115200n8 noinitrd rw ip=dhcp root=/dev/hda1 mem=120M
printenv bootargs
寫完之後 就是要把他變成u-boot上面可以執行的script
接者打以下這行
mkimage -T script -C none -n "set Hard disk linux" -d hdLinux hdLinux.img
說明一下
-T是代表這個image檔是什麼type 這裡是script檔
-C是代表這個image檔是用什麼方法壓縮 這裡是沒有壓縮(none)
-n是給這個image檔 取個名字 這裡是根據功能來取名
-d是製作這個image要用的檔案 可以不只一個 這是是用剛剛上面寫得script hdLinux
最後面是image產稱出來的檔案名稱
在這的話 為什麼會要給image取個名稱 最後又要給個檔名?
因為在u-boot裡面是沒有檔案系統的 將image放進去的時候是直接load進memory中
所以說要知道現在memory是什麼檔 在這個load進memory的image裡面必須要有個名稱 讓我們知道是什麼檔
而最後的檔名是要給host端來辨別的
最好u-boot的script 接下來就用tftp將檔案放到u-boot上再來執行
以下就是可能打的指令
tftp 0x85000000 hdLinux
autoscr 0x85000000(不能用bootm 0x85000000 他不會理你的)
這樣就可以執行剛剛寫好的u-boot script
舉例像他沒有history這樣要看前幾個指令是打什麼還蠻麻煩的
不過這其實是還好 更麻煩的是如過要打很長的指令 打到後面就會不見了(他不會跳到下一行...)
這裡其實會有一個方法 只針對setenv用(如果不想寫u-boot script的話)
常見的就是setenv bootargs console=ttyS0,115200n8........(超長)
這樣的話可以用setenv bootargs concole=ttyS0,115200n8(後面還有 但是先打到這裡)
下一行 setenv bootargs ${bootargs} noinitrd....(還有很長 但是可以這樣串起來)
這樣的話可以解決 有時候setenv超長的問題 但是在printenv的時候 還是會因為太長看不到
還是用u-boot script來解決吧
需要的東西mkimage這個utility 這樣在u-boot裡面的tool(基本上toolchain都會有 compile kernel完也要用)
就將需要的u-boot的command寫在一個檔案
以下就會是一個u-boot的script example 名稱是hdLinux
echo ====== set linux bootargs ======
setenv bootargs console=ttyS0,115200n8 noinitrd rw ip=dhcp root=/dev/hda1 mem=120M
printenv bootargs
寫完之後 就是要把他變成u-boot上面可以執行的script
接者打以下這行
mkimage -T script -C none -n "set Hard disk linux" -d hdLinux hdLinux.img
說明一下
-T是代表這個image檔是什麼type 這裡是script檔
-C是代表這個image檔是用什麼方法壓縮 這裡是沒有壓縮(none)
-n是給這個image檔 取個名字 這裡是根據功能來取名
-d是製作這個image要用的檔案 可以不只一個 這是是用剛剛上面寫得script hdLinux
最後面是image產稱出來的檔案名稱
在這的話 為什麼會要給image取個名稱 最後又要給個檔名?
因為在u-boot裡面是沒有檔案系統的 將image放進去的時候是直接load進memory中
所以說要知道現在memory是什麼檔 在這個load進memory的image裡面必須要有個名稱 讓我們知道是什麼檔
而最後的檔名是要給host端來辨別的
最好u-boot的script 接下來就用tftp將檔案放到u-boot上再來執行
以下就是可能打的指令
tftp 0x85000000 hdLinux
autoscr 0x85000000(不能用bootm 0x85000000 他不會理你的)
這樣就可以執行剛剛寫好的u-boot script
2009年8月14日 星期五
u-boot中重要的指令
在davinci板子上的u-boot是1.1.4的版本(我不確定是不是原本就是這一版)
(網路上有查到現在新的u-boot有支援davinci)
不過因為是這一版 有些指令是沒有的(太新 或是沒有提供)
這裡主要是看了一些能夠看到有關板子上的資訊的指令(括號裡面的是縮寫)
bdinfo(bdi) coninfo(conin) flinfo(fli) iminfo(imi) help(h)(?)
感覺這些都沒什麼特別 他網頁上的文件還蠻詳細的
http://www.denx.de/wiki/view/DULG/UBootCmdGroupInfo
再來看到的是有關memory的指令
base crc32 cmp cp mm mtest mw nm loop
這裡只有md感覺起來會比較有用 可以看現在個位置的memory
http://www.denx.de/wiki/view/DULG/UBootCmdGroupMemory
接者是flash有關的指令 這邊我沒看 還暫時不會用到
http://www.denx.de/wiki/view/DULG/UBootCmdGroupFlash
下一項是關於執行方面的指令
這部份看到了一個還不錯的東西
像之前在u-boot打指令的時候 會覺得超不方便的 因為早就用習慣bash了
u-boot的prompt又很難用 雖然說好像有一個東西叫Hush shell在u-boot上
但是這不是我編的u-boot 好像是要在configure裡面設定 所以應該是沒有hush
這裡有個東西是autoscr可以做u-boot上面的script 太好了 這樣就不用打一串指令
他需要在host端上面有個u-boot附的utility mkimage
這時我就發現davinci上面的toolchain做的很好 居然已經有包進去了
他擺得位置在/opt/mv_pro_4.0/montavista/pro/bin/mkimage
不過後來才發現這東西一定會有 不然u-boot沒辦法執行image
目前還沒有使用過 但感覺不錯
執行方面的指令還有go跟bootm 這些就直接看網站
http://www.denx.de/wiki/view/DULG/UBootCmdGroupExec
這一項是網路相關的指令 這裡只列出感覺重要的指令
bootp跟tftpboot(tftp)
其他看網站http://www.denx.de/wiki/view/DULG/UBootCmdGroupDownload
重要的環境變數指令
有printenv saveenv setenv(set) run bootd
要注意的是set (環境變數名稱) 這樣打是刪掉變數
這裡網站寫得文件很詳細 直接看網站
http://www.denx.de/wiki/view/DULG/UBootCmdGroupEnvironment
這邊還有不知道怎麼分類的指令
echo reset sleep version help
這些很重要 應該沒人不知道
網站http://www.denx.de/wiki/view/DULG/UBootCmdGroupMisc
指令方面沒有了
還有兩個重要的網頁
內建環境變數的介紹 http://www.denx.de/wiki/view/DULG/UBootEnvVariables
u-boot script的介紹 http://www.denx.de/wiki/view/DULG/UBootScripts
(這裡有mkimage的example)
(mkimage中好像有可以做mutli boot的選項 這在microkernel會有用)
大致上重要的就是這些了
(網路上有查到現在新的u-boot有支援davinci)
不過因為是這一版 有些指令是沒有的(太新 或是沒有提供)
這裡主要是看了一些能夠看到有關板子上的資訊的指令(括號裡面的是縮寫)
bdinfo(bdi) coninfo(conin) flinfo(fli) iminfo(imi) help(h)(?)
感覺這些都沒什麼特別 他網頁上的文件還蠻詳細的
http://www.denx.de/wiki/view/DULG/UBootCmdGroupInfo
再來看到的是有關memory的指令
base crc32 cmp cp mm mtest mw nm loop
這裡只有md感覺起來會比較有用 可以看現在個位置的memory
http://www.denx.de/wiki/view/DULG/UBootCmdGroupMemory
接者是flash有關的指令 這邊我沒看 還暫時不會用到
http://www.denx.de/wiki/view/DULG/UBootCmdGroupFlash
下一項是關於執行方面的指令
這部份看到了一個還不錯的東西
像之前在u-boot打指令的時候 會覺得超不方便的 因為早就用習慣bash了
u-boot的prompt又很難用 雖然說好像有一個東西叫Hush shell在u-boot上
但是這不是我編的u-boot 好像是要在configure裡面設定 所以應該是沒有hush
這裡有個東西是autoscr可以做u-boot上面的script 太好了 這樣就不用打一串指令
他需要在host端上面有個u-boot附的utility mkimage
這時我就發現davinci上面的toolchain做的很好 居然已經有包進去了
他擺得位置在/opt/mv_pro_4.0/montavista/pro/bin/mkimage
不過後來才發現這東西一定會有 不然u-boot沒辦法執行image
目前還沒有使用過 但感覺不錯
執行方面的指令還有go跟bootm 這些就直接看網站
http://www.denx.de/wiki/view/DULG/UBootCmdGroupExec
這一項是網路相關的指令 這裡只列出感覺重要的指令
bootp跟tftpboot(tftp)
其他看網站http://www.denx.de/wiki/view/DULG/UBootCmdGroupDownload
重要的環境變數指令
有printenv saveenv setenv(set) run bootd
要注意的是set (環境變數名稱) 這樣打是刪掉變數
這裡網站寫得文件很詳細 直接看網站
http://www.denx.de/wiki/view/DULG/UBootCmdGroupEnvironment
這邊還有不知道怎麼分類的指令
echo reset sleep version help
這些很重要 應該沒人不知道
網站http://www.denx.de/wiki/view/DULG/UBootCmdGroupMisc
指令方面沒有了
還有兩個重要的網頁
內建環境變數的介紹 http://www.denx.de/wiki/view/DULG/UBootEnvVariables
u-boot script的介紹 http://www.denx.de/wiki/view/DULG/UBootScripts
(這裡有mkimage的example)
(mkimage中好像有可以做mutli boot的選項 這在microkernel會有用)
大致上重要的就是這些了
l4linux h.264 decoder & u-boot study
我因為現在的l4linux上面沒有filesys 上面現在有的東西只有ram disk
而如果說我現在在ram disk解影片檔(H.264)解出來 我也沒辦法知道他是不是解對了
所以說我現在想要把影片先在別的地方先解好 也放到ram disk上面
這樣l4linux上面的H.264檔解完 就有可以對照的影片檔
這樣就可以驗證這是不是對的
現在的問題就是我要在哪裡先解好這個影片檔 如果說在我的PC上解好
可是我的東西是在davinci上跑 這樣可能會因為arm跟x86的關係會是不一樣的
為了防止這種因為浮點數的關係造成檔案不一樣
我想就先用原本就有在板子上的linux來解H.264將檔解成wmv或是其他格式
在將H.264跟wmv或是另外一種格式放到l4linux的ram disk上
看看H.264解出來的是不是跟原本在ram disk上面的wmv一不一樣
如果說不一樣的話 這就好玩...
現在要做的事讓我現在compile完的ffmpeg放到板子上面原本就有的linux
但是因為我這個ffmpeg是用另一個叫新版的compiler而linux是相對舊的compiler
板子上的file system中的 shared library是舊compiler做出來的
我的ffmpeg當然不能不能link
所以說直接放上去世絕對不work的
我打算替換掉 原本在板子上的file system中的shared library看可不可以執行
不過我剛開始就卡住 我本來以為板子上的file system就擺l4linux的ram disk就好
當然是不能執行的了 決定就改原本板子附的nfs的file system
這樣還不用改hard disk中的file system
以上這部份一開始做就會遇到u-boot的問題 重點就是我不熟u-boot
我還一直把u-boot當作bash來用 狂按tab鍵跟上鍵
u-boot的prompt好像都沒有這些功能 不知道是不是因為serial的關係
除了不能按tab(真的跑出tab而不是跳出其他可能的選項)上鍵(不會跑出上一個指令)
還不能在打到一半的command跑到前面插入字元(以serial來解釋還蠻合理的)
以下就是我去看了u-boot的一些會用的到command(我總不行一直不熟u-boot)
要注意的是在u-boot中有很多command都會有縮寫
還有就是很多的command都會因為不同的u-boot的configure而有不同的功用
有看到一個不錯的東西autoscr 這是可以在u-boot上面寫script 這真是太好了
好像要去用mkimage我不知道為什麼 我的PATH居然有耶
不過autoscr再過幾個越會被source取代
先在到這裡 之後還有寫更多command
而如果說我現在在ram disk解影片檔(H.264)解出來 我也沒辦法知道他是不是解對了
所以說我現在想要把影片先在別的地方先解好 也放到ram disk上面
這樣l4linux上面的H.264檔解完 就有可以對照的影片檔
這樣就可以驗證這是不是對的
現在的問題就是我要在哪裡先解好這個影片檔 如果說在我的PC上解好
可是我的東西是在davinci上跑 這樣可能會因為arm跟x86的關係會是不一樣的
為了防止這種因為浮點數的關係造成檔案不一樣
我想就先用原本就有在板子上的linux來解H.264將檔解成wmv或是其他格式
在將H.264跟wmv或是另外一種格式放到l4linux的ram disk上
看看H.264解出來的是不是跟原本在ram disk上面的wmv一不一樣
如果說不一樣的話 這就好玩...
現在要做的事讓我現在compile完的ffmpeg放到板子上面原本就有的linux
但是因為我這個ffmpeg是用另一個叫新版的compiler而linux是相對舊的compiler
板子上的file system中的 shared library是舊compiler做出來的
我的ffmpeg當然不能不能link
所以說直接放上去世絕對不work的
我打算替換掉 原本在板子上的file system中的shared library看可不可以執行
不過我剛開始就卡住 我本來以為板子上的file system就擺l4linux的ram disk就好
當然是不能執行的了 決定就改原本板子附的nfs的file system
這樣還不用改hard disk中的file system
以上這部份一開始做就會遇到u-boot的問題 重點就是我不熟u-boot
我還一直把u-boot當作bash來用 狂按tab鍵跟上鍵
u-boot的prompt好像都沒有這些功能 不知道是不是因為serial的關係
除了不能按tab(真的跑出tab而不是跳出其他可能的選項)上鍵(不會跑出上一個指令)
還不能在打到一半的command跑到前面插入字元(以serial來解釋還蠻合理的)
以下就是我去看了u-boot的一些會用的到command(我總不行一直不熟u-boot)
要注意的是在u-boot中有很多command都會有縮寫
還有就是很多的command都會因為不同的u-boot的configure而有不同的功用
有看到一個不錯的東西autoscr 這是可以在u-boot上面寫script 這真是太好了
好像要去用mkimage我不知道為什麼 我的PATH居然有耶
不過autoscr再過幾個越會被source取代
先在到這裡 之後還有寫更多command
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是在哪裡用的
要怎麼去掉沒用到的
目前看來是沒什麼問題的 都有成功跑起來 再接下來是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這個 但是實在不知道 他是怎麼設的
結果看一看好像沒有 好像一定是要包成一個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沒有
目前就看到這裡 其他之後再看