Skip to content
Snippets Groups Projects
Commit 310d345a authored by Vojtech Moravec's avatar Vojtech Moravec
Browse files

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.
parent a0e834cc
No related branches found
No related tags found
No related merge requests found
...@@ -63,7 +63,7 @@ public class CompressionOptions { ...@@ -63,7 +63,7 @@ public class CompressionOptions {
private boolean verbose = false; private boolean verbose = false;
public CompressionOptions() { public CompressionOptions() {
int cores = Runtime.getRuntime().availableProcessors(); final int cores = Runtime.getRuntime().availableProcessors();
this.workerCount = (cores / 2); this.workerCount = (cores / 2);
} }
......
...@@ -412,19 +412,23 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I ...@@ -412,19 +412,23 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
@Override @Override
public short[] decompressStreamMode(final DataInputStream compressedStream, public short[] decompressStreamMode(final DataInputStream compressedStream,
final QCMPFileHeader header) throws ImageDecompressionException { final QCMPFileHeader header) throws ImageDecompressionException {
final short[] buffer = new short[(int) header.getImageDims().multiplyTogether()]; final short[] buffer = new short[(int) header.getImageDims().multiplyTogether()];
if (header.getQuantizationType() == QuantizationType.Vector3D) { if (header.getQuantizationType() == QuantizationType.Vector3D) {
final V3i voxelDim = new V3i(header.getVectorSizeX(), header.getVectorSizeY(), header.getVectorSizeZ()); final V3i voxelDim = new V3i(header.getVectorSizeX(), header.getVectorSizeY(), header.getVectorSizeZ());
decompressVoxelsStreamModeImpl(compressedStream, header, (voxel, voxelData, planeOffset) -> { 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 ImageU16Dataset decompressedVoxel = voxel.reconstructFromVoxelsToDataset(voxelDim, voxelData);
final short[] voxelLayerData = currentVoxelLayer.getPlaneData(layer); assert (decompressedVoxel.getPlaneCount() == voxel.getDims().getZ());
System.arraycopy(voxelLayerData, 0, buffer, offset, voxelLayerData.length); final int expectedVoxelPlaneSize = header.getImageSizeX() * header.getImageSizeY();
offset += voxelLayerData.length;
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; return buffer;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment