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

Bits Per Codebook index improvements.

parent dd1fc768
Branches
No related tags found
No related merge requests found
...@@ -70,6 +70,7 @@ public class CompressionOptions implements Cloneable { ...@@ -70,6 +70,7 @@ public class CompressionOptions implements Cloneable {
public CompressionOptions(final ICacheFile codebookCacheFile) { public CompressionOptions(final ICacheFile codebookCacheFile) {
this(); this();
quantizationType = codebookCacheFile.getHeader().getQuantizationType(); quantizationType = codebookCacheFile.getHeader().getQuantizationType();
bitsPerCodebookIndex = codebookCacheFile.getHeader().getBitsPerCodebookIndex();
codebookType = CodebookType.Global; codebookType = CodebookType.Global;
} }
......
...@@ -21,11 +21,15 @@ public abstract class CompressorDecompressorBase { ...@@ -21,11 +21,15 @@ public abstract class CompressorDecompressorBase {
private ArrayList<IStatusListener> statusListeners; private ArrayList<IStatusListener> statusListeners;
private ArrayList<IProgressListener> progressListeners; private ArrayList<IProgressListener> progressListeners;
public CompressorDecompressorBase(CompressionOptions options) { public CompressorDecompressorBase(final CompressionOptions options) {
this.options = options; this.options = options;
this.codebookSize = (int) Math.pow(2, this.options.getBitsPerCodebookIndex()); this.codebookSize = (int) Math.pow(2, this.options.getBitsPerCodebookIndex());
} }
public int getBitsPerCodebookIndex() {
return this.options.getBitsPerCodebookIndex();
}
public void addStatusListener(final IStatusListener listener) { public void addStatusListener(final IStatusListener listener) {
if (statusListeners == null) { if (statusListeners == null) {
statusListeners = new ArrayList<>(1); statusListeners = new ArrayList<>(1);
...@@ -45,7 +49,7 @@ public abstract class CompressorDecompressorBase { ...@@ -45,7 +49,7 @@ public abstract class CompressorDecompressorBase {
this.progressListeners.clear(); this.progressListeners.clear();
} }
protected void duplicateAllListeners(IListenable other) { protected void duplicateAllListeners(final IListenable other) {
if (other == this) if (other == this)
return; return;
...@@ -89,7 +93,7 @@ public abstract class CompressorDecompressorBase { ...@@ -89,7 +93,7 @@ public abstract class CompressorDecompressorBase {
} }
protected int[] createHuffmanSymbols(final int codebookSize) { protected int[] createHuffmanSymbols(final int codebookSize) {
int[] symbols = new int[codebookSize]; final int[] symbols = new int[codebookSize];
for (int i = 0; i < codebookSize; i++) { for (int i = 0; i < codebookSize; i++) {
symbols[i] = i; symbols[i] = i;
} }
...@@ -97,7 +101,7 @@ public abstract class CompressorDecompressorBase { ...@@ -97,7 +101,7 @@ public abstract class CompressorDecompressorBase {
} }
protected Huffman createHuffmanCoder(final int[] symbols, final long[] frequencies) { protected Huffman createHuffmanCoder(final int[] symbols, final long[] frequencies) {
Huffman huffman = new Huffman(symbols, frequencies); final Huffman huffman = new Huffman(symbols, frequencies);
huffman.buildHuffmanTree(); huffman.buildHuffmanTree();
return huffman; return huffman;
} }
...@@ -109,7 +113,7 @@ public abstract class CompressorDecompressorBase { ...@@ -109,7 +113,7 @@ public abstract class CompressorDecompressorBase {
final int from = inputData.getPlaneRange().getFrom(); final int from = inputData.getPlaneRange().getFrom();
final int count = inputData.getPlaneRange().getTo() - from; final int count = inputData.getPlaneRange().getTo() - from;
int[] indices = new int[count + 1]; final int[] indices = new int[count + 1];
for (int i = 0; i <= count; i++) { for (int i = 0; i <= count; i++) {
indices[i] = from + i; indices[i] = from + i;
} }
...@@ -120,7 +124,7 @@ public abstract class CompressorDecompressorBase { ...@@ -120,7 +124,7 @@ public abstract class CompressorDecompressorBase {
} }
private int[] generateAllPlaneIndices(final int planeCount) { private int[] generateAllPlaneIndices(final int planeCount) {
int[] planeIndices = new int[planeCount]; final int[] planeIndices = new int[planeCount];
for (int i = 0; i < planeCount; i++) { for (int i = 0; i < planeCount; i++) {
planeIndices[i] = i; planeIndices[i] = i;
} }
...@@ -152,15 +156,15 @@ public abstract class CompressorDecompressorBase { ...@@ -152,15 +156,15 @@ public abstract class CompressorDecompressorBase {
* @return Number of bytes written. * @return Number of bytes written.
* @throws ImageCompressionException when fails to write to compress stream. * @throws ImageCompressionException when fails to write to compress stream.
*/ */
protected long writeHuffmanEncodedIndices(DataOutputStream compressStream, protected long writeHuffmanEncodedIndices(final DataOutputStream compressStream,
final Huffman huffman, final Huffman huffman,
final int[] indices) throws ImageCompressionException { final int[] indices) throws ImageCompressionException {
try (OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerCodebookIndex(), 2048)) { try (final OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerCodebookIndex(), 2048)) {
for (final int index : indices) { for (final int index : indices) {
outBitStream.write(huffman.getCode(index)); outBitStream.write(huffman.getCode(index));
} }
return outBitStream.getBytesWritten(); return outBitStream.getBytesWritten();
} catch (Exception ex) { } catch (final Exception ex) {
throw new ImageCompressionException("Unable to write indices to OutBitStream.", ex); throw new ImageCompressionException("Unable to write indices to OutBitStream.", ex);
} }
} }
......
...@@ -25,10 +25,6 @@ public class ImageCompressor extends CompressorDecompressorBase { ...@@ -25,10 +25,6 @@ public class ImageCompressor extends CompressorDecompressorBase {
imageCompressor.preloadGlobalCodebook(codebookCacheFile); imageCompressor.preloadGlobalCodebook(codebookCacheFile);
} }
public int getBitsPerCodebookIndex() {
return this.options.getBitsPerCodebookIndex();
}
/** /**
* Set InputData object for compressor. * Set InputData object for compressor.
* *
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment