2009年10月5日 星期一

verilog文件跟簡單語法

其實之前就有寫過verilog了 但是之前都沒有認真去看verilog的語法
就是只要可以work就可以了  所以現在還有一大堆語法都不熟
雖然說基本的語法都會 但是只限於寫正常module 但是像testbench這種就完全不行
現在我就來好好看看這些testbench的東西吧

首先我必須知道要去哪裡找doucment來看
我上網找了很久總算知道要找了(其實網路上的文件一大堆 但是我習慣看最官方的)
其實很簡單 去modelsim的網站找user manual來看最好
我用的是modelsim SE 所以就用modelsim SE User's Manual
網址在這裡http://portal.model.com/modelsim/resources/references/modelsim_se_user.pdf

好就從`timescale開始看吧
其實我發現在User's Manual寫得很好
重點就是每一個檔案都要有`timescale 否則就會出現compile error等等的問題

2009年10月4日 星期日

ffmpeg中的禁用function

在ffmpeg中不能使用一些特定的function如printf malloc free等function
當用這些function的時候  compile的時候後跳出錯誤的訊息
我一直覺得超神奇的  ffmpeg居然可以限制某些可以compile 某些不行
會想找這個是因為今天我想用strcat跟sprintf的時候  居然有出現了compile error
我就覺得我一定要知道是為什麼

還蠻好找的 就在(ffmpeg top)/libavutil/internal.h中
他先將某給不想給別用的function #undef
接者不想給別人用的function定義成一個很長的symbol(只能一個)
compile的時候就會因為找不到這個symbol 而印出這個symbol
但這時我們就會就將這個symbol當成error message
這樣就可以控制某些function不能用了

但是這個的前提必須要檔案有include到上面這個internal.h
如果沒有include 一樣是沒有用的

2009年9月22日 星期二

在netbeans中使用opencv的 library

最近想來用opencv來寫一些cv的東西
一開始就是先灌opencv到ubuntu中
就直接用ubuntu的套件管理灌啦
選的是libcv-dev就可以了
他會自動灌libcv1, libhighgui1, libcvaux1,libcvauz-dev, libhighgui-dev...等的
這樣其實就可以用了 真方便
我為了看document來安裝了opencv-doc (不過證明其實可以不用 有更好用的)
那好用的document在哪裡勒
http://opencv.willowgarage.com/documentation/index.html
這個是在opencv的wiki上面的document 好用的地方是在可以搜尋

接下來是內容是要設定如何在netbeans中如何設定才能夠方便的使用
其實我有看了網路上的一篇教學
http://rorasa.wordpress.com/2009/08/19/opencv-with-netbeans-ide/
但是這篇有很多步驟我都沒做就可以用了

我從第三步開始做的  是要用code assistance的
但是第三步其實不用做 我沒又設定就可以用了 我猜有可能是因為ubuntu設定在default的位置

第四步要設定compile的include path用的
project properties中的Build的C++ Compiler中的Include Directories
我設定成/usr/include/opencv

接下來是第5步 要設定link用的library的路徑
我的設定方法很爛 直接加在additional options上面(應該有更好寫法)
project preperties中的Build中的Linker中的additional options
加上以下這四個就可以了
-lm -lcv -lhighgui -lcvaux
這樣就完成了 就可以在ubuntu底下的netbeans中用opencv了

2009年9月20日 星期日

用python分析ffmpeg的log

今天想將之前跑h.264產生的log來作一些處理來得到我想要的資訊
想當然的 我一開始會需要去看document 因為我從來就不會去記得function的名稱
結果今天我發現python的網站怪怪的 連不太上
我就想ubuntu裡面應該有python的document
就發現是要安裝一個套件python2.6-doc才可以
安裝好之後 就會發現/usr/share/doc裡面多一個python2.6-doc這個資料夾
裡面的html資料夾 就是平常會在網站上看到的文件
也可以從/usr/share/doc/python2.6/html/是一樣的地方(這裡才是真正的地方 剛剛那裡是symbolic link)

這樣我就可以開始parse我之前跑出來的log擋了
我主要用的東西是regular expression相關的module
這裡比較重要的是可以先做出一個regular expression的object
然後在用re的object來做match會產生match object
在match的object中會有很多相關的資訊可以利用
大致上就是這些

還有就是python現在已經沒有atoi()的function 用int()就可以完全取代了

h264 in ffmpeg deblocking filter survey

之前我已經確定說ffmpeg是以一個一個macroblock的形式去作inverse transform,prediction及deblocking filter
雖然說這跟standard寫得順序似乎有點出入
standard中寫是順序是要decode完一個完整frame的時候  才會一口氣做完deblocking filter
這裡就浮現了一個問題 就是每個macroblock都有可能會作intra prediction的動作(好 standard中寫只有I跟SI picture)
那在decode現在的macroblock會需要附近已經decode出來的macroblcok
那這些macroblock究竟是已經做完deblock filter還是還沒有做的勒
我看了standard發現這些時還沒有進行deblocking filter的macroblock 
這時候就會發現ffmpeg的h.264的code一定有在這個地方動手腳  可能是將還沒deblocking的macroblock不知道存在哪裡
不然要怎麼reference 不過這裡我之後再看

接下來我在看standrad中luma在boundary filtering strength小於4的時候的function
基本上做的事是跟h264_loop_filter_luma_c一樣 但是裡面的判斷式 跟standard中寫得並沒有完全一樣
我想一定是因為ffmpeg為了加速改寫了一大堆的東西  不過還好的是ffmpeg中的變數名稱還認得出來
不過看的話可能要在花點時間
還有就是小記一下h264_loop_filter_luma_c是一次處理16條6個byte的內容

