Skip to content

Commit ba41b26

Browse files
authored
Merge pull request facebook#689 from facebook/cctxMerge
Cctx merge
2 parents d47709b + 30ab64e commit ba41b26

File tree

8 files changed

+366
-279
lines changed

8 files changed

+366
-279
lines changed

doc/zstd_manual.html

Lines changed: 80 additions & 72 deletions
Large diffs are not rendered by default.

lib/compress/zstd_compress.c

Lines changed: 105 additions & 88 deletions
Large diffs are not rendered by default.

lib/decompress/zstd_decompress.c

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ struct ZSTD_DCtx_s
105105
const void* vBase; /* virtual start of previous segment if it was just before current one */
106106
const void* dictEnd; /* end of previous segment */
107107
size_t expected;
108-
ZSTD_frameParams fParams;
108+
ZSTD_frameHeader fParams;
109109
blockType_e bType; /* used in ZSTD_decompressContinue(), to transfer blockType between header decoding and block decoding stages */
110110
ZSTD_dStage stage;
111111
U32 litEntropy;
@@ -219,22 +219,23 @@ static size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize)
219219
}
220220

221221

222-
/** ZSTD_getFrameParams() :
222+
/** ZSTD_getFrameHeader() :
223223
* decode Frame Header, or require larger `srcSize`.
224-
* @return : 0, `fparamsPtr` is correctly filled,
224+
* @return : 0, `zfhPtr` is correctly filled,
225225
* >0, `srcSize` is too small, result is expected `srcSize`,
226226
* or an error code, which can be tested using ZSTD_isError() */
227-
size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t srcSize)
227+
size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize)
228228
{
229229
const BYTE* ip = (const BYTE*)src;
230-
231230
if (srcSize < ZSTD_frameHeaderSize_prefix) return ZSTD_frameHeaderSize_prefix;
231+
232232
if (MEM_readLE32(src) != ZSTD_MAGICNUMBER) {
233233
if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
234+
/* skippable frame */
234235
if (srcSize < ZSTD_skippableHeaderSize) return ZSTD_skippableHeaderSize; /* magic number + skippable frame length */
235-
memset(fparamsPtr, 0, sizeof(*fparamsPtr));
236-
fparamsPtr->frameContentSize = MEM_readLE32((const char *)src + 4);
237-
fparamsPtr->windowSize = 0; /* windowSize==0 means a frame is skippable */
236+
memset(zfhPtr, 0, sizeof(*zfhPtr));
237+
zfhPtr->frameContentSize = MEM_readLE32((const char *)src + 4);
238+
zfhPtr->windowSize = 0; /* windowSize==0 means a frame is skippable */
238239
return 0;
239240
}
240241
return ERROR(prefix_unknown);
@@ -281,10 +282,10 @@ size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t
281282
}
282283
if (!windowSize) windowSize = (U32)frameContentSize;
283284
if (windowSize > windowSizeMax) return ERROR(frameParameter_windowTooLarge);
284-
fparamsPtr->frameContentSize = frameContentSize;
285-
fparamsPtr->windowSize = windowSize;
286-
fparamsPtr->dictID = dictID;
287-
fparamsPtr->checksumFlag = checksumFlag;
285+
zfhPtr->frameContentSize = frameContentSize;
286+
zfhPtr->windowSize = windowSize;
287+
zfhPtr->dictID = dictID;
288+
zfhPtr->checksumFlag = checksumFlag;
288289
}
289290
return 0;
290291
}
@@ -302,9 +303,8 @@ unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
302303
return ret == 0 ? ZSTD_CONTENTSIZE_UNKNOWN : ret;
303304
}
304305
#endif
305-
{
306-
ZSTD_frameParams fParams;
307-
if (ZSTD_getFrameParams(&fParams, src, srcSize) != 0) return ZSTD_CONTENTSIZE_ERROR;
306+
{ ZSTD_frameHeader fParams;
307+
if (ZSTD_getFrameHeader(&fParams, src, srcSize) != 0) return ZSTD_CONTENTSIZE_ERROR;
308308
if (fParams.windowSize == 0) {
309309
/* Either skippable or empty frame, size == 0 either way */
310310
return 0;
@@ -389,7 +389,7 @@ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize)
389389
* @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
390390
static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t headerSize)
391391
{
392-
size_t const result = ZSTD_getFrameParams(&(dctx->fParams), src, headerSize);
392+
size_t const result = ZSTD_getFrameHeader(&(dctx->fParams), src, headerSize);
393393
if (ZSTD_isError(result)) return result; /* invalid header */
394394
if (result>0) return ERROR(srcSize_wrong); /* headerSize too small */
395395
if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID)) return ERROR(dictionary_wrong);
@@ -1364,13 +1364,13 @@ size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
13641364
const BYTE* ip = (const BYTE*)src;
13651365
const BYTE* const ipstart = ip;
13661366
size_t remainingSize = srcSize;
1367-
ZSTD_frameParams fParams;
1367+
ZSTD_frameHeader fParams;
13681368

13691369
size_t const headerSize = ZSTD_frameHeaderSize(ip, remainingSize);
13701370
if (ZSTD_isError(headerSize)) return headerSize;
13711371

13721372
/* Frame Header */
1373-
{ size_t const ret = ZSTD_getFrameParams(&fParams, ip, remainingSize);
1373+
{ size_t const ret = ZSTD_getFrameHeader(&fParams, ip, remainingSize);
13741374
if (ZSTD_isError(ret)) return ret;
13751375
if (ret > 0) return ERROR(srcSize_wrong);
13761376
}
@@ -1969,6 +1969,14 @@ size_t ZSTD_freeDDict(ZSTD_DDict* ddict)
19691969
}
19701970
}
19711971

1972+
/*! ZSTD_estimateDDictSize() :
1973+
* Estimate amount of memory that will be needed to create a dictionary for decompression.
1974+
* Note : if dictionary is created "byReference", reduce this amount by dictSize */
1975+
size_t ZSTD_estimateDDictSize(size_t dictSize)
1976+
{
1977+
return dictSize + sizeof(ZSTD_DDict);
1978+
}
1979+
19721980
size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict)
19731981
{
19741982
if (ddict==NULL) return 0; /* support sizeof on NULL */
@@ -2008,11 +2016,11 @@ unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict)
20082016
* Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`.
20092017
* - This is not a Zstandard frame.
20102018
* When identifying the exact failure cause, it's possible to use
2011-
* ZSTD_getFrameParams(), which will provide a more precise error code. */
2019+
* ZSTD_getFrameHeader(), which will provide a more precise error code. */
20122020
unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize)
20132021
{
2014-
ZSTD_frameParams zfp = { 0 , 0 , 0 , 0 };
2015-
size_t const hError = ZSTD_getFrameParams(&zfp, src, srcSize);
2022+
ZSTD_frameHeader zfp = { 0 , 0 , 0 , 0 };
2023+
size_t const hError = ZSTD_getFrameHeader(&zfp, src, srcSize);
20162024
if (ZSTD_isError(hError)) return 0;
20172025
return zfp.dictID;
20182026
}
@@ -2045,7 +2053,7 @@ struct ZSTD_DStream_s {
20452053
ZSTD_DCtx* dctx;
20462054
ZSTD_DDict* ddictLocal;
20472055
const ZSTD_DDict* ddict;
2048-
ZSTD_frameParams fParams;
2056+
ZSTD_frameHeader fParams;
20492057
ZSTD_dStreamStage stage;
20502058
char* inBuff;
20512059
size_t inBuffSize;
@@ -2175,6 +2183,15 @@ size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds)
21752183
+ zds->inBuffSize + zds->outBuffSize;
21762184
}
21772185

2186+
size_t ZSTD_estimateDStreamSize(ZSTD_frameHeader fHeader)
2187+
{
2188+
size_t const windowSize = fHeader.windowSize;
2189+
size_t const blockSize = MIN(windowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
2190+
size_t const inBuffSize = blockSize; /* no block can be larger */
2191+
size_t const outBuffSize = windowSize + blockSize + (WILDCOPY_OVERLENGTH * 2);
2192+
return sizeof(ZSTD_DStream) + ZSTD_estimateDCtxSize() + inBuffSize + outBuffSize;
2193+
}
2194+
21782195

21792196
/* ***** Decompression ***** */
21802197

@@ -2209,7 +2226,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
22092226
/* fall-through */
22102227

22112228
case zdss_loadHeader :
2212-
{ size_t const hSize = ZSTD_getFrameParams(&zds->fParams, zds->headerBuffer, zds->lhSize);
2229+
{ size_t const hSize = ZSTD_getFrameHeader(&zds->fParams, zds->headerBuffer, zds->lhSize);
22132230
if (ZSTD_isError(hSize))
22142231
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
22152232
{ U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart);

0 commit comments

Comments
 (0)