Independent JPEG Group's JPEG software release 6b
   with x86 SIMD extension for IJG JPEG library version 1.02


● このソフトは

JPEG のサポートライブラリとして広く使われている Independent JPEG Group's JPEG library (libjpeg ライブラリ) に、Intel x86 系 CPU の持つ SIMD 命令を利用したコード(ルーチン)を新たに追加し、高速化改造したものです。 MMX や SSE などの SIMD 演算機能を装備しているプロセッサ上で動作させると、 オリジナル版の libjpeg ライブラリと比較して 2〜3 倍程度の速度で動作します。 また、SIMD 化に依らない高速化改造もいくつか施されており、SIMD 演算の使えない旧型 CPU においても、オリジナル版と比較して十数%程度高速に動作します。

JPEG 圧縮/展開処理の高速化を目的としていますが、動作速度最優先ではなく、 オリジナル版と同等以上の計算精度を持つことを最優先に考えたコードを採用しています。 実際、DCT演算に浮動小数点DCTを使った場合、および、やや特殊なサンプリング比(h1v2)を持つ JPEG ファイルを展開する場合を除いては、オリジナル版と1ビットも違わない結果を出します。 上記の2つの例外の場合もオリジナル版よりは高画質化(高精度化)されています。

SIMD 対応化に際しては、可能な限り、 オリジナル版の libjpeg ライブラリとの互換性が失われないように考慮されていますので、 ほとんどの場合、オリジナル版をそのまま置き換えることが可能です。 特に、共有ライブラリに関して言えば、一部の例外(cygwin の場合)を除き、 それはオリジナル版とバイナリレベルでの上位互換性がありますので、 そのままオリジナル版を置き換えることができます。

● 対応しているプラットフォーム

Intel x86 CPU に固有の機能を利用していますので、オリジナル版とは異なり、 Intel x86 CPU およびその互換 CPU を採用しているシステムに限られます。 PowerPC などの Intel x86 系以外のシステムには対応していません。

具体的には、80386 以降の Intel x86 CPU およびその互換 CPU を採用しているハードウェアで、かつ、32bitフラットアドレスモード(保護モード) を使用しているプラットフォーム(OS)が対象です。これには、Win32 (Windows 9x系/NT系) や各種 PC-UNIX (linux や xBSD ファミリなど) などが該当します。なお、 AMD64 (EM64T/Intel64) の64bitモード環境には(現時点では)対応していません。 ご注意ください。

作者のところでは、Win32 の各種C言語処理系と、NetBSD・FreeBSD・Linux (Fedora Core 4〜9 & Vine Linux 3.2/4.2)・Solaris 10 (x86)・Darwin 8.0.1 (x86) での動作確認がとれています。

● アセンブラ NASM の入手/インストール

この x86 SIMD 版 libjpeg ライブラリの SIMD 拡張部分は、そのほとんどが x86 のアセンブリ言語で書かれています。このアセンブリ言語ソースコードをアセンブルするには、 NASM (Netwide Assembler) というアセンブラが別途必要です。

Windows 系の場合は、 公式サイト から nasm-0.XX.YY-win32.zip (XX.YY にはバージョン番号が入る) という名前のファイルをダウンロードして、それに含まれる nasmw.exe をCコンパイラの実行ファイル群がインストールされている場所にコピーします。

各種 PC-UNIX の場合は、 OS の配布元にて移植済みパッケージが提供されている場合がありますので、 まず最初にそちらを確認してみてください。それがない場合は、 上記公式サイトからソースコード(もしくは RPM パッケージ) をダウンロードしてコンパイル/インストールしてください。

なお、x86 版の Darwin や Mac OS X などで使用する場合は、 現時点ではまだ正式にリリースされていない V.0.98.40 以降の NASM が必要です。 現時点では、V.0.98.40 は上記の公式サイトの CVS リポジトリ から ソースコード一式をダウンロードしてコンパイル/インストールする必要があります。

● 使用条件・サポート

この SIMD 拡張版 IJG JPEG software の使用条件については、 オリジナル版の IJG JPEG software の使用条件が適用されます。

この SIMD 拡張版 IJG JPEG software は、オリジナル開発元の IJG とは関係なく、 独自に拡張を行なったものです。ですので、この SIMD 拡張版 IJG JPEG software に関する質問を、オリジナル開発元 (The Independent JPEG Group) に送らないでください。