另外我有沿者filter_mb來開始看code
發現其實要看的code其實沒有很多 有很多部份是跟mbaff 就查一下這是什麼吧
這好像是有field的時候才會需要的東西 去除掉這些東西的話
其實要看的code就沒這麼多了

2009年9月19日 星期六

virtualbox 3.0.6的小bug

其實我不知道這是不是這一版才有的bug
就是我現在想將網路設定成bridge adapter
我就使用virtualbox中的第一張網路卡設定成Bridged adapter
結果居然是偶爾才可以用  我本來以為是我們dhcp server的問題
結果看了很久才發現是virtualbox虛擬網卡的問題
我用預設的網路卡PCnet-FAST III(我之前在3.0.0就發現有問題)
這張網卡就是偶爾才連的上
結果我就換另一張網卡 Intel PRO/1000 MT Desktop 就一切正常了

所以我想以後virtualbox網路有問題的時候
可以先換換虛擬網卡 說不定問題就解決了

2009年9月18日 星期五

h.264在ffmpeg中 deblocking fileter的實做

我之前花了點時間看了h.264目前可以拿到的standard
我就仔細的看了deblocking filter實做部份的內容
應該是在8.7的部份  大致上跟我在wiki上面的deblocking filter paper是一樣的
但在這裡我看到驚人的東西
standard上面定義的deblocking filter執行時間 跟我自己在ffmpeg中不一樣
我在standard中看到的是在decode完一個frame後才對整張frame的一個一個macroblock作deblocking fileter
但是在ffmpeg中好像不是這樣
我看到的是他是在decode一個一個macroblock的時候 順便作deblock filter
我又仔細的看了一遍 並且用debugger設了一堆的breakpoint來確定執行的順序
沒錯真的一個一個macroblock這樣做

但是我有去看jm(h.264的reference software)了
發現的作法是跟standard寫得一模一樣  但是如果是這樣的話 就會比較好加速
不過這裡我就又不懂了 如果這樣做的話那麼在intra prediction的時候的macroblock 不就是沒有經過deblocking的macroblock
這樣不會是錯的嗎
不然我會因為在傳資料上花非常多時間

2009年9月17日 星期四

使用virtualbox的serial port

我現在想在virtualbox的guest中使用host的serial port
我的guest是window xp
而我的host是ubuntu 9.04
然後其實我的guest上面沒有serial port
我是利用usb to serial的線來產生出一個serial port的
virtualbox 3.0.6
以上就是我的環境

其實virtualbox中原本就有提供這樣的功能
所以只需要一些簡單的設定就可以用了
首先因為是usb to serial的轉接線 所以在ubuntu上面的serial port是在/dev/ttyUSB0(接很多條有可能是/dev/ttyUSB1之類的)
接下來是guest window xp的設定 所有的設定都是在序列埠的部份
首先要將啟用序列埠勾起來
在port number上面選COM1 其實也可以選其他項不過我沒試過 後面兩欄不用理他
在port Mode的部份選擇主端裝置
建立管線的部份不用選
最後是port/File Path就輸入/dev/ttyUSB0
這樣在guest window xp的配置就設好了
但是這樣還是不能動的
因為window xp還沒有偵測到COM1所以說還需要在windows上面裝上序列埠的driver才行

這樣就可以讓guest window xp看到一個序列埠

serial terminial的挑選

我原本是一直在用linux上面的minicom
會用這個的原因純粹是因為這是我在linux找到唯一可以接受serial input/output的software
其實我覺得也沒有做比較好  就是將就將就用

而且我一直覺得連線到板子上並且用minicom上面打指令很麻煩
會打的指令就是那些 u-boot上面又沒有histroy 也不能用上一個指令
我原本有找到一個方法就是寫u-boot的script
就是將要在u-boot上面要打得command打在一個檔案中
然後將這個檔案用u-boot提供的mkimage作成u-boot的script檔
再將這個檔用tftp傳到板子上 並用autoscr來執行傳到位置
但是這樣有個缺點就是還是要在minicom中打最少兩行的指令就是傳檔跟執行script
雖然說真的變少了 但是還是打了不少重複的東西

之前去某個training course的時候發現有一種在windows上面的terminal工具
這個工具是teraterm pro 這是個比超級終端機強大的的東西
他有提供一種東西叫做macro 是ttl 就是Tera Term Language
這就是host端上面寫script然後透過serial terminial傳到板子上
這樣就可以很容易的執行一大堆的指令

不過我覺得minicom上面一定有相同的功能
找了很久就找到了很相似的功能這個東西就叫做runscript
我就想太好了這樣也可以在linux上面寫terminal專用的script
不過我在仔細看 發現這兩樣似乎不是一樣的東西
runscript是只能在minicom一開始的時候執行 而不是在任何時間都可以執行
所以說並不是說非常好

後來就只好投向teraterm pro的懷抱了
我就開始研究簡單的ttl了
我現在會用的只有sendln跟wait
sendln就是丟一行指令
而wait就是等待某個字串出現
我現在是
sendln
wait
sendln
wait
這樣來寫 才能正常執行(要怎麼使用很簡單 就去看看TeraTerm附的doc就可以了)
目前我還不知道為什麼要用wait 有時間在繼續看
所以說我以後應該會是用TeraTerm當作我連serial的terminial

