星期四, 4月 28, 2005
MPEG4LIVE : Media Node
Thread Body : int ThreadMain(void)
規定Node內必須有一個message queue和一個queue semaphore。
operation有
Start()
Stop()
StartThread()
StopThread()
SetConfig()
Media Node的Thread, semaphore operation使用了SDL library。
Media Source和Media Sink都是Media Node。
ref : mpeg4live
SDL : Simple Direct Media Layer
Simple Direct Media Layer 支援 Linux 、Windoes、BeOS, MacOS Classic, MacOS x, FreeBSD 、OpenBSD 、BSD/OS 、Solaris 、IRIX, 和QNX 。 有Code,但是沒沒有正式支援的平台有 Windows CE、AmigaOS 、Dreamcast 、Atari 、NetBSD 、AIX 、OSF/Tru64 、RISC OS, 和SymbianOS 。
SDL 是用C撰寫, 但可以直接使用在C++上, 並且支援其它語言, 包括Ada 、Eiffel 、Java 、Lua 、ML、Perl 、PHP 、Pike、Python, 和Ruby。
星期三, 4月 27, 2005
星期二, 4月 26, 2005
MP4Live Internal 翻譯
由沒有GUI的運作模式來看mp4live 比較容易瞭解。 在這個模式下, mp4live 讀 Config file, 然後根據Config file Create " Media flow",當"Media flow"啟動一些Thread之後main program 進入while loop,sleep一段時間,check是否要termintate。結束程式。
Media flow and Node
"Media flow" (media_flow.h) 是最高層,控制所有 mp4live 的活動的class。 Mediaflow 由許多Media Node集合而成(media_node.h), 每個node間都規定好互相傳送資料的方式。 每個 Node2. 都是mp4live 的一個thread process。 每個Node Thread都有一個message queue作為溝通的interface。 目前只有start,stop command經由這些queue來控制,還有當一比(一個media frame) ready時,利用的個queue來通知該thread可以開始處理了。Node之間的其他合作關係世界由shared configuration information data來達成。
Media Source
" Media Source" (media_source.h)是處理raw image data的node的Class,她根據configuration file將raw data轉換為需要的格式。"Media Source"可以用來產生(轉換)Video或Audio。Media Source可以同時將raw data轉換為多種格式,例如將video data轉為YUV 和MPEG-4。
因 為大部分的Media process都和Media的來源無關, Media Source class(media_source.cpp) 包含encode media ,加入同步time tag的code。現在的Media Process有點過度設計,可以用來轉換檔案和Capture device的輸出。
Audio 的Media Process有:
* Reframing PCM audio sampling。例如:將1152 PCM的MP3 reframed 為 1024 PCM 的AAC
* Resampling,降低sampling rate 和bit rate。
* Channel adoption : 將 立體轉為單音。
* 經由media codec作 encoding
* 將未處理的frame 轉送給其他process
Video的Media Process有:
* 將Colorspace 轉換從RGB24 到YUV12 。 一些Vedio capture只能輸出RGB,不能輸出YUV。
* Frame rate adoptin: down sampling 29.97 fps到24 fps
* Image resizing:將352x288 轉換為320x240的影像
* Image cropping: 將4:3 轉到到16:9 長寬比
* 經由media codec作encoding
* 將未處理的frame轉送給其他process
Midea Codecs
有 二種已定義的Media codecs (encoders):Video,Audio。定義在audio_encoder.h 和video_encoder.h,這兩個都是abstrat class,提供一個和encoder library溝通的inteface。Media Source使用Media Codec Class來作encode,將raw , uncompressed data轉換為encoded media。
每一個實際的codec都是由適合的 abstrator media codecs class derives自已的class,implement自己的interface method。
每 一個encoder都實作許多method,用來設定rtp transmission的變數或是設定將結果存為mp4檔案,各種編碼器類型並且有一定數量的電話設置各種各樣的可變物為 rtp 傳輸或挽救對mp4 文件。 這些method都宣告 audio_encoder.h 和video_encoder.h
將新的 encoder class加入到video_encoder_tables.h就可以增加新的video encoder,同樣的,將audio encoder加入audio_encoder_tables可以增加audio encoder。除了修改table之外,還要將hook code寫入audio_encoder.cpp和video_encoder.cpp中。
Media Frame
Media Source的輸出是Media Frame (media_frame.h) 。 這是一個被reference counted structure。包含 :一個指向malloc'ed 的Media Data,Media Data的長度,Media的Type,Media Frame的time tag,Media Frame duration(用在audio frame),Media frame的time scale。當create自己的Media Source,要在source間加入time tag。
Media Source在處理取得的media frame時,會產生很多media frame。 這些產生的Media frame會被包在message送到每一個向這個Source註冊的Media Sink中。要注意的是, 如果有 N Media Sink註冊需要這個Message,會有N個Message被create,但是都指向同一個Media Frame。Media frame會keep一個reference count,當有Sink free掉,count就減一,當count =0時,Media fram data會被free掉,這個frame也會被destroy。
Media Sinks
"Media Sink" (media_sink.h)從Media Source取得Media frame,並且把這些frame送到目的地(譬如file或network socket)。 迄今Media Sink對Media frame幾乎沒做處理。Media Sink的主要目的是利用獨立的Thread來避免寫入Media Frame到device時被block住,影響到Media frame的讀取(buffer用)。 例如:一個很糟的情況是Media Source不能跟上Video Capture的動作,Video Capture是不能"暫停"來等待Media Source讀取。要注意的情況是, 當Media Sink在對目標device(例如file或socket)寫入而被block時,新的Media frame會一直持續的放入她的queue中,如Media Sink沒有是當處置,最後系統 記憶將被耗盡。 同理,當Media Sink的動作跟不上realtime的Media flow速度,系統記憶體也會慢慢堆在Media Sink的queue中,最後耗盡。所以在Implement自己的Media Sink Class時要注意,要有write timeout功能,將memory release,避免導致程式不正常結束。
目前一個registered Media Sink會接受所有Media Source output的Media type,所以Media Sink要在class內部檢查Media的格式,reject (free) 它不想要的Media type。
Media Source List
V4L video_v4l_source.cpp
::從V4L (錄影為Linux) 設備獲取YUV12 圖像
V4L2 video_v4l2_source.cpp
::從V4L2 (錄影為Linux) 設備獲取YUV12 圖像(建議使用)
OSS audio_oss_source.cpp
::從OSS (開放伴音系統) 設備獲取PCM16 Audio Sample
self loop_source.cpp
::從Main process取得的raw的YUV 或PCM
Codecs List
Lame-> MP3 - audio_lame.cpp, installed from3.92 or later
FAAC -> AAC - audio_faac.cpp, installed from faac version 1.21 or later
ffmeg-> Mpeg layer 2, AMR NB, AMR WB, installed from ffmpeg (0.4.7 or later)
Xvid -> MPEG4 - video_xvid.cpp, mpeg4.ip/lib/xvid, or xvidcode 0.92 or later
Xvid 1.0 -> MPEG4 - video_xvid10.cpp,從xvidcode 1.0 RC3 or later
ffmpeg-> MPEG4, MPEG2, H263 - video_ffmpeg.cpp, installed from ffmpeg version0.4.7 or later(參拷README) 。
Media Sink List
MP4 | file_mp4_recorder.cpp Writes media frames to an mp4 file |
RTP | rtp_transmitter.cpp Transmits media frames via RTP/UDP/IP Implements media specific RTP payloads as defined in IETF RFCs An adjunct to the RTP transmitter is the SDP file writer (sdp_file.cpp) which constructs an SDP file that can be used to tune into the RTP streams |
SDL Previewer | video_sdl_preview.cpp Display video frames to a local video display via the SDL multi-platform library |
Raw Sink | file_raw_sink.cpp Writes raw media frames (YUV12 and PCM16) to a local named pipe This enables sharing of the capture devices between mp4live and another application. |
design draft : transfer file throufh tcp
建立socketfd.
建立sockaddr_in.
CONNECT
open and get size of localfile
master focus on sockfd. - 呆會select用
fread file in buf
send buf to sockfd
fread file in buf (MAX_PKT_SIZE)
星期一, 4月 25, 2005
星期日, 4月 24, 2005
軟便記
NORMACOL PLUS GRANULES
成 分:每100g含Sterculia‧‧‧‧‧‧‧‧‧‧‧‧‧62g
Frangula‧‧‧‧‧‧‧‧‧‧‧‧‧8g
作 用:長久以來刺激性瀉下劑使用後,會產生危險的副作用,如果長期使用會更干擾腸正常的蠕動,而本品是天然纖維產品,能自然保持腸正常的活動,避免刺激性瀉下劑造成的危險。
適應症:習慣性便秘。
注意事項:應飲用足量的水以避免腸阻塞,潰瘍性結腸炎者小心使 用。
副作用:脹氣、腹脹。
兒童:成人之一半。
顆粒置於舌上,勿嚼或壓,配合充分水吞服。
星期四, 4月 21, 2005
Framebuffer : Multi framebuffer device
所以就在boot argument寫兩個"video=" parameters.
video=vesa:ywrap video=vfb:font:5 vga=788
結果從boot message中可以看到vesa和vfb都啟動了。
# cat /proc/fb
0 VESA VGA
1 Virtual FB
可以知道都啟動了,而且VESA是fb0,VFB是1.
對/dev/fb0,/dev/fb1都可以作檔案操作。
但是console是VESA。
frame buffer : DirectFB
一般的display card都會支援VESA Mode.
所以可以使用framebuffer的vesa driver.
首先要確認kernel有buildin(或有module) vesafb driver
(在menuconfig的console--framebuffer--vesa 選 * 或是M)
在boot argument中加入:
(以grub為例)
video=vesa:ywrap,mtrr vga=791
從vesa framebuffer的code : driver/video/vesafb.c中可以看到vesa mode支援的option.
'ywrap' enables panning with wraparound.
'mtrr' enables setting caching type for the frame buffer to write-combining.
vga=791是設定顯示模式
This sets the mode on startup. 791 means 1024x768@16, 788 means 800x600@16.
All VESA Video Modes:
Bits 640x480 800x600 1024x768 1280x1024 1600x1200
8 769 771 773 775 796
16 785 788 791 794 798
32 786 789 792 795 799
所以以上boot argument會啟動vesa framebuffer,並且設定解析度是1024x768 16bit.
framebuffer啟動後,螢幕會變大(廢話),/proc/fb是 framebuffer資訊,
對/dev/fb0寫入資料會影響到螢幕。
身分證號碼檢查
在http://www.neo.com.tw/archives/000490.html 看到的
private boolean isIdNumber(String ID) {
boolean rule = false;
if (ID.length() == 10) {
ID = ID.toUpperCase();
byte s[] = ID.getBytes();
if (s[0] >= 65 && s[0] <= 90) {
int[] c = new int[11];
int a[] = {10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35, 23, 24, 25,26, 27, 28, 29, 32, 30, 31, 33};
c[0] = a[ (s[0]) - 65] / 10;
c[1] = a[ (s[0]) - 65] % 10;
for (int i = 1; i <= 9; i++) {
c[i + 1] = s[i] - 48;
}
int count = c[0];
for (int i = 1; i <= 9; i++) {
count += c[i] * (10 - i);
}
if ( ( (count % 10) + c[10]) == 10) {
rule = true;
}
}
}
return (rule);
}
A=65(ASCII)
Z=90(ASCII)
A=10 台北市 J=18 新竹縣 S=26 高雄縣
B=11 台中市 K=19 苗栗縣 T=27 屏東縣
C=12 基隆市 L=20 台中縣 U=28 花蓮縣
D=13 台南市 M=21 南投縣 V=29 台東縣
E=14 高雄市 N=22 彰化縣 * W=32 金門縣
F=15 台北縣 * O=35 新竹市 X=30 澎湖縣
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山
H=17 桃園縣 Q=24 嘉義縣 * Z=33 連江縣
* I=34 嘉義市 R=25 台南縣
星期三, 4月 20, 2005
星期二, 4月 19, 2005
Virtual Frame Buffer : vfb
但是因為這樣就以vfb作console,所以boot message都導入vfb而看不見了。
實際上vfb是ok的。
menuconfig Console加入vga text console.
enable virtual frame buffer.
*要及記得enable telnetd或ssh.因為啟動vfb後console就不見了,要用telnet來
控制。
在boot argument加入video=vfb:font:5
"video="開頭的部分會pass給video_setup( )。
video_setup( )會將"vfb:"開頭的部分pass給vfb_setup( )。
"font:5" 我也不知道要設多少,只知道vfb_setup( )只認識font:
boot到bios report memory後就停止了。
等HD停止。用HD來判斷boot complete.
telnet
dmesg可以看到vfb 的message:
"fb0: Virtual frame buffer device, using 1024k of video memory"
/dev/fb0可以當作是file作read/write動作
#echo 012345 > /dev/fb0
#cat /dev/fb0
012345
--------------------------------------------------------------
init/main.c : start_kernel --> setup_arch( )
setup_arch( ) --> conswitch = vga_con.
vga_con 宣告在driver/console_vga.c
猜測如Lu Sir所說,是console跑到vfb了,所以看不到boot message。
==> 啟動後用telnet試試。
menuconfig,將vga_text console 拿掉。build 看看。
Linux ignores input when using the framebuffer driver
- Question:
- When using the framebuffer driver the console output goes to the LCD display, but I cannot input anything. What's wrong?
- Answer:
- You can define "console devices" using the console= boot argument. Add something like this to your
bootargs
setting:... console=tty0 console=ttyS0,$(baudrate) ...
This will ensure that the boot messages are displayed on both the framebuffer (/dev/tty0) and the serial console (/dev/ttyS0); the last device named in aconsole=
option will be the one that takes input, too, so with the settings above you can use the serial console to enter commands etc. For a more detailed description see http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/configure-kernel.html
星期一, 4月 18, 2005
Module __SETUP : kernel boot argument
__setup("video=",video_setup);
這樣的宣告,意思是將kernel boot argument中有video=???的部分交給video_setup( )這個function.
這樣啟動時也可以將參數通知Module。
像video=這一個boot argument就是用來通知framebuffer module (fbmem)。
video=scrollback:120k map:1234 vc:1-4 vfb:font:3
從source code上看來各option好像要照順序。
,
超清楚- 編譯核心(其實還包括module,initrd和grub)
步驟大概是:
- build kernel
- build module
- build initrd
- modify GRUB
make menuconfig - uncheck module-version-xxxx
make dep
su
make bzImage (11:05 ~ 11:12)
--Makefile中有 include arch/$(ARCH)/Makefile
--這個Makefile就有bzImage targe
--其實bzImage就是到arch/i386/boot下run make bzImage
--bzImage的depend target是vmlinux
--OK在arch/i386/boot下有bzImage.
cp /arch/i386/boot/bzImage /boot
--將bzImage copy到開機目錄
make modules
--如果version number沒變,要先將library module rename
--mv /lib/modules/2.4.18-20 backup
make modules_install
--在/lib/modules/下產生一個2.4.18-14customm,好像要rename成2.4.18-14
depmod -a
--如果沒有message顯示,代表module ok
--如果有?
Install RH8 again
安裝minimal package for kernel developement--- X都不裝。
---這樣竟然也要快0.9G.
09:55開始
10:10結束
disk 1-3.
星期五, 4月 15, 2005
chroot後symbolic link不能用的問題:
標題: Proftpd會看不到連結目錄嗎?
時間: Tue Sep 3 01:50:05 2002
※ 引述《MarsJn.bbs@bbs.cju.edu.tw》之銘言:
> 使用ln作出的連結目錄,在proftp會看不到嗎?
我想您應該是問到一個匿名登入後,發現 symbolic link 失效的問題。
由於匿名登入下,ftpd 會呼叫 chroot() 將某個目錄作為匿名登入
環境下的更目錄,比方系統實際上是使用 /var/ftp 當作匿名登入後的
/ 目錄。
在該環境下,若是您有建立 symbolic link 檔案連結超過 /var/ftp
目錄外的話,那當然會失效。若是您 建立 symbolic link 檔案,其
連結目的還是在 /var/ftp 裡面相關目錄的話,應該使用相對路徑而
不是絕對路徑。
若是您真的有需要連結 /var/ftp 目錄外的目錄,應該考慮使用
mount --bind 的方式把目錄掛入到 /var/ftp 裡面。比方:
mount --bind /home/blah /var/ftp/pub/share
mount --bind,需要在 kernel 2.4 後才可以使用。
奇怪的問題:Recvfrom: Resource temporarily unavailable
他用文字檔測試,發現跟file size有關係。--加上一個字就OK。
發現跟4的倍數有關,不行的檔案+1,+2,+3都可以,+4就不行。
dmesg的結果顯示UDP checksum error.
BlueCat linux 4.1, linux kerenel 2.4.18 arm.
framebuffer fb_mmap() in fbmem.c
他先check device有沒有implement mmap,如果有就執行device的mmap,
如果沒有就執行fbmem default的mmap:
start = fix.smem_start; // fd的fix data: fb的start address
off += start;
vma->pgoff = off >> PAGE_SHIFT;
...
io_remap_page_range(vma_start,off,
vma->vm_end - vma->vm_start, vma->vm_page_prot);
其中io_remap_page_range( )在asm-arm/io.h中define為
remap_page_range(from, physic,size,prot)
所以實off就是physical address,這個address在mmap return時會藉由vma->vm_pgoff
轉成return value傳給caller application
struct vm_area_struct
unsigned long vm_start; 在vm_mm中的起始位置
unsigned logn vm_end; 在vm_mm中的結束位置+1
...
pgprot_t vm_page_prot; 存取權限
unsigned long vm_flags; flags
..
struct vm_operations_struct *vm_ops; 處裡的function pointer
...
unsigned long vm_pgoff; 映射起始位置是在vm_file的?offset.
struct file *vm_file; 映射的file
星期四, 4月 14, 2005
mmap : mmap a file
start : 要把記憶體放哪?如果是0代表請system決定。
length : 要把fd的多少大小(長度)映射到記憶體。
prot : 保護方式
PROT_EXEC : 可被執行
PROT_READ : 可被讀取
PROT_WRITE : 可被寫入
PROT_NONE : 不能存取
flag : 特性
MAP_FIXED : 如果start指定的位置無法被映射則放棄
MAP_SHARED : 寫入資料到映射區會寫回fd內,供其他process使用。
MAP_PRIVATE : 對fd作複製,所有動作不影響到fd.
MAP_ANONYMOUS : 忽略fd,和檔案無關。
MAP_DENYWRITE : 只允許經由映射區作寫入,不允許其他process對fd寫入
MAP_LOCKED : 鎖定映射區,不被swap out
offset : 從fd的offset位置開始映射,必須要是分頁大小的整數倍。
return code
成功則傳回映射的起始位址,否則傳回MAP_FAILED(-1),原因再errno中。
#include <sys/mman.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc,int *argv[])
{
int fd;
char *mapped_mem;
const int len=100;
int i;
fd = open("testfile",O_RDWR | O_CREATE);
lseek(fd,length+1,SEEK_SET);
write(fd,"\0",1);
lseek(fd,0 ,SEEK_SET);
mapped_mem=mmap(0,len,PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
for(i=0;i<10;i++)
mapped_mem[i]='0'+i;
return 0;
}
執行後會產生testfile檔,cat後會是
1234567890
To understanding Linux VMM
因為這個module和比較獨立,這module的工作在memory low時選一出一個process來kill。
接著non-contiguous memory allocator: mm/vmalloc.c
physical page allocator : mm/page_alloc.c
creation of VMAs and memory area for process
以上的部分在其他VM的部分都會大量的使用到。所以先了解有助於了解其他的code。
--------------------------------------------------------------------------------------
NUMA (Non-Uniform Memory Access)
硬體的memory有區分,例如:每一個CPU旁都有一塊memory,CPU取用起來比較快。
DMA旁有一塊。
Node : 每一塊有區分的記憶體都是一個Node。 用pg_data_t 來表示。
所有的pg_data_會被串起來,在pgdat_list。
以x86來說,是UMA(uniform memory access),也就是說,
他只有一塊memory,
所以x86的linux系統,他的pgdat_list只有一比資料(一個Node)。
Zone :Node又被分成很多小塊(通常依照address分割),叫Zone,
用zone_t紀錄。
page:每個Zone又被分成很多page,表示的data structure就是
page所有的page倍放在mem_map[]
GPD (Global Page Directory) : 每個process都有一個GPD。
About diff
-----------------------------------------------------------------------------------
diff會產生單一檔案,內容包含所有的file difference.
diff產生的結果檔是由很多小區塊組成,
每一個區塊由@@開始,標明startline of code,還有修改前,後的source line數,
接著還會顯示修改的code 前面和後面部分的code,讓人容易了解。
每一行由+,-或是空白起頭。
+ 表示要加入這一行
- 表示要刪除這一行
空白代表這一行維持不變
以下是linux kernel pathc一般的rule
一般linux的diff都是
星期三, 4月 13, 2005
Qt/Embedded - low level classes
更加底層的抽象描述則在src/kerne/qgfx_qws.cpp的Qscreen 中定義。
對framebuffer直接操作,包括點、線、區域填充、alpha混合、屏幕繪制等。
星期二, 4月 12, 2005
Linux Framebufer driver writting howto
舊的api讓console的code和frame buffer driver link在一起,新的driver將console code移到fbcon
fbcon將顯示卡的功能包起來,讓vt console和device drvier可以分開修改。
一個最好的例子就是virtual framebuffe : vfb。
vfb並不是真正的graphic card,他只是將memory mapping到user space,
有關每個function的內容,可以參考linux/drivers/video/skeletonfb.c。
Data Structure
framebuffer有4個比較重要的structure,都宣告在 fb.h
fb_var_screeninfofb_var_screeninfo : 可以設定的資料,向color depth,resolution。
fb_fix_screeninfo
fb_monospecs
fb_info
fb_fix_screeninfo :不能設定的資料,向framebuffer start address
fb_monospecs :避免user program作一些硬體不容許的動作,例如不正確的resolution。
fb_info : 硬體的資料,和card關聯在一起,例如一個有2個output的card,那就會有兩個fb_info,fb_info只有kernel看得到。
Driver Layout
vfb.c是一個比較清楚的範例。
Initialization and boot time parameter handling
啟動時會執行的function有:
int xxfb_init(void);
int xxfb_setup(char*);
上面的function,通常在寫好後,藉由fbmem.c這個code的宣告,在load時link到kernel裡:
static struct {
const char *name;
int (*init)(void);
int (*setup)(char*);
} fb_drivers[] __initdata = {
#ifdef CONFIG_FB_YOURCARD
{"driver_name",xxfb_init,xxfb_setup},
#endif
xxfb_setup(char*)是在kernel boot時使用的,例如,用bootloader開機時同時下達以下參數:
boot: video=matrox:vesa:443
這個video的string會被傳給setup( ) function.
setup function一般是這樣:
int __init xxfb_setup(char *options)
{
char *this_opt;
if(!options || !*options)
return 0;
for(this_opt = strtok(options,","); this_opt;this_opt=strtok(NULL,",")) {
if(!strcmp(this_opt,"my_options")) {
....do something your options want....
 }else if (!strncmp(this_opt,"other_options:",5))
...
}
另一個function : xxfb_init( ) 設定好video card的initial state,還要處理bus的相關動作(pci,isa或none)
星期一, 4月 11, 2005
Source Navigator 5.2b2 1不認識中文檔名
所以build project時會會出現error,當機。
但是將project file放在source folder裡就可以(猜測是 "."),
但是add more folder,其他的folder就reference不到。
星期五, 4月 08, 2005
Bus CLK :25 or 33MHz
Bus Width: 32 bit
Autodetetion of interface board (Jumpless)
Automatically configured at boot time
device driver can access the configuration information in the device
Addressing
peripherial is identified by a bus number, a device number, a function number.
each PCI domain can host up 256 buses.
each bus can hosts up 32 devices.
each device can be a multifunction board with a maximum 8 functions.
each function can be identified at a hardware level by a 16-bit address, or key.
Linux device driver doesn't need to deal with these binary address, it uses a specific
data structure, pci_dev to act on devices.
command "lspci" and the file "devices" in /proc/bus/pci/ shows all pci peripherial datas,
$lspci
00:00.0 Host brigde
00:01.0 ISA bridge
00:07.0 IDE interface
....
The hardware circuits of each peripherial board answers queries pertainning to tree address space: memory location, I/O and configuration registers.
memory locaion and I/O are all the same for every bus. so queries one bus at one time.
then won't collid.
Memory and I/O are accessed in the uaual way via inb. configuration transations are performed by
calling specific kernel function to access configuration register.
Every PCI slot has 4 interrupt pin. each function can use
星期四, 4月 07, 2005
About BlueCat 4.1
BlueCat還真利害,除了linux kernel部分有source code,其他的一律沒有,
所有root file system需要的都已經build好,包刮busybox,所以全部都沒有source code。
....這違反GPL吧,特地查了一下busybox,真的是GPL license....
一般embedded覺得麻煩(有趣,有用)的部分:root file system,BlueCat提供了自己
寫的program:
mkrootfs : 產生,加入,parse share library,strip debug information...etc當然,也沒附source code。這倒是不違反GPL。(不過顯得小氣而已)。
mkboot : 配合BlueCat的bootoader.
cross developement tool都已經build好,也寫了script設定environment。
沒看到library的selection和build,所以?一律使用glibc?
結論:
明明都是open source的東西,但是都
用Linux的原因..
Our customers have an aversion to putting Microsoft in any of their devices. They're not interested in seeing Microsoft usurp value from their devices
.....
Microsoft's entry in the set-top box market. They're not just interested in being a software supplier; they're interested in taking over the business altogether.
-------------------------------------------------------------------------
就像smartphone,剛開始只有一家,超強的一家(現在還是很強)。
但是當MS在這一家累積了經驗後,他的software platform越來越完整,
接著就有很多家出來了,因為只要(也只能)follow MS的規定和referecence design
就可以作出smart phone來了。
而且重點是,隨著MS在market上累積的經驗越來越多,他的developement
platform越來越完整,各家的差異也越來越小了。
最後smart phone就像pc一樣,像郭說的一樣,不是電子業,而是機構,組裝而已。
所以要為MS工作嗎?
還是使用Linux,保持多樣性和維持自己的優勢?
Ghost 2005 (9.0)
因為這是Notebook,只有256M RAM(真的是少了一點)。
不過目前NB的一般規格都是256M。
Ghost說可以執行輩分,但是run restore disk的畫就需要256M了。
真慘,256 Onb share w Graphic,所以當然不足256囉。
能backup不能restore的東西等於沒用,
那就...看看使用說明好了。
哇!竟然還要裝.NET。
唉!一個backup的工具也要搞得這樣大的陣仗。
還是算了。別試了吧。
.
.
早上寫的這篇,下午MIS就通知windows又有重要更新了,
是針對.NET framework,
我update了一下,發現我不需要,
還好沒裝.net。
因為我google了一下這個"重要更新",
發現有很多問題,包瓜讓IIS無法動作。
.
還好,我沒為了Ghost裝.net。
百慕達之謎已找到線索
有魔鬼三角區之稱的百慕達海域不知吞沒了多少船隻,航行者提起這個地方就發
毛,因為十多年己有一百多架飛機,兩百多艘船在此地失蹤,奇怪的是殘骸始終找不
到,有時連派去溲索的飛機和船隻也一去不回,所以此地也叫死亡之域或死亡三角區。
死亡三角區是如何埋葬船和飛機呢﹖過去一直是不解之謎,近來科學家努力討究,
似乎己找到線索。
原來百幕達三角區海域潮流向是個大旋渦,旋渦轉起來像一塊凹面鏡,此鏡經陽光
照射,陽光被聚焦,焦點周圍溫度上升到萬度,所以過往船隻和飛機都融化掉了。
科學家作以下試驗,一個大浴盆裝滿水,然後攪動,讓水湧起旋渦,再令強烈聚光
燈以十六到七十五度入射角照射旋渦,不久奇蹟出現了,一張懸在浴盆上空薄紙突然燒
起來,接著科學家把旋渦直徑加大到一百公尺,引入太陽光,發現陽光焦點直徑有一公
尺以上,焦範圍溫度高到萬度。
百慕達三角區旋渦直徑據說有好幾千公里,生命長達六十多天,在陽光以十度到七
十五度角入射時,焦點周圍直徑可達到幾百公尺到上千公尺,其焦點周圍溫度超過萬
度。
所以飛機,船一入焦點地區,頃刻間化為烏有。即使進入高溫區邊緣,也會引起爆
炸和燃燒。
=========================================================
以上是從這裡copy過來的。
星期三, 4月 06, 2005
CCD: Color Rolling
自動白平衡根據影像的色分布扭曲色平衡,藉以改變顯示的色偏。
因為是一種回授的動作,所以很容易產生震盪。造成顏色週期的改變。
自動白平衡實驗:
將CCD對準藍色牆壁,慢慢將白紙深入拍攝範圍中,
可以看到白紙的顏色隨著深入的量而改變。
星期一, 4月 04, 2005
星期六, 4月 02, 2005
resize 要用 bicubic 還是 bilinear?
作者是Shade.
--------------------------------------------------
resize 要用 bicubic 還是 bilinear?
----------------------------------
好問題
也許有人看過 Nicky 寫的這篇:
http://nickyguides.digital-digest.c...-vs-bicubic.htm
他的建議是
放大用 bicubic
縮小用 bilinear
一般我們做 DVDRip 的時候都是用縮小 resize,放大留給播放的時候再去放大。
縮小 resize 的計算步驟
1. pre-filter
2. 座標變換
3. post-filter
resize 的時候,要計算像素的座標變換,例如 704x480 -> 320x240,
新畫面座標 (99,99) 這個點對應到原畫面,是 (217.8,198) 這個點,
落在原畫面的整數像素之間。
704/320 = 2.2
x = 99*2.2 = 217.8
480/240 = 2
y= 99*2 = 198
所以 (99,99) 對應的 (x,y) 是 (217.8,198)
當然原畫面是沒有 (217.8,198) 這個點的數值,那我們要計算這個位置的像素值應該是多少,
也就是對應過來的新畫面座標 (99,99) 的像素值是多少。
那要怎麼計算這個在像素中間的值呢?
我們會利用內插法,也就是利用這個點周圍鄰居的像素值,來推算這個位於像素中間的數值。
這個內插法使用的 interpolation filter 也就是步驟三的 post-filter,
常見的有以下幾種方法:
1. Nearest neighbor: 最近鄰居法,就是很簡單的直接拿最靠近的鄰居(像素)數值來使用。
2. bilinear: 使用周圍 2x2,4 個鄰居做垂直、水平的線性內插。
3. bicubic: 使用周圍 4x4,16 個鄰居來做內插,內插的算式比較複雜,按距離的遠近有不同的權重。
縮小的時候會發生一種瑕疵叫做 aliasing,也就是原本的高頻被當成低頻訊號,
使得縮小後的低頻出現不正確的結果。
從畫面上看起來 aliasing 會造成 moire 和 鋸齒,線條會一格一格的很難看。
解決的方法是步驟一,先用一個 pre-filter 濾掉 resize 後無法正確記錄、
會引起 aliasing 的高頻訊號,然後再 resize,這樣就可以解決 aliasing 的問題。
但是這個 pre-filter(也就是一個 low pass filter)的設計有兩個困難。
不同種類的 filter 濾除高頻的特性不一樣,有的會造成畫面模糊。
如果 filter 的 tap 數越高(計算的像素個數越多),計算越精確,
品質當然越好。但是 tap 數太高,會造成另一種瑕疵叫做 ringing effect,
所以這個 filter tap 數不能太高。
但是如果 tap 數太低,無法無法良好的濾除高頻,又會發生 aliasing 的瑕疵。
所以這是一個兩難,必須視縮小率來調整最恰當的設計。
Avisynth 的 bicubic 設定
# BicubicResize(clip, int target_width, int target_height, float "b", float "c")
其中參數 b 代表模糊的程度,c 代表 ringing 的程度。
預設值是 b = 1/3, c = 1/3。
b = 0, c = 0.75 等於 VirtualDub 的 "precise bicubic"。
Avisynth 建議,理論上保持 b + 2 * c = 1 會得到最正確、最適當的 filter 結果。
例如 b = 0, c 便要 = 0.5,如果 c 超過 0.5 就會產生 ringing 瑕疵。
bilinear 的畫面比較模糊,但是也比較好壓縮,做 1 CD 的時候,用 bilinear 會比較好。
SimpleResize 這個 resize 法就等於 bilinear 拿掉 triangle filter,
所以它的畫面會比 bilinear 銳利一點。
如果你的畫面本來就很銳利,用 SimpleResize 縮小,那麼就會出現 aliasing 瑕疵。
前面的討論中,我們有提到一個 resize 的王者,叫做 lanczos3。
這個 resize 法是一種 decimation filter,本身具有 low pass 的效果,
也就是使用 lanczos windowed 的 FIR Low Pass Filter,它的 tap 數會根據縮小率
自動變化,在清晰度和 ringing effect/aliasing 等瑕疵之間取得最佳的平衡點。
所以 lanczos3 等於自己是一個完美的 low pass filter
根據大家的實驗,lanczos3 可以保留最多的細節,而又不會造成太大的壓縮困難,
所以建議如果流量夠的話,用 lanczos3 可以得到最佳的結果。
相關討論,可以看日本的網站或 Doom9。
另外,lanczos3 處理放大,效果也很不錯。
放大縮小都行,所以說它是 resize 的王者
星期五, 4月 01, 2005
不可思議的事..
- 網路商店: 以伺服器、使用者與付款處理系統,或是用戶端、伺服器架構 透過網路販賣物品 - EP803105 與 EP738446
- 以行動電話訂購: 透過行動電話網路銷售物品 - EP1090494
- 購物車: 電子購物車 - EP807891 與 EP784279
- [CDs] [Films] [Books]: 分頁標籤 - EP689133
- 圖片連結: 預覽視窗 - EP537100
- 檢視/下載影片: 透過網路傳送視訊資料 - EP933892
- 觀看影片: 視訊串流 (「根據需求提供視訊片段」) - EP633694
- MP3 格式: 被好幾個專利保護的音訊壓縮格式, 像是 EP287578
- 信用卡: 透過 Internet 以信用卡付款 - EP820620 與 EP779587
- 禮品: 提供他/她的 Email 位址,透過 Internet 為某個人訂購禮品的專利 - EP927945 (留意: 這個連結所聲明的內容比較狹窄;最後通過的專利內容在 B1 form)
- 申請貸款: 自動申請貸款 - EP715740
- VISA: 圖片的數位簽章,以顯示商店能夠接受 VISA 信用卡付款 - EP798657
- 傳送優惠訊息: 回應需求、提供特殊優惠的專利 - EP986016
- 送到廠商: 把收到的訂單轉給廠商 - EP217308
- 支援資料庫: 使用資料庫的網路支援系統 - EP673135
- 預覽章節: 以電視暗喻選擇不同影像片段 - EP670652
- 金龜子圖片: JPEG 格式 - EP266049
- 相關結果: 顯示客戶可能感興趣的相關結果 - EP628919
- 折扣碼: 讓客戶輸入折扣代碼 - EP370847
- 由商店燒錄: 在遠端重製實體資訊的專利 - EP195098
GCC attrib: naked
但是如果不想要compiler加上這些code,就可以在function宣告時加上attribut : naked
void funA(void) __attribute__ ( (naked))
{
...
asm("ret");
}
這樣compiler就不會加code,但是也因為這樣,programmer自己要在最後加上return code。
這通常是在os kernel時使用,例如context switch function,programmer要自己處理context save
restore的動作。
http://www.freertos.org/implementation/a00012.html
和
http://www.freertos.org/implementation/a00013.html
有說明和範例
解夏
http://blog.sina.com.tw/archive.php?blog_id=112&md=entry&id=12833
網誌存檔
-
▼
2005
(620)
-
▼
4月
(60)
- MPEG4LIVE : Media Node
- SDL : Simple Direct Media Layer
- 又要記了..
- MP4Live Internal 翻譯
- memo : available time
- design draft : transfer file throufh tcp
- 偉大的CEO..
- VGA resolution
- 重新開張第一天
- 軟便記
- 今天的工作還是....
- 又....
- 奇怪,主頁進不去...
- Framebuffer : Multi framebuffer device
- frame buffer : DirectFB
- 身分證號碼檢查
- 這篇不錯:Gmail的功能
- 今天的工作是..
- Virtual Frame Buffer : vfb
- Linux ignores input when using the framebuffer driver
- ...
- Module __SETUP : kernel boot argument
- follow 這個 link,奇怪的是怎麼make bzImage後make clean ?然後ma...
- 超清楚- 編譯核心(其實還包括module,initrd和grub)
- Install RH8 again
- 向陽農場
- 向陽農場
- chroot後symbolic link不能用的問題:
- 奇怪的問題:Recvfrom: Resource temporarily unavailable
- framebuffer fb_mmap() in fbmem.c
- struct vm_area_struct
- 又忘記,所以再寫一次:find grep
- mmap : mmap a file
- HTML Tag: PRE
- arm linux bootloader
- To understanding Linux VMM
- About diff
- Qt/Embedded - low level classes
- 用hyperterminal送hex的方法
- vesafb
- Linux Framebufer driver writting howto
- Source Navigator 5.2b2 1不認識中文檔名
- 晴天霹靂...
- PCIBus CLK :25 or 33MHzBus Width: 32 bitAutodeteti...
- About BlueCat 4.1
- 用Linux的原因..
- Ghost 2005 (9.0)
- 百慕達之謎已找到線索
- 新名詞: SOA
- CCD: Color Rolling
- ...
- ...
- ...
- ...
- Some Keywords.
- resize 要用 bicubic 還是 bilinear?
- 不可思議的事..
- 完工
- GCC attrib: naked
- 解夏
-
▼
4月
(60)