public DecompressionStream(Stream stream, int bufferSize = 0) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (!stream.CanRead) { throw new ArgumentException("Stream is not readable", nameof(stream)); } if (bufferSize < 0) { throw new ArgumentOutOfRangeException(nameof(bufferSize)); } innerStream = stream; decompressor = new Decompressor(); inputBufferSize = bufferSize > 0 ? bufferSize : (int)Methods.ZSTD_CStreamInSize().EnsureZstdSuccess(); inputBuffer = ArrayPool <byte> .Shared.Rent(inputBufferSize); input = new ZSTD_inBuffer_s { pos = (nuint)inputBufferSize, size = (nuint)inputBufferSize }; }
internal nuint DecompressStream(ref ZSTD_inBuffer_s input, ref ZSTD_outBuffer_s output) { fixed(ZSTD_inBuffer_s *inputPtr = &input) fixed(ZSTD_outBuffer_s * outputPtr = &output) { return(Methods.ZSTD_decompressStream(dctx, outputPtr, inputPtr).EnsureZstdSuccess()); } }
internal unsafe nuint CompressStream(ref ZSTD_inBuffer_s input, ReadOnlySpan <byte> inputBuffer, ZSTD_EndDirective directive) { fixed(byte *inputBufferPtr = inputBuffer) fixed(byte *outputBufferPtr = outputBuffer) { input.src = inputBufferPtr; output.dst = outputBufferPtr; return(compressor.CompressStream(ref input, ref output, directive).EnsureZstdSuccess()); } }
private void WriteInternal(ReadOnlySpan <byte> buffer, bool lastChunk) { EnsureNotDisposed(); var input = new ZSTD_inBuffer_s { pos = 0, size = buffer != null ? (nuint)buffer.Length : 0 }; nuint remaining; do { output.pos = 0; remaining = CompressStream(ref input, buffer, lastChunk ? ZSTD_EndDirective.ZSTD_e_end : ZSTD_EndDirective.ZSTD_e_continue); var written = (int)output.pos; if (written > 0) { innerStream.Write(outputBuffer, 0, written); } } while (lastChunk ? remaining > 0 : input.pos < input.size); }
private async ValueTask WriteInternalAsync(ReadOnlyMemory <byte>?buffer, bool lastChunk, CancellationToken cancellationToken = default) { EnsureNotDisposed(); var input = new ZSTD_inBuffer_s { pos = 0, size = buffer.HasValue ? (nuint)buffer.Value.Length : 0 }; nuint remaining; do { output.pos = 0; remaining = CompressStream(ref input, buffer.HasValue ? buffer.Value.Span : null, lastChunk ? ZSTD_EndDirective.ZSTD_e_end : ZSTD_EndDirective.ZSTD_e_continue); var written = (int)output.pos; if (written > 0) { await innerStream.WriteAsync(outputBuffer, 0, written, cancellationToken).ConfigureAwait(false); } } while (lastChunk ? remaining > 0 : input.pos < input.size); }