2009年9月8日 星期二

h.264 in ffmpeg -- deblocking

先繼續往deblocking 的部份看
因為我時再不知道這個deblocking 到底在做什麼
沒辦法 我這時只能靠google了 google了一陣子 我在wiki中的deblocking filter找到有用的pdf檔
in-loop deblocking filter for H.264/AVC video
這篇paper的內容並不是要告訴別人什麼是deblocking filter
他是要說明deblocking filter真的能有效的消除blocking  artifacts
不過同時他也很仔細的介紹了deblocking filter 是怎麼做的(這比spec中寫的好多了)

這裡稍微介紹一下paper好了 
一開始就說明以前的其他video standard都將deblocking filter放到optional或是沒設計
但是h.264卻是將他放到standard中一定要做的部份
還有介紹in-loop filter跟post filter的差別
in-loop filter就是h.264中的deblocking filter 是在一個個macroblock上面做的
post filter是都做完整個frame的時候 再對整張圖做的處理

接下來是用圖解的方式來說明說 怎麼對macroblock做處理
就是先在luma的的部份 再來由左到右一條條vertical(4條)做 然後再來由上到下一條條horizontal(4條)做
做完luma再來換chrominance 跟剛剛一樣但是這裡只有各兩條

基本上是這樣 再來是細節的部份這裡會分成三個部份 filter strength, filter decision, filter implementation
第一個是說這個filter的強度 分成0到4五種 0就是不用做 1到3是一種level 4是一種(這是我的理解 我沒看過spec)
第二個是決定說這個要不要做 剛剛0是一定不用做  這是是會用別的方法來決定還有哪些是不用做的
第三個就是實做的部份 這裡就是列了一堆的條件式 蠻複雜的

小記一下 deblocking filter是一個一個macroblock丟進去做

2009年9月6日 星期日

/dev/null的小研究


不知道為什麼我現在用的ramdisk上面會沒有/dev/null
所以我就開始看看網路上關於/dev/null的說明
基本上在wiki上面就有很好的說明了

簡單的來說/dev/null就是一個黑洞 什麼丟進去 什麼就會不見
這是一個好東西
知道之後現在就是要想辦法說在ramdisk上面 做出/dev/null

我有看到說打一下的指令就可以了
mknod -m 0666 /dev/null c 1 3
說明一下這個指令(主要是看man的)
這裡的-m是設定這個device的權限
然後/dev/null是這個node的名稱
c是指這是一個怎樣的device
1是major number
3是minor number
這裡要注意的就是以上的major number跟minor number是linux kernel中定義的
像在freebsd就不是這樣的

那究竟現在的我用的l4linux可不可以這樣打就能用了
我就去trace l4linux的source code去找/dev/null的實做(其實我是用google找的)
找到了(linux top)/drivers/char/mem.c 的null_fops就是/dev/null的實做
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
static const struct {
 unsigned int  minor;
 char   *name;
 umode_t   mode;
 const struct file_operations *fops;
} devlist[] = { /* list of minor devices */
 {1, "mem",     S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops},
#ifdef CONFIG_DEVKMEM
 {2, "kmem",    S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops},
#endif
 {3, "null",    S_IRUGO | S_IWUGO,           &null_fops},
#ifdef CONFIG_DEVPORT
 {4, "port",    S_IRUSR | S_IWUSR | S_IRGRP, &port_fops},
#endif
 {5, "zero",    S_IRUGO | S_IWUGO,           &zero_fops},
 {7, "full",    S_IRUGO | S_IWUGO,           &full_fops},
 {8, "random",  S_IRUGO | S_IWUSR,           &random_fops},
 {9, "urandom", S_IRUGO | S_IWUSR,           &urandom_fops},
 {11,"kmsg",    S_IRUGO | S_IWUSR,           &kmsg_fops},
#ifdef CONFIG_CRASH_DUMP
 {12,"oldmem",    S_IRUSR | S_IWUSR | S_IRGRP, &oldmem_fops},
#endif
};
987
988
if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
  printk("unable to get major %d for memory devs\n", MEM_MAJOR);
不過這裡重要的是要找到他用的major number跟minor number
這個時候 就看到了devlist這個variable
這裡定義了null的minor number是3
接下來找major number
這時看到一個macro 就是MEM_MAJOR他的宣告是在(linux top)/include/linux/major.h中
1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#ifndef _LINUX_MAJOR_H
#define _LINUX_MAJOR_H

/*
 * This file has definitions for major device numbers.
 * For the device number assignments, see Documentation/devices.txt.
 */

#define UNNAMED_MAJOR  0
#define MEM_MAJOR  1
#define RAMDISK_MAJOR  1
#define FLOPPY_MAJOR  2
然後在這裡MEM_MAJOR是1
這樣我確定l4linux裡面有實做/dev/null

所以就很放心的用上面的command 建立node 然後用echo測試
echo "hello" > /dev/null 看到/dev/null的size沒有變 很好成功了

在板子上播影片

我本來是將h.264轉mpeg 1 video的ffmpeg放在板子上 驗證他是不是正確
但是我現在我需要得到他的workload
我原本以為說其實mpeg 1 video的encode 應該是不會花多少時間
但是好像不是這樣的 我加上mpeg1 video的話fps就變成4到5之間
不過如果只有h.264 decoder的話 那們他的fps就會是9左右
可是這樣一樣沒有很好 因為還沒跑完就因為使用的memory量過大 就當機了
我本來以為只要導到/dev/null就會沒但是居然沒有耶 我的天阿

我目前有三條路可以走
第一條就是找找看有沒有辦法在ramdisk上面 做出一個/dev/null來 這樣就可以直接用H.264 decoder
第二條就是在找找看ffmpeg有沒有可以直接將decoder的資訊丟掉的辦法
第三條路就是繼續用h.264轉mpeg1 video的converter

2009年9月3日 星期四

python 比較不同資料夾的部份內容


最近再看學長的code 我發現有點小問題  就是他的reposiroty最早的版本不是他一開始沒改的版本
喔  不 所以說我只好手動來找是哪些檔改過了  我當然知道diff是我最好的朋友
不過我不知道要怎麼比整個資料夾 我感覺bash script一定可以最這件事  但是現在離我上次寫bash script有點久耶
雖然書在旁邊  完全不沒有想去翻他的慾望  難道我真的要一個一個手動打diff比嗎
其實也可以啦 反正大不了一百多個  那我就不用寫這篇了....

想想python好像蠻強大的  用用看吧
以下就是簡單的python code
1
2
3
4
5
6
7
8
9
#! /usr/bin/python
import os
import re
fileName = os.listdir("~/kernel_new/");
firDir = "~/kernel_new/"
secDir = "~/kernel/"
for oneName in fileName:
        if re.match(".*cpp", oneName):
                reslut = os.system("diff -c " + firDir + oneName + " " + secDir + oneName); 
主要用到的就是os跟re這兩個module 簡單介紹一下
os就是一些平常在bash可以打得一些command 其實就是一些system programming會出現的東西
re就是reguler expression的縮寫  這就是正規表示法 就是有*,?,.,[]等等的符號的東西  他是用來更方便描述string特性
程式一開始先用os.listdir()取得新的資料夾裡面有什麼
再來設定兩個資料夾是哪兩個資料夾(這裡好像有點重複到)
接者將一個個檔名抓出來比較看看結尾是不是cpp 是的話再用os.system去call diff來作比較
這樣簡單的一個檔案就可以比較整個資料夾的某些檔案

在這裡我曾經犯了一個錯誤  就是我忘了reguler expression是什麼了  跟bash的wildcard混在一起了
我還以為可以打*cpp就得到所有cpp結尾的檔案 當然是不行的 因為在*前面一定要接是什麼東西要重複
還又就是re.match()是只要string前面match就可以了  不需要全部的string

2009年9月1日 星期二

ffmpeg benchmark

今天突然想要看看H.264的某一段code花的時間
我就熊熊想到ffmpeg好像本來就有benchmark的功能
就想說用他裡面就有的benchmark來測一定很棒
結果就看一下code 原來只有ffmpeg.c中的main()有用到
他只是用來測av_encode這個function所花的時間 不會吧
我本來以為benchmark很強大

好吧 看來我要測地方的時間 就只需要將ffmpeg的benchmark相關的code複製過去就好了
因為其實ffmpeg benchmark相關的code也不複雜
既然這樣就來看看ffmpeg的benchmark是怎麼做的 我這邊只看linux是怎麼做 至於windows是怎麼做的就再說啦

其實他只實做了一個function -- getutime()
顧名思義他就是要取得micro second(百萬分之一秒)
這裡的話會根據不同的平台會call不同的function
在linux的話 他會用sys/resource.h的getrusage
他會用這個的目的是要得到user time而不是要wall-clock time
在這裡我覺得很合理 因為這是codec大部分的時間都會在user mode底下執行 很少在system mode底下執行

看了看感覺getrusage好像很強大 ffmpeg居然用他來benchmark
就上網查了一下 發現這個function也不是完美的 在hyperthread的processor好像會不準  不過我沒試過

我另外看到這篇不錯的東西 寫得很好
Benchmarking misconceptions, microtime() vs. getrusage()
雖然說最後的code是php 但是其實概念是一樣的

profiling tool的使用

我用的是valgrind中附的callgrind
另外觀看結果是用kcachegrind(這是一個KDE上面的application)
為什麼我不用gnome上面的application 原因很簡單  就是我找不到在gnome裡面對應的程式
不然我都用gnome的桌布怎麼會用KDE的application
好所以說我只要用的就是callgrind跟kcachegrind(如果是gnome桌布的話 灌的時後 會灌一堆KDE的套件)
這兩個套件都很好灌  都是直接打名字在synaptic裡面 就會找到了(callgrind是要打valgrind)

接下來就是用法了 因為callgrind是valgrind中的其中一個工具 所以說用callgrind 只是用valgrind的其中一個工具

valgrind --tool=callgrind [option] program_name
以上就是指令的打法
後面program_name(包括program_name以及他後面會接的一大堆有關這個program的選項) 這些就是原本我們執行這個程式後面會接的選項
中間的option是callgrind他自己特殊的選項 這裡我沒有特別去看
我用的時候都是用default就好了
我稍微看了一下 這裡的選項有一些功能像我們不一定要在程式開始的時候就profiling
可以執行到中間的時候在進行profiling 可能這是一個interactive的程式之類的
這時後會用到另一個指令是callgrind_control (我沒用過)

當打完以上的指令(就是valgrind那行) 然後等程式執行完(會比正常執行時間久 久很多)
會出現一個檔(如果沒有自己指定其他檔名的話) callgrind.out.[執行時候的pid]
(當然也有可能出現兩個檔以上 看你用幾個thread來執行程式)
這時候就可以用kcachegrind來看結果  相信我直接看檔什麼也看不懂的
kcachegrind是GUI的  很容易  看一看就會知道結果(比callgrind_annotate好看多了)

