Skip to content
Snippets Groups Projects
Commit 46cedfe5 authored by Vojtech Moravec's avatar Vojtech Moravec
Browse files

Add preloadGlobalCodebook method.

This method is used for stream compressor/decompressor.
It will cache the codebook and huffman tree so that each compression/decompression pass don't have to create it.
parent 14ba13b0
No related branches found
No related tags found
No related merge requests found
package azgracompress.compression; package azgracompress.compression;
import azgracompress.cache.ICacheFile;
import azgracompress.compression.exception.ImageDecompressionException; import azgracompress.compression.exception.ImageDecompressionException;
import azgracompress.fileformat.QCMPFileHeader; import azgracompress.fileformat.QCMPFileHeader;
...@@ -38,4 +39,11 @@ public interface IImageDecompressor extends IListenable { ...@@ -38,4 +39,11 @@ public interface IImageDecompressor extends IListenable {
void decompressToBuffer(DataInputStream compressedStream, void decompressToBuffer(DataInputStream compressedStream,
short[][] buffer, short[][] buffer,
final QCMPFileHeader header) throws ImageDecompressionException; final QCMPFileHeader header) throws ImageDecompressionException;
/**
* Preload decompressor codebook and Huffman tree for stream decompressor from provided cache file.
*
* @param codebookCacheFile Codebook cache file.
*/
void preloadGlobalCodebook(final ICacheFile codebookCacheFile);
} }
package azgracompress.compression; package azgracompress.compression;
import azgracompress.cache.ICacheFile;
import azgracompress.cache.SQCacheFile;
import azgracompress.cache.VQCacheFile;
import azgracompress.compression.exception.ImageDecompressionException; import azgracompress.compression.exception.ImageDecompressionException;
import azgracompress.fileformat.QCMPFileHeader; import azgracompress.fileformat.QCMPFileHeader;
import azgracompress.huffman.Huffman; import azgracompress.huffman.Huffman;
...@@ -14,6 +17,9 @@ import java.io.DataOutputStream; ...@@ -14,6 +17,9 @@ import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
public class SQImageDecompressor extends CompressorDecompressorBase implements IImageDecompressor { public class SQImageDecompressor extends CompressorDecompressorBase implements IImageDecompressor {
private SQCodebook cachedCodebook = null;
private Huffman cachedHuffman = null;
public SQImageDecompressor(CompressionOptions options) { public SQImageDecompressor(CompressionOptions options) {
super(options); super(options);
} }
...@@ -88,8 +94,8 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I ...@@ -88,8 +94,8 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
byte[] decompressedPlaneData = null; byte[] decompressedPlaneData = null;
final int planeDataSize = (int) header.getPlaneDataSizes()[planeIndex]; final int planeDataSize = (int) header.getPlaneDataSizes()[planeIndex];
try (InBitStream inBitStream = new InBitStream(compressedStream, try (InBitStream inBitStream = new InBitStream(compressedStream,
header.getBitsPerCodebookIndex(), header.getBitsPerCodebookIndex(),
planeDataSize)) { planeDataSize)) {
inBitStream.readToBuffer(); inBitStream.readToBuffer();
inBitStream.setAllowReadFromUnderlyingStream(false); inBitStream.setAllowReadFromUnderlyingStream(false);
...@@ -124,7 +130,19 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I ...@@ -124,7 +130,19 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
} }
@Override @Override
public void decompressToBuffer(DataInputStream compressedStream, short[][] buffer, QCMPFileHeader header) throws ImageDecompressionException { public void preloadGlobalCodebook(final ICacheFile codebookCacheFile) {
assert (codebookCacheFile instanceof SQCacheFile) : "Incorrect codebook cache file type for SQImageDecompressor";
SQCacheFile codebookCache = (SQCacheFile) codebookCacheFile;
cachedCodebook = codebookCache.getCodebook();
cachedHuffman = createHuffmanCoder(createHuffmanSymbols(cachedCodebook.getCodebookSize()), cachedCodebook.getSymbolFrequencies());
}
@Override
public void decompressToBuffer(DataInputStream compressedStream,
short[][] buffer,
QCMPFileHeader header) throws ImageDecompressionException {
final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex()); final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex());
final int[] huffmanSymbols = createHuffmanSymbols(codebookSize); final int[] huffmanSymbols = createHuffmanSymbols(codebookSize);
final int planeCountForDecompression = header.getImageSizeZ(); final int planeCountForDecompression = header.getImageSizeZ();
...@@ -166,8 +184,12 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I ...@@ -166,8 +184,12 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
buffer[planeIndex] = TypeConverter.intArrayToShortArray(decompressedValues); buffer[planeIndex] = TypeConverter.intArrayToShortArray(decompressedValues);
} catch (Exception ex) { } catch (Exception ex) {
throw new ImageDecompressionException("SQImageDecompressor::decompressToBuffer() - Unable to read indices from InBitStream.", ex); throw new ImageDecompressionException("SQImageDecompressor::decompressToBuffer() - Unable to read indices from " +
"InBitStream.",
ex);
} }
} }
} }
} }
package azgracompress.compression; package azgracompress.compression;
import azgracompress.cache.ICacheFile;
import azgracompress.cache.SQCacheFile;
import azgracompress.cache.VQCacheFile;
import azgracompress.compression.exception.ImageDecompressionException; import azgracompress.compression.exception.ImageDecompressionException;
import azgracompress.data.*; import azgracompress.data.*;
import azgracompress.fileformat.QCMPFileHeader; import azgracompress.fileformat.QCMPFileHeader;
...@@ -17,6 +20,9 @@ import java.io.IOException; ...@@ -17,6 +20,9 @@ import java.io.IOException;
public class VQImageDecompressor extends CompressorDecompressorBase implements IImageDecompressor { public class VQImageDecompressor extends CompressorDecompressorBase implements IImageDecompressor {
private VQCodebook cachedCodebook = null;
private Huffman cachedHuffman = null;
private interface DecompressCallback { private interface DecompressCallback {
void process(final Block imageBlock, final int planeIndex) throws ImageDecompressionException; void process(final Block imageBlock, final int planeIndex) throws ImageDecompressionException;
} }
...@@ -67,6 +73,15 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I ...@@ -67,6 +73,15 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
return new VQCodebook(new V3i(0), codebookVectors, frequencies); return new VQCodebook(new V3i(0), codebookVectors, frequencies);
} }
@Override
public void preloadGlobalCodebook(final ICacheFile codebookCacheFile) {
assert (codebookCacheFile instanceof VQCacheFile) : "Incorrect codebook cache file type for VQImageDecompressor";
VQCacheFile codebookCache = (VQCacheFile) codebookCacheFile;
cachedCodebook = codebookCache.getCodebook();
cachedHuffman = createHuffmanCoder(createHuffmanSymbols(cachedCodebook.getCodebookSize()), cachedCodebook.getVectorFrequencies());
}
private Block reconstructImageFromQuantizedVectors(final int[][] vectors, private Block reconstructImageFromQuantizedVectors(final int[][] vectors,
final V2i qVector, final V2i qVector,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment