Распараллеливание создания файла 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? Большое спасибо!