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 <[email protected]>
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);
}