This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new 0ea485eff4 Enable the use of direct buffer for decompression 
implemented by native libraries (currently only ZIP).
0ea485eff4 is described below

commit 0ea485eff4e01ca4c6d66771407b3e55700b5ae7
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Sat Dec 24 22:18:19 2022 +0100

    Enable the use of direct buffer for decompression implemented by native 
libraries (currently only ZIP).
---
 .../main/java/org/apache/sis/internal/geotiff/Compression.java | 10 ++++++++++
 .../sis/internal/storage/inflater/CompressionChannel.java      |  8 ++++++--
 .../org/apache/sis/internal/storage/inflater/Inflater.java     |  2 +-
 .../org/apache/sis/internal/storage/io/ChannelFactory.java     |  2 +-
 4 files changed, 18 insertions(+), 4 deletions(-)

diff --git 
a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/Compression.java
 
b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/Compression.java
index 384d6f9e51..27f63864be 100644
--- 
a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/Compression.java
+++ 
b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/Compression.java
@@ -159,4 +159,14 @@ public enum Compression {
         }
         return UNKNOWN;
     }
+
+    /**
+     * Whether the decompression uses native library.
+     * In such case, the use of direct buffer may be more efficient.
+     *
+     * @return whether the compression may use a native library.
+     */
+    public final boolean useNativeLibrary() {
+        return this == DEFLATE;
+    }
 }
diff --git 
a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CompressionChannel.java
 
b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CompressionChannel.java
index ef54e3b7a1..6a37c5becd 100644
--- 
a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CompressionChannel.java
+++ 
b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CompressionChannel.java
@@ -105,10 +105,13 @@ abstract class CompressionChannel extends PixelChannel {
      *
      * @param  channel         the channel to wrap. This is {@code this} 
unless a {@link Predictor} is applied.
      * @param  scanlineStride  the scanline stride of the image to read. Used 
for choosing a buffer size.
+     * @param  directBuffer    whether the use of direct buffer is preferred 
to heap buffer.
      * @throws IOException if an error occurred while filling the buffer with 
initial data.
      * @return the data input for uncompressed data.
      */
-    final ChannelDataInput createDataInput(final PixelChannel channel, final 
int scanlineStride) throws IOException {
+    final ChannelDataInput createDataInput(final PixelChannel channel, final 
int scanlineStride, final boolean directBuffer)
+            throws IOException
+    {
         final int capacity;
         if (scanlineStride > BUFFER_SIZE) {
             final int[] divisors = MathFunctions.divisors(scanlineStride);
@@ -118,7 +121,8 @@ abstract class CompressionChannel extends PixelChannel {
         } else {
             capacity = Numerics.ceilDiv(BUFFER_SIZE, scanlineStride) * 
scanlineStride;      // ≥ BUFFER_SIZE
         }
-        final ByteBuffer buffer = 
ByteBuffer.allocate(capacity).order(input.buffer.order()).limit(0);
+        ByteBuffer buffer = directBuffer ? ByteBuffer.allocateDirect(capacity) 
: ByteBuffer.allocate(capacity);
+        buffer = buffer.order(input.buffer.order()).limit(0);
         return new ChannelDataInput(input.filename, channel, buffer, true);
     }
 
diff --git 
a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/Inflater.java
 
b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/Inflater.java
index 229d513826..a11eb6168c 100644
--- 
a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/Inflater.java
+++ 
b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/Inflater.java
@@ -240,7 +240,7 @@ public abstract class Inflater implements Closeable {
             }
         }
         final int scanlineStride = Math.multiplyExact(sourceWidth, 
sourcePixelStride * dataType.bytes());
-        return CopyFromBytes.create(inflater.createDataInput(channel, 
scanlineStride),
+        return CopyFromBytes.create(inflater.createDataInput(channel, 
scanlineStride, compression.useNativeLibrary()),
                 dataType, chunksPerRow, samplesPerChunk, skipAfterChunks, 
pixelsPerElement);
     }
 
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelFactory.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelFactory.java
index bec2f32eb7..4ebb845075 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelFactory.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelFactory.java
@@ -226,7 +226,7 @@ public abstract class ChannelFactory {
                 throw new 
IOException(Resources.format(Resources.Keys.MissingSchemeInURI_1, uri));
             }
             if (IOUtilities.isHTTP(uri.getScheme())) {
-                return new ChannelFactory(false) {
+                return new ChannelFactory(true) {
                     @Override public ReadableByteChannel readable(String 
filename, StoreListeners listeners) throws IOException {
                         return new HttpByteChannel(filename, uri);
                     }

Reply via email to