読者です 読者をやめる 読者になる 読者になる

Tech と Culture

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

IJG jpeg library

IJG(Independent Jpeg Group) のライブラリには充実したドキュメントがあるのでそれを調べました。structure.docにdjpegの構造が載っています。

Here is a sketch of the logical structure of the JPEG decompression library:

|-- Entropy decoding
|-- Coefficient cont --|
| |-- Dequantize, Inverse DCT
Main --|
| |-- Upsampling
|-- Postprocessing cont --| |-- Colorspace conversion
|-- Color quantization
|-- Color precision reduction

Color quantizationとColor precision reductionは無視して良い気がします???
他のJPEGの本を読んでも ハフマンデコード 量子化・DCT アップサンプリング YCbCr->RGB変換が大まかな処理と説明されている。IJG のjpeg libraryはそれぞれの処理にある単位のデータが流れてストリーム処理を行っていくようです。

ということは、全ての処理が終わってからbmpファイル出力のところでフレームバッファに書き込むのではなく、Colorspace conversionの所の処理が終わった分だけ順に書き込んでいくことができるはず。

日曜工作なのでとりあえずやってみるスタンスでプログラムを変更します(まずはホストのXwindow表示版から)。

調べるとjdcolor.c 内部の関数 ycc_rgb_convertが一行毎にピクセルを変換している模様。また、jinit_color_deconverterがここの処理の初期化関数の模様。
jinit_color_deconverterにWindowを作る処理を追加。
ycc_rgb_converterでpixelを打つ出力関数を追加。
これでコンパイルすると無事に画面にjpeg画像が出ました。

全体の変更がこれで良いことが分かったのでターゲットボード用のプログラムの方も同じように変更します。
jinit_color_deconverterにフレームバッファをオープンしてmmapする部分を追加。
ycc_rgb_converterでフレームバッファにピクセル毎に書き込む関数を追加。

ちゃんと画像が出力されました。
これまでは、プログラムを実行するとしばらく考えてから、下のラインから順に描画されていましたが、今回はすぐに左上から描画が始まります。
しかし、描画が遅い。。。。。。。。。。。。。
VGAサイズを表示するだけで間違いなく1秒以上かかっている
このままではmotionJPEGに移行しても0.5fpsとかの値になって、動画というより紙芝居になってしまいます。。。。。