Parallelisierung der Erstellung von PNG-Dateien mit C ++, libpng und OpenMP

Ich versuche derzeit, einen PNG-Encoder in C ++ basierend auf libpng zu implementieren, der OpenMP verwendet, um den Komprimierungsprozess zu beschleunigen. Das Tool ist bereits in der Lage, PNG-Dateien aus verschiedenen Bildformaten zu generieren. Ich habe den vollständigen Quellcode auf pastebin.com hochgeladen, damit Sie sehen können, was ich bisher getan habe:http://pastebin.com/8wiFzcgV

So weit, ist es gut! Nun besteht mein Problem darin, einen Weg zu finden, wie die Erzeugung der IDAT-Blöcke, die die komprimierten Bilddaten enthalten, parallelisiert werden kann. Normalerweise wird die libpng-Funktion png_write_row in einer for-Schleife mit einem Zeiger auf die Struktur aufgerufen, die alle Informationen zur PNG-Datei und einen Zeilenzeiger mit den Pixeldaten einer einzelnen Bildzeile enthält.

(Zeile 114-117 in der Pastebin-Datei)

//Loop through image
for (i = 0, rp = info_ptr->row_pointers; i < png_ptr->height; i++, rp++) {
    png_write_row(png_ptr, *rp);
}

Libpng komprimiert dann eine Zeile nach der anderen und füllt einen internen Puffer mit den komprimierten Daten. Sobald der Puffer voll ist, werden die komprimierten Daten in einem IDAT-Block in die Image-Datei geschrieben.

Mein Ansatz war es, das Bild in mehrere Teile zu teilen und einen Thread die Zeilen 1 bis 10 und einen anderen Thread 11 bis 20 komprimieren zu lassen und so weiter. Aber da libpng einen internen Puffer verwendet, ist es nicht so einfach, wie ich zuerst dachte :) Ich muss libpng irgendwie dazu bringen, die komprimierten Daten für jeden Thread in einen separaten Puffer zu schreiben. Danach muss ich die Puffer in der richtigen Reihenfolge verketten, damit ich sie alle zusammen in die Ausgabebilddatei schreiben kann.

Hat jemand eine Idee, wie ich das mit OpenMP und einigen Anpassungen an libpng machen kann? Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage