2007年6月29日 星期五

爆料

今天早上在公司的 mailing list 上看到 Life at Google - The Microsoftie Perspective 這,後來看到「Google離職員工爆料 「免費」背後有代價」這篇的整理,覺得有種莫名奇怪的感覺。我看原文的時候,明明覺得他寫得還滿正面的,至少不是這篇全部都是批評。怎麼翻成中文會差這麼多 XD

2007年6月11日 星期一

Motion Vector Extraction

為了做 MULTIMEDIA ANALYSIS AND INDEXING 這門課的 project,我們這組需要從 MPEG video 裡面取出 motion vector(它在 MPEG video 裡的用途是用來做壓縮。一個物體在畫面裡面移動時,其實只需要描述它的位移,而不需整個重新 encode)。

不知道是不是因為大部分的人需要的都是 video 的 frame,而不是 motion vector(其實在解壓縮時只差一步),我 google 了好久都找不到工具可以用。後來發現 ffmpeg 的 ffplay 可以直接把 motion vector 邊撥邊畫出來,但是還是沒辦法 dump 出來。

$ ffplay -vismv 3 xxx.mpg

vismv 那個參數其實是三個 bit,第一個 bit 代表 P-Frame,第二個代表 B-Frame 的 forward motion vector,第三個 bit 則是 B-Frame 的 backward vector。

不過,這只能看。所以我參考 Using libavformat and libavcodec 跟 ffplay 的 source code 寫了一個程式。這個程式可以把 video 每個 frame (除了沒有 motion vector 的 I-Frame)的 motion vector 取出來。如果要改成取第幾個 frame、或是某個 range 之類的,也很好改。

g++ compile 時需要加上 -lavcodec -lavformat 兩個參數,當然也要先裝上 libavcodec 跟 libavformat 兩個 library。有裝 ffmpeg 就會有。

http://cmlab.csie.org/~victor/archive/motion_vector.cpp

2007年6月9日 星期六

Parallel::ForkManager

在 Perl 裡面如何把這種程式平行化? 假設每次 interation 是獨立的。

foreach $data (@all_data) {
eat_cpu($data);
}



超簡單



use Parallel::ForkManager; # !!
$pm = new Parallel::ForkManager($MAX_PROCESSES);


foreach $data (@all_data) {
$pid = $pm->start and next;
eat_cpu($data);
$pm->finish;
}