From 7662a4e66e3d9221f0e15440cbaa3809ba10cccf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vojt=C4=9Bch=20Moravec?= <theazgra@gmail.com>
Date: Sat, 8 Aug 2020 09:21:36 +0200
Subject: [PATCH] Add setWorkerCount() in IPlaneLoader.

With this API you can set worker count for plane loader.
Plane loader may want to use more than one thread in some operations.
---
 .../compression/ImageDecompressor.java              |  1 -
 .../compression/VQImageCompressor.java              |  2 ++
 .../java/azgracompress/io/loader/BasicLoader.java   | 13 ++++++++-----
 .../java/azgracompress/io/loader/IPlaneLoader.java  |  7 +++++++
 .../azgracompress/io/loader/ImageJBufferLoader.java |  4 +---
 .../azgracompress/io/loader/PlaneLoaderFactory.java |  3 ---
 6 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/src/main/java/azgracompress/compression/ImageDecompressor.java b/src/main/java/azgracompress/compression/ImageDecompressor.java
index 1bb1f5c..4b5651e 100644
--- a/src/main/java/azgracompress/compression/ImageDecompressor.java
+++ b/src/main/java/azgracompress/compression/ImageDecompressor.java
@@ -233,7 +233,6 @@ public class ImageDecompressor extends CompressorDecompressorBase {
         return true;
     }
 
-    // TODO(Moravec): Return optional to get rid of null check.
     public Optional<ImageU16Dataset> decompressInMemory() {
         try (FileInputStream fileInputStream = new FileInputStream(options.getInputDataInfo().getFilePath());
              DataInputStream dataInputStream = new DataInputStream(fileInputStream)) {
diff --git a/src/main/java/azgracompress/compression/VQImageCompressor.java b/src/main/java/azgracompress/compression/VQImageCompressor.java
index bc302b1..976f40f 100644
--- a/src/main/java/azgracompress/compression/VQImageCompressor.java
+++ b/src/main/java/azgracompress/compression/VQImageCompressor.java
@@ -207,6 +207,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
         final IPlaneLoader planeLoader;
         try {
             planeLoader = PlaneLoaderFactory.getPlaneLoaderForInputFile(options.getInputDataInfo());
+            planeLoader.setWorkerCount(options.getWorkerCount());
         } catch (Exception e) {
             throw new ImageCompressionException("Unable to create reader. " + e.getMessage());
         }
@@ -308,6 +309,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
         final int[] huffmanSymbols = createHuffmanSymbols(getCodebookSize());
         try {
             planeLoader = PlaneLoaderFactory.getPlaneLoaderForInputFile(options.getInputDataInfo());
+            planeLoader.setWorkerCount(options.getWorkerCount());
         } catch (Exception e) {
             throw new ImageCompressionException("Unable to create plane reader. " + e.getMessage());
         }
diff --git a/src/main/java/azgracompress/io/loader/BasicLoader.java b/src/main/java/azgracompress/io/loader/BasicLoader.java
index fcc936e..3d47d54 100644
--- a/src/main/java/azgracompress/io/loader/BasicLoader.java
+++ b/src/main/java/azgracompress/io/loader/BasicLoader.java
@@ -8,6 +8,7 @@ import java.io.IOException;
 
 public abstract class BasicLoader {
     protected final V3i dims;
+    protected int threadCount = 1;
 
     protected BasicLoader(final V3i datasetDims) {
         this.dims = datasetDims;
@@ -83,15 +84,13 @@ public abstract class BasicLoader {
      * Load specified planes from dataset to voxel of specified dimensions.
      * This overload uses the valueAt function to read src data.
      *
-     * @param voxelDim    Single voxel dimensions.
-     * @param planeRange  Range of planes to load voxels from.
-     * @param threadCount Number of threads used for loading.
+     * @param voxelDim   Single voxel dimensions.
+     * @param planeRange Range of planes to load voxels from.
      * @return Voxel data arranged in arrays.
      * @throws IOException When fails to load plane data.
      */
     protected int[][] loadVoxelsImplByValueAt(final V3i voxelDim,
-                                              final Range<Integer> planeRange,
-                                              final int threadCount) throws IOException {
+                                              final Range<Integer> planeRange) throws IOException {
 
         // TODO(Moravec): Improve performance of loading.
         final Voxel dstVoxel = new Voxel(voxelDim);
@@ -155,4 +154,8 @@ public abstract class BasicLoader {
         return voxels;
     }
 
+    public void setWorkerCount(final int threadCount) {
+        this.threadCount = threadCount;
+    }
+
 }
diff --git a/src/main/java/azgracompress/io/loader/IPlaneLoader.java b/src/main/java/azgracompress/io/loader/IPlaneLoader.java
index 42162f9..9fdafcc 100644
--- a/src/main/java/azgracompress/io/loader/IPlaneLoader.java
+++ b/src/main/java/azgracompress/io/loader/IPlaneLoader.java
@@ -55,4 +55,11 @@ public interface IPlaneLoader {
      * @throws IOException when fails to load plane data.
      */
     int[][] loadVoxels(final V3i voxelDim, final Range<Integer> planeRange) throws IOException;
+
+    /**
+     * Set thread count, which can be used by the loader if needed.
+     *
+     * @param threadCount Available thread count for loader.
+     */
+    void setWorkerCount(final int threadCount);
 }
diff --git a/src/main/java/azgracompress/io/loader/ImageJBufferLoader.java b/src/main/java/azgracompress/io/loader/ImageJBufferLoader.java
index ecf84c9..3aff05a 100644
--- a/src/main/java/azgracompress/io/loader/ImageJBufferLoader.java
+++ b/src/main/java/azgracompress/io/loader/ImageJBufferLoader.java
@@ -35,7 +35,6 @@ public final class ImageJBufferLoader extends BasicLoader implements IPlaneLoade
     protected int valueAt(int plane, int offset) {
         final short value = ((short[]) bufferInputData.getPixelBuffer(plane))[offset];
         return TypeConverter.shortToInt(value);
-        //        return ((value & 0xFF00) | (value & 0x00FF));
     }
 
     @Override
@@ -94,8 +93,7 @@ public final class ImageJBufferLoader extends BasicLoader implements IPlaneLoade
 
     @Override
     public int[][] loadVoxels(final V3i voxelDim, final Range<Integer> planeRange) throws IOException {
-        // TODO(Moravec): Thread count, now 4, should be configurable.
-        return loadVoxelsImplByValueAt(voxelDim, planeRange, 1);
+        return loadVoxelsImplByValueAt(voxelDim, planeRange);
     }
 }
 
diff --git a/src/main/java/azgracompress/io/loader/PlaneLoaderFactory.java b/src/main/java/azgracompress/io/loader/PlaneLoaderFactory.java
index 7d51b7a..b147eba 100644
--- a/src/main/java/azgracompress/io/loader/PlaneLoaderFactory.java
+++ b/src/main/java/azgracompress/io/loader/PlaneLoaderFactory.java
@@ -4,8 +4,6 @@ import azgracompress.io.BufferInputData;
 import azgracompress.io.FileInputData;
 import azgracompress.io.InputData;
 
-import java.nio.Buffer;
-
 public final class PlaneLoaderFactory {
 
     /**
@@ -26,6 +24,5 @@ public final class PlaneLoaderFactory {
             default:
                 throw new Exception("Unsupported data loader.");
         }
-//        return null;
     }
 }
-- 
GitLab