2009年8月31日 星期一

fiasco的scheduler

這一篇主要是參考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月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檔的工具 我沒什麼研究 一打開就可以用了
還算清晰

vim 的顏色

在ubuntu中常常用vim  但是常常覺得寫c code的時候  註解的部份很昏暗
我記得之前就已經找到辦法了  但是一久沒打就忘記這個指令要怎麼打了
這很簡單 是利用vim早就定好的指令colorscheme來就可以了只是這後面要接是使永哪一種的colorscheme
我習慣用的是evening這個  因為這樣看起來會比較亮
這些指令只要插在~/.vimrc裡面就可以了  也就是加一行在.vimrc這個檔裡面
加colorscheme evening 這樣

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) 但是我並不確定
其他兩個 對我的用處不大

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這本感覺不也不錯
大概就是這樣

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的最後幾行
沒仔細看 先看到這裡 快看完了 加油

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的部份 但是還有一大堆是不懂的

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)
這裡我一樣使用預設的設定

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
(後來發現這好像沒什麼用)

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了

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
大致上就是這些

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
打以上這行就會有可以用的格式

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資訊
就作到這裡

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

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會有用)
大致上重要的就是這些了

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

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

2009年7月31日 星期五

trace fiasco bootstrap code part 2

接下來繼續看fiasco的bootstrap
正在努力看懂crt0.S
首先遇到一個macro就是REALMODE_LOADING
雖然說我知道這個macro在Makefile中有 但是看不出來有沒有有沒有用
我就用readelf這個工具 將以已經編好的bootstrap執行檔讀出來
指令是 readelf -a (build directory)/bin/x86-586/bootstrap
在symbol table欄中 可以看到很多在crt0.S出現的label 但是沒有_stack_seg這個label
因為這個label是在有定義REALMODE_LOADING的時候才會編譯的
好 因此我知道 現在REALMODE_LOADING這個macro沒有define

為了看懂crt0.S 我跑去看elf的格式 我發現了.init是重要的section
他跟我想的一樣 是為了在執行main之前執行的function
但是目前我不知道程式是從bootstrap的哪裡開始執行 我猜是第一個instruction
這樣很合理 但是我不知道怎麼看出來

-----------------------
跳離主題 製作fiasco的iso檔
我以前都不知道在用grub做iso檔的時候的資料夾 會當作iso檔的內容
然後還傻傻的放在我tudos的top資料夾下 他就全部放進iso檔中 真像個笨蛋....
-----------------------

為了知道grub怎麼跳到fiasco 我跑去看grub了
發現現在有grub 跟grub 2
他們的分法是grub最新的是0.97 而之後的版本是grub2的 並沒明確的編號上的不同
我現在用的grub是0.97也就是grub的最後一版
所以說我看的doc是grub 0.97的manual
其實grub本來就有支援multiboot也就是一次除了load kernel外 還有load其他的module
我也發現grub跟u-boot一樣可以用command line只是我都不想用而已
現在的重點是我要了解grub跟fiasco的相關指令
主要是kernel跟module這兩個指令 其實應該還有root這個指令 不過我現在是在做iso檔 就先不理了
kernel就是要指定kernel的名稱 這裡並不是要指定fiasco 而是要指定bootstrap 由bootstrap當作假的kernel
是要用來load fiasco
command是這樣打的 kernel (directory)/bootstrap
其實還要加上 --type=multiboot 在kernel後面 這樣才是要讀多個module
雖然說command是照上面這樣打 但是還可以在 command接東西 這樣接的東西 會傳到bootstrap
在bootstrap中有很多處理這些選項的程式碼
module就是另外要load的module名稱
(這是grub原本就有的功能另我很驚訝 我猜是因為MACH所以才會有 manual中另外還有提到 可以參考fiasco的使用 超酷的)
command是這樣打的module (directory)/(moudle name)
這也是一樣後面接者給他的選項

其實我還是沒找到他怎麼執行bootstrap的東西.....

trace fiasco bootstrap code part 1

繼續trace fiasco的bootstrap
我發現她用了很多奇怪的macro
不過沒關係 我現在用google desktop search來作搜尋
我找了EXTERN_C_BEGIN 跟 EXTERN_C_END 及 EXTERN_C這些的定義
他們是定義在l4/pkg/l4/sys/include/compiler.h裡面
他做的工作很簡單 就是用來取代我們常常看到的 extern "C" { 跟 }
她會根據__cplusplus這個macro來作決定要不要讓這個macro有實質
__cplusplus是c++ compiler裡面原本就會有的macro 來辨別說這是不是一個c++ compiler

那為什麼要用extern "C" 的原因是因為在一個有c也有c++ code的程式中
因為對於c++來說 c算是另種language 有些地方會不一樣 所以說會要說這是另一種language
他們在編譯的時候c跟c++對function name的編譯是不一樣的 可能會造成link error

接下來trace bootstrap的startup.h的code
這邊有一個function have_hercules() 這個function好像是只有在amd64底下才有用到 其他我都沒看到又在用
另外這邊有一個變數 _mod_end我看了看 我沒發現有人用他 不知道是怎麼回事
在這裡還有一個struct是boot_info_t 他主要用的地方是在init_kip的部份 其他就沒看到了
這個startup.h大概就是這樣

