diff --git a/contrib/seekable_format/examples/.gitignore b/contrib/seekable_format/examples/.gitignore new file mode 100644 index 00000000..4ded4561 --- /dev/null +++ b/contrib/seekable_format/examples/.gitignore @@ -0,0 +1,2 @@ +seekable_compression +seekable_decompression diff --git a/contrib/seekable_format/examples/Makefile b/contrib/seekable_format/examples/Makefile new file mode 100644 index 00000000..c560eb07 --- /dev/null +++ b/contrib/seekable_format/examples/Makefile @@ -0,0 +1,35 @@ +# ################################################################ +# Copyright (c) 2017-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. An additional grant +# of patent rights can be found in the PATENTS file in the same directory. +# ################################################################ + +# This Makefile presumes libzstd is built, using `make` in / or /lib/ + +LDFLAGS += -L../../../lib/ -lzstd +CPPFLAGS += -I../ -I../../../lib -I../../../lib/common + +CFLAGS = -O3 +CFLAGS += -g + +SEEKABLE_OBJS = ../zstdseek_compress.c ../zstdseek_decompress.c + +.PHONY: default all clean test + +default: all + +all: seekable_compression seekable_decompression + +seekable_compression : seekable_compression.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(SEEKABLE_OBJS) $^ $(LDFLAGS) -o $@ + +seekable_decompression : seekable_decompression.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(SEEKABLE_OBJS) $^ $(LDFLAGS) -o $@ + +clean: + @rm -f core *.o tmp* result* *.zst \ + seekable_compression seekable_decompression + @echo Cleaning completed diff --git a/contrib/seekable_format/examples/seekable_compression b/contrib/seekable_format/examples/seekable_compression new file mode 100755 index 00000000..88e1d294 Binary files /dev/null and b/contrib/seekable_format/examples/seekable_compression differ diff --git a/examples/seekable_compression.c b/contrib/seekable_format/examples/seekable_compression.c similarity index 99% rename from examples/seekable_compression.c rename to contrib/seekable_format/examples/seekable_compression.c index f4bceb10..8d3fe857 100644 --- a/examples/seekable_compression.c +++ b/contrib/seekable_format/examples/seekable_compression.c @@ -12,6 +12,8 @@ #define ZSTD_STATIC_LINKING_ONLY #include // presumes zstd library is installed +#include "zstd_seekable.h" + static void* malloc_orDie(size_t size) { void* const buff = malloc(size); diff --git a/examples/seekable_decompression.c b/contrib/seekable_format/examples/seekable_decompression.c similarity index 99% rename from examples/seekable_decompression.c rename to contrib/seekable_format/examples/seekable_decompression.c index 641e0429..b134b87b 100644 --- a/examples/seekable_decompression.c +++ b/contrib/seekable_format/examples/seekable_decompression.c @@ -15,6 +15,8 @@ #include // presumes zstd library is installed #include +#include "zstd_seekable.h" + static void* malloc_orDie(size_t size) { diff --git a/contrib/seekable_format/zstd_seekable.h b/contrib/seekable_format/zstd_seekable.h new file mode 100644 index 00000000..959b1bd0 --- /dev/null +++ b/contrib/seekable_format/zstd_seekable.h @@ -0,0 +1,140 @@ +#ifndef SEEKABLE_H +#define SEEKABLE_H + +#if defined (__cplusplus) +extern "C" { +#endif + +static const unsigned ZSTD_seekTableFooterSize = 9; + +#define ZSTD_SEEKABLE_MAGICNUMBER 0x8F92EAB1 + +#define ZSTD_SEEKABLE_MAXCHUNKS 0x8000000U + +/* 0xFE03F607 is the largest number x such that ZSTD_compressBound(x) fits in a 32-bit integer */ +#define ZSTD_SEEKABLE_MAX_CHUNK_DECOMPRESSED_SIZE 0xFE03F607 + +/*-**************************************************************************** +* Seekable Format +* +* The seekable format splits the compressed data into a series of "chunks", +* each compressed individually so that decompression of a section in the +* middle of an archive only requires zstd to decompress at most a chunk's +* worth of extra data, instead of the entire archive. +******************************************************************************/ + +typedef struct ZSTD_seekable_CStream_s ZSTD_seekable_CStream; +typedef struct ZSTD_seekable_DStream_s ZSTD_seekable_DStream; + +/*-**************************************************************************** +* Seekable compression - HowTo +* A ZSTD_seekable_CStream object is required to tracking streaming operation. +* Use ZSTD_seekable_createCStream() and ZSTD_seekable_freeCStream() to create/ +* release resources. +* +* Streaming objects are reusable to avoid allocation and deallocation, +* to start a new compression operation call ZSTD_seekable_initCStream() on the +* compressor. +* +* Data streamed to the seekable compressor will automatically be split into +* chunks of size `maxChunkSize` (provided in ZSTD_seekable_initCStream()), +* or if none is provided, will be cut off whenver ZSTD_endChunk() is called +* or when the default maximum chunk size is reached (approximately 4GB). +* +* Use ZSTD_seekable_initCStream() to initialize a ZSTD_seekable_CStream object +* for a new compression operation. +* `maxChunkSize` indicates the size at which to automatically start a new +* seekable frame. `maxChunkSize == 0` implies the default maximum size. +* `checksumFlag` indicates whether or not the seek table should include chunk +* checksums on the uncompressed data for verification. +* @return : a size hint for input to provide for compression, or an error code +* checkable with ZSTD_isError() +* +* Use ZSTD_seekable_compressStream() repetitively to consume input stream. +* The function will automatically update both `pos` fields. +* Note that it may not consume the entire input, in which case `pos < size`, +* and it's up to the caller to present again remaining data. +* @return : a size hint, preferred nb of bytes to use as input for next +* function call or an error code, which can be tested using +* ZSTD_isError(). +* Note 1 : it's just a hint, to help latency a little, any other +* value will work fine. +* Note 2 : size hint is guaranteed to be <= ZSTD_CStreamInSize() +* +* At any time, call ZSTD_seekable_endChunk() to end the current chunk and +* start a new one. +* +* ZSTD_endStream() will end the current chunk, and then write the seek table +* so that decompressors can efficiently find compressed chunks. +* ZSTD_endStream() may return a number > 0 if it was unable to flush all the +* necessary data to `output`. In this case, it should be called again until +* all remaining data is flushed out and 0 is returned. +******************************************************************************/ + +/*===== Seekable compressor management =====*/ +ZSTDLIB_API ZSTD_seekable_CStream* ZSTD_seekable_createCStream(void); +ZSTDLIB_API size_t ZSTD_seekable_freeCStream(ZSTD_seekable_CStream* zcs); + +/*===== Seekable compression functions =====*/ +ZSTDLIB_API size_t ZSTD_seekable_initCStream(ZSTD_seekable_CStream* zcs, int compressionLevel, int checksumFlag, unsigned maxChunkSize); +ZSTDLIB_API size_t ZSTD_seekable_compressStream(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); +ZSTDLIB_API size_t ZSTD_seekable_endChunk(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output); +ZSTDLIB_API size_t ZSTD_seekable_endStream(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output); + +/*-**************************************************************************** +* Seekable decompression - HowTo +* A ZSTD_seekable_DStream object is required to tracking streaming operation. +* Use ZSTD_seekable_createDStream() and ZSTD_seekable_freeDStream() to create/ +* release resources. +* +* Streaming objects are reusable to avoid allocation and deallocation, +* to start a new compression operation call ZSTD_seekable_initDStream() on the +* compressor. +* +* Use ZSTD_seekable_loadSeekTable() to load the seek table from a file. +* `src` should point to a block of data read from the end of the file, +* i.e. `src + srcSize` should always be the end of the file. +* @return : 0 if the table was loaded successfully, or if `srcSize` was too +* small, a size hint for how much data to provide. +* An error code may also be returned, checkable with ZSTD_isError() +* +* Use ZSTD_initDStream to prepare for a new decompression operation using the +* seektable loaded with ZSTD_seekable_loadSeekTable(). +* Data in the range [rangeStart, rangeEnd) will be decompressed. +* +* Call ZSTD_seekable_decompressStream() repetitively to consume input stream. +* @return : There are a number of possible return codes for this function +* - 0, the decompression operation has completed. +* - An error code checkable with ZSTD_isError +* + If this error code is ZSTD_error_needSeek, the user should seek +* to the file position provided by ZSTD_seekable_getSeekOffset() +* and indicate this to the stream with +* ZSTD_seekable_updateOffset(), before resuming decompression +* + Otherwise, this is a regular decompression error and the input +* file is likely corrupted or the API was incorrectly used. +* - A size hint, the preferred nb of bytes to provide as input to the +* next function call to improve latency. +* +* ZSTD_seekable_getSeekOffset() and ZSTD_seekable_updateOffset() are helper +* functions to indicate where the user should seek their file stream to, when +* a different position is required to continue decompression. +* Note that ZSTD_seekable_updateOffset will error if given an offset other +* than the one requested from ZSTD_seekable_getSeekOffset(). +******************************************************************************/ + +/*===== Seekable decompressor management =====*/ +ZSTDLIB_API ZSTD_seekable_DStream* ZSTD_seekable_createDStream(void); +ZSTDLIB_API size_t ZSTD_seekable_freeDStream(ZSTD_seekable_DStream* zds); + +/*===== Seekable decompression functions =====*/ +ZSTDLIB_API size_t ZSTD_seekable_loadSeekTable(ZSTD_seekable_DStream* zds, const void* src, size_t srcSize); +ZSTDLIB_API size_t ZSTD_seekable_initDStream(ZSTD_seekable_DStream* zds, unsigned long long rangeStart, unsigned long long rangeEnd); +ZSTDLIB_API size_t ZSTD_seekable_decompressStream(ZSTD_seekable_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); +ZSTDLIB_API unsigned long long ZSTD_seekable_getSeekOffset(ZSTD_seekable_DStream* zds); +ZSTDLIB_API size_t ZSTD_seekable_updateOffset(ZSTD_seekable_DStream* zds, unsigned long long offset); + +#if defined (__cplusplus) +} +#endif + +#endif diff --git a/doc/zstd_seekable_compression_format.md b/contrib/seekable_format/zstd_seekable_compression_format.md similarity index 100% rename from doc/zstd_seekable_compression_format.md rename to contrib/seekable_format/zstd_seekable_compression_format.md diff --git a/lib/compress/zstdseek_compress.c b/contrib/seekable_format/zstdseek_compress.c similarity index 99% rename from lib/compress/zstdseek_compress.c rename to contrib/seekable_format/zstdseek_compress.c index f9e108af..2504287c 100644 --- a/lib/compress/zstdseek_compress.c +++ b/contrib/seekable_format/zstdseek_compress.c @@ -10,10 +10,11 @@ #include /* malloc, free */ #define XXH_STATIC_LINKING_ONLY +#define XXH_NAMESPACE ZSTD_ #include "xxhash.h" #include "zstd_internal.h" /* includes zstd.h */ -#include "seekable.h" +#include "zstd_seekable.h" typedef struct { U32 cSize; diff --git a/lib/decompress/zstdseek_decompress.c b/contrib/seekable_format/zstdseek_decompress.c similarity index 99% rename from lib/decompress/zstdseek_decompress.c rename to contrib/seekable_format/zstdseek_decompress.c index 92901bef..3cb851ea 100644 --- a/lib/decompress/zstdseek_decompress.c +++ b/contrib/seekable_format/zstdseek_decompress.c @@ -10,10 +10,11 @@ #include /* malloc, free */ #define XXH_STATIC_LINKING_ONLY +#define XXH_NAMESPACE ZSTD_ #include "xxhash.h" #include "zstd_internal.h" /* includes zstd.h */ -#include "seekable.h" +#include "zstd_seekable.h" typedef struct { U64 cOffset; diff --git a/doc/README.md b/doc/README.md index 0aee0428..6f761b33 100644 --- a/doc/README.md +++ b/doc/README.md @@ -17,6 +17,3 @@ __`zstd_manual.html`__ : Documentation on the functions found in `zstd.h`. See [http://zstd.net/zstd_manual.html](http://zstd.net/zstd_manual.html) for the manual released with the latest official `zstd` release. -__`zstd_seekable_compression_format.md`__ : This document defines the Zstandard -format for seekable compression. - diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index c7017d12..a5b66f7d 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -28,9 +28,6 @@
  • Buffer-less streaming compression (synchronous mode)
  • Buffer-less streaming decompression (synchronous mode)
  • Block functions
  • -
  • Seekable Format
  • -
  • Seekable compression - HowTo
  • -
  • Seekable decompression - HowTo

  • Introduction

    @@ -671,111 +668,5 @@ size_t ZSTD_compressBlock  (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, cons
     size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
     size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize);  /**< insert block into `dctx` history. Useful for uncompressed blocks */
     

    -

    Seekable Format

    -  The seekable format splits the compressed data into a series of "chunks",
    -  each compressed individually so that decompression of a section in the
    -  middle of an archive only requires zstd to decompress at most a chunk's
    -  worth of extra data, instead of the entire archive.
    -
    - -

    Seekable compression - HowTo

      A ZSTD_seekable_CStream object is required to tracking streaming operation.
    -  Use ZSTD_seekable_createCStream() and ZSTD_seekable_freeCStream() to create/
    -  release resources.
    -
    -  Streaming objects are reusable to avoid allocation and deallocation,
    -  to start a new compression operation call ZSTD_seekable_initCStream() on the
    -  compressor.
    -
    -  Data streamed to the seekable compressor will automatically be split into
    -  chunks of size `maxChunkSize` (provided in ZSTD_seekable_initCStream()),
    -  or if none is provided, will be cut off whenver ZSTD_endChunk() is called
    -  or when the default maximum chunk size is reached (approximately 4GB).
    -
    -  Use ZSTD_seekable_initCStream() to initialize a ZSTD_seekable_CStream object
    -  for a new compression operation.
    -  `maxChunkSize` indicates the size at which to automatically start a new
    -  seekable frame.  `maxChunkSize == 0` implies the default maximum size.
    -  `checksumFlag` indicates whether or not the seek table should include chunk
    -  checksums on the uncompressed data for verification.
    -  @return : a size hint for input to provide for compression, or an error code
    -            checkable with ZSTD_isError()
    -
    -  Use ZSTD_seekable_compressStream() repetitively to consume input stream.
    -  The function will automatically update both `pos` fields.
    -  Note that it may not consume the entire input, in which case `pos < size`,
    -  and it's up to the caller to present again remaining data.
    -  @return : a size hint, preferred nb of bytes to use as input for next
    -            function call or an error code, which can be tested using
    -            ZSTD_isError().
    -            Note 1 : it's just a hint, to help latency a little, any other
    -                     value will work fine.
    -            Note 2 : size hint is guaranteed to be <= ZSTD_CStreamInSize()
    -
    -  At any time, call ZSTD_seekable_endChunk() to end the current chunk and
    -  start a new one.
    -
    -  ZSTD_endStream() will end the current chunk, and then write the seek table
    -  so that decompressors can efficiently find compressed chunks.
    -  ZSTD_endStream() may return a number > 0 if it was unable to flush all the
    -  necessary data to `output`.  In this case, it should be called again until
    -  all remaining data is flushed out and 0 is returned.
    -
    - -

    Seekable compressor management

    ZSTD_seekable_CStream* ZSTD_seekable_createCStream(void);
    -size_t ZSTD_seekable_freeCStream(ZSTD_seekable_CStream* zcs);
    -

    -

    Seekable compression functions

    size_t ZSTD_seekable_initCStream(ZSTD_seekable_CStream* zcs, int compressionLevel, int checksumFlag, unsigned maxChunkSize);
    -size_t ZSTD_seekable_compressStream(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
    -size_t ZSTD_seekable_endChunk(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output);
    -size_t ZSTD_seekable_endStream(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output);
    -

    -

    Seekable decompression - HowTo

      A ZSTD_seekable_DStream object is required to tracking streaming operation.
    -  Use ZSTD_seekable_createDStream() and ZSTD_seekable_freeDStream() to create/
    -  release resources.
    -
    -  Streaming objects are reusable to avoid allocation and deallocation,
    -  to start a new compression operation call ZSTD_seekable_initDStream() on the
    -  compressor.
    -
    -  Use ZSTD_seekable_loadSeekTable() to load the seek table from a file.
    -  `src` should point to a block of data read from the end of the file,
    -  i.e. `src + srcSize` should always be the end of the file.
    -  @return : 0 if the table was loaded successfully, or if `srcSize` was too
    -            small, a size hint for how much data to provide.
    -            An error code may also be returned, checkable with ZSTD_isError()
    -
    -  Use ZSTD_initDStream to prepare for a new decompression operation using the
    -  seektable loaded with ZSTD_seekable_loadSeekTable().
    -  Data in the range [rangeStart, rangeEnd) will be decompressed.
    -
    -  Call ZSTD_seekable_decompressStream() repetitively to consume input stream.
    -  @return : There are a number of possible return codes for this function
    -           - 0, the decompression operation has completed.
    -           - An error code checkable with ZSTD_isError
    -             + If this error code is ZSTD_error_needSeek, the user should seek
    -               to the file position provided by ZSTD_seekable_getSeekOffset()
    -               and indicate this to the stream with
    -               ZSTD_seekable_updateOffset(), before resuming decompression
    -             + Otherwise, this is a regular decompression error and the input
    -               file is likely corrupted or the API was incorrectly used.
    -           - A size hint, the preferred nb of bytes to provide as input to the
    -             next function call to improve latency.
    -
    -  ZSTD_seekable_getSeekOffset() and ZSTD_seekable_updateOffset() are helper
    -  functions to indicate where the user should seek their file stream to, when
    -  a different position is required to continue decompression.
    -  Note that ZSTD_seekable_updateOffset will error if given an offset other
    -  than the one requested from ZSTD_seekable_getSeekOffset().
    -
    - -

    Seekable decompressor management

    ZSTD_seekable_DStream* ZSTD_seekable_createDStream(void);
    -size_t ZSTD_seekable_freeDStream(ZSTD_seekable_DStream* zds);
    -

    -

    Seekable decompression functions

    size_t ZSTD_seekable_loadSeekTable(ZSTD_seekable_DStream* zds, const void* src, size_t srcSize);
    -size_t ZSTD_seekable_initDStream(ZSTD_seekable_DStream* zds, unsigned long long rangeStart, unsigned long long rangeEnd);
    -size_t ZSTD_seekable_decompressStream(ZSTD_seekable_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
    -unsigned long long ZSTD_seekable_getSeekOffset(ZSTD_seekable_DStream* zds);
    -size_t ZSTD_seekable_updateOffset(ZSTD_seekable_DStream* zds, unsigned long long offset);
    -

    diff --git a/examples/.gitignore b/examples/.gitignore index c6b2a9f4..0711813d 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -6,8 +6,6 @@ dictionary_decompression streaming_compression streaming_decompression multiple_streaming_compression -seekable_compression -seekable_decompression #test artefact tmp* diff --git a/examples/Makefile b/examples/Makefile index 2f649eae..b84983f0 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -18,8 +18,7 @@ default: all all: simple_compression simple_decompression \ dictionary_compression dictionary_decompression \ streaming_compression streaming_decompression \ - multiple_streaming_compression \ - seekable_compression seekable_decompression + multiple_streaming_compression simple_compression : simple_compression.c $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@ @@ -42,12 +41,6 @@ multiple_streaming_compression : multiple_streaming_compression.c streaming_decompression : streaming_decompression.c $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@ -seekable_compression : seekable_compression.c - $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@ - -seekable_decompression : seekable_decompression.c - $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@ - clean: @rm -f core *.o tmp* result* *.zst \ simple_compression simple_decompression \ diff --git a/lib/common/seekable.h b/lib/common/seekable.h deleted file mode 100644 index ab11a438..00000000 --- a/lib/common/seekable.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef SEEKABLE_H -#define SEEKABLE_H - -#if defined (__cplusplus) -extern "C" { -#endif - -#include "zstd_internal.h" - -static const unsigned ZSTD_seekTableFooterSize = 9; - -#define ZSTD_SEEKABLE_MAGICNUMBER 0x8F92EAB1 - -#define ZSTD_SEEKABLE_MAXCHUNKS 0x8000000U - -/* 0xFE03F607 is the largest number x such that ZSTD_compressBound(x) fits in a 32-bit integer */ -#define ZSTD_SEEKABLE_MAX_CHUNK_DECOMPRESSED_SIZE 0xFE03F607 - -#if defined (__cplusplus) -} -#endif - -#endif diff --git a/lib/zstd.h b/lib/zstd.h index 748a9827..6066db45 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -776,125 +776,6 @@ ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCa ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert block into `dctx` history. Useful for uncompressed blocks */ -/*-**************************************************************************** -* Seekable Format -* -* The seekable format splits the compressed data into a series of "chunks", -* each compressed individually so that decompression of a section in the -* middle of an archive only requires zstd to decompress at most a chunk's -* worth of extra data, instead of the entire archive. -******************************************************************************/ - -typedef struct ZSTD_seekable_CStream_s ZSTD_seekable_CStream; -typedef struct ZSTD_seekable_DStream_s ZSTD_seekable_DStream; - -/*-**************************************************************************** -* Seekable compression - HowTo -* A ZSTD_seekable_CStream object is required to tracking streaming operation. -* Use ZSTD_seekable_createCStream() and ZSTD_seekable_freeCStream() to create/ -* release resources. -* -* Streaming objects are reusable to avoid allocation and deallocation, -* to start a new compression operation call ZSTD_seekable_initCStream() on the -* compressor. -* -* Data streamed to the seekable compressor will automatically be split into -* chunks of size `maxChunkSize` (provided in ZSTD_seekable_initCStream()), -* or if none is provided, will be cut off whenver ZSTD_endChunk() is called -* or when the default maximum chunk size is reached (approximately 4GB). -* -* Use ZSTD_seekable_initCStream() to initialize a ZSTD_seekable_CStream object -* for a new compression operation. -* `maxChunkSize` indicates the size at which to automatically start a new -* seekable frame. `maxChunkSize == 0` implies the default maximum size. -* `checksumFlag` indicates whether or not the seek table should include chunk -* checksums on the uncompressed data for verification. -* @return : a size hint for input to provide for compression, or an error code -* checkable with ZSTD_isError() -* -* Use ZSTD_seekable_compressStream() repetitively to consume input stream. -* The function will automatically update both `pos` fields. -* Note that it may not consume the entire input, in which case `pos < size`, -* and it's up to the caller to present again remaining data. -* @return : a size hint, preferred nb of bytes to use as input for next -* function call or an error code, which can be tested using -* ZSTD_isError(). -* Note 1 : it's just a hint, to help latency a little, any other -* value will work fine. -* Note 2 : size hint is guaranteed to be <= ZSTD_CStreamInSize() -* -* At any time, call ZSTD_seekable_endChunk() to end the current chunk and -* start a new one. -* -* ZSTD_endStream() will end the current chunk, and then write the seek table -* so that decompressors can efficiently find compressed chunks. -* ZSTD_endStream() may return a number > 0 if it was unable to flush all the -* necessary data to `output`. In this case, it should be called again until -* all remaining data is flushed out and 0 is returned. -******************************************************************************/ - -/*===== Seekable compressor management =====*/ -ZSTDLIB_API ZSTD_seekable_CStream* ZSTD_seekable_createCStream(void); -ZSTDLIB_API size_t ZSTD_seekable_freeCStream(ZSTD_seekable_CStream* zcs); - -/*===== Seekable compression functions =====*/ -ZSTDLIB_API size_t ZSTD_seekable_initCStream(ZSTD_seekable_CStream* zcs, int compressionLevel, int checksumFlag, unsigned maxChunkSize); -ZSTDLIB_API size_t ZSTD_seekable_compressStream(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); -ZSTDLIB_API size_t ZSTD_seekable_endChunk(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output); -ZSTDLIB_API size_t ZSTD_seekable_endStream(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output); - -/*-**************************************************************************** -* Seekable decompression - HowTo -* A ZSTD_seekable_DStream object is required to tracking streaming operation. -* Use ZSTD_seekable_createDStream() and ZSTD_seekable_freeDStream() to create/ -* release resources. -* -* Streaming objects are reusable to avoid allocation and deallocation, -* to start a new compression operation call ZSTD_seekable_initDStream() on the -* compressor. -* -* Use ZSTD_seekable_loadSeekTable() to load the seek table from a file. -* `src` should point to a block of data read from the end of the file, -* i.e. `src + srcSize` should always be the end of the file. -* @return : 0 if the table was loaded successfully, or if `srcSize` was too -* small, a size hint for how much data to provide. -* An error code may also be returned, checkable with ZSTD_isError() -* -* Use ZSTD_initDStream to prepare for a new decompression operation using the -* seektable loaded with ZSTD_seekable_loadSeekTable(). -* Data in the range [rangeStart, rangeEnd) will be decompressed. -* -* Call ZSTD_seekable_decompressStream() repetitively to consume input stream. -* @return : There are a number of possible return codes for this function -* - 0, the decompression operation has completed. -* - An error code checkable with ZSTD_isError -* + If this error code is ZSTD_error_needSeek, the user should seek -* to the file position provided by ZSTD_seekable_getSeekOffset() -* and indicate this to the stream with -* ZSTD_seekable_updateOffset(), before resuming decompression -* + Otherwise, this is a regular decompression error and the input -* file is likely corrupted or the API was incorrectly used. -* - A size hint, the preferred nb of bytes to provide as input to the -* next function call to improve latency. -* -* ZSTD_seekable_getSeekOffset() and ZSTD_seekable_updateOffset() are helper -* functions to indicate where the user should seek their file stream to, when -* a different position is required to continue decompression. -* Note that ZSTD_seekable_updateOffset will error if given an offset other -* than the one requested from ZSTD_seekable_getSeekOffset(). -******************************************************************************/ - -/*===== Seekable decompressor management =====*/ -ZSTDLIB_API ZSTD_seekable_DStream* ZSTD_seekable_createDStream(void); -ZSTDLIB_API size_t ZSTD_seekable_freeDStream(ZSTD_seekable_DStream* zds); - -/*===== Seekable decompression functions =====*/ -ZSTDLIB_API size_t ZSTD_seekable_loadSeekTable(ZSTD_seekable_DStream* zds, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_seekable_initDStream(ZSTD_seekable_DStream* zds, unsigned long long rangeStart, unsigned long long rangeEnd); -ZSTDLIB_API size_t ZSTD_seekable_decompressStream(ZSTD_seekable_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); -ZSTDLIB_API unsigned long long ZSTD_seekable_getSeekOffset(ZSTD_seekable_DStream* zds); -ZSTDLIB_API size_t ZSTD_seekable_updateOffset(ZSTD_seekable_DStream* zds, unsigned long long offset); - #endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ #if defined (__cplusplus)