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