jpeg軟解碼實現介紹
我的月經貼部落格該更新了!!!已經有許多博文需要補了!
去年開始的jpeg解碼項目,中間停止更新了大半年時間,上個月想起這事還沒完工,就又做了更多兼容性和性能上的改進,目前終於接近尾聲了。有需要參考的可以進去下載。
為了便於閱讀,有必要從下面幾點展開本博文:
1.為什麼寫這篇博文?
一來是對前期忙活事情的總結,二來是向感興趣人們的介紹我的實現,三來為x264學習做一些鋪墊性工作。
在此,要感謝一個台灣同仁提供的示範(由R語言編譯)和說明,沒有他的demo,我的這個demo也無法完工。因為解碼過程是個漫漫長路,中間一步出錯了,後面都會累積出錯。
jpeg_tutorial由於是R語言這種小眾語言編寫,可能很多人學習道路停止在環境搭建上,因此我上傳了編譯後的可執行文件(jpeg_tutorial.exe),你可以拿來直接執行,來對照我的解碼器JpegDecoder。
2.參考來源包括哪些?
2.1 TinyJpeg——一個小巧、精簡的jpeg解碼器,程式碼量非常少。參考其中的huffman解碼時,被其演算法繞進去了,因此放棄,導致自己實現huffman解碼的衝動,於是有了這個MiniJpegDecoder解碼器。
2.2 jpeg_tutorial——一個台灣同仁用Rust語言實現的jpeg解碼器。由於R語言不懂,無法閱讀源碼,只使用了編譯構建出的可執行文件進行對照驗證。
2.3 libjpeg/libjpeg-turbo——被其眾多文件所嚇倒,放棄參考。
2.4 mozjpeg——文件和程式碼量太大,也放棄參考。
3.該版本功能和特性包括哪些?
3.1 由jpeg文件解碼並保存為yuv文件(重取樣為yuv444_3plane,或yuv420_3plane,或nv21格式)。
3.2 通過dump開關來檢查每一步生成結果(例如各分量的量化表、huffman表,huffman解碼結果、DPCM和RLC逆變換/反量化/逆ZigZag變換/IDCT2/逆零偏置,以及yuv格式轉換)。
3.3 jpeg格式支援格式,包括四種:yuv444取樣(MCU大小為8×8,各一個Y/U/V分量block)、yuv420(MCU大小為16×16,包括4個Y分量和各一個U/V分量的block)、兩種YUV矩形取樣(MCU大小為16×8或8×16,兩個Y分量和各一個U/V分量block)
3.4 純軟體解碼,未使用x86的MMX的多媒體指令集,因此速度較慢。
3.5 小範圍驗證,可以解碼8成以上的jpg文件。
4.如何使用?
4.1 該解碼器開發環境為win10+mingw32。移植到linux環境需要修改Makefile。
4.2 編譯由兩步組成:utils庫編譯和JpegDecoder編譯,前者生成libcodec_utils.so,後者依賴前者生成可執行文件JpegDecoder。