Распараллеливание создания файла PNG с C ++, libpng и OpenMP

В настоящее время я пытаюсь реализовать кодер PNG в C ++ на основе libpng, который использует OpenMP для ускорения процесса сжатия. Инструмент уже способен генерировать файлы PNG из различных графических форматов. Я загрузил полный исходный код на pastebin.com, чтобы вы могли увидеть, что я уже сделал:http://pastebin.com/8wiFzcgV

Все идет нормально! Теперь моя проблема состоит в том, чтобы найти способ распараллелить генерацию блоков IDAT, содержащих сжатые данные изображений. Обычно, функция libpng png_write_row вызывается в цикле for с указателем на структуру, которая содержит всю информацию о файле PNG, и указателем строки с данными пикселей одной строки изображения.

(Строка 114-117 в файле Pastebin)

//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 по 10, а другой поток с 11 по 20 и так далее. Но так как libpng использует внутренний буфер, это не так просто, как я думал сначала :) Мне почему-то нужно заставить libpng записывать сжатые данные в отдельный буфер для каждого потока. После этого мне нужен способ объединить буферы в правильном порядке, чтобы я мог записать их все вместе в выходной файл изображения.

Итак, есть ли у кого-то идея, как я могу сделать это с OpenMP и некоторые настройки в libpng? Большое спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос