From bd0121008b6d1fbba86750d9afa3a43fba6278a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Moravec?= <theazgra@gmail.com> Date: Mon, 20 Jul 2020 11:28:10 +0200 Subject: [PATCH] Use new options in whole program. --- DataCompressor.iml | 7 ++- .../java/azgracompress/DataCompressor.java | 4 +- .../azgracompress/benchmark/Benchmark.java | 10 ++-- .../benchmark/BenchmarkBase.java | 34 ++++++------- .../cli/functions/EntropyCalculation.java | 4 +- .../CompressorDecompressorBase.java | 13 +++-- .../compression/ImageCompressor.java | 9 ++-- .../compression/ImageDecompressor.java | 14 +++--- .../azgracompress/compression/Interval.java | 2 +- .../compression/SQImageCompressor.java | 44 ++++++++--------- .../compression/SQImageDecompressor.java | 8 +-- .../compression/VQImageCompressor.java | 49 ++++++++++--------- .../compression/VQImageDecompressor.java | 6 +-- 13 files changed, 100 insertions(+), 104 deletions(-) diff --git a/DataCompressor.iml b/DataCompressor.iml index fc02b02..add7179 100644 --- a/DataCompressor.iml +++ b/DataCompressor.iml @@ -1,12 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> -<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> - <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_10"> +<module type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_9"> <output url="file://$MODULE_DIR$/target/classes" /> <output-test url="file://$MODULE_DIR$/target/test-classes" /> <content url="file://$MODULE_DIR$"> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> - <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> <excludeFolder url="file://$MODULE_DIR$/target" /> </content> <orderEntry type="inheritedJdk" /> @@ -14,7 +13,7 @@ <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" /> <orderEntry type="library" name="Maven: commons-io:commons-io:1.3.2" level="project" /> <orderEntry type="library" name="Maven: commons-cli:commons-cli:1.4" level="project" /> - <orderEntry type="library" name="Maven: org.jetbrains:annotations:18.0.0" level="project" /> + <orderEntry type="library" name="Maven: org.jetbrains:annotations:19.0.0" level="project" /> <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" /> </component> </module> \ No newline at end of file diff --git a/src/main/java/azgracompress/DataCompressor.java b/src/main/java/azgracompress/DataCompressor.java index be30166..0d9e0b4 100644 --- a/src/main/java/azgracompress/DataCompressor.java +++ b/src/main/java/azgracompress/DataCompressor.java @@ -30,8 +30,8 @@ public class DataCompressor { } ParsedCliOptions parsedCliOptions = new ParsedCliOptions(cmd); - if (parsedCliOptions.hasErrorOccured()) { - System.err.println(parsedCliOptions.getError()); + if (parsedCliOptions.parseError()) { + System.err.println(parsedCliOptions.getParseError()); return; } diff --git a/src/main/java/azgracompress/benchmark/Benchmark.java b/src/main/java/azgracompress/benchmark/Benchmark.java index a54814f..21af7c4 100644 --- a/src/main/java/azgracompress/benchmark/Benchmark.java +++ b/src/main/java/azgracompress/benchmark/Benchmark.java @@ -31,26 +31,26 @@ public class Benchmark extends BenchmarkBase { return; } - boolean dirCreated = new File(options.getOutputFile()).mkdirs(); + boolean dirCreated = new File(options.getOutputFilePath()).mkdirs(); //"%d_cb%d.raw.qcmp" final String qcmpFilePath = getFileNamePathIntoOutDir(String.format(COMPRESSED_FILE_TEMPLATE, options.getPlaneIndex(), codebookSize)); - compressOps.setOutputFile(qcmpFilePath); + compressOps.setOutputFilePath(qcmpFilePath); ImageCompressor compressor = new ImageCompressor(compressOps); if (!compressor.compress()) { System.err.println("Errors occurred during compression."); return; } - decompressOps.setInputFile(qcmpFilePath); + decompressOps.setInputFilePath(qcmpFilePath); final String decompressedFile = getFileNamePathIntoOutDir(String.format(QUANTIZED_FILE_TEMPLATE, options.getPlaneIndex(), codebookSize)); - decompressOps.setOutputFile(decompressedFile); + decompressOps.setOutputFilePath(decompressedFile); ImageDecompressor decompressor = new ImageDecompressor(decompressOps); if (!decompressor.decompress()) { System.err.println("Errors occurred during decompression."); @@ -58,7 +58,7 @@ public class Benchmark extends BenchmarkBase { final int[] originalData; try { - originalData = RawDataIO.loadImageU16(options.getInputFile(), + originalData = RawDataIO.loadImageU16(options.getInputFilePath(), options.getImageDimension(), options.getPlaneIndex()).getData(); } catch (IOException e) { diff --git a/src/main/java/azgracompress/benchmark/BenchmarkBase.java b/src/main/java/azgracompress/benchmark/BenchmarkBase.java index b2777a9..5d272e2 100644 --- a/src/main/java/azgracompress/benchmark/BenchmarkBase.java +++ b/src/main/java/azgracompress/benchmark/BenchmarkBase.java @@ -1,6 +1,7 @@ package azgracompress.benchmark; import azgracompress.cli.ParsedCliOptions; +import azgracompress.compression.Interval; import azgracompress.data.ImageU16; import azgracompress.data.V3i; import azgracompress.io.RawDataIO; @@ -38,18 +39,18 @@ abstract class BenchmarkBase { protected BenchmarkBase(final ParsedCliOptions options) { this.options = options; - this.inputFile = options.getInputFile(); - this.outputDirectory = options.getOutputFile(); + this.inputFile = options.getInputFilePath(); + this.outputDirectory = options.getOutputFilePath(); this.rawImageDims = options.getImageDimension(); this.useMiddlePlane = options.shouldUseMiddlePlane(); - this.codebookSize = (int) Math.pow(2, options.getBitsPerPixel()); + this.codebookSize = (int) Math.pow(2, options.getBitsPerCodebookIndex()); - if (options.hasPlaneIndexSet()) { + if (options.isPlaneIndexSet()) { this.planes = new int[]{options.getPlaneIndex()}; - } else if (options.hasPlaneRangeSet()) { - final int from = options.getFromPlaneIndex(); - final int to = options.getToPlaneIndex(); - final int count = to - from; + } else if (options.isPlaneRangeSet()) { + final Interval<Integer> planeRange = options.getPlaneRange(); + final int from = planeRange.getFrom(); + final int count = planeRange.getInclusiveTo() - from; this.planes = new int[count + 1]; for (int i = 0; i <= count; i++) { @@ -131,10 +132,9 @@ abstract class BenchmarkBase { /** * Save both U16 absolute difference image and I32 difference values * - * @param originalData Original U16 plane data. - * @param transformedData Quantized U16 plane data. - * @param diffFile File storing i32 difference values. - * @param absDiffFile File storing u16 absolute difference values. + * @param differenceData Difference data. + * @param diffFile File storing i32 difference values. + * @param absDiffFile File storing u16 absolute difference values. * @return True if both files were saved successfully. */ protected boolean saveDifference(final int[] differenceData, @@ -146,8 +146,8 @@ abstract class BenchmarkBase { final String absDiffFilePath = getFileNamePathIntoOutDir(absDiffFile); ImageU16 img = new ImageU16(rawImageDims.getX(), - rawImageDims.getY(), - absDifferenceData); + rawImageDims.getY(), + absDifferenceData); try { // NOTE(Moravec): Use little endian so that gnuplot can read the array. RawDataIO.writeImageU16(absDiffFilePath, img, true); @@ -180,9 +180,9 @@ abstract class BenchmarkBase { for (final QTrainIteration it : trainingLog) { writer.write(String.format("%d;%.5f;%.5f\n", - it.getIteration(), - it.getMse(), - it.getPSNR())); + it.getIteration(), + it.getMse(), + it.getPSNR())); } writer.flush(); fileStream.flush(); diff --git a/src/main/java/azgracompress/cli/functions/EntropyCalculation.java b/src/main/java/azgracompress/cli/functions/EntropyCalculation.java index 5175eed..c7285b0 100644 --- a/src/main/java/azgracompress/cli/functions/EntropyCalculation.java +++ b/src/main/java/azgracompress/cli/functions/EntropyCalculation.java @@ -21,11 +21,11 @@ public class EntropyCalculation extends CustomFunctionBase { @Override public boolean run() { ImageU16 plane = null; - System.out.println(String.format("Input file: %s", options.getInputFile())); + System.out.println(String.format("Input file: %s", options.getInputFilePath())); for (int planeIndex = 0; planeIndex < options.getImageDimension().getZ(); planeIndex++) { try { - plane = RawDataIO.loadImageU16(options.getInputFile(), + plane = RawDataIO.loadImageU16(options.getInputFilePath(), options.getImageDimension(), planeIndex); } catch (IOException e) { diff --git a/src/main/java/azgracompress/compression/CompressorDecompressorBase.java b/src/main/java/azgracompress/compression/CompressorDecompressorBase.java index 996173e..8ab8f5a 100644 --- a/src/main/java/azgracompress/compression/CompressorDecompressorBase.java +++ b/src/main/java/azgracompress/compression/CompressorDecompressorBase.java @@ -16,7 +16,7 @@ public abstract class CompressorDecompressorBase { public CompressorDecompressorBase(ParsedCliOptions options) { this.options = options; - this.codebookSize = (int) Math.pow(2, this.options.getBitsPerPixel()); + this.codebookSize = (int) Math.pow(2, this.options.getBitsPerCodebookIndex()); } protected int[] createHuffmanSymbols(final int codebookSize) { @@ -48,12 +48,11 @@ public abstract class CompressorDecompressorBase { } protected int[] getPlaneIndicesForCompression() { - if (options.hasPlaneIndexSet()) { + if (options.isPlaneIndexSet()) { return new int[]{options.getPlaneIndex()}; - } else if (options.hasPlaneRangeSet()) { - final int from = options.getFromPlaneIndex(); - final int to = options.getToPlaneIndex(); - final int count = to - from; + } else if (options.isPlaneRangeSet()) { + final int from = options.getPlaneRange().getFrom(); + final int count = options.getPlaneRange().getInclusiveTo() - from; int[] indices = new int[count + 1]; for (int i = 0; i <= count; i++) { @@ -117,7 +116,7 @@ public abstract class CompressorDecompressorBase { protected long writeHuffmanEncodedIndices(DataOutputStream compressStream, final Huffman huffman, final int[] indices) throws ImageCompressionException { - try (OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerPixel(), 2048)) { + try (OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerCodebookIndex(), 2048)) { for (final int index : indices) { outBitStream.write(huffman.getCode(index)); } diff --git a/src/main/java/azgracompress/compression/ImageCompressor.java b/src/main/java/azgracompress/compression/ImageCompressor.java index 701725e..90db3d2 100644 --- a/src/main/java/azgracompress/compression/ImageCompressor.java +++ b/src/main/java/azgracompress/compression/ImageCompressor.java @@ -7,13 +7,10 @@ import azgracompress.fileformat.QCMPFileHeader; import java.io.*; public class ImageCompressor extends CompressorDecompressorBase { - final int PLANE_DATA_SIZES_OFFSET = 23; - private final int codebookSize; public ImageCompressor(ParsedCliOptions options) { super(options); - codebookSize = (int) Math.pow(2, options.getBitsPerPixel()); } /** @@ -68,7 +65,7 @@ public class ImageCompressor extends CompressorDecompressorBase { long[] planeDataSizes = null; - try (FileOutputStream fos = new FileOutputStream(options.getOutputFile(), false); + try (FileOutputStream fos = new FileOutputStream(options.getOutputFilePath(), false); DataOutputStream compressStream = new DataOutputStream(new BufferedOutputStream(fos, 8192))) { final QCMPFileHeader header = createHeader(); @@ -92,7 +89,7 @@ public class ImageCompressor extends CompressorDecompressorBase { return false; } - try (RandomAccessFile raf = new RandomAccessFile(options.getOutputFile(), "rw")) { + try (RandomAccessFile raf = new RandomAccessFile(options.getOutputFilePath(), "rw")) { raf.seek(PLANE_DATA_SIZES_OFFSET); writePlaneDataSizes(raf, planeDataSizes); } catch (IOException ex) { @@ -126,7 +123,7 @@ public class ImageCompressor extends CompressorDecompressorBase { header.setQuantizationType(options.getQuantizationType()); - header.setBitsPerPixel((byte) options.getBitsPerPixel()); + header.setBitsPerCodebookIndex((byte) options.getBitsPerCodebookIndex()); // Codebook per plane is used only if middle plane isn't set nor is the cache folder. final boolean oneCodebook = options.shouldUseMiddlePlane() || options.hasCodebookCacheFolder(); diff --git a/src/main/java/azgracompress/compression/ImageDecompressor.java b/src/main/java/azgracompress/compression/ImageDecompressor.java index a2a5537..ded4d46 100644 --- a/src/main/java/azgracompress/compression/ImageDecompressor.java +++ b/src/main/java/azgracompress/compression/ImageDecompressor.java @@ -61,7 +61,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { boolean validFile = true; QCMPFileHeader header = null; - try (FileInputStream fileInputStream = new FileInputStream(options.getInputFile()); + try (FileInputStream fileInputStream = new FileInputStream(options.getInputFilePath()); DataInputStream dataInputStream = new DataInputStream(fileInputStream)) { header = readQCMPFileHeader(dataInputStream); } catch (IOException ioEx) { @@ -97,12 +97,12 @@ public class ImageDecompressor extends CompressorDecompressorBase { logBuilder.append("INVALID\n"); break; } - logBuilder.append("Bits per pixel:\t\t").append(header.getBitsPerPixel()).append('\n'); + logBuilder.append("Bits per pixel:\t\t").append(header.getBitsPerCodebookIndex()).append('\n'); logBuilder.append("Codebook:\t\t").append(header.isCodebookPerPlane() ? "one per plane\n" : "one for " + "all\n"); - final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel()); + final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); logBuilder.append("Codebook size:\t\t").append(codebookSize).append('\n'); logBuilder.append("Image size X:\t\t").append(header.getImageSizeX()).append('\n'); @@ -113,7 +113,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { logBuilder.append("Vector size Y:\t\t").append(header.getVectorSizeY()).append('\n'); logBuilder.append("Vector size Z:\t\t").append(header.getVectorSizeZ()).append('\n'); - final long fileSize = new File(options.getInputFile()).length(); + final long fileSize = new File(options.getInputFilePath()).length(); final long headerSize = header.getHeaderSize(); final long dataSize = fileSize - headerSize; @@ -167,7 +167,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { final Stopwatch decompressionStopwatch = Stopwatch.startNew(); final long decompressedFileSize; - try (FileInputStream fileInputStream = new FileInputStream(options.getInputFile()); + try (FileInputStream fileInputStream = new FileInputStream(options.getInputFilePath()); DataInputStream dataInputStream = new DataInputStream(fileInputStream)) { final QCMPFileHeader header = readQCMPFileHeader(dataInputStream); @@ -187,7 +187,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { return false; } - final long fileSize = new File(options.getInputFile()).length(); + final long fileSize = new File(options.getInputFilePath()).length(); final long dataSize = fileSize - header.getHeaderSize(); final long expectedDataSize = imageDecompressor.getExpectedDataSize(header); if (dataSize != expectedDataSize) { @@ -195,7 +195,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { return false; } - try (FileOutputStream fos = new FileOutputStream(options.getOutputFile(), false); + try (FileOutputStream fos = new FileOutputStream(options.getOutputFilePath(), false); DataOutputStream decompressStream = new DataOutputStream(fos)) { imageDecompressor.decompress(dataInputStream, decompressStream, header); diff --git a/src/main/java/azgracompress/compression/Interval.java b/src/main/java/azgracompress/compression/Interval.java index d0d17b5..f6f2fbf 100644 --- a/src/main/java/azgracompress/compression/Interval.java +++ b/src/main/java/azgracompress/compression/Interval.java @@ -33,7 +33,7 @@ public class Interval<T extends Comparable<T>> { * Get inclusive end of the interval. * @return Inclusive end of the interval. */ - public T getInclusiveEnd() { + public T getInclusiveTo() { return to; } } diff --git a/src/main/java/azgracompress/compression/SQImageCompressor.java b/src/main/java/azgracompress/compression/SQImageCompressor.java index 48654a8..09efdea 100644 --- a/src/main/java/azgracompress/compression/SQImageCompressor.java +++ b/src/main/java/azgracompress/compression/SQImageCompressor.java @@ -30,8 +30,8 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm private ScalarQuantizer trainScalarQuantizerFromData(final int[] planeData) { LloydMaxU16ScalarQuantization lloydMax = new LloydMaxU16ScalarQuantization(planeData, - getCodebookSize(), - options.getWorkerCount()); + getCodebookSize(), + options.getWorkerCount()); lloydMax.train(false); return new ScalarQuantizer(U16.Min, U16.Max, lloydMax.getCodebook()); } @@ -72,7 +72,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm private ScalarQuantizer loadQuantizerFromCache() throws ImageCompressionException { QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getCodebookCacheFolder()); - final SQCodebook codebook = cacheManager.loadSQCodebook(options.getInputFile(), getCodebookSize()); + final SQCodebook codebook = cacheManager.loadSQCodebook(options.getInputFilePath(), getCodebookSize()); if (codebook == null) { throw new ImageCompressionException("Failed to read quantization values from cache file."); } @@ -104,9 +104,9 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm ImageU16 middlePlane = null; final int middlePlaneIndex = getMiddlePlaneIndex(); try { - middlePlane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), - getMiddlePlaneIndex()); + middlePlane = RawDataIO.loadImageU16(options.getInputFilePath(), + options.getImageDimension(), + getMiddlePlaneIndex()); } catch (Exception ex) { throw new ImageCompressionException("Unable to load plane data.", ex); } @@ -130,9 +130,9 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm ImageU16 plane = null; try { - plane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), - planeIndex); + plane = RawDataIO.loadImageU16(options.getInputFilePath(), + options.getImageDimension(), + planeIndex); } catch (Exception ex) { throw new ImageCompressionException("Unable to load plane data.", ex); } @@ -152,7 +152,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm Log("Compressing plane..."); final int[] indices = quantizer.quantizeIntoIndices(plane.getData(), 1); - planeDataSizes[planeCounter++] = writeHuffmanEncodedIndices(compressStream,huffman, indices); + planeDataSizes[planeCounter++] = writeHuffmanEncodedIndices(compressStream, huffman, indices); stopwatch.stop(); Log("Plane time: " + stopwatch.getElapsedTimeString()); @@ -163,20 +163,20 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm private int[] loadConfiguredPlanesData() throws ImageCompressionException { int[] trainData = null; - if (options.hasPlaneIndexSet()) { + if (options.isPlaneIndexSet()) { try { Log("Loading single plane data."); - trainData = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), - options.getPlaneIndex()).getData(); + trainData = RawDataIO.loadImageU16(options.getInputFilePath(), + options.getImageDimension(), + options.getPlaneIndex()).getData(); } catch (IOException e) { throw new ImageCompressionException("Failed to load plane data.", e); } - } else if (options.hasPlaneRangeSet()) { + } else if (options.isPlaneRangeSet()) { Log("Loading plane range data."); final int[] planes = getPlaneIndicesForCompression(); try { - trainData = RawDataIO.loadPlanesData(options.getInputFile(), options.getImageDimension(), planes); + trainData = RawDataIO.loadPlanesData(options.getInputFilePath(), options.getImageDimension(), planes); } catch (IOException e) { e.printStackTrace(); throw new ImageCompressionException("Failed to load plane range data.", e); @@ -184,7 +184,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm } else { Log("Loading all planes data."); try { - trainData = RawDataIO.loadAllPlanesData(options.getInputFile(), options.getImageDimension()); + trainData = RawDataIO.loadAllPlanesData(options.getInputFilePath(), options.getImageDimension()); } catch (IOException e) { throw new ImageCompressionException("Failed to load all planes data.", e); } @@ -197,18 +197,18 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm int[] trainData = loadConfiguredPlanesData(); LloydMaxU16ScalarQuantization lloydMax = new LloydMaxU16ScalarQuantization(trainData, - getCodebookSize(), - options.getWorkerCount()); + getCodebookSize(), + options.getWorkerCount()); Log("Starting LloydMax training."); lloydMax.train(options.isVerbose()); final SQCodebook codebook = lloydMax.getCodebook(); final int[] qValues = codebook.getCentroids(); Log("Finished LloydMax training."); - Log(String.format("Saving cache file to %s", options.getOutputFile())); - QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getOutputFile()); + Log(String.format("Saving cache file to %s", options.getOutputFilePath())); + QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getOutputFilePath()); try { - cacheManager.saveCodebook(options.getInputFile(), codebook); + cacheManager.saveCodebook(options.getInputFilePath(), codebook); } catch (IOException e) { throw new ImageCompressionException("Unable to write cache.", e); } diff --git a/src/main/java/azgracompress/compression/SQImageDecompressor.java b/src/main/java/azgracompress/compression/SQImageDecompressor.java index 1ef5f6a..1009794 100644 --- a/src/main/java/azgracompress/compression/SQImageDecompressor.java +++ b/src/main/java/azgracompress/compression/SQImageDecompressor.java @@ -39,7 +39,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I @Override public long getExpectedDataSize(QCMPFileHeader header) { // Quantization value count. - final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel()); + final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); // Total codebook size in bytes. Also symbol frequencies for Huffman. long codebookDataSize = ((2 * codebookSize) + (LONG_BYTES * codebookSize)) * @@ -60,12 +60,12 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I DataOutputStream decompressStream, QCMPFileHeader header) throws ImageDecompressionException { - final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel()); + final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); final int[] huffmanSymbols = createHuffmanSymbols(codebookSize); final int planeCountForDecompression = header.getImageSizeZ(); final int planePixelCount = header.getImageSizeX() * header.getImageSizeY(); - final int planeIndicesDataSize = (int) Math.ceil((planePixelCount * header.getBitsPerPixel()) / 8.0); + final int planeIndicesDataSize = (int) Math.ceil((planePixelCount * header.getBitsPerCodebookIndex()) / 8.0); SQCodebook codebook = null; Huffman huffman = null; @@ -90,7 +90,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I byte[] decompressedPlaneData = null; final int planeDataSize = (int) header.getPlaneDataSizes()[planeIndex]; try (InBitStream inBitStream = new InBitStream(compressedStream, - header.getBitsPerPixel(), + header.getBitsPerCodebookIndex(), planeDataSize)) { inBitStream.readToBuffer(); inBitStream.setAllowReadFromUnderlyingStream(false); diff --git a/src/main/java/azgracompress/compression/VQImageCompressor.java b/src/main/java/azgracompress/compression/VQImageCompressor.java index 9960c8d..3b6eb76 100644 --- a/src/main/java/azgracompress/compression/VQImageCompressor.java +++ b/src/main/java/azgracompress/compression/VQImageCompressor.java @@ -28,9 +28,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm private VectorQuantizer trainVectorQuantizerFromPlaneVectors(final int[][] planeVectors) { LBGVectorQuantizer vqInitializer = new LBGVectorQuantizer(planeVectors, - getCodebookSize(), - options.getWorkerCount(), - options.getVectorDimension().toV3i()); + getCodebookSize(), + options.getWorkerCount(), + options.getVectorDimension().toV3i()); LBGResult vqResult = vqInitializer.findOptimalCodebook(false); return new VectorQuantizer(vqResult.getCodebook()); } @@ -73,9 +73,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm private VectorQuantizer loadQuantizerFromCache() throws ImageCompressionException { QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getCodebookCacheFolder()); - final VQCodebook codebook = cacheManager.loadVQCodebook(options.getInputFile(), - getCodebookSize(), - options.getVectorDimension().toV3i()); + final VQCodebook codebook = cacheManager.loadVQCodebook(options.getInputFilePath(), + getCodebookSize(), + options.getVectorDimension().toV3i()); if (codebook == null) { throw new ImageCompressionException("Failed to read quantization vectors from cache."); } @@ -110,9 +110,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm final int middlePlaneIndex = getMiddlePlaneIndex(); ImageU16 middlePlane = null; try { - middlePlane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), - middlePlaneIndex); + middlePlane = RawDataIO.loadImageU16(options.getInputFilePath(), + options.getImageDimension(), + middlePlaneIndex); } catch (Exception ex) { throw new ImageCompressionException("Unable to load plane data.", ex); } @@ -136,9 +136,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm ImageU16 plane = null; try { - plane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), - planeIndex); + plane = RawDataIO.loadImageU16(options.getInputFilePath(), + options.getImageDimension(), + planeIndex); } catch (Exception ex) { throw new ImageCompressionException("Unable to load plane data.", ex); } @@ -176,9 +176,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm * @throws IOException When reading fails. */ private int[][] loadPlaneQuantizationVectors(final int planeIndex) throws IOException { - ImageU16 refPlane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), - planeIndex); + ImageU16 refPlane = RawDataIO.loadImageU16(options.getInputFilePath(), + options.getImageDimension(), + planeIndex); return refPlane.toQuantizationVectors(options.getVectorDimension()); } @@ -188,7 +188,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm int[][] trainData = null; Stopwatch s = new Stopwatch(); s.start(); - if (options.hasPlaneIndexSet()) { + if (options.isPlaneIndexSet()) { Log("VQ: Loading single plane data."); try { trainData = loadPlaneQuantizationVectors(options.getPlaneIndex()); @@ -196,7 +196,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm throw new ImageCompressionException("Failed to load plane data.", e); } } else { - Log(options.hasPlaneRangeSet() ? "VQ: Loading plane range data." : "VQ: Loading all planes data."); + + Log((options.isPlaneRangeSet()) ? "VQ: Loading plane range data." : "VQ: Loading all planes data."); final int[] planeIndices = getPlaneIndicesForCompression(); final int chunkCountPerPlane = Chunk2D.calculateRequiredChunkCountPerPlane( @@ -214,7 +215,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm assert (planeVectors.length == chunkCountPerPlane) : "Wrong chunk count per plane"; } catch (IOException e) { throw new ImageCompressionException(String.format("Failed to load plane %d image data.", - planeIndex), e); + planeIndex), e); } System.arraycopy(planeVectors, 0, trainData, (planeCounter * chunkCountPerPlane), chunkCountPerPlane); @@ -231,18 +232,18 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm final int[][] trainingData = loadConfiguredPlanesData(); LBGVectorQuantizer vqInitializer = new LBGVectorQuantizer(trainingData, - getCodebookSize(), - options.getWorkerCount(), - options.getVectorDimension().toV3i()); + getCodebookSize(), + options.getWorkerCount(), + options.getVectorDimension().toV3i()); Log("Starting LBG optimization."); LBGResult lbgResult = vqInitializer.findOptimalCodebook(options.isVerbose()); Log("Learned the optimal codebook."); - Log("Saving cache file to %s", options.getOutputFile()); - QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getOutputFile()); + Log("Saving cache file to %s", options.getOutputFilePath()); + QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getOutputFilePath()); try { - cacheManager.saveCodebook(options.getInputFile(), lbgResult.getCodebook()); + cacheManager.saveCodebook(options.getInputFilePath(), lbgResult.getCodebook()); } catch (IOException e) { throw new ImageCompressionException("Unable to write VQ cache.", e); } diff --git a/src/main/java/azgracompress/compression/VQImageDecompressor.java b/src/main/java/azgracompress/compression/VQImageDecompressor.java index f37b119..e86a980 100644 --- a/src/main/java/azgracompress/compression/VQImageDecompressor.java +++ b/src/main/java/azgracompress/compression/VQImageDecompressor.java @@ -78,7 +78,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I @Override public long getExpectedDataSize(QCMPFileHeader header) { // Vector count in codebook - final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel()); + final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); // Single vector size in bytes. assert (header.getVectorSizeZ() == 1); @@ -102,7 +102,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I public void decompress(DataInputStream compressedStream, DataOutputStream decompressStream, QCMPFileHeader header) throws ImageDecompressionException { - final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel()); + final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); assert (header.getVectorSizeZ() == 1); final int vectorSize = header.getVectorSizeX() * header.getVectorSizeY() * header.getVectorSizeZ(); final int planeCountForDecompression = header.getImageSizeZ(); @@ -137,7 +137,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I final int planeDataSize = (int) header.getPlaneDataSizes()[planeIndex]; try (InBitStream inBitStream = new InBitStream(compressedStream, - header.getBitsPerPixel(), + header.getBitsPerCodebookIndex(), planeDataSize)) { inBitStream.readToBuffer(); inBitStream.setAllowReadFromUnderlyingStream(false); -- GitLab