diff --git a/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java index 3ff365c7ffa561f2537a560ada0af38796db6060..7ff58e137913f5fb91c67be64df39ebf8f1a1cf4 100644 --- a/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java @@ -217,6 +217,7 @@ public class ImageCompressor extends CompressorDecompressorBase { * @return Valid QCMPFile header for compressed file. */ private QCMPFileHeader createHeader() { + // TODO(Moravec): Change header to newer version! final QCMPFileHeader header = new QCMPFileHeader(); diff --git a/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java index aee6464408d39c2e7b023b2e788da1d737a0514a..2a5e8f0f5d52bea5d37c6964c97f61b848d8b737 100644 --- a/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java @@ -7,6 +7,7 @@ import cz.it4i.qcmp.cache.SqQvcFile; import cz.it4i.qcmp.compression.exception.ImageCompressionException; import cz.it4i.qcmp.huffman.HuffmanEncoder; import cz.it4i.qcmp.io.InputData; +import cz.it4i.qcmp.io.OutBitStream; import cz.it4i.qcmp.io.loader.IPlaneLoader; import cz.it4i.qcmp.io.loader.PlaneLoaderFactory; import cz.it4i.qcmp.quantization.scalar.LloydMaxU16ScalarQuantization; @@ -59,14 +60,15 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm final DataOutputStream compressStream) throws ImageCompressionException { final SQCodebook codebook = quantizer.getCodebook(); final int[] centroids = codebook.getCentroids(); - final long[] frequencies = codebook.getSymbolFrequencies(); try { for (final int quantizationValue : centroids) { compressStream.writeShort(quantizationValue); } - for (final long symbolFrequency : frequencies) { - compressStream.writeLong(symbolFrequency); + + try (final OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerCodebookIndex(), 32)) { + codebook.getHuffmanTreeRoot().writeToBinaryStream(outBitStream); } + } catch (final IOException ioEx) { throw new ImageCompressionException("Unable to write codebook to compress stream.", ioEx); } diff --git a/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java index e3433a4d1a529e8173606ab57cbbac5cfe5fa802..a7c3c42b234031aeab669841302e165539085e17 100644 --- a/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java @@ -30,6 +30,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I for (int i = 0; i < codebookSize; i++) { quantizationValues[i] = compressedStream.readUnsignedShort(); } + // TODO(Moravec): Read frequencies or binary huffman tree based on file format version!!! for (int i = 0; i < codebookSize; i++) { symbolFrequencies[i] = compressedStream.readLong(); } diff --git a/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java index 0bdd52f343e1ed1263e3872355885ac5efb5b71c..0c8c112da67a467bd71b1bd8ed7502bc6e253dcc 100644 --- a/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java @@ -8,6 +8,7 @@ import cz.it4i.qcmp.data.Range; import cz.it4i.qcmp.fileformat.QuantizationType; import cz.it4i.qcmp.huffman.HuffmanEncoder; import cz.it4i.qcmp.io.InputData; +import cz.it4i.qcmp.io.OutBitStream; import cz.it4i.qcmp.io.loader.IPlaneLoader; import cz.it4i.qcmp.io.loader.PlaneLoaderFactory; import cz.it4i.qcmp.quantization.vector.LBGResult; @@ -72,7 +73,6 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm */ private void writeQuantizerToCompressStream(final VectorQuantizer quantizer, final DataOutputStream compressStream) throws ImageCompressionException { - // TODO final int[][] codebook = quantizer.getCodebookVectors(); try { for (final int[] entry : codebook) { @@ -80,9 +80,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm compressStream.writeShort(vecVal); } } - final long[] frequencies = quantizer.getFrequencies(); - for (final long symbolFrequency : frequencies) { - compressStream.writeLong(symbolFrequency); + try (final OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerCodebookIndex(), 32)) { + quantizer.getCodebook().getHuffmanTreeRoot().writeToBinaryStream(outBitStream); } } catch (final IOException ioEx) { throw new ImageCompressionException("Unable to write codebook to compress stream.", ioEx); diff --git a/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java index 65af70fe3057f6ee6ddce0c808e0b5528aaf8ce4..87bc9c7e3f1c3a9c245940c6a0fba45d85a69e3a 100644 --- a/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java +++ b/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java @@ -56,6 +56,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I codebookVectors[codebookIndex][vecIndex] = compressedStream.readUnsignedShort(); } } + // TODO(Moravec): Read frequencies or binary huffman tree based on file format version!!! for (int codebookIndex = 0; codebookIndex < codebookSize; codebookIndex++) { frequencies[codebookIndex] = compressedStream.readLong(); }