接下來是看crt0.S這個檔 這是很重要的檔
根據我現在的理解 這個檔本來在compile那端就會自動產生這個檔
這裡不知道為什麼要自己寫一份
這主要是做一個c程式在開始前的startup 跟結束後的finish code
目前我看的code是在/l4/pkg/bootstrap/server/src/ARCH-x86/crt0.S
這是x86的專屬code 每個arch都有自己對應的一份
目前我知道他會跳到__main的function中
而這個function目前是定義在 l4/pkg/bootstrap/server/src/libc_support+.cc裡面
他會跳到startup這個function
目前先看到這裡 其實中間的細節是很重要的 之後再看

2009年7月30日 星期四

desktop search的小研究

今天本來想要去 trace fiasco中的bootstrap的package
但是又遇到了一個就是好多部份都定義了一些macro 然後又不知道去哪裡找這些東西
以前的方法是用grep
就是grep -R "要尋找的字串" .
以上的就是我要搜某個字串 從現在這個資料夾開始 而且是遞迴下去搜尋
但是我覺得很這樣很麻煩要打一堆字 而且出來的字也沒有format好
我後來就看看google desktop好像還不錯 就用看看

剛剛試了他search的速度還不錯 但是她建index好慢我居然要建3個多小時才ok
不過找的速度蠻快是真的
這個時候重點就來了
她佔的空間大不大
我發現在他是存在$(home)/.google/desktop底下
我的感覺是還好 不會佔太多

但是用一用感覺沒有說很好用 檔案名太長她都會自動省略 但是那是我要看的 怎麼可以省略
不過上網看了看 我發現google desktop好像也不是最好 desktop search的軟體

其實網路上有很多的desktop search的軟體
像Copernic 這原本是我覺得還不錯的軟體 他是專門作來搜尋程式碼的
不過很抱歉的是他只提供windows的版本 而且他還會綁IDE的樣子

Regain 這也是一套不錯的軟體 但是她沒有在ubuntu的package裡我就不想用了 而且我本來想用 但是他的java居然是不能執行的
接下來的三套是在linux中蠻有名的
beagle 這其實是用c#寫得程式 但是跑再mono上面 我不怎麼想裝mono 好像是gnome目前預設的桌面搜尋(但是不一定會安裝) 裝了感覺google的還是比較好用
strigi 這感覺不錯 雖然好像是要用KDE跑會比較好 不過這好像有ubuntu的官方維護 但是好像是一定要裝KDE才能用 雖然有個deskbar applet的版本 但是不知道要怎麼用 我怎覺得為了個search用另一個桌布很不值得
recoll 看別的地方的介紹說 這是一個成熟的project 我就覺得奇怪 真的有這個成熟的專案 那其他家desktop search在做什麼 後來用了之後 我懂了 他的search是對一個一個詞作search 也就是說如果說我的程式是這樣寫的 int goodThing(int i) 那麼我搜尋goodThing是搜尋不到這個goodThing的函式 那我想這樣我要找的東西應該大部分都找不到吧

在試的過程是我發現台灣的ubuntu mirror好像掛了 我就用國外的站 方法是
在synaptic中 設定->套件庫->下載自
在這裡可以設定成主要伺服器 就可以先用國外的了

用了這麼多 最後還是覺得用google desktop search
那關於檔名自動隱藏的部份 可以按開啟資料夾的連結 這樣就可以看到完整的路徑
雖然好像還是很不方便 但是就將就點

qemu的小練習

最近在練習使用qemu 但是我懶得自己編就用ubuntu上可以用的package
為了要測試arm的部分是不是要能跑 我就去官網上下載arm-test來測試
不過其中要執行qemu時候的一個option 我不太懂
就是要給一個-append "console=ttyAMA0"

我沒有看過這個serial port
我就上網找 居然都是有關qemu的文章 我就懷疑這是他自己設的
我就開始看看tty的東西 後來可到一篇不錯的文章 連結不見了...
他說可以用/sbin/getty -L ttyAMA0 9600 vt100 來開tty
所以這樣我就懂了 難怪會有奇怪的tty

順便記一下
跳出qemu可以用ctrl + a 在按x

2009年7月29日 星期三

練習latex的建立目錄及各章節

因為要作網站的相關文件 所以動手開始學latex
先前已經知道該如何設定中文的問題 現在要開始建立基本的目錄結構
這部份不太困難
我的作法是用\title\author來寫首頁的部份
除了這兩部份以外還要加上\maketitle才可以真正建立起title來
在這裡 因為我需要中文 我是將以上的三個command寫在\begin{CJK}裡面
不知道能不能寫在外面 感覺是不行的
接下來是寫每個chapter跟scetion的內容 這邊不難
後來要建立目錄 這裡的關鍵是command要寫在\maketitle的後面才可以 不然會有奇怪的結果
command是\tableofcontents
這裡的話要看到目錄的結果要commpile兩次
第一次是compile目錄 第二次才會放進文件中

大致上重要的東西就是這些
我又測過ubuntu上是正確的 放在windows上也沒問題 真是太好了

2009年7月27日 星期一

porting ffmpeg to davinci

