diff --git a/src/main/java/cz/it4i/qcmp/compression/IImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/IImageDecompressor.java index 19740c1c66759badde8e429417f17bb65b16aa89..3c11e8592378c0ae00ce528eee430d9fd2a79759 100644 --- a/src/main/java/cz/it4i/qcmp/compression/IImageDecompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/IImageDecompressor.java @@ -2,7 +2,7 @@ package cz.it4i.qcmp.compression; import cz.it4i.qcmp.compression.exception.ImageDecompressionException; import cz.it4i.qcmp.fileformat.IQvcFile; -import cz.it4i.qcmp.fileformat.QCMPFileHeader; +import cz.it4i.qcmp.fileformat.QCMPFileHeaderV1; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -18,7 +18,7 @@ public interface IImageDecompressor extends IListenable { */ void decompress(DataInputStream compressedStream, DataOutputStream decompressStream, - final QCMPFileHeader header) throws ImageDecompressionException; + final QCMPFileHeaderV1 header) throws ImageDecompressionException; /** * Decompress the image planes to memory buffer. @@ -30,10 +30,10 @@ public interface IImageDecompressor extends IListenable { */ void decompressToBuffer(DataInputStream compressedStream, short[][] buffer, - final QCMPFileHeader header) throws ImageDecompressionException; + final QCMPFileHeaderV1 header) throws ImageDecompressionException; short[] decompressStreamMode(final DataInputStream compressedStream, - final QCMPFileHeader header) throws ImageDecompressionException; + final QCMPFileHeaderV1 header) throws ImageDecompressionException; /** * Preload decompressor codebook and Huffman tree for stream decompressor from provided cache file. diff --git a/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java index fbaa6edb7b0f62c7555c8bc6d1c745a83b4ee960..8afb429be5fcc6e688139ca1cb46287b7426db10 100644 --- a/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java @@ -4,7 +4,7 @@ import cz.it4i.qcmp.U16; import cz.it4i.qcmp.compression.exception.ImageCompressionException; import cz.it4i.qcmp.data.Range; import cz.it4i.qcmp.fileformat.IQvcFile; -import cz.it4i.qcmp.fileformat.QCMPFileHeader; +import cz.it4i.qcmp.fileformat.QCMPFileHeaderV1; import cz.it4i.qcmp.io.InputData; import java.io.*; @@ -67,7 +67,7 @@ public class ImageCompressor extends CompressorDecompressorBase { return compressor; } - private void reportCompressionRatio(final QCMPFileHeader header, final int written) { + private void reportCompressionRatio(final QCMPFileHeaderV1 header, final int written) { final long originalDataSize = 2 * header.getImageSizeX() * header.getImageSizeY() * header.getImageSizeZ(); final double compressionRatio = (double) written / (double) originalDataSize; System.out.printf("Compression ratio: %.5f%%\n", compressionRatio); @@ -136,7 +136,7 @@ public class ImageCompressor extends CompressorDecompressorBase { try (final FileOutputStream fos = new FileOutputStream(options.getOutputFilePath(), false); final DataOutputStream compressStream = new DataOutputStream(new BufferedOutputStream(fos, 8192))) { - final QCMPFileHeader header = createHeader(); + final QCMPFileHeaderV1 header = createHeader(); header.writeToStream(compressStream); planeDataSizes = imageCompressor.compress(compressStream); @@ -216,9 +216,9 @@ public class ImageCompressor extends CompressorDecompressorBase { * * @return Valid QCMPFile header for compressed file. */ - private QCMPFileHeader createHeader() { + private QCMPFileHeaderV1 createHeader() { // TODO(Moravec): Change header to newer version! - final QCMPFileHeader header = new QCMPFileHeader(); + final QCMPFileHeaderV1 header = new QCMPFileHeaderV1(); header.setQuantizationType(options.getQuantizationType()); diff --git a/src/main/java/cz/it4i/qcmp/compression/ImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/ImageDecompressor.java index ea8062d623a0d9814bb5b7c116a72de67a35391c..1c2308f7eba25db69452317776d28c9eaa6bab4c 100644 --- a/src/main/java/cz/it4i/qcmp/compression/ImageDecompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/ImageDecompressor.java @@ -3,7 +3,7 @@ package cz.it4i.qcmp.compression; import cz.it4i.qcmp.compression.exception.ImageDecompressionException; import cz.it4i.qcmp.data.ImageU16Dataset; import cz.it4i.qcmp.fileformat.IQvcFile; -import cz.it4i.qcmp.fileformat.QCMPFileHeader; +import cz.it4i.qcmp.fileformat.QCMPFileHeaderV1; import cz.it4i.qcmp.fileformat.QuantizationType; import cz.it4i.qcmp.utilities.Stopwatch; import cz.it4i.qcmp.utilities.Utils; @@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit; public class ImageDecompressor extends CompressorDecompressorBase { private IImageDecompressor cachedDecompressor = null; - private QCMPFileHeader cachedHeader = null; + private QCMPFileHeaderV1 cachedHeader = null; public ImageDecompressor(final CompressionOptions passedOptions) { super(passedOptions); @@ -31,7 +31,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { assert (cachedDecompressor != null); cachedDecompressor.preloadGlobalCodebook(codebookCacheFile); - cachedHeader = new QCMPFileHeader(); + cachedHeader = new QCMPFileHeaderV1(); cachedHeader.setQuantizationType(codebookCacheFile.getHeader().getQuantizationType()); cachedHeader.setBitsPerCodebookIndex((byte) ((int) Utils.log2(codebookCacheFile.getHeader().getCodebookSize()))); cachedHeader.setVectorDimension(codebookCacheFile.getHeader().getVectorDim()); @@ -44,8 +44,8 @@ public class ImageDecompressor extends CompressorDecompressorBase { * @return Decompressed file header. * @throws IOException when failed to read header. */ - private QCMPFileHeader readQCMPFileHeader(final DataInputStream inputStream) throws IOException { - final QCMPFileHeader header = new QCMPFileHeader(); + private QCMPFileHeaderV1 readQCMPFileHeader(final DataInputStream inputStream) throws IOException { + final QCMPFileHeaderV1 header = new QCMPFileHeaderV1(); header.readFromStream(inputStream); return header; } @@ -90,7 +90,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { final StringBuilder logBuilder = new StringBuilder(); boolean validFile = true; - final QCMPFileHeader header; + final QCMPFileHeaderV1 header; try (final FileInputStream fileInputStream = new FileInputStream(options.getInputDataInfo().getFilePath()); final DataInputStream dataInputStream = new DataInputStream(fileInputStream)) { header = readQCMPFileHeader(dataInputStream); @@ -125,7 +125,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { try (final FileInputStream fileInputStream = new FileInputStream(options.getInputDataInfo().getFilePath()); final DataInputStream dataInputStream = new DataInputStream(fileInputStream)) { - final QCMPFileHeader header = decompressQcmpHeader(dataInputStream); + final QCMPFileHeaderV1 header = decompressQcmpHeader(dataInputStream); if (header == null) return false; @@ -164,7 +164,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { return true; } - private boolean checkInputFileSize(final QCMPFileHeader header, final IImageDecompressor imageDecompressor) { + private boolean checkInputFileSize(final QCMPFileHeaderV1 header, final IImageDecompressor imageDecompressor) { final long fileSize = new File(options.getInputDataInfo().getFilePath()).length(); final long dataSize = fileSize - header.getHeaderSize(); final long expectedDataSize = header.getExpectedDataSize(); @@ -179,7 +179,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { try (final FileInputStream fileInputStream = new FileInputStream(options.getInputDataInfo().getFilePath()); final DataInputStream dataInputStream = new DataInputStream(fileInputStream)) { - final QCMPFileHeader header = decompressQcmpHeader(dataInputStream); + final QCMPFileHeaderV1 header = decompressQcmpHeader(dataInputStream); if (header == null) return Optional.empty(); @@ -217,7 +217,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { try (final DataInputStream dis = new DataInputStream(new BufferedInputStream(compressedStream))) { assert (dis.markSupported()); - final QCMPFileHeader header = cachedHeader.copyOf(); + final QCMPFileHeaderV1 header = cachedHeader.copyOf(); header.setImageSizeX(dis.readUnsignedShort()); header.setImageSizeY(dis.readUnsignedShort()); @@ -254,8 +254,8 @@ public class ImageDecompressor extends CompressorDecompressorBase { } @Nullable - private QCMPFileHeader decompressQcmpHeader(final DataInputStream dataInputStream) throws IOException { - final QCMPFileHeader header = readQCMPFileHeader(dataInputStream); + private QCMPFileHeaderV1 decompressQcmpHeader(final DataInputStream dataInputStream) throws IOException { + final QCMPFileHeaderV1 header = readQCMPFileHeader(dataInputStream); if (header == null) { System.err.println("Failed to read QCMPFile header"); return null; diff --git a/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java index 9b2fa953001d0dd4705217604ef7c0ffaa0bf0f2..f568653160b0058217391e3dbd3c922629de7b57 100644 --- a/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java @@ -2,7 +2,7 @@ package cz.it4i.qcmp.compression; import cz.it4i.qcmp.compression.exception.ImageDecompressionException; import cz.it4i.qcmp.fileformat.IQvcFile; -import cz.it4i.qcmp.fileformat.QCMPFileHeader; +import cz.it4i.qcmp.fileformat.QCMPFileHeaderV1; import cz.it4i.qcmp.fileformat.SqQvcFile; import cz.it4i.qcmp.huffman.HuffmanDecoder; import cz.it4i.qcmp.huffman.HuffmanTreeBuilder; @@ -45,7 +45,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I @Override public void decompress(final DataInputStream compressedStream, final DataOutputStream decompressStream, - final QCMPFileHeader header) throws ImageDecompressionException { + final QCMPFileHeaderV1 header) throws ImageDecompressionException { final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); final int planeCountForDecompression = header.getImageSizeZ(); @@ -118,7 +118,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I @Override public void decompressToBuffer(final DataInputStream compressedStream, final short[][] buffer, - final QCMPFileHeader header) throws ImageDecompressionException { + final QCMPFileHeaderV1 header) throws ImageDecompressionException { final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); final int planeCountForDecompression = header.getImageSizeZ(); @@ -163,7 +163,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I @Override public short[] decompressStreamMode(final DataInputStream compressedStream, - final QCMPFileHeader header) throws ImageDecompressionException { + final QCMPFileHeaderV1 header) throws ImageDecompressionException { throw new ImageDecompressionException("Not implemented yet."); } } diff --git a/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java index 47efc54f839e733edfd844492f39445b610f6dbe..97f2ad8a63274c81e98c56a7a31849c52f684c37 100644 --- a/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java @@ -3,7 +3,7 @@ package cz.it4i.qcmp.compression; import cz.it4i.qcmp.compression.exception.ImageDecompressionException; import cz.it4i.qcmp.data.*; import cz.it4i.qcmp.fileformat.IQvcFile; -import cz.it4i.qcmp.fileformat.QCMPFileHeader; +import cz.it4i.qcmp.fileformat.QCMPFileHeaderV1; import cz.it4i.qcmp.fileformat.QuantizationType; import cz.it4i.qcmp.fileformat.VqQvcFile; import cz.it4i.qcmp.huffman.HuffmanDecoder; @@ -36,7 +36,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I super(options); } - private long calculatePlaneVectorCount(final QCMPFileHeader header) { + private long calculatePlaneVectorCount(final QCMPFileHeaderV1 header) { final long vectorXCount = (long) Math.ceil((double) header.getImageSizeX() / (double) header.getVectorSizeX()); final long vectorYCount = (long) Math.ceil((double) header.getImageSizeY() / (double) header.getVectorSizeY()); // Number of vectors per plane. @@ -98,7 +98,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I @Override public void decompress(final DataInputStream compressedStream, final DataOutputStream decompressStream, - final QCMPFileHeader header) throws ImageDecompressionException { + final QCMPFileHeaderV1 header) throws ImageDecompressionException { if (header.getQuantizationType() == QuantizationType.Vector3D) { decompressVoxels(compressedStream, decompressStream, header); return; @@ -114,7 +114,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I } public void decompressImpl(final DataInputStream compressedStream, - final QCMPFileHeader header, + final QCMPFileHeaderV1 header, final DecompressCallback callback) throws ImageDecompressionException { final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); assert (header.getVectorSizeZ() == 1); @@ -170,7 +170,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I @SuppressWarnings("DuplicatedCode") public void decompressStreamModelImpl(final DataInputStream compressedStream, - final QCMPFileHeader header, + final QCMPFileHeaderV1 header, final DecompressCallback callback) throws ImageDecompressionException { assert (cachedCodebook != null && cachedHuffmanDecoder != null); @@ -215,7 +215,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I @Override public void decompressToBuffer(final DataInputStream compressedStream, final short[][] buffer, - final QCMPFileHeader header) throws ImageDecompressionException { + final QCMPFileHeaderV1 header) throws ImageDecompressionException { if (header.getQuantizationType() == QuantizationType.Vector3D) { decompressVoxelsToBuffer(compressedStream, buffer, header); return; @@ -227,7 +227,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I private void decompressVoxelsImpl(final DataInputStream compressedStream, - final QCMPFileHeader header, + final QCMPFileHeaderV1 header, final DecompressVoxelCallback callback) throws ImageDecompressionException { assert (header.getQuantizationType() == QuantizationType.Vector3D); @@ -289,7 +289,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I @SuppressWarnings("DuplicatedCode") private void decompressVoxelsStreamModeImpl(final DataInputStream compressedStream, - final QCMPFileHeader header, + final QCMPFileHeaderV1 header, final DecompressVoxelCallback callback) throws ImageDecompressionException { assert (header.getQuantizationType() == QuantizationType.Vector3D); @@ -348,7 +348,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I private void decompressVoxelsToBuffer(final DataInputStream compressedStream, final short[][] buffer, - final QCMPFileHeader header) throws ImageDecompressionException { + final QCMPFileHeaderV1 header) throws ImageDecompressionException { final V3i voxelDims = new V3i(header.getVectorSizeX(), header.getVectorSizeY(), header.getVectorSizeZ()); @@ -358,7 +358,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I private void decompressVoxels(final DataInputStream compressedStream, final DataOutputStream decompressStream, - final QCMPFileHeader header) throws ImageDecompressionException { + final QCMPFileHeaderV1 header) throws ImageDecompressionException { final V3i voxelDims = new V3i(header.getVectorSizeX(), header.getVectorSizeY(), header.getVectorSizeZ()); decompressVoxelsImpl(compressedStream, header, (voxel, voxelData, planeOffset) -> { @@ -377,7 +377,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I @Override public short[] decompressStreamMode(final DataInputStream compressedStream, - final QCMPFileHeader header) throws ImageDecompressionException { + final QCMPFileHeaderV1 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()); diff --git a/src/main/java/cz/it4i/qcmp/fileformat/QCMPFileHeader.java b/src/main/java/cz/it4i/qcmp/fileformat/QCMPFileHeaderV1.java similarity index 98% rename from src/main/java/cz/it4i/qcmp/fileformat/QCMPFileHeader.java rename to src/main/java/cz/it4i/qcmp/fileformat/QCMPFileHeaderV1.java index e720b0d51452c01b75166bc1b73d97ff6087e99a..677a3f1204681fd9e223167c284191826886f216 100644 --- a/src/main/java/cz/it4i/qcmp/fileformat/QCMPFileHeader.java +++ b/src/main/java/cz/it4i/qcmp/fileformat/QCMPFileHeaderV1.java @@ -11,7 +11,7 @@ import java.io.DataOutputStream; import java.io.File; import java.io.IOException; -public class QCMPFileHeader implements IFileHeader, Cloneable { +public class QCMPFileHeaderV1 implements IFileHeader, Cloneable { //region Constants private static final int VERSION = 1; private static final int BASE_QCMP_HEADER_SIZE = 23; @@ -263,9 +263,9 @@ public class QCMPFileHeader implements IFileHeader, Cloneable { return super.clone(); } - public QCMPFileHeader copyOf() { + public QCMPFileHeaderV1 copyOf() { try { - return (QCMPFileHeader) this.clone(); + return (QCMPFileHeaderV1) this.clone(); } catch (final CloneNotSupportedException e) { return null; } diff --git a/src/main/java/cz/it4i/qcmp/io/FileTypeInspector.java b/src/main/java/cz/it4i/qcmp/io/FileTypeInspector.java index 14a99bd4f0c4cf0aac015d831dcd01847d42bfce..d9b9d97431118fad6aa0412da2bcf10c813ff7c2 100644 --- a/src/main/java/cz/it4i/qcmp/io/FileTypeInspector.java +++ b/src/main/java/cz/it4i/qcmp/io/FileTypeInspector.java @@ -1,6 +1,6 @@ package cz.it4i.qcmp.io; -import cz.it4i.qcmp.fileformat.QCMPFileHeader; +import cz.it4i.qcmp.fileformat.QCMPFileHeaderV1; import cz.it4i.qcmp.fileformat.QvcHeaderV1; import cz.it4i.qcmp.fileformat.QvcHeaderV2; @@ -39,9 +39,9 @@ public class FileTypeInspector { // QvcHeaderV1.MAGIC_VALUE // 9 bytes // QvcHeaderV2.MAGIC_VALUE // 9 bytes try (final FileInputStream stream = new FileInputStream(filePath)) { - final byte[] buf1 = new byte[QCMPFileHeader.MAGIC_VALUE.length()]; + final byte[] buf1 = new byte[QCMPFileHeaderV1.MAGIC_VALUE.length()]; RawDataIO.readFullBuffer(stream, buf1); - if (new String(buf1).equals(QCMPFileHeader.MAGIC_VALUE)) { + if (new String(buf1).equals(QCMPFileHeaderV1.MAGIC_VALUE)) { return FileType.Qcmp; }