我目前正在尝试在C++中实现一个基于libpng的PNG编码器,它使用OpenMP来加速压缩过程。该工具已经能够从各种图像格式生成PNG文件。
我已经将完整的源代码上传到pastebin.com,因此您可以查看我到目前为止所做的工作:http://pastebin.com/8wiFzcgV
到目前为止一切顺利! 现在,我的问题是要找到一种方法来并行生成包含压缩图像数据的IDAT块。通常,libpng函数png_write_row会在for循环中被调用,其中包含一个指向包含有关PNG文件的所有信息的结构体的指针以及一个包含单个图像行的像素数据的行指针。
(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到10行,另一个线程压缩第11到20行以此类推。但是,由于libpng正在使用内部缓冲区,这并不像我最初想的那么简单 :) 我必须让libpng为每个线程将压缩数据写入单独的缓冲区。之后,我需要一种方法来按正确顺序连接缓冲区,以便可以将它们全部一起写入输出图像文件。
因此,是否有人有关于如何使用OpenMP和对libpng进行一些调整的想法?非常感谢!