diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java index a320ef147d134a78462b30549ae9d94bfabb85e9..e11e818b58c19fd702512d886fe9f6a2e694fa2b 100644 --- a/src/main/java/bdv/server/CellHandler.java +++ b/src/main/java/bdv/server/CellHandler.java @@ -4,7 +4,11 @@ import azgracompress.cache.ICacheFile; import azgracompress.cache.QuantizationCacheManager; import azgracompress.compression.CompressionOptions; import azgracompress.compression.ImageCompressor; +import azgracompress.data.V3i; import azgracompress.io.FileInputData; +import azgracompress.io.FlatBufferInputData; +import azgracompress.io.InputData; +import azgracompress.io.MemoryOutputStream; import bdv.BigDataViewer; import bdv.cache.CacheHints; import bdv.cache.LoadingStrategy; @@ -97,6 +101,7 @@ public class CellHandler extends ContextHandler { private final CompressionOptions compressionParams; private ICacheFile compressionCacheFile = null; private ImageCompressor compressor = null; + private MemoryOutputStream cachedCompressionStream = null; public CellHandler(final String baseUrl, final String xmlFilename, final String datasetName, final String thumbnailsDirectory, final CompressionOptions compressionParams) throws SpimDataException, IOException { @@ -129,18 +134,17 @@ public class CellHandler extends ContextHandler { private void initializeCompression() { if (compressionParams == null) return; - this.compressionParams.setInputDataInfo(new FileInputData(this.baseFilename)); - compressor = new ImageCompressor(compressionParams); - QuantizationCacheManager qcm = new QuantizationCacheManager(compressionParams.getCodebookCacheFolder()); this.compressionCacheFile = qcm.loadCacheFile(compressionParams); - if (compressionCacheFile != null) { - - LOG.info("CellHandler loaded codebook cache file. '" + compressionCacheFile.toString() + "'"); - System.out.println("\u001b[33mCellHandler::initializeCompression() loaded codebook cache file. '" + - compressionCacheFile.toString() + "'\u001b[0m"); + if (compressionCacheFile == null) { + return; } + LOG.info("CellHandler loaded codebook cache file. '" + compressionCacheFile + "'"); + System.out.println("\u001b[33mCellHandler::initializeCompression() loaded codebook cache file for: " + baseFilename + "\u001b[0m"); + + compressor = new ImageCompressor(compressionParams, compressionCacheFile); + cachedCompressionStream = new MemoryOutputStream(4096); } private short[] getCachedVolatileCellData(final String[] parts, final int[] cellDims) { @@ -164,6 +168,10 @@ public class CellHandler extends ContextHandler { return ((VolatileCell<VolatileShortArray>) cell).getData().getCurrentStorageArray(); } + private FlatBufferInputData createInputDataObject(final short[] data, final int[] cellDims) { + return new FlatBufferInputData(data, new V3i(cellDims[0], cellDims[1], cellDims[2]), InputData.PixelType.Gray16, this.baseFilename); + } + @Override public void doHandle(final String target, final Request baseRequest, @@ -217,12 +225,17 @@ public class CellHandler extends ContextHandler { final int[] cellDims = new int[]{Integer.parseInt(parts[5]), Integer.parseInt(parts[6]), Integer.parseInt(parts[7])}; final short[] data = getCachedVolatileCellData(parts, cellDims); - final OutputStream responseStream = response.getOutputStream(); assert (compressor != null); - final int contentLength = compressor.streamCompress(responseStream); - responseStream.close(); - response.setContentLength(contentLength); + compressor.setInputData(createInputDataObject(data, cellDims)); + + cachedCompressionStream.reset(); + final int compressedContentLength = compressor.streamCompressChunk(cachedCompressionStream); + response.setContentLength(compressedContentLength); + + try (OutputStream responseStream = response.getOutputStream()) { + responseStream.write(cachedCompressionStream.getBuffer(), 0, cachedCompressionStream.getCurrentBufferLength()); + } response.setContentType("application/octet-stream"); response.setStatus(HttpServletResponse.SC_OK); @@ -241,6 +254,7 @@ public class CellHandler extends ContextHandler { try (DataOutputStream dos = new DataOutputStream(response.getOutputStream())) { compressionCacheFile.writeToStream(dos); } + response.getOutputStream().close(); response.setContentType("application/octet-stream"); response.setStatus(HttpServletResponse.SC_OK);