この SIMD 拡張版 IJG JPEG software に関しては、 原則としてノーサポートとさせていただきます。ご意見やご感想につきましては、 メールよりも 当サイトの掲示板 に寄せていただきたく思いますが、 常に何らかの返答ができるわけではありませんので、ご承知おきください。 特に、(オリジナルの英文マニュアルを含め)同梱のマニュアル類に回答が書いてある質問や、 使用者のソフトウェア技術者としての技量不足に関わる質問、 質問の要領を得ない質問などについては、回答をいたしませんので、あしからずご了承ください。

● 改版履歴

● ソースコード (source code)

.zip ファイルは、テキストファイルの改行コードが CR+LF 、 マニュアルの日本語文字コードが Shift_JIS になっていて、Windows 系向きです。.tar.gz.tar.bz2 ファイルは、改行コードが LF 、日本語文字コードが EUC-JP になっていて、 UNIX 系向きです。それ以外の内容はすべて同じです。

以下のファイルは、Fedora シリーズなどの SELinux を使用している Linux システムにおいて、 スタック保護が有効になっている環境下での動作を可能にするパッチです。このパッチは、 次期バージョンのリリース時にはソースコード本体に取り込まれます。(thanks to Kenny Root)

2009/01/05 (rel.2): 同梱のspecファイル(libjpeg.spec)について、fedora 10 でビルドできない不都合を修正しました。 それと併せて、fedora 9/10 で java-1.6.0-openjdk が libjpeg=6b を要求することに対する対処も行ないました。

以下のファイルは、旧バージョンとの差分ファイル(diff)です。この差分ファイルは、 日本語文字コードが EUC-JP の UNIX 系向けファイルセットの差分ですので、Windows 系向けファイルセットにこの差分ファイルを適用する場合は、差分ファイルの日本語文字コードを Shift_JIS に変換してから差分を適用してください。

以下のファイルは、このソースコードを Mozilla Firefox に組み込むためのパッチ(差分)です。 このパッチは、Mozilla Firefox 1.5.0.1 のソースコードを元に作られていますが、 他のバージョンでも小規模な修正で使えると思います。動作確認は Visual C++ 6.0 で行なっています。 Windows 以外のプラットフォームでのコンパイルは未確認です。(謝辞:このパッチは Firefox の独自ビルド版を公開されている 綾川さんの解説 を基にしました。ありがとうございます。)

2006/04/26 (rel.2): リンカオプション変数 LDFLAGS を設定した場合、 設定ファイル jsimdcfg.inc が生成されなくなる場合がある不都合を修正しました。

● コンパイル済み Win32 実行ファイル (pre-complied binary for Win32)

IJG JPEG software に付属の5つのコマンドライン・ ユーティリティをコンパイルしたものです。IJG から公式に配布されている MS-DOS 版DJGPP 版 の Win32/SIMD 版に相当します。DLL 版は、JPEG の圧縮/展開を行なう中心部分を DLL (jpeg62.dll) に分離したものです。コンパイルは Microsoft Visual C++ 6.0 Pro SP6 で行ないました。

なお、これらのソフトの 無改造版(非SIMD/Win32版) も、以前よりこのサイトで公開しています。

以下にあるのは、これらのソフトの日本語メッセージ版です (日本語版ソースコード)。 プログラムが出力するメッセージの一部が日本語になっていて、 私製の日本語マニュアル が同梱されています。 それ以外は、上記の英語版と同じです。

Windows 版 GIMP を使っている場合は、DLL 版に含まれる jpeg62.dll が、 Windows 版 GTK に含まれている同名の DLL (C:\Program Files\Common Files\GTK\2.0\bin\jpeg62.dll) と互換があるようなので、それをこの SIMD 版 jpeg62.dll に入れ替えれば、 GIMP での JPEG の読み込み/書き出しが若干高速化されます。ただし、GIMP の場合は GIMP の JPEG プラグインの動作が遅いようなので、思ったほど速くはならないようです。

● コンパイル済み linux 用パッケージ (pre-complied binary for linux)

Fedora 10/9 と Vine Linux 4.2 用の RPM バイナリパッケージです。 このパッケージをインストールすると、JPEG の読み込み/書き出しに共有ライブラリ (libjpeg.so.62) を利用しているソフトすべてが高速化されます (これには GIMP や Web ブラウザを含め大部分のソフトが該当します)。

一応、動作確認も行なってありますが、 何か重要な役割を担っているシステムでは、十分にテストを行なってから使用してください。 これらのパッケージを使用した結果に関しては、当方は如何なる責任も負いかねます。

devel package は、libjpeg を利用したソフトウェアを開発する場合に必要になるものです。 それ以外の場合は、basic package のみのインストールで十分です。

2009/01/05 (rel.3): 上述の execstack-patch rel.2 を適用して、 全てのバイナリパッケージ・ソースパッケージを再ビルド(作り直し)しました。

以上の RPM バイナリパッケージの元になったソースパッケージです。RPM を扱える linux では、 NASM のパッケージをインストールしてから、rpmbuild --rebuild (ソースパッケージ名) でパッケージが出来上がります(うまくいけば)。

● 作者より

この SIMD 拡張版 IJG JPEG library は元々、拙作の SIMD Enhanced JPEG Plug-in に使用するために作り始めたものですが、 いずれはこういう形でオープンソース化することを念頭に置いて開発しておりました。 なので、SIMD Enhanced JPEG Plug-in では使われていない圧縮側の SIMD 化もしてあります。ちなみに、製作開始は 2002年12月。 休み休み製作して、ようやっとオープンソース化にこぎ着けました。 本当は 2005年の4月頃に公開する予定だったのですが、マシンの故障などの諸事情がありまして、 こんなに遅くなってしまいました。

SIMD Enhanced JPEG Plug-in を初めて公開した頃は、 コンピュータが十分に高速化した今では、 (動画や音声はともかく) JPEG の高速化に対する需要はほとんど無いだろうと思っていました。 本当は、CPU の速度がまだ遅く、MMX-Pentium が出始めた 1997 年頃にこういうものを作りたかったのです。 ところが、ディジタルカメラの普及とその高精細化に伴って巨大な JPEG ファイルを扱う機会が増えたためか、 SIMD Enhanced JPEG Plug-in は予想以上の好評をいただきまして、 少し予想外でした。

高速 JPEG ライブラリ としては他に、Intel JPEG library がありますが、 動作速度の面で Intel JPEG library と張り合おうなんていう意図はありません(^^;。 IJG JPEG library は構造的に高速化には不向きな気がしますし、 この SIMD 拡張版 IJG JPEG library は動作速度よりも計算精度重視で作ってありますので。 でも、広く使われている IJG JPEG library と互換が高くオープンソースであるという点で、 存在価値があればいいなぁと思っています。

現バージョンでは AMD64 には対応していませんが、AMD64 対応版は現在製作中です。 できれば今年の上半期中に、 遅くても今年中には AMD64 対応版の公開を目指しています。
2006/10/26: 製作作業が現在止まっています。予定よりリリースが遅れそうです。申し訳ありません。) ただし、i386/AMD64 以外のプラットフォームへの移植の予定はありません。ですので、 Itanium 版とか PowerPC (Mac) 版 が欲しいなどという希望には応えられません。

現在のところ、英文マニュアルがありません。とはいうものの、 ソースコード中のコメントを英文で書く場合にさえ苦労する場合もあるぐらいですから(^_^;;、 英文マニュアルに関してはほとんど期待しないでください (英文マニュアルよりも AMD64 対応化を急ぎたい)。

ちなみに、動作速度は使用するCコンパイラによって若干異なります。 私が試した中で一番速かったのは Visual C++ 6.0 Pro SP6 です。gcc だと若干速度が落ちますが、 たくさんある gcc の最適化オプションをいろいろ組み合わせてみると、少しは速くなるかもしれません。 ソースコードに同梱の MinGW 用の Makefile (makefile.mgw) には、 私が試してみて一番速くなると思われる最適化オプションが書いてあります。

cygwin の場合だけ共有ライブラリ(DLL)の互換がない理由は、cygwin から公式に配布されている DLL cygjpeg-62.dll には、Lossless JPEG patch (ljpeg-6b.tar.gz) という、 互換が崩れる追加パッチが含まれているためです。cygwin でも configure を使ってコンパイルはできますが、 cygjpeg-62.dll を置き換えることはできませんので、cygjpeg-162.dll という名前で DLL が作成されます。そしてシステムにインストールすると cygjpeg-62.dll と共存することになり、 SIMD版の cygjpeg-162.dll を利用するには、cygjpeg-62.dll を利用していたプログラムの再コンパイル (再リンク)が必要となります。


counter トップページに戻る