Tech と Culture

テクノロジーとカルチャー

JPEG ファイルフォーマット

JPEGファイルの内部構造を調査しました。

JPEGにおいて 0xFFXX (XXはいろいろな数値)という、最初の1バイトがFFで始まるマーカーというものが多数定義されています。
例えばJPEGデータは SOIマーカーで始まり、EOIマーカーで終わりますが、それぞれ以下の値が定義されています。
SOI (Start of Image) marker : 0xFFD8
EOI (End of Image) marker : 0xFFD9
と決められています。
エンコードされた画像データ中に 0xFF が出てくる場合もありますが、その場合は 0xFF00 と後ろに00が付加されることになっています(0xFF00というマーカーは無い)。この仕組みによりデータ中からマーカーを読み取り様々なセクションの始まりと終わりを判断できるようになっています。


JPEGデータの内部構造は以下のようなセクションに分かれています。

jpegframe.jpg

SOIとEOIにはさまれた部分をFrameと呼びます。Frame内はFrame headerとScanと呼ばれる部分に分けられます。
Frame header中には、画面の縦横サイズや成分数、サンプリングファクタなどの値が格納されています。
Scan内部もScan header と実際のエントロピー符号化後のデータに分けられます。
Scan headerには、各成分(Y,Cb,Cr)に対してどのテーブルを使うか等の指定が入ります。

今回のmotion JPEGデコーダは、ソフトウェア処理とハードウェア処理を自由に切り分けることができますので、ヘッダー部分の処理は純粋なソフトウェアで処理を行い、読み込んだパラメータをmotion JPEGモジュールのレジスタに書き込みます。その後、エントロピー符号化セグメントのデータをモジュールに転送します。

転送の方法は、最初はDMAを用いずにソフトウェア的にCPUに読み込んだ後にモジュールに書き込むという手法を用います。この動作の成功の後に転送の高速化を考えます。