現在先看看ldd是什麼 這是一個可以看出有什麼share library的工具
用在ffmpeg上 就可以看到她用了什麼share library
現在有看到6個 就將這6個複製過去吧 不過看起來好像有重複耶
紀錄一下好了
libz.so.1 這個是裡面原本就有的東西
libbz2.so.1.0 這是裡面原本就有的東西
libm.so.6 有缺後面6的
libdl.so.2 有缺後面2的
libc.so.6 有缺後面6的
ld-linux.so.3 完全沒有相似的
這些東西都是在/usr/lib中對應的情形
不過其實還有另一個放lib的地方 就是/lib底下 而上面列的東西 沒在/usr/lib底下就有在/lib
這個的意思是說 我們不需要在加其他的object到現在的file system 就可以正常執行ffmpeg了
真是一件好事

所以就直接將ffmpeg跟要decode的檔案用nfs丟到板子上進行decode
一開始不知道跟編成什麼東西就將h.264編成.yuv檔 檔案大到爆炸 90M的檔案編成2G多
重點是還不能驗證到底對不對 我實在不知道要怎麼驗證YUV檔
現在的重點是驗證ffmpeg是不是可以用 就先將h.264的檔案轉檔成wmv檔來試看看
我照做了 而且可以播放影片 很好但是轉檔花的時間有點長 2分9秒的 片子轉檔花了87分鐘
有點太誇張了 不過後來想想
我為什麼要在nfs上面作當然會慢到不行了??不過也有可能是process bound

接下來必須要尋找好了測試速度的方法
目前來看似乎是直接放在LCD上跑最合理 overhead最小
今天的重點是ffmpeg真的可以跑

2009年7月26日 星期日

研究ffmpeg放到davinci上面

一開始是研究ffmpeg的版本 最新版是0.5是今年出來的
還很新 上一版已經是兩年前的事情了 所以我應該是要用這一版

網路上主要的文件有兩份
一份是專門作給davinci的 不過這份的話他有要用到ffplay也就是他要播放影片 但是我沒有要用

另一份是講compile ffmpeg的大方法這份的話有x86也有arm的教學
但是原則上這兩份都不夠新 因為最新的應該是今年度出來的document
我將兩份的文件綜來用 設出來自己的configure
以下是我的configure
../configure --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
我想我就一項一項的講好了
第一項的arch是沒有用的參數但還是要給 這是我遇到的最大的bug
這裡正常應該是要打arm或是armv[45679]*l才可以

這樣打 她才會知道我們的arch是arm 但是這是目前這個版本的bug
如果真的讓她知道我們的ARCH她會用arm的code來compile

在(ffmpeg source)/libavcodec/arm/asm.S中會有一個eabi_attribute的macro
但是不知道為什麼 compiler就是不認識

這個問題目前是無解的
為什麼我會這麼確定勒 因為我去翻過ffmpeg的bug tracker
https://roundup.ffmpeg.org/roundup/ffmpeg/issue950
這是因為我用的是原本付的tool-chain 他的assembler可能太舊了 就不能用了
(當然可以用其他的tool-chain 但是很多東西要重做....)
所以我只好用generic的ARCH

--cross-prefix是compiler前面的prefix 這個要注意最後還有一個減號
--enable-cross-compile 我不知道這是作什麼的 加就對了
--prefix結果要放在哪裡
--enable-static --disable-shared這兩個目前不知道有什麼用 有人加就跟者加
--enable-gpl聽說程式會變比較快
--disable-stripping執行檔跟object不會分開??
--disable-network --disable-ipv6會少compile一些東西
--enable-small --disable-parsers --disable-debug好像是最佳化的東西
--disable-ffplay這似乎需要其他的套件 (ex.SDL)

2009年7月23日 星期四

安裝davinci的完整tool-chain到ubuntu 9.04

現在正在練習灌davinici的tool-chain
雖然說學長說了一堆 但是跟的他說的似乎不太一樣
不過沒關係 在cd3的那片光碟中有灌的說明文件
我就看得文件上的灌 應該是不會又錯的
目前是灌前三片光碟的.bin的安裝 安裝完是三個.tar檔
都將他們放在/opt底下 (照doc做的最不會有錯)
還有一個是放在自己的home directory底下的資料夾
現在正在研究這些tool-chain要怎麼用

不過在這之前我必須線想起來要怎麼架設nfs才可以
隨便查了一下就看到了 只要灌以下的兩個套件就可以了
nfs-commonnfs-kernel-server 應該是這樣 不過之後要在試試
照文件上的說明其實要開一個nfs的filesys在上面 我開了
也照文件上的說明做了nfs的設定 不過好像是nfs有新的設定
就是有多了subtree_check這個option

現在先不要管好了 有錯再說
因為我現在灌的是ubuntu的nfs-kernel-server
所以說nfs的重開是用/etc/init.d/nfs-kernel-server restart

不是doc上面寫得/sbin/service nfs restart
以上應該是算設定完nfs的部份 沒測過

現在要來尋找可用的超級終端機了..
其實根本就不用尋找了 就是用以前用的minicom 還算堪用 而且我發現其實他在去年還有更新
不過我尋找了很久 還是不知道要怎麼在virtualbox中使用minicom來連接板子
後來就算了 我最後就破例灌在實機的ubuntu上
不過其實還好說minicom只有一個binary而已 我就接受了

一開始當然是要設定configure的檔案 我的設法很簡單
sudo minicom -s 這邊要注意minicom要用super user的權限執行
在設定serial device的時候要設定/dev/ttyUSB0或/dev/ttyUSB1
(這是當/dev/ttyUSB0被鎖住的時候 可能是沒關好minicom)

接下來設定 115200 8N1 我不清楚這是什麼 設了就對了
最後是將設定檔output出來 我是output成first.min
以後執行的時候就打 sudo minicom on first.min
就可以了

這是測試一下
發現minicom是可以用的 但是沒有辦法開啟linux 好像是因為裡面沒有uImage的樣子
我原本想照doc上面的作法 就是用u-boot來掛nfs但是我懶的研究
我就用學長的方式 先用tftp傳linux的uImage檔過去 開機過後在掛nfs

好所以說現在最重要的就是在我的virtualbox中的ubuntu中安裝tftp
我就看看該灌哪一種tftp 我看了一下
就灌tftpd-hpatftp-hpa 理論上應該只要灌tftpd-hpa但是怕麻煩就都灌

還有另外一個原因就是 我希望板子可以找到我的virtualbox中的ubuntu 所以說virtualbox就不應該用nat的網路
應該要用bridge adapter才可以(這樣才可以設定自己的ip 給板子看) 不過後來想想 就給這個ubuntu兩張網卡就好...
好灌好之後就是要設定tftp的時候 不過我懶的設定就用tftp中的預設
就是資料是在/var/lib/tftpboot/底下的才能傳

然後權限全開 就是這樣

最後就是測試我早上用davinci的tool-chain編的hello world有沒有問題
要先將虛擬的ubuntu的ip換成192.168.48.244用ifconfig eth0 192.168.48.244
我從板子上傳官方光碟的uImage到板子上
u-boot中打tftp 0x85000000 uImage 位址的話打 0x80000000到 0x90000000都可以 但是儘量不要打0x81000000以下 可能會出問題
接下來打bootm就可以了
最後就可以登入了 打root就可以了
好現在可以來掛nfs了 但是這裡要注意就是不知道為什麼 ip被換掉了(好像是bootarg的問題)要改回192.168.48.243這是在u-boot的時候的ip
這個時候就可以在/底下打mount -t nfs 192.168.48.244:/home/liuin/fm/filesys /mnt 就可以成功掛到/mnt底下了
在將編好的hello world拿來就發現 是可以跑的 今天的工作就到此結束

2009年7月16日 星期四

灌qt的開發環境

今天開始設定qt的開發環境 當然不用懷疑 我當然是又開了一個virtualbox來用
因為我實在不知道要怎麼灌比較好 一開始我本來想照netbeans官方網頁上寫的做
但是依照我優良的習慣 我一向是先看看在ubuntu的package裡面有沒有我要的package
幸好我有看 ubuntu裡面原本就有了
不過這是我第一次看到ubuntu的package中有這麼新的package

居然跟現在最新的qt同樣版本 可見qt現在有多紅

我就直接用ubuntu的package來用了 我實在懶的自己編了
package很簡單是qt4-dev-tools基本上就這個就可以了
就全部都有了 試一試qmake -v會有版本資訊就是對的了
接下來我就照netbeans官方網站上的練習照做了
他寫得不錯 我都沒遇到什麼問題 這樣做完也算完成qt書的第一章了

我還有設定一個在assembla的account 是專門用來練習的寫程式用的
其中就有一個qt的資料夾 是我以後寫qt程式的練習

2009年7月13日 星期一

安裝latex的開發環境

今天聽到師大老師說以後要我打一些文件
我就想說我可以稱這個機會來練習latex
我就開始研究latex要怎麼寫

首先研究要怎麼灌出開發的環境來
我研究很久看了很多別人寫的文章
本來感覺說寫中文一定很困難
但是其實ubuntu 9.04(不確定是不是從這版開始的 好像不是)已經把他弄的很好寫了
主要灌texlivelatex-cjk-all套件
這樣就可以寫中文再latex中了

我看了許多的latex IDE有兩套看起來不錯
lyxtexmaker 我選了texmaker
為什麼??純粹看起來爽 用熟了改天再試用另一套

以下是最簡單的latex
\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK}{UTF8}{bkai}
大家好
\end{CJK}
\end{document}

大家好是會顯示出來的內容
再這裡重要的是bkai(楷體) 這個是我選用的字型
其他還有bsmi(明體) gdsn gkai(不知道是什麼體)
我想有這些應該就可以開始動手寫了

2009年7月5日 星期日

安裝web page的開發環境

今天下午重灌了一個ubuntu作為用來開發web的project用的
我是要將他灌在virtualbox 3.0里 但是一直失敗 後來才發現好像是預設的網卡device壞掉了
換一張網卡的device問題就解決了 害我花了一個多小時


灌完之後 就開始灌php mysql apache等的 當然啦 這些都不會有問題的 灌了不知道多少遍了
接下來是要安裝aptana的部份 我灌的是aptana 1.2.7 後面的版本不知道有沒有這個問題
之前一直在linux上都安裝不起來 但是這次我找到了一些有用的文章

http://forums.aptana.com/viewtopic.php?f=37&t=7147
他說主要的問題是在xulrunner上面一定要用1.8.1.3才可以 其他版本都不行
這樣弄之後 還真的可以執行 目前來看沒什麼問題

再來是將之前的svn弄回去 基本上就是用svnadmin load就可以了
這次我多設定了websvn 他沒有辦法設帳號密碼來限制觀看
不過因為我是在vitualbox裡面也就沒差了

所以說svn的reposity是在/var/lib/svn/底下 是配合websvn來作設定

之後要設定是的是apache的userdir來用
我的印象中 好像只要設symbolic link就可以
沒錯我將mods-enabled中新增 兩個symbolic link到mods-aviliable 都是跟userdir有關的
這樣就做完了 新增資料夾public_html到使用者的home directory底下里面就是我們的網頁了