2010年11月28日 星期日

Transfer Function GTK+ Edition

"Transfer Function GTK+ Edition"(以下簡稱 gTF)是我在海大唸碩士時寫的一個整合式實體成像軟體,它可以利用 3D 繪圖硬體來繪製立體的醫學影像,並且能夠讓使用者調整轉換函數以檢視資料中的解剖結構。


gTF 目前的最新版本為 20100406(Win32) 與 20101026(Linux),主要提供以下功能:
  1. GTK2 GUI
  2. Enhanced 1D & 2D transfer function
  3. 3D texture based volume renderer with axis-aligned and view-aligned slicing
  4. Iso-surface extractor based on marching tetrahedra
  5. .obj file exporter for iso-surface

系統需求

  • Graphics card supporting OpenGL 2.0 or later
  • Modern Linux distro or Microsoft Windows XP (or later)

編譯相依

  • libgtk2.0-dev
  • libgtkglext1-dev


Download

Source code: gTF-20101026.tar.bz2

Win32 binary: gTF-20100406_win32.zip

Volume data: volume_data.tar.bz2

Github

https://github.com/ryuanlu/gTF


輸出影像範例(cthead)

Volume rendering
Iso-surface extraction

2010年11月13日 星期六

在 Linux 以 VLC 搭配 Jtvlc 進行實況

若要在 Linux 進行實況,請先裝 Justin.tv 提供的工具 Jtvlc。我們將利用 VLC 建立 stream server 把影音資料送給 SDP檔(Session Description Protocol),然後讓 Jtvlc 去讀取SDP檔把資料上傳給 Justin.tv。

詳細流程如下:

先執行以下指令啟動 VLC stream server,將目標檔案或裝置轉換成 H.264 + AAC 串流,並建立 sdp 介面。
$ vlc filename -vvv input_stream --sout='#duplicate{dst="transcode{venc=x264,vcodec=h264,vb=800,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{dst=127.0.0.1,port=1234,sdp=file:///path/to/vlc_sdp_file.sdp}"}'

你可以修改 vb 的值改變影像輸出的 bitrate,subq則會影響影像品質。啟動 server 以後我們就可以執行 jtvlc 將串流上傳至 Justin.tv。

$ jtvlc your_account stream_key vlc_sdp_file.sdp

其中 stream_key 是一個 live_ 開頭的字串,你可以先登入 Justin.tv 並且點選這個連結。如果網頁上沒有 stream key 字串,請打開檢視網頁原始碼視窗搜尋 stream_key,應該可以在 javascript tag裡找到它。


底下是我以前用來實況 PSP 遊戲畫面的 VLC 命令

vlc -vvv v4l2:///dev/video0  --input-slave=alsa://plughw:0,0  --sout='#duplicate{dst=display,dst="transcode{vfilter=croppadd{cropleft=121,cropright=121,croptop=102,cropbottom=104},venc=x264,vcodec=h264,vb=800,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{dst=127.0.0.1,port=1234,sdp=file://~/vlc.sdp}"}'

如果使用 input-slave 接 ALSA 裝置的話,請記得檢查 VLC 的音效輸出模組是否設定為 ALSA。

Mencoder profile for PSP

要讓 PSP 能播放 H.264 的影片,x264 的編碼旗標 x264encopts 至少要有以下幾項(使用版本 x264-snapshot-20101110-2245)
  1. global_header
  2. b_pyramid=none
  3. 8x8dct=no
  4. frameref必須小於4
以下是我目前使用的 mencoder.conf

[PSP]
profile-desc="PSP Video : H.264 + AAC"
ovc=x264=yes
sws=9
vf=softskip,scale=720:480,harddup,unsharp=l3x3:0.7
x264encopts=bitrate=500:global_header:subq=7:b_adapt=2:partitions=all:me=umh:frameref=3:bframes=3:weight_b:b_pyramid=none:8x8dct=no:threads=auto
oac=faac=yes
faacopts=mpeg=4:object=2:raw=yes
of=lavf=yes
lavfopts=format=psp=yes

這個 profile 盡可能的在要求的解析度以及 bitrate 下達到最高品質,使用者可以改變 scale 與 bitrate來調整影片解析度與檔案大小。


Reference link:
http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-x264.html
http://ashotw.blogspot.com/2009/12/mencoder-libx264.html
mencoder --fullhelp

2010年11月10日 星期三

Linux 無線 AP 架設

這篇文章使用的網路環境:
  1. 對外的網際網路連線為 PPPoE(ADSL或VDSL光纖),介面為 ppp0
  2. r8169 網卡 eth0 連接到寬頻的數據機
  3. rt73usb 無線網卡(Planex GW-US54Mini2),介面為 wlan0

我們的目標是讓無線網卡進入 AP 模式,並且透過 NAT 的方式讓無線裝置可以利用 ppp0 介面上網。首先 Linux 系統上必須先確定安裝了以下的套件:

  1. wireless-tools(iwconfig、iwlist等工具)
  2. linux-firmware(無線網卡的韌體)
  3. hostapd(無線AP服務)
  4. iptables(Linux 的NetFilter,我們需要它來做 NAT)

接下來編輯 /etc/hostapd/hostapd.conf 設定檔,其內容如下:

interface=wlan0
driver=nl80211
ssid=myap
hw_mode=g
channel=1
wpa=3
wpa_psk=95254362caf85a8b7521351858bd8d74070d27b04c8eab027af4a599a170a890

其中 driver 為 nl80211,指的是 Linux mac80211 based driver;wpa 指的是加密方式,wpa_psk為加密過的密碼字串,和wpa_supplicant一樣可以利用 wpa_passphrase 來取得。

設定完成後我們可以輸入以下的指令,設定 iptables 啟用 NAT 並執行 hostapd 啟用 AP 功能。

$ iptables -A INPUT -i wlan0 -j ACCEPT
$ iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE
$ iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
$ echo "1" > /proc/sys/net/ipv4/ip_forward
$ hostapd -B /etc/hostapd/hostapd.conf
$ ifconfig wlan0 192.168.0.1
$ dhcpd3 wlan0

192.168.0.0/24 代表的是以無線 AP 為閘道所構成的內部網域。為了方便,我們使用 DHCP 來自動分配 IP 位址給內網的電腦。以 Ubuntu 來說,DHCP server套件名稱為 dhcp3-server。在執行 dhcpd3 wlan0 之前,我們必須先設定 DHCP server,先利用文字編輯器開啟 /etc/dhcp3/dhcpd.conf,並將原本內建的基本範例改成以下內容:

subnet 192.168.0.0 netmask 255.255.255.0
{
 range 192.168.0.2 192.168.0.10;
 option routers 192.168.0.1;
 option domain-name-servers 168.95.192.1;
}

其中 range 是指網域中的主機分配 IP 範圍從 .2 ~ .10,router 是指定你的閘道,domain-name-servers就是 DNS server,這裡我們設定為使用 Hinet 的 DNS 主機。

Linux 無線網路連線

要在 Linux 下使用無線網路需要準備以下的套件:
  1. iw (無線網路工具)
  2. wpa_supplicant (若 AP 需要 WPA/WPA2 安全認證)
  3. linux-firmware (無線網卡的韌體)
  4. dhcp3-client (用來自動取得IP、DNS位址的 DHCP client)

連線的流程如下:(假設我們的無線網卡介面為 wlan0,AP的ssid為myap、密碼是mytestap)

先建立一個 wpa_supplicant 的設定檔(/etc/wpa_supplicant.conf),它的內容如下:

ap_scan=0
ctrl_interface=/var/run/wpa_supplicant

network={
	ssid="myap"
	scan_ssid=0
	proto=WPA
	key_mgmt=WPA-PSK
	psk=95254362caf85a8b7521351858bd8d74070d27b04c8eab027af4a599a170a890
}

其中proto和 key_mgmt 是指定加密協定,psk則是則加密過的密碼,我們可以利用 wpa_passphrase 這個工具得到這個字串:

$ wpa_passphrase myap mytestap
network={
	ssid="myap"
	#psk="mytestap"
	psk=95254362caf85a8b7521351858bd8d74070d27b04c8eab027af4a599a170a890
}
$

建立好設定檔以後啟動 wpa_supplicant 服務,它會在我們啟用 wlan0 連線時為我們處理 WPA 。

$ wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf &
$ iw dev wlan0 connect myap
$ ifconfig wlan0 up
$ dhclient


最後啟用 wlan0 連線,並且呼叫 DHCP client 取得 IP與 DNS,這樣無線網路應該就能使用了。

※修改於 2011/01/28

2010年11月6日 星期六

GTK視窗事件 "motion-notify-event"

GTK在視窗元件中定義了 motion-notify-event,這種訊號會在滑鼠游標在視窗元件上移動時觸發。由於滑鼠游標快速地在視窗元件上移動時會產生大量的視窗事件,使得系統來不及處理完佇列中的事件進而產生 lag 的現象。

為了解決這個問題,我們可以在這個視窗元件上加上 GDK_POINTER_MOTION_HINT。

使用motion-notify-event的視窗元件,需要執行下列指令來啟用motion-notify-event
gtk_widget_add_events(GTK_WIDGET(?) ,GDK_POINTER_MOTION_MASK);

加上 GDK_POINTER_MOTION_HINT
gtk_widget_add_events(GTK_WIDGET(?) ,GDK_POINTER_MOTION_HINT_MASK);

ALSA 使用者設定檔(Full duplex + SoftVol + SSRC)

如果你有一張類似 Onkyo SE-200PCI 這種有無法控制音量的 RCA 輸出孔,又想要在 Linux 下控制它的音量加上全雙工與 SSRC,這時候你需要的就是 ALSA 的各種 plugins。

我們可以在家目錄建立 .asoundrc 這個檔案,並且加入以下的內容:

pcm.softvol
{
 type softvol
 slave
 {
  pcm "dmix"
 }
 control
 {
  name "Master"
  card 0
 }
}

pcm.duplex {
 type asym
 playback.pcm "softvol"
 capture.pcm "dsnoop"
}

pcm.!default
{
 type plug
 slave.pcm "duplex"
}

這樣我們就可以使用 default 裝置來同時進行錄音與播放工作了。

另外如果你的音效卡支援播放 16 bits / 44100HZ 以上的格式,想讓 ALSA 混音時以較高的格式輸出的話,可以透過修改 /usr/share/alsa/alsa.conf 的內容來達成:

defaults.pcm.dmix.rate 192000
defaults.pcm.dmix.format S32_LE



Linux下 Java 視窗的中文字型

在Linux下某些Java視窗程式的中文字會變成 "口口口" 的亂碼,像是Swing介面的 Java ControlPanel。

解決的辦法就是在 [jre資料夾]/lib/fonts 下建立一個叫做 fallback的資料夾,然後在裡面建立你想用的字型檔的連結,這樣就能正常顯示中文了。