jpegファイルのデコードにlibjpegを使用しています。大きな画像をデコードするとき、ユーザーは別の jpeg ファイルに切り替えることができます。 libjpeg はデコード割り込みをサポートしていますか? どうもありがとう!
3 に答える
LibjpegにはI/O一時停止機能があります。したがって、はい、エンコード/デコードプロセスを一時停止する(そして後で再開する)か、単に中断する(後で続行したくない)ことができます。
カスタマイズされた入力ルーチンを(構造を設定することにより)libjpegに提供してから、libjpegが提供するI/Oサスペンションをjpeg_source_mgr
使用できます。
libjpegのドキュメントから引用すると、一時停止は非常に簡単です。
解凍の一時停止には、単にFALSEを返すfill_input_buffer()ルーチンを使用します(以下で説明するように、エラー回復中を除く)。これにより、デコンプレッサが呼び出し元に戻り、一時停止が発生したことが示されます。
一時停止は、初期段階で発生する可能性があります(呼び出し時などjpeg_read_header
)。また、ドキュメントから:
これは4つの場所で発生する可能性があります:
jpeg_read_header(): will return JPEG_SUSPENDED.
jpeg_start_decompress(): will return FALSE, rather than its usual TRUE.
jpeg_read_scanlines(): will return the number of scanlines already completed (possibly 0).
jpeg_finish_decompress(): will return FALSE, rather than its usual TRUE.
サスペンションは、エンコード/デコードプロセスを「再開」する方法を提供するために、いくつかのバックトラックを実装します。それは高価である可能性があります(私はそれについての手がかりがありません)ので、あなたはそれがあなたのニーズに合うかどうか確かめるためにそれをテストするかもしれません。
私はあなたの問題を理解しているかどうかわかりません。
私が覚えている限り、あなたは通常のボイラープレートを最大で実行しjpeg_start_decompress()
、それからあなたはjpeg_read_scanlines()
繰り返しを介して行を読み始めます。操作をキャンセルする必要がある場合は、スキャンラインを読み取るループから抜け出します。
より良い応答性が必要な場合は、小さなチャンクで読んでください。
あなたの質問は本当にありませんか:
"is libjpg thread safe?"
基礎となるstdioライブラリがjpeg_stdio_srcを使用しているか、使用していない場合、基本的にはそうなると思います。ただし、「人生の明るい面」に立つために、保留中の割り込みを read_scanline ごとにチェックするという Georg のアドバイスに従います (割り込みハンドラーが割り込み保留フラグを設定する可能性があります)。それが私がその問題を解決した方法です(スレッドのプリエンプティブスケジューリングが必要だった場所)。