Paralelização de criação de arquivos PNG com C ++, libpng e OpenMP

Atualmente, estou tentando implementar um codificador PNG em C ++ baseado em libpng que usa o OpenMP para acelerar o processo de compactação. A ferramenta já é capaz de gerar arquivos PNG de vários formatos de imagem. Enviei o código-fonte completo para pastebin.com para que você possa ver o que eu fiz até agora:http://pastebin.com/8wiFzcgV

Por enquanto, tudo bem! Agora, meu problema é encontrar uma maneira de paralelizar a geração dos blocos IDAT contendo os dados da imagem compactada. Geralmente, a função libpng png_write_row é chamada em um loop for com um ponteiro para a estrutura que contém todas as informações sobre o arquivo PNG e um ponteiro de linha com os dados de pixel de uma única linha de imagem.

(Linha 114-117 no arquivo 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, em seguida, compacta uma linha após a outra e preenche um buffer interno com os dados compactados. Assim que o buffer estiver cheio, os dados compactados serão liberados em um bloco IDAT para o arquivo de imagem.

Minha abordagem foi dividir a imagem em várias partes e deixar um segmento compactar linha 1 a 10 e outro segmento 11 a 20 e assim por diante. Mas como a libpng está usando um buffer interno, não é tão fácil quanto eu pensei primeiro :) De alguma forma eu tenho que fazer a libpng gravar os dados compactados em um buffer separado para cada thread. Depois, preciso de uma maneira de concatenar os buffers na ordem correta para que eu possa escrevê-los todos juntos no arquivo de imagem de saída.

Então, alguém tem uma ideia de como eu posso fazer isso com o OpenMP e alguns ajustes para a libpng? Muito obrigado!

questionAnswers(2)

yourAnswerToTheQuestion