私は現在、OpenMPを使用して圧縮プロセスを高速化するlibpngに基づくC++でPNGエンコーダーを実装しようとしています。このツールは、さまざまな画像形式からPNGファイルを生成することができます。完全なソースコードをpastebin.comにアップロードしたので、これまでに行ったことを確認できます:http: //pastebin.com/8wiFzcgV
ここまでは順調ですね!さて、私の問題は、圧縮された画像データを含むIDATチャンクの生成を並列化する方法を見つけることです。通常、libpng関数png_write_rowは、PNGファイルに関するすべての情報を含む構造体へのポインターと、単一の画像行のピクセルデータを含む行ポインターを使用してforループで呼び出されます。
(Pastebinファイルの114-117行目)
//Loop through image
for (i = 0, rp = info_ptr->row_pointers; i < png_ptr->height; i++, rp++) {
png_write_row(png_ptr, *rp);
}
次に、Libpngは次々に行を圧縮し、圧縮されたデータで内部バッファーを埋めます。バッファがいっぱいになるとすぐに、圧縮されたデータはIDATチャンクでイメージファイルにフラッシュされます。
私のアプローチは、画像を複数の部分に分割し、1つのスレッドで行1を10に圧縮し、別のスレッドで11から20に圧縮するという方法でした。しかし、libpngは内部バッファーを使用しているため、最初に思ったほど簡単ではありません:)どういうわけか、libpngに圧縮データをスレッドごとに個別のバッファーに書き込ませる必要があります。その後、バッファを正しい順序で連結して、出力イメージファイルにすべてまとめて書き込むことができるようにする方法が必要です。
それで、誰かがOpenMPとlibpngの微調整でこれをどのように行うことができるか考えていますか?どうもありがとうございます!