diff options
author | Yann Collet <cyan@fb.com> | 2017-03-29 00:10:01 (GMT) |
---|---|---|
committer | Yann Collet <cyan@fb.com> | 2017-03-29 00:10:01 (GMT) |
commit | f0a7651fce53f5e85da6140f9d075b730ae6eac7 (patch) | |
tree | 2ed5556ca004b617683260baad52fac2ff2e2ec6 /lib/lz4frame.h | |
parent | ab547a0ef8e78a5930936b0440020bb779f1d53c (diff) | |
download | lz4-f0a7651fce53f5e85da6140f9d075b730ae6eac7.zip lz4-f0a7651fce53f5e85da6140f9d075b730ae6eac7.tar.gz lz4-f0a7651fce53f5e85da6140f9d075b730ae6eac7.tar.bz2 |
Safer LZ4_getFrameInfo()
LZ4_getFrameInfo() is now guaranteed to keep dctx state clean,
even in case of failure.
Diffstat (limited to 'lib/lz4frame.h')
-rw-r--r-- | lib/lz4frame.h | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/lz4frame.h b/lib/lz4frame.h index a0cf0ab..7c33464 100644 --- a/lib/lz4frame.h +++ b/lib/lz4frame.h @@ -303,25 +303,30 @@ LZ4FLIB_API LZ4F_errorCode_t LZ4F_createDecompressionContext(LZ4F_dctx** dctxPtr LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* const dctx); -/* ====== Decompression ======*/ +/*-*********************************** +* Streaming decompression functions +*************************************/ -/*!LZ4F_getFrameInfo() : - * This function decodes frame header information (such as max blockSize, frame checksum, etc.). - * Its usage is optional. The objective is to extract frame header information, typically for allocation purposes. - * A header size is variable and can length from 7 to 15 bytes. It's possible to provide more input bytes than that. +/*! LZ4F_getFrameInfo() : + * This function extracts frame parameters (such as max blockSize, frame checksum, etc.). + * Its usage is optional. The objective is to provide relevant information for allocation purposes. + * This function works in 2 situations : + * - At the beginning of a new frame, in which case it will decode this information from `srcBuffer`, and start the decoding process. + * Amount of input data provided must be large enough to successfully decode the frame header. + * A header size is variable, but is guaranteed to be <= LZ4F_HEADER_SIZE_MAX bytes. It's possible to provide more input data than this minimum. + * - After decoding has been started. In which case, no input is read, frame parameters are extracted from dctx. * The number of bytes consumed from srcBuffer will be updated within *srcSizePtr (necessarily <= original value). - * Decompression must resume from this point (srcBuffer + *srcSizePtr). - * Note that LZ4F_getFrameInfo() can also be used anytime *after* decompression is started, in which case 0 input byte can be enough. - * Frame header info is *copied into* an already allocated LZ4F_frameInfo_t structure. + * Decompression must resume from (srcBuffer + *srcSizePtr). * @return : an hint about how many srcSize bytes LZ4F_decompress() expects for next call, * or an error code which can be tested using LZ4F_isError() - * (typically, when there is not enough src bytes to fully decode the frame header) + * note 1 : in case of error, dctx is not modified. Decoding operations can resume from where they stopped. + * note 2 : frame parameters are *copied into* an already allocated LZ4F_frameInfo_t structure. */ LZ4FLIB_API size_t LZ4F_getFrameInfo(LZ4F_dctx* dctx, LZ4F_frameInfo_t* frameInfoPtr, const void* srcBuffer, size_t* srcSizePtr); -/*!LZ4F_decompress() : +/*! LZ4F_decompress() : * Call this function repetitively to regenerate data compressed within `srcBuffer`. * The function will attempt to decode up to *srcSizePtr bytes from srcBuffer, into dstBuffer of capacity *dstSizePtr. * @@ -337,7 +342,7 @@ LZ4FLIB_API size_t LZ4F_getFrameInfo(LZ4F_dctx* dctx, * * @return is an hint of how many `srcSize` bytes LZ4F_decompress() expects for next call. * Schematically, it's the size of the current (or remaining) compressed block + header of next block. - * Respecting the hint provides some boost to performance, since it does skip intermediate buffers. + * Respecting the hint provides some small speed benefit, because it skips intermediate buffers. * This is just a hint though, it's always possible to provide any srcSize. * When a frame is fully decoded, @return will be 0 (no more data expected). * If decompression failed, @return is an error code, which can be tested using LZ4F_isError(). |