Skip to content
Snippets Groups Projects
Commit c8b8b83e authored by Vojtěch Moravec's avatar Vojtěch Moravec
Browse files

Add support to inspect the QVC cache file.

parent c609207d
No related branches found
No related tags found
No related merge requests found
package azgracompress;
import azgracompress.benchmark.CompressionBenchmark;
import azgracompress.cache.QuantizationCacheManager;
import azgracompress.cli.CliConstants;
import azgracompress.cli.CustomFunctionBase;
import azgracompress.cli.ParsedCliOptions;
import azgracompress.cli.functions.EntropyCalculation;
import azgracompress.compression.ImageCompressor;
import azgracompress.compression.ImageDecompressor;
import azgracompress.fileformat.FileExtensions;
import org.apache.commons.cli.*;
import java.io.IOException;
......@@ -42,7 +44,6 @@ public class DataCompressor {
}
switch (parsedCliOptions.getMethod()) {
case Compress: {
ImageCompressor compressor = new ImageCompressor(parsedCliOptions);
if (!compressor.compress()) {
......@@ -85,13 +86,17 @@ public class DataCompressor {
}
break;
case InspectFile: {
ImageDecompressor decompressor = new ImageDecompressor(parsedCliOptions);
try {
System.out.println(decompressor.inspectCompressedFile());
} catch (IOException e) {
System.err.println("Errors occurred during inspecting file.");
System.err.println(e.getMessage());
e.printStackTrace();
if (parsedCliOptions.getInputDataInfo().getFilePath().endsWith(FileExtensions.CACHE_FILE_EXT)) {
QuantizationCacheManager.inspectCacheFile(parsedCliOptions.getInputDataInfo().getFilePath());
} else {
ImageDecompressor decompressor = new ImageDecompressor(parsedCliOptions);
try {
System.out.println(decompressor.inspectCompressedFile());
} catch (IOException e) {
System.err.println("Errors occurred during inspecting file.");
System.err.println(e.getMessage());
e.printStackTrace();
}
}
}
break;
......
......@@ -98,6 +98,24 @@ public class CacheFileHeader {
outputStream.writeShort(vectorSizeZ);
}
public long getExpectedFileSize() {
long expectedFileSize = 20 + trainFileNameSize; // Base header size
expectedFileSize += (codebookSize * 8); // Frequency values
switch (quantizationType) {
case Scalar:
expectedFileSize += (codebookSize * 2); // Scalar quantization values
break;
case Vector1D:
case Vector2D:
case Vector3D:
expectedFileSize += ((vectorSizeX * vectorSizeY * vectorSizeZ) * codebookSize * 2); // Quantization vectors
break;
case Invalid:
return -1;
}
return expectedFileSize;
}
/**
* Read header from the stream.
*
......@@ -111,7 +129,7 @@ public class CacheFileHeader {
byte[] magicBuffer = new byte[QCMP_CACHE_MAGIC_VALUE.length()];
final int readFromMagic = inputStream.read(magicBuffer,0,QCMP_CACHE_MAGIC_VALUE.length());
final int readFromMagic = inputStream.read(magicBuffer, 0, QCMP_CACHE_MAGIC_VALUE.length());
if (readFromMagic != QCMP_CACHE_MAGIC_VALUE.length()) {
throw new IOException("Invalid file type. Unable to read magic value");
}
......@@ -124,8 +142,7 @@ public class CacheFileHeader {
trainFileNameSize = inputStream.readUnsignedShort();
byte[] fileNameBuffer = new byte[trainFileNameSize];
inputStream.read(fileNameBuffer,0, trainFileNameSize);
// inputStream.readNBytes(fileNameBuffer, 0, trainFileNameSize);
final int readBytes = inputStream.read(fileNameBuffer, 0, trainFileNameSize);
trainFileName = new String(fileNameBuffer);
vectorSizeX = inputStream.readUnsignedShort();
......@@ -148,7 +165,7 @@ public class CacheFileHeader {
sb.append("Scalar\n");
break;
case Vector1D:
sb.append(String.format("Vector1D %s\n", vectorSizeX));
sb.append(String.format("Vector1D [%sx1]\n", vectorSizeX));
break;
case Vector2D:
sb.append(String.format("Vector2D %s\n", new V3i(vectorSizeX, vectorSizeY, vectorSizeZ).toString()));
......
......@@ -2,7 +2,6 @@ package azgracompress.cache;
import azgracompress.data.V3i;
import azgracompress.fileformat.QuantizationType;
import azgracompress.quantization.QTrainIteration;
import azgracompress.quantization.scalar.SQCodebook;
import azgracompress.quantization.vector.VQCodebook;
......@@ -270,53 +269,34 @@ public class QuantizationCacheManager {
}
/**
* Log information about SQ cache file.
* Inspect cache file specified by the path.
*
* @param trainFile Input image file.
* @param codebookSize Codebook size.
* @param path Path to cache file.
*/
public void validateAndReport(final String trainFile, final int codebookSize) {
final SQCacheFile cacheFile = loadSQCacheFile(trainFile, codebookSize);
if (cacheFile == null) {
System.err.println("Invalid SQ cache file.");
public static void inspectCacheFile(final String path) {
CacheFileHeader header = null;
long fileSize;
try (FileInputStream fis = new FileInputStream(path);
DataInputStream dis = new DataInputStream(fis)) {
fileSize = fis.getChannel().size();
header = new CacheFileHeader();
header.readFromStream(dis);
} catch (IOException e) {
e.printStackTrace();
return;
}
StringBuilder sb = new StringBuilder();
cacheFile.getHeader().report(sb);
sb.append("Frequencies: ");
for (final long fV : cacheFile.getCodebook().getSymbolFrequencies())
sb.append(fV).append(", ");
sb.append('\n');
System.out.println(sb.toString());
}
/**
* Log information about VQ cache file.
*
* @param trainFile Input image file.
* @param codebookSize Codebook size.
* @param vDim Quantization vector dimension.
*/
public void validateAndReport(final String trainFile,
final int codebookSize,
final V3i vDim) {
final VQCacheFile cacheFile = loadVQCacheFile(trainFile, codebookSize, vDim);
if (cacheFile == null) {
System.err.println("Invalid VQ cache file.");
return;
StringBuilder reportBuilder = new StringBuilder();
final long expectedFileSize = header.getExpectedFileSize();
if (expectedFileSize == fileSize) {
reportBuilder.append("\u001B[32mCache file is VALID. ").append(fileSize).append(" bytes\u001B[0m\n ");
} else {
reportBuilder.append("\u001B[31mCache file is INVALID.\u001B[0m\n\t")
.append(fileSize).append(" bytes instead of expected ")
.append(expectedFileSize).append(" bytes.\n");
}
StringBuilder sb = new StringBuilder();
cacheFile.getHeader().report(sb);
sb.append("Frequencies: ");
for (final long fV : cacheFile.getCodebook().getVectorFrequencies())
sb.append(fV).append(", ");
sb.append('\n');
System.out.println(sb.toString());
}
header.report(reportBuilder);
System.out.println(reportBuilder);
}
}
......@@ -3,5 +3,6 @@ package azgracompress.fileformat;
public class FileExtensions {
public static final String RAW = "raw";
public static final String QCMP = "qcmp";
public static final String CACHE_FILE_EXT = "qvc";
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment