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); }