diff --git a/DataCompressor.iml b/DataCompressor.iml
index fc02b02707b1069a5e54ee78aa8cbd0b3d27ffac..add71798f4dc0699f9f3ae1cd18003ffe51acc6a 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 be30166ac47127da5fb25f4d95b09451959aa4fb..0d9e0b48b34702dc238732c09593b5de2f10bc20 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 a54814f627d1730ca9df953cab279036128349d6..21af7c41cb2158b9d90d250428acd0a06978d550 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 b2777a94e82a2230874aa2bfb6d7583ca9a03fe4..5d272e2f7bfe7c6b77c8421bf0757bcfeed995c9 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 5175eed1ad566e249e0963245587fb21c76a4f3d..c7285b01a2a9f6e5cdf200f67fb4b6bf67cedcb7 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 996173e91348e023372e459ff743b9f64fb7ac49..8ab8f5a759bde145550f9ade60ad62b46fa8faa2 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 701725eb1fd07e0fef4d146272f9714ce4b05d88..90db3d2c14d180bbb383a0e0d1c7c5242c0047e6 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 a2a5537e2d00c6c4f874fcf04f1f39c5e6a34d0a..ded4d46557e7069933cdf0339f9693d2e0886450 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 d0d17b5a7e873ede639eb50a4f1958e35d4b4a5e..f6f2fbfeee1bb93ac6ffae9f171c70052d10095c 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 48654a8bc30b33e8fc6e85d768d9ef9ea06b2d47..09efdeacdb381e7ff84a5a8b9d25ca2d10fb6d24 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 1ef5f6ac5cdc349f0605d6977c5fbe94e77484f0..1009794cc160e249ec7d39ed90761fdbe0cd731d 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 9960c8d6a6b32e609c99399f2cd9174b037e5d8d..3b6eb761a384791536559f54c48a4b02be37fbf4 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 f37b1192d15f34efe10a620ba06ffc01caf206ca..e86a980249f505cc502651725c444a892be83850 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);