首頁 > 軟體

jpeg軟解碼實現介紹

2020-09-22 23:00:17

我的月經貼部落格該更新了!!!已經有許多博文需要補了!

  去年開始的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大小為8x8,各一個Y/U/V分量block)、yuv420(MCU大小為16x16,包括4個Y分量和各一個U/V分量的block)、兩種YUV矩形取樣(MCU大小為16x8或8x16,兩個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。


IT145.com E-mail:sddin#qq.com