From 9242816b5640f99547dd731f0e947b67eafa113e Mon Sep 17 00:00:00 2001 From: inikep Date: Wed, 1 Jun 2016 18:47:04 +0200 Subject: [PATCH] fparamsPtr->windowLog==0 means that a frame is skippable --- lib/common/zstd_static.h | 9 +++++++++ lib/decompress/zbuff_decompress.c | 2 ++ lib/decompress/zstd_decompress.c | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/common/zstd_static.h b/lib/common/zstd_static.h index e4c992be..19118f46 100644 --- a/lib/common/zstd_static.h +++ b/lib/common/zstd_static.h @@ -246,6 +246,15 @@ ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t ds A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero. Context can then be reset to start a new decompression. + + Skippable frames allow the integration of user-defined data into a flow of concatenated frames. + Skippable frames will be ignored (skipped) by a decompressor. The format of skippable frame is following: + a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F + b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits + c) Frame Content - any content (User Data) of length equal to Frame Size + For skippable frames ZSTD_decompressContinue() always returns 0. + For skippable frames ZSTD_getFrameParams() returns fparamsPtr->windowLog==0 what means that a frame is skippable. + It also returns Frame Size as fparamsPtr->frameContentSize. */ diff --git a/lib/decompress/zbuff_decompress.c b/lib/decompress/zbuff_decompress.c index 72456fd5..69898fdb 100644 --- a/lib/decompress/zbuff_decompress.c +++ b/lib/decompress/zbuff_decompress.c @@ -192,6 +192,8 @@ size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbd, if (ZSTD_isError(h2Result)) return h2Result; } } + if (zbd->fParams.windowLog < ZSTD_WINDOWLOG_ABSOLUTEMIN) zbd->fParams.windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN; /* required for buffer allocation */ + /* Frame header instruct buffer sizes */ { size_t const blockSize = MIN(1 << zbd->fParams.windowLog, ZSTD_BLOCKSIZE_MAX); zbd->blockSize = blockSize; diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index e88b873c..27dd780a 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -335,7 +335,7 @@ size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t if (srcSize < ZSTD_skippableHeaderSize) return ZSTD_skippableHeaderSize; /* magic number + skippable frame length */ memset(fparamsPtr, 0, sizeof(*fparamsPtr)); fparamsPtr->frameContentSize = MEM_readLE32((const char *)src + 4); - fparamsPtr->windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN; + fparamsPtr->windowLog = 0; /* windowLog==0 means a frame is skippable */ return 0; } return ERROR(prefix_unknown);