From 310d345a9387be24a81387ee07165e0a482e9745 Mon Sep 17 00:00:00 2001 From: Vojtech Moravec <vojtech.moravec.st@vsb.cz> Date: Thu, 24 Sep 2020 11:58:39 +0200 Subject: [PATCH] Fix voxel stream decompression. Decompression of image from voxels in stream mode was flawed. The base offset, which was used to copy decompressed data to result array, was wrong. We used quantization voxel plane dimensions to calculate it, instead of dataset plane dimensions. --- .../compression/CompressionOptions.java | 2 +- .../compression/VQImageDecompressor.java | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/azgracompress/compression/CompressionOptions.java b/src/main/java/azgracompress/compression/CompressionOptions.java index 4b00e57..407cb6e 100644 --- a/src/main/java/azgracompress/compression/CompressionOptions.java +++ b/src/main/java/azgracompress/compression/CompressionOptions.java @@ -63,7 +63,7 @@ public class CompressionOptions { private boolean verbose = false; public CompressionOptions() { - int cores = Runtime.getRuntime().availableProcessors(); + final int cores = Runtime.getRuntime().availableProcessors(); this.workerCount = (cores / 2); } diff --git a/src/main/java/azgracompress/compression/VQImageDecompressor.java b/src/main/java/azgracompress/compression/VQImageDecompressor.java index 9a2e086..323b82c 100644 --- a/src/main/java/azgracompress/compression/VQImageDecompressor.java +++ b/src/main/java/azgracompress/compression/VQImageDecompressor.java @@ -412,19 +412,23 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I @Override public short[] decompressStreamMode(final DataInputStream compressedStream, final QCMPFileHeader header) throws ImageDecompressionException { - final short[] buffer = new short[(int) header.getImageDims().multiplyTogether()]; if (header.getQuantizationType() == QuantizationType.Vector3D) { final V3i voxelDim = new V3i(header.getVectorSizeX(), header.getVectorSizeY(), header.getVectorSizeZ()); decompressVoxelsStreamModeImpl(compressedStream, header, (voxel, voxelData, planeOffset) -> { - final ImageU16Dataset currentVoxelLayer = voxel.reconstructFromVoxelsToDataset(voxelDim, voxelData); - int offset = planeOffset * (voxelDim.getX() * voxelDim.getY()); - for (int layer = 0; layer < voxel.getDims().getZ(); layer++) { - final short[] voxelLayerData = currentVoxelLayer.getPlaneData(layer); - System.arraycopy(voxelLayerData, 0, buffer, offset, voxelLayerData.length); - offset += voxelLayerData.length; + final ImageU16Dataset decompressedVoxel = voxel.reconstructFromVoxelsToDataset(voxelDim, voxelData); + assert (decompressedVoxel.getPlaneCount() == voxel.getDims().getZ()); + final int expectedVoxelPlaneSize = header.getImageSizeX() * header.getImageSizeY(); + + final int baseOffset = planeOffset * expectedVoxelPlaneSize; + + for (int voxelLayerIndex = 0; voxelLayerIndex < decompressedVoxel.getPlaneCount(); voxelLayerIndex++) { + final short[] voxelLayerData = decompressedVoxel.getPlaneData(voxelLayerIndex); + assert (voxelLayerData.length == expectedVoxelPlaneSize); + final int bufferPos = baseOffset + (voxelLayerIndex * expectedVoxelPlaneSize); + System.arraycopy(voxelLayerData, 0, buffer, bufferPos, voxelLayerData.length); } }); return buffer; -- GitLab