星期四, 12月 21, 2006

瓶頸

昨天的時間幾乎都花在libjpeg上面。

libjpeg架構的古老程度和libtiff似乎不相上下甚至超過。從library documentation上面可以注意到library似乎是在OO出現以前的洪荒時代開始開發。後來又經歷了物件導向大爆發,作者想改用物件導向卻又不想把Code砍掉重練,所以documentation中所謂「Poorman's OO」就出現了。沒有繼承?唉呀沒關係,只要使用function pointer,就算是路邊隨處可見的struct也可以龍飛鳳舞變出物件樹。沒有Exception?向各位隆重介紹C時代的exception:longjmp和他的好朋友setjmp,在這個充斥虛擬機器,新語言直接把指標藏起來的時代,能夠瞻仰這麼暴力簡潔的異常處理機制,實在予以讀者一種震撼的心靈感受。

自己嘗試寫個Helloworld的時候linker一直報錯,到最後才發現是忘了連結C object必備的extern "C",天啊,我用libtiff得時候還沒用到這個耶@@。去網路上晃晃還有一大票程式設計師抱怨這個問題。好傢伙,你們一定沒經歷過艱困的世紀(煙)。

執行Helloworld的時發生了恐怖的Segmentation fault事件,本來想說我的老毛病又犯了。想當初我大一和DNA他們組隊比賽,用wxWidget寫的UI也常常因為SIGSEGV爆掉。不過這次backtrace發現問題是出在libjpeg本身,不是我的問題。正當我心裡暗爽不是只有我會看到SIGSEGV時,突然想到libjpeg這麼老牌的library應該不可能有如此白爛的錯誤,於是去查詢documentation和sample code以後,我發現原來一定要設定個error handler給他,不然他就會SIGSEGV給你看,這該不會是作者在C時代代替unhandled exception的東西吧?先stderr丟一行字串然後來個pointer大暴走強迫結束程式,挺有魄力的XD

用libtiff取出table和圖以後就是用libjpeg做transcoding。做transcoding的時候libjpeg就報錯說JPEG source有corruption,開始有不好的預感。打開合出來的圖檔以後心情更糟糕:開出來的圖檔完全不對。我自己想可能有幾種因素:最糟糕的情況是Aperio用的TIFF和JPEG函式,壓出來的東西根本是錯的,而我的功力絕對沒有高到可以幫他們修復這種錯誤的地步。次糟糕的情況是我對TIFF和JPEG的架構和library使用上有錯誤的了解。

本來想說可能要被逼放棄這個方案了。不過我突然想到,既然Aperio的Web server有提供HTTP Webservice,並且提供傳回JPEG和lossless transcoding兩種方式,那我可以用後者叫他傳回我測試過的部份,然後和我自己實做的結果用hex editor做比較。看看兩個JPEG檔到底差在哪裡?就算這步行不通,我也可以要他把切片以一個個JPEG的方式傳回來然後存檔。等於是以付出多壓縮一次為代價把圖檔抓出來。要用HTTP可是又不想學C語言,怎麼辦呢?準備研究libcurl吧,C++可以用的library真是多....


至於今天呢??今天放學回家都在寫實驗動物學報告啦ˋ_ˊ 全文連結

0 意見: