extzstd 0.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/HISTORY.ja.md +39 -0
- data/README.md +38 -56
- data/contrib/zstd/CHANGELOG +613 -0
- data/contrib/zstd/CODE_OF_CONDUCT.md +5 -0
- data/contrib/zstd/CONTRIBUTING.md +406 -0
- data/contrib/zstd/COPYING +339 -0
- data/contrib/zstd/Makefile +420 -0
- data/contrib/zstd/README.md +179 -41
- data/contrib/zstd/TESTING.md +44 -0
- data/contrib/zstd/appveyor.yml +292 -0
- data/contrib/zstd/lib/BUCK +234 -0
- data/contrib/zstd/lib/Makefile +451 -0
- data/contrib/zstd/lib/README.md +207 -0
- data/contrib/zstd/{common → lib/common}/bitstream.h +187 -138
- data/contrib/zstd/lib/common/compiler.h +288 -0
- data/contrib/zstd/lib/common/cpu.h +213 -0
- data/contrib/zstd/lib/common/debug.c +24 -0
- data/contrib/zstd/lib/common/debug.h +107 -0
- data/contrib/zstd/lib/common/entropy_common.c +362 -0
- data/contrib/zstd/{common → lib/common}/error_private.c +25 -12
- data/contrib/zstd/{common → lib/common}/error_private.h +14 -10
- data/contrib/zstd/{common → lib/common}/fse.h +173 -92
- data/contrib/zstd/{common → lib/common}/fse_decompress.c +149 -85
- data/contrib/zstd/lib/common/huf.h +361 -0
- data/contrib/zstd/{common → lib/common}/mem.h +115 -59
- data/contrib/zstd/lib/common/pool.c +350 -0
- data/contrib/zstd/lib/common/pool.h +84 -0
- data/contrib/zstd/lib/common/threading.c +122 -0
- data/contrib/zstd/lib/common/threading.h +155 -0
- data/contrib/zstd/{common → lib/common}/xxhash.c +55 -96
- data/contrib/zstd/{common → lib/common}/xxhash.h +23 -47
- data/contrib/zstd/lib/common/zstd_common.c +83 -0
- data/contrib/zstd/lib/common/zstd_deps.h +111 -0
- data/contrib/zstd/lib/common/zstd_errors.h +95 -0
- data/contrib/zstd/lib/common/zstd_internal.h +478 -0
- data/contrib/zstd/{compress → lib/compress}/fse_compress.c +214 -319
- data/contrib/zstd/lib/compress/hist.c +181 -0
- data/contrib/zstd/lib/compress/hist.h +75 -0
- data/contrib/zstd/lib/compress/huf_compress.c +913 -0
- data/contrib/zstd/lib/compress/zstd_compress.c +5208 -0
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +1203 -0
- data/contrib/zstd/lib/compress/zstd_compress_literals.c +158 -0
- data/contrib/zstd/lib/compress/zstd_compress_literals.h +29 -0
- data/contrib/zstd/lib/compress/zstd_compress_sequences.c +433 -0
- data/contrib/zstd/lib/compress/zstd_compress_sequences.h +54 -0
- data/contrib/zstd/lib/compress/zstd_compress_superblock.c +849 -0
- data/contrib/zstd/lib/compress/zstd_compress_superblock.h +32 -0
- data/contrib/zstd/lib/compress/zstd_cwksp.h +561 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.c +521 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.h +38 -0
- data/contrib/zstd/lib/compress/zstd_fast.c +496 -0
- data/contrib/zstd/lib/compress/zstd_fast.h +37 -0
- data/contrib/zstd/lib/compress/zstd_lazy.c +1412 -0
- data/contrib/zstd/lib/compress/zstd_lazy.h +87 -0
- data/contrib/zstd/lib/compress/zstd_ldm.c +660 -0
- data/contrib/zstd/lib/compress/zstd_ldm.h +116 -0
- data/contrib/zstd/lib/compress/zstd_opt.c +1345 -0
- data/contrib/zstd/lib/compress/zstd_opt.h +56 -0
- data/contrib/zstd/lib/compress/zstdmt_compress.c +1811 -0
- data/contrib/zstd/lib/compress/zstdmt_compress.h +110 -0
- data/contrib/zstd/lib/decompress/huf_decompress.c +1350 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.c +244 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.h +44 -0
- data/contrib/zstd/lib/decompress/zstd_decompress.c +1930 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1540 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_block.h +62 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +190 -0
- data/contrib/zstd/{common → lib/deprecated}/zbuff.h +68 -45
- data/contrib/zstd/lib/deprecated/zbuff_common.c +26 -0
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +147 -0
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +75 -0
- data/contrib/zstd/lib/dictBuilder/cover.c +1245 -0
- data/contrib/zstd/lib/dictBuilder/cover.h +157 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/divsufsort.c +3 -3
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/divsufsort.h +0 -0
- data/contrib/zstd/lib/dictBuilder/fastcover.c +758 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/zdict.c +318 -194
- data/contrib/zstd/lib/dictBuilder/zdict.h +305 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_legacy.h +171 -15
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v01.c +191 -124
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v01.h +19 -5
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v02.c +125 -125
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v02.h +19 -5
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v03.c +125 -124
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v03.h +20 -6
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v04.c +151 -299
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v04.h +19 -5
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v05.c +237 -243
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v05.h +19 -6
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v06.c +130 -143
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v06.h +18 -5
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v07.c +158 -157
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v07.h +19 -5
- data/contrib/zstd/lib/libzstd.pc.in +15 -0
- data/contrib/zstd/lib/zstd.h +2391 -0
- data/ext/depend +2 -0
- data/ext/extconf.rb +15 -6
- data/ext/extzstd.c +76 -145
- data/ext/extzstd.h +80 -31
- data/ext/extzstd_stream.c +417 -142
- data/ext/libzstd_conf.h +8 -0
- data/ext/zstd_common.c +10 -7
- data/ext/zstd_compress.c +14 -5
- data/ext/zstd_decompress.c +5 -4
- data/ext/zstd_dictbuilder.c +9 -4
- data/ext/zstd_dictbuilder_fastcover.c +3 -0
- data/ext/zstd_legacy_v01.c +3 -1
- data/ext/zstd_legacy_v02.c +3 -1
- data/ext/zstd_legacy_v03.c +3 -1
- data/ext/zstd_legacy_v04.c +3 -1
- data/ext/zstd_legacy_v05.c +3 -1
- data/ext/zstd_legacy_v06.c +3 -1
- data/ext/zstd_legacy_v07.c +3 -1
- data/gemstub.rb +10 -24
- data/lib/extzstd.rb +64 -179
- data/lib/extzstd/version.rb +6 -1
- data/test/test_basic.rb +9 -6
- metadata +113 -57
- data/HISTORY.ja +0 -5
- data/contrib/zstd/common/entropy_common.c +0 -225
- data/contrib/zstd/common/huf.h +0 -228
- data/contrib/zstd/common/zstd_common.c +0 -83
- data/contrib/zstd/common/zstd_errors.h +0 -60
- data/contrib/zstd/common/zstd_internal.h +0 -267
- data/contrib/zstd/compress/huf_compress.c +0 -533
- data/contrib/zstd/compress/zbuff_compress.c +0 -319
- data/contrib/zstd/compress/zstd_compress.c +0 -3264
- data/contrib/zstd/compress/zstd_opt.h +0 -900
- data/contrib/zstd/decompress/huf_decompress.c +0 -883
- data/contrib/zstd/decompress/zbuff_decompress.c +0 -252
- data/contrib/zstd/decompress/zstd_decompress.c +0 -1842
- data/contrib/zstd/dictBuilder/zdict.h +0 -111
- data/contrib/zstd/zstd.h +0 -640
@@ -1,10 +1,11 @@
|
|
1
|
-
|
2
|
-
* Copyright (c) 2016-
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
6
|
-
* LICENSE file in the root directory of this source tree
|
7
|
-
*
|
5
|
+
* This source code is licensed under both the BSD-style license (found in the
|
6
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
7
|
+
* in the COPYING file in the root directory of this source tree).
|
8
|
+
* You may select, at your option, one of the above-listed licenses.
|
8
9
|
*/
|
9
10
|
|
10
11
|
/* The purpose of this file is to have a single list of error strings embedded in binary */
|
@@ -13,6 +14,10 @@
|
|
13
14
|
|
14
15
|
const char* ERR_getErrorString(ERR_enum code)
|
15
16
|
{
|
17
|
+
#ifdef ZSTD_STRIP_ERROR_STRINGS
|
18
|
+
(void)code;
|
19
|
+
return "Error strings stripped";
|
20
|
+
#else
|
16
21
|
static const char* const notErrorCode = "Unspecified error code";
|
17
22
|
switch( code )
|
18
23
|
{
|
@@ -20,24 +25,32 @@ const char* ERR_getErrorString(ERR_enum code)
|
|
20
25
|
case PREFIX(GENERIC): return "Error (generic)";
|
21
26
|
case PREFIX(prefix_unknown): return "Unknown frame descriptor";
|
22
27
|
case PREFIX(version_unsupported): return "Version not supported";
|
23
|
-
case PREFIX(parameter_unknown): return "Unknown parameter type";
|
24
28
|
case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter";
|
25
|
-
case PREFIX(frameParameter_unsupportedBy32bits): return "Frame parameter unsupported in 32-bits mode";
|
26
29
|
case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding";
|
27
|
-
case PREFIX(
|
30
|
+
case PREFIX(corruption_detected): return "Corrupted block detected";
|
31
|
+
case PREFIX(checksum_wrong): return "Restored data doesn't match checksum";
|
32
|
+
case PREFIX(parameter_unsupported): return "Unsupported parameter";
|
33
|
+
case PREFIX(parameter_outOfBound): return "Parameter is out of bound";
|
28
34
|
case PREFIX(init_missing): return "Context should be init first";
|
29
35
|
case PREFIX(memory_allocation): return "Allocation error : not enough memory";
|
36
|
+
case PREFIX(workSpace_tooSmall): return "workSpace buffer is not large enough";
|
30
37
|
case PREFIX(stage_wrong): return "Operation not authorized at current processing stage";
|
31
|
-
case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
|
32
|
-
case PREFIX(srcSize_wrong): return "Src size incorrect";
|
33
|
-
case PREFIX(corruption_detected): return "Corrupted block detected";
|
34
|
-
case PREFIX(checksum_wrong): return "Restored data doesn't match checksum";
|
35
38
|
case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported";
|
36
39
|
case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large";
|
37
40
|
case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small";
|
38
41
|
case PREFIX(dictionary_corrupted): return "Dictionary is corrupted";
|
39
42
|
case PREFIX(dictionary_wrong): return "Dictionary mismatch";
|
43
|
+
case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples";
|
44
|
+
case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
|
45
|
+
case PREFIX(srcSize_wrong): return "Src size is incorrect";
|
46
|
+
case PREFIX(dstBuffer_null): return "Operation on NULL destination buffer";
|
47
|
+
/* following error codes are not stable and may be removed or changed in a future version */
|
48
|
+
case PREFIX(frameIndex_tooLarge): return "Frame index is too large";
|
49
|
+
case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking";
|
50
|
+
case PREFIX(dstBuffer_wrong): return "Destination buffer is wrong";
|
51
|
+
case PREFIX(srcBuffer_wrong): return "Source buffer is wrong";
|
40
52
|
case PREFIX(maxCode):
|
41
53
|
default: return notErrorCode;
|
42
54
|
}
|
55
|
+
#endif
|
43
56
|
}
|
@@ -1,10 +1,11 @@
|
|
1
|
-
|
2
|
-
* Copyright (c) 2016-
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
6
|
-
* LICENSE file in the root directory of this source tree
|
7
|
-
*
|
5
|
+
* This source code is licensed under both the BSD-style license (found in the
|
6
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
7
|
+
* in the COPYING file in the root directory of this source tree).
|
8
|
+
* You may select, at your option, one of the above-listed licenses.
|
8
9
|
*/
|
9
10
|
|
10
11
|
/* Note : this module is expected to remain private, do not expose it */
|
@@ -20,7 +21,7 @@ extern "C" {
|
|
20
21
|
/* ****************************************
|
21
22
|
* Dependencies
|
22
23
|
******************************************/
|
23
|
-
#include
|
24
|
+
#include "zstd_deps.h" /* size_t */
|
24
25
|
#include "zstd_errors.h" /* enum list */
|
25
26
|
|
26
27
|
|
@@ -48,15 +49,18 @@ typedef ZSTD_ErrorCode ERR_enum;
|
|
48
49
|
/*-****************************************
|
49
50
|
* Error codes handling
|
50
51
|
******************************************/
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#define ERROR(name) ((size_t)-PREFIX(name))
|
52
|
+
#undef ERROR /* already defined on Visual Studio */
|
53
|
+
#define ERROR(name) ZSTD_ERROR(name)
|
54
|
+
#define ZSTD_ERROR(name) ((size_t)-PREFIX(name))
|
55
55
|
|
56
56
|
ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
|
57
57
|
|
58
58
|
ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); }
|
59
59
|
|
60
|
+
/* check and forward error code */
|
61
|
+
#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e
|
62
|
+
#define CHECK_F(f) { CHECK_V_F(_var_err__, f); }
|
63
|
+
|
60
64
|
|
61
65
|
/*-****************************************
|
62
66
|
* Error Strings
|
@@ -1,48 +1,56 @@
|
|
1
1
|
/* ******************************************************************
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
notice, this list of conditions and the following disclaimer.
|
14
|
-
* Redistributions in binary form must reproduce the above
|
15
|
-
copyright notice, this list of conditions and the following disclaimer
|
16
|
-
in the documentation and/or other materials provided with the
|
17
|
-
distribution.
|
18
|
-
|
19
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
20
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
21
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
22
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
23
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
27
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
-
|
31
|
-
You can contact the author at :
|
32
|
-
- Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
2
|
+
* FSE : Finite State Entropy codec
|
3
|
+
* Public Prototypes declaration
|
4
|
+
* Copyright (c) 2013-2020, Yann Collet, Facebook, Inc.
|
5
|
+
*
|
6
|
+
* You can contact the author at :
|
7
|
+
* - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
8
|
+
*
|
9
|
+
* This source code is licensed under both the BSD-style license (found in the
|
10
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
11
|
+
* in the COPYING file in the root directory of this source tree).
|
12
|
+
* You may select, at your option, one of the above-listed licenses.
|
33
13
|
****************************************************************** */
|
34
|
-
#ifndef FSE_H
|
35
|
-
#define FSE_H
|
36
14
|
|
37
15
|
#if defined (__cplusplus)
|
38
16
|
extern "C" {
|
39
17
|
#endif
|
40
18
|
|
19
|
+
#ifndef FSE_H
|
20
|
+
#define FSE_H
|
21
|
+
|
41
22
|
|
42
23
|
/*-*****************************************
|
43
24
|
* Dependencies
|
44
25
|
******************************************/
|
45
|
-
#include
|
26
|
+
#include "zstd_deps.h" /* size_t, ptrdiff_t */
|
27
|
+
|
28
|
+
|
29
|
+
/*-*****************************************
|
30
|
+
* FSE_PUBLIC_API : control library symbols visibility
|
31
|
+
******************************************/
|
32
|
+
#if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4)
|
33
|
+
# define FSE_PUBLIC_API __attribute__ ((visibility ("default")))
|
34
|
+
#elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) /* Visual expected */
|
35
|
+
# define FSE_PUBLIC_API __declspec(dllexport)
|
36
|
+
#elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1)
|
37
|
+
# define FSE_PUBLIC_API __declspec(dllimport) /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/
|
38
|
+
#else
|
39
|
+
# define FSE_PUBLIC_API
|
40
|
+
#endif
|
41
|
+
|
42
|
+
/*------ Version ------*/
|
43
|
+
#define FSE_VERSION_MAJOR 0
|
44
|
+
#define FSE_VERSION_MINOR 9
|
45
|
+
#define FSE_VERSION_RELEASE 0
|
46
|
+
|
47
|
+
#define FSE_LIB_VERSION FSE_VERSION_MAJOR.FSE_VERSION_MINOR.FSE_VERSION_RELEASE
|
48
|
+
#define FSE_QUOTE(str) #str
|
49
|
+
#define FSE_EXPAND_AND_QUOTE(str) FSE_QUOTE(str)
|
50
|
+
#define FSE_VERSION_STRING FSE_EXPAND_AND_QUOTE(FSE_LIB_VERSION)
|
51
|
+
|
52
|
+
#define FSE_VERSION_NUMBER (FSE_VERSION_MAJOR *100*100 + FSE_VERSION_MINOR *100 + FSE_VERSION_RELEASE)
|
53
|
+
FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */
|
46
54
|
|
47
55
|
|
48
56
|
/*-****************************************
|
@@ -56,8 +64,8 @@ extern "C" {
|
|
56
64
|
if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression instead.
|
57
65
|
if FSE_isError(return), compression failed (more details using FSE_getErrorName())
|
58
66
|
*/
|
59
|
-
size_t FSE_compress(void* dst, size_t dstCapacity,
|
60
|
-
|
67
|
+
FSE_PUBLIC_API size_t FSE_compress(void* dst, size_t dstCapacity,
|
68
|
+
const void* src, size_t srcSize);
|
61
69
|
|
62
70
|
/*! FSE_decompress():
|
63
71
|
Decompress FSE data from buffer 'cSrc', of size 'cSrcSize',
|
@@ -69,18 +77,18 @@ size_t FSE_compress(void* dst, size_t dstCapacity,
|
|
69
77
|
Why ? : making this distinction requires a header.
|
70
78
|
Header management is intentionally delegated to the user layer, which can better manage special cases.
|
71
79
|
*/
|
72
|
-
size_t FSE_decompress(void* dst, size_t dstCapacity,
|
73
|
-
|
80
|
+
FSE_PUBLIC_API size_t FSE_decompress(void* dst, size_t dstCapacity,
|
81
|
+
const void* cSrc, size_t cSrcSize);
|
74
82
|
|
75
83
|
|
76
84
|
/*-*****************************************
|
77
85
|
* Tool functions
|
78
86
|
******************************************/
|
79
|
-
size_t FSE_compressBound(size_t size); /* maximum compressed size */
|
87
|
+
FSE_PUBLIC_API size_t FSE_compressBound(size_t size); /* maximum compressed size */
|
80
88
|
|
81
89
|
/* Error Management */
|
82
|
-
unsigned FSE_isError(size_t code); /* tells if a return value is an error code */
|
83
|
-
const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */
|
90
|
+
FSE_PUBLIC_API unsigned FSE_isError(size_t code); /* tells if a return value is an error code */
|
91
|
+
FSE_PUBLIC_API const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */
|
84
92
|
|
85
93
|
|
86
94
|
/*-*****************************************
|
@@ -94,7 +102,7 @@ const char* FSE_getErrorName(size_t code); /* provides error code string (usef
|
|
94
102
|
if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression.
|
95
103
|
if FSE_isError(return), it's an error code.
|
96
104
|
*/
|
97
|
-
size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
|
105
|
+
FSE_PUBLIC_API size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
|
98
106
|
|
99
107
|
|
100
108
|
/*-*****************************************
|
@@ -102,7 +110,7 @@ size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize
|
|
102
110
|
******************************************/
|
103
111
|
/*!
|
104
112
|
FSE_compress() does the following:
|
105
|
-
1. count symbol occurrence from source[] into table count[]
|
113
|
+
1. count symbol occurrence from source[] into table count[] (see hist.h)
|
106
114
|
2. normalize counters so that sum(count[]) == Power_of_2 (2^tableLog)
|
107
115
|
3. save normalized counters to memory buffer using writeNCount()
|
108
116
|
4. build encoding table 'CTable' from normalized counters
|
@@ -120,57 +128,56 @@ or to save and provide normalized distribution using external method.
|
|
120
128
|
|
121
129
|
/* *** COMPRESSION *** */
|
122
130
|
|
123
|
-
/*! FSE_count():
|
124
|
-
Provides the precise count of each byte within a table 'count'.
|
125
|
-
'count' is a table of unsigned int, of minimum size (*maxSymbolValuePtr+1).
|
126
|
-
*maxSymbolValuePtr will be updated if detected smaller than initial value.
|
127
|
-
@return : the count of the most frequent symbol (which is not identified).
|
128
|
-
if return == srcSize, there is only one symbol.
|
129
|
-
Can also return an error code, which can be tested with FSE_isError(). */
|
130
|
-
size_t FSE_count(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
|
131
|
-
|
132
131
|
/*! FSE_optimalTableLog():
|
133
132
|
dynamically downsize 'tableLog' when conditions are met.
|
134
133
|
It saves CPU time, by using smaller tables, while preserving or even improving compression ratio.
|
135
134
|
@return : recommended tableLog (necessarily <= 'maxTableLog') */
|
136
|
-
unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue);
|
135
|
+
FSE_PUBLIC_API unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue);
|
137
136
|
|
138
137
|
/*! FSE_normalizeCount():
|
139
138
|
normalize counts so that sum(count[]) == Power_of_2 (2^tableLog)
|
140
139
|
'normalizedCounter' is a table of short, of minimum size (maxSymbolValue+1).
|
140
|
+
useLowProbCount is a boolean parameter which trades off compressed size for
|
141
|
+
faster header decoding. When it is set to 1, the compressed data will be slightly
|
142
|
+
smaller. And when it is set to 0, FSE_readNCount() and FSE_buildDTable() will be
|
143
|
+
faster. If you are compressing a small amount of data (< 2 KB) then useLowProbCount=0
|
144
|
+
is a good default, since header deserialization makes a big speed difference.
|
145
|
+
Otherwise, useLowProbCount=1 is a good default, since the speed difference is small.
|
141
146
|
@return : tableLog,
|
142
147
|
or an errorCode, which can be tested using FSE_isError() */
|
143
|
-
size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog,
|
148
|
+
FSE_PUBLIC_API size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog,
|
149
|
+
const unsigned* count, size_t srcSize, unsigned maxSymbolValue, unsigned useLowProbCount);
|
144
150
|
|
145
151
|
/*! FSE_NCountWriteBound():
|
146
152
|
Provides the maximum possible size of an FSE normalized table, given 'maxSymbolValue' and 'tableLog'.
|
147
153
|
Typically useful for allocation purpose. */
|
148
|
-
size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog);
|
154
|
+
FSE_PUBLIC_API size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog);
|
149
155
|
|
150
156
|
/*! FSE_writeNCount():
|
151
157
|
Compactly save 'normalizedCounter' into 'buffer'.
|
152
158
|
@return : size of the compressed table,
|
153
159
|
or an errorCode, which can be tested using FSE_isError(). */
|
154
|
-
size_t FSE_writeNCount (void* buffer, size_t bufferSize,
|
155
|
-
|
160
|
+
FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize,
|
161
|
+
const short* normalizedCounter,
|
162
|
+
unsigned maxSymbolValue, unsigned tableLog);
|
156
163
|
|
157
164
|
/*! Constructor and Destructor of FSE_CTable.
|
158
165
|
Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */
|
159
166
|
typedef unsigned FSE_CTable; /* don't allocate that. It's only meant to be more restrictive than void* */
|
160
|
-
FSE_CTable* FSE_createCTable (unsigned
|
161
|
-
void FSE_freeCTable (FSE_CTable* ct);
|
167
|
+
FSE_PUBLIC_API FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog);
|
168
|
+
FSE_PUBLIC_API void FSE_freeCTable (FSE_CTable* ct);
|
162
169
|
|
163
170
|
/*! FSE_buildCTable():
|
164
171
|
Builds `ct`, which must be already allocated, using FSE_createCTable().
|
165
172
|
@return : 0, or an errorCode, which can be tested using FSE_isError() */
|
166
|
-
size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
173
|
+
FSE_PUBLIC_API size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
167
174
|
|
168
175
|
/*! FSE_compress_usingCTable():
|
169
176
|
Compress `src` using `ct` into `dst` which must be already allocated.
|
170
177
|
@return : size of compressed data (<= `dstCapacity`),
|
171
178
|
or 0 if compressed data could not fit into `dst`,
|
172
179
|
or an errorCode, which can be tested using FSE_isError() */
|
173
|
-
size_t FSE_compress_usingCTable (void* dst, size_t dstCapacity, const void* src, size_t srcSize, const FSE_CTable* ct);
|
180
|
+
FSE_PUBLIC_API size_t FSE_compress_usingCTable (void* dst, size_t dstCapacity, const void* src, size_t srcSize, const FSE_CTable* ct);
|
174
181
|
|
175
182
|
/*!
|
176
183
|
Tutorial :
|
@@ -223,25 +230,34 @@ If there is an error, the function will return an ErrorCode (which can be tested
|
|
223
230
|
@return : size read from 'rBuffer',
|
224
231
|
or an errorCode, which can be tested using FSE_isError().
|
225
232
|
maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */
|
226
|
-
size_t FSE_readNCount (short* normalizedCounter,
|
233
|
+
FSE_PUBLIC_API size_t FSE_readNCount (short* normalizedCounter,
|
234
|
+
unsigned* maxSymbolValuePtr, unsigned* tableLogPtr,
|
235
|
+
const void* rBuffer, size_t rBuffSize);
|
236
|
+
|
237
|
+
/*! FSE_readNCount_bmi2():
|
238
|
+
* Same as FSE_readNCount() but pass bmi2=1 when your CPU supports BMI2 and 0 otherwise.
|
239
|
+
*/
|
240
|
+
FSE_PUBLIC_API size_t FSE_readNCount_bmi2(short* normalizedCounter,
|
241
|
+
unsigned* maxSymbolValuePtr, unsigned* tableLogPtr,
|
242
|
+
const void* rBuffer, size_t rBuffSize, int bmi2);
|
227
243
|
|
228
244
|
/*! Constructor and Destructor of FSE_DTable.
|
229
245
|
Note that its size depends on 'tableLog' */
|
230
246
|
typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
|
231
|
-
FSE_DTable* FSE_createDTable(unsigned tableLog);
|
232
|
-
void FSE_freeDTable(FSE_DTable* dt);
|
247
|
+
FSE_PUBLIC_API FSE_DTable* FSE_createDTable(unsigned tableLog);
|
248
|
+
FSE_PUBLIC_API void FSE_freeDTable(FSE_DTable* dt);
|
233
249
|
|
234
250
|
/*! FSE_buildDTable():
|
235
251
|
Builds 'dt', which must be already allocated, using FSE_createDTable().
|
236
252
|
return : 0, or an errorCode, which can be tested using FSE_isError() */
|
237
|
-
size_t FSE_buildDTable (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
253
|
+
FSE_PUBLIC_API size_t FSE_buildDTable (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
238
254
|
|
239
255
|
/*! FSE_decompress_usingDTable():
|
240
256
|
Decompress compressed source `cSrc` of size `cSrcSize` using `dt`
|
241
257
|
into `dst` which must be already allocated.
|
242
258
|
@return : size of regenerated data (necessarily <= `dstCapacity`),
|
243
259
|
or an errorCode, which can be tested using FSE_isError() */
|
244
|
-
size_t FSE_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSE_DTable* dt);
|
260
|
+
FSE_PUBLIC_API size_t FSE_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSE_DTable* dt);
|
245
261
|
|
246
262
|
/*!
|
247
263
|
Tutorial :
|
@@ -271,8 +287,10 @@ FSE_decompress_usingDTable() result will tell how many bytes were regenerated (<
|
|
271
287
|
If there is an error, the function will return an error code, which can be tested using FSE_isError(). (ex: dst buffer too small)
|
272
288
|
*/
|
273
289
|
|
290
|
+
#endif /* FSE_H */
|
274
291
|
|
275
|
-
#
|
292
|
+
#if defined(FSE_STATIC_LINKING_ONLY) && !defined(FSE_H_FSE_STATIC_LINKING_ONLY)
|
293
|
+
#define FSE_H_FSE_STATIC_LINKING_ONLY
|
276
294
|
|
277
295
|
/* *** Dependency *** */
|
278
296
|
#include "bitstream.h"
|
@@ -283,48 +301,78 @@ If there is an error, the function will return an error code, which can be teste
|
|
283
301
|
*******************************************/
|
284
302
|
/* FSE buffer bounds */
|
285
303
|
#define FSE_NCOUNTBOUND 512
|
286
|
-
#define FSE_BLOCKBOUND(size) (size + (size>>7))
|
304
|
+
#define FSE_BLOCKBOUND(size) ((size) + ((size)>>7) + 4 /* fse states */ + sizeof(size_t) /* bitContainer */)
|
287
305
|
#define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
|
288
306
|
|
289
|
-
/* It is possible to statically allocate FSE CTable/DTable as a table of
|
290
|
-
#define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<(maxTableLog-1)) + ((maxSymbolValue+1)*2))
|
291
|
-
#define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<maxTableLog))
|
307
|
+
/* It is possible to statically allocate FSE CTable/DTable as a table of FSE_CTable/FSE_DTable using below macros */
|
308
|
+
#define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<((maxTableLog)-1)) + (((maxSymbolValue)+1)*2))
|
309
|
+
#define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<(maxTableLog)))
|
310
|
+
|
311
|
+
/* or use the size to malloc() space directly. Pay attention to alignment restrictions though */
|
312
|
+
#define FSE_CTABLE_SIZE(maxTableLog, maxSymbolValue) (FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(FSE_CTable))
|
313
|
+
#define FSE_DTABLE_SIZE(maxTableLog) (FSE_DTABLE_SIZE_U32(maxTableLog) * sizeof(FSE_DTable))
|
292
314
|
|
293
315
|
|
294
316
|
/* *****************************************
|
295
|
-
* FSE advanced API
|
296
|
-
|
297
|
-
size_t FSE_countFast(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
|
298
|
-
/**< same as FSE_count(), but blindly trusts that all byte values within src are <= *maxSymbolValuePtr */
|
317
|
+
* FSE advanced API
|
318
|
+
***************************************** */
|
299
319
|
|
300
320
|
unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus);
|
301
321
|
/**< same as FSE_optimalTableLog(), which used `minus==2` */
|
302
322
|
|
323
|
+
/* FSE_compress_wksp() :
|
324
|
+
* Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`).
|
325
|
+
* FSE_COMPRESS_WKSP_SIZE_U32() provides the minimum size required for `workSpace` as a table of FSE_CTable.
|
326
|
+
*/
|
327
|
+
#define FSE_COMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + ((maxTableLog > 12) ? (1 << (maxTableLog - 2)) : 1024) )
|
328
|
+
size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
329
|
+
|
303
330
|
size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits);
|
304
|
-
/**< build a fake FSE_CTable, designed
|
331
|
+
/**< build a fake FSE_CTable, designed for a flat distribution, where each symbol uses nbBits */
|
305
332
|
|
306
333
|
size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue);
|
307
334
|
/**< build a fake FSE_CTable, designed to compress always the same symbolValue */
|
308
335
|
|
336
|
+
/* FSE_buildCTable_wksp() :
|
337
|
+
* Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
|
338
|
+
* `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog)`.
|
339
|
+
*/
|
340
|
+
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * (maxSymbolValue + 2) + (1ull << tableLog))
|
341
|
+
size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
342
|
+
|
343
|
+
#define FSE_BUILD_DTABLE_WKSP_SIZE(maxTableLog, maxSymbolValue) (sizeof(short) * (maxSymbolValue + 1) + (1ULL << maxTableLog) + 8)
|
344
|
+
#define FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ((FSE_BUILD_DTABLE_WKSP_SIZE(maxTableLog, maxSymbolValue) + sizeof(unsigned) - 1) / sizeof(unsigned))
|
345
|
+
FSE_PUBLIC_API size_t FSE_buildDTable_wksp(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
346
|
+
/**< Same as FSE_buildDTable(), using an externally allocated `workspace` produced with `FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxSymbolValue)` */
|
347
|
+
|
309
348
|
size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits);
|
310
|
-
/**< build a fake FSE_DTable, designed to read
|
349
|
+
/**< build a fake FSE_DTable, designed to read a flat distribution where each symbol uses nbBits */
|
311
350
|
|
312
351
|
size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue);
|
313
352
|
/**< build a fake FSE_DTable, designed to always generate the same symbolValue */
|
314
353
|
|
354
|
+
#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue))
|
355
|
+
#define FSE_DECOMPRESS_WKSP_SIZE(maxTableLog, maxSymbolValue) (FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(unsigned))
|
356
|
+
size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize);
|
357
|
+
/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DECOMPRESS_WKSP_SIZE_U32(maxLog, maxSymbolValue)` */
|
358
|
+
|
359
|
+
size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize, int bmi2);
|
360
|
+
/**< Same as FSE_decompress_wksp() but with dynamic BMI2 support. Pass 1 if your CPU supports BMI2 or 0 if it doesn't. */
|
361
|
+
|
362
|
+
typedef enum {
|
363
|
+
FSE_repeat_none, /**< Cannot use the previous table */
|
364
|
+
FSE_repeat_check, /**< Can use the previous table but it must be checked */
|
365
|
+
FSE_repeat_valid /**< Can use the previous table and it is assumed to be valid */
|
366
|
+
} FSE_repeat;
|
315
367
|
|
316
368
|
/* *****************************************
|
317
369
|
* FSE symbol compression API
|
318
370
|
*******************************************/
|
319
371
|
/*!
|
320
372
|
This API consists of small unitary functions, which highly benefit from being inlined.
|
321
|
-
|
322
|
-
Visual seems to do it automatically.
|
323
|
-
For gcc or clang, you'll need to add -flto flag at compilation and linking stages.
|
324
|
-
If none of these solutions is applicable, include "fse.c" directly.
|
373
|
+
Hence their body are included in next section.
|
325
374
|
*/
|
326
|
-
typedef struct
|
327
|
-
{
|
375
|
+
typedef struct {
|
328
376
|
ptrdiff_t value;
|
329
377
|
const void* stateTable;
|
330
378
|
const void* symbolTT;
|
@@ -384,8 +432,7 @@ If there is an error, it returns an errorCode (which can be tested using FSE_isE
|
|
384
432
|
/* *****************************************
|
385
433
|
* FSE symbol decompression API
|
386
434
|
*******************************************/
|
387
|
-
typedef struct
|
388
|
-
{
|
435
|
+
typedef struct {
|
389
436
|
size_t state;
|
390
437
|
const void* table; /* precise table may vary, depending on U16 */
|
391
438
|
} FSE_DState_t;
|
@@ -469,7 +516,7 @@ MEM_STATIC void FSE_initCState(FSE_CState_t* statePtr, const FSE_CTable* ct)
|
|
469
516
|
const U32 tableLog = MEM_read16(ptr);
|
470
517
|
statePtr->value = (ptrdiff_t)1<<tableLog;
|
471
518
|
statePtr->stateTable = u16ptr+2;
|
472
|
-
statePtr->symbolTT =
|
519
|
+
statePtr->symbolTT = ct + 1 + (tableLog ? (1<<(tableLog-1)) : 1);
|
473
520
|
statePtr->stateLog = tableLog;
|
474
521
|
}
|
475
522
|
|
@@ -488,11 +535,11 @@ MEM_STATIC void FSE_initCState2(FSE_CState_t* statePtr, const FSE_CTable* ct, U3
|
|
488
535
|
}
|
489
536
|
}
|
490
537
|
|
491
|
-
MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr,
|
538
|
+
MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, unsigned symbol)
|
492
539
|
{
|
493
|
-
const
|
540
|
+
FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];
|
494
541
|
const U16* const stateTable = (const U16*)(statePtr->stateTable);
|
495
|
-
U32 nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
|
542
|
+
U32 const nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
|
496
543
|
BIT_addBits(bitC, statePtr->value, nbBitsOut);
|
497
544
|
statePtr->value = stateTable[ (statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];
|
498
545
|
}
|
@@ -504,6 +551,39 @@ MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePt
|
|
504
551
|
}
|
505
552
|
|
506
553
|
|
554
|
+
/* FSE_getMaxNbBits() :
|
555
|
+
* Approximate maximum cost of a symbol, in bits.
|
556
|
+
* Fractional get rounded up (i.e : a symbol with a normalized frequency of 3 gives the same result as a frequency of 2)
|
557
|
+
* note 1 : assume symbolValue is valid (<= maxSymbolValue)
|
558
|
+
* note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
|
559
|
+
MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue)
|
560
|
+
{
|
561
|
+
const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr;
|
562
|
+
return (symbolTT[symbolValue].deltaNbBits + ((1<<16)-1)) >> 16;
|
563
|
+
}
|
564
|
+
|
565
|
+
/* FSE_bitCost() :
|
566
|
+
* Approximate symbol cost, as fractional value, using fixed-point format (accuracyLog fractional bits)
|
567
|
+
* note 1 : assume symbolValue is valid (<= maxSymbolValue)
|
568
|
+
* note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
|
569
|
+
MEM_STATIC U32 FSE_bitCost(const void* symbolTTPtr, U32 tableLog, U32 symbolValue, U32 accuracyLog)
|
570
|
+
{
|
571
|
+
const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr;
|
572
|
+
U32 const minNbBits = symbolTT[symbolValue].deltaNbBits >> 16;
|
573
|
+
U32 const threshold = (minNbBits+1) << 16;
|
574
|
+
assert(tableLog < 16);
|
575
|
+
assert(accuracyLog < 31-tableLog); /* ensure enough room for renormalization double shift */
|
576
|
+
{ U32 const tableSize = 1 << tableLog;
|
577
|
+
U32 const deltaFromThreshold = threshold - (symbolTT[symbolValue].deltaNbBits + tableSize);
|
578
|
+
U32 const normalizedDeltaFromThreshold = (deltaFromThreshold << accuracyLog) >> tableLog; /* linear interpolation (very approximate) */
|
579
|
+
U32 const bitMultiplier = 1 << accuracyLog;
|
580
|
+
assert(symbolTT[symbolValue].deltaNbBits + tableSize <= threshold);
|
581
|
+
assert(normalizedDeltaFromThreshold <= bitMultiplier);
|
582
|
+
return (minNbBits+1)*bitMultiplier - normalizedDeltaFromThreshold;
|
583
|
+
}
|
584
|
+
}
|
585
|
+
|
586
|
+
|
507
587
|
/* ====== Decompression ====== */
|
508
588
|
|
509
589
|
typedef struct {
|
@@ -588,6 +668,9 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
|
|
588
668
|
#ifndef FSE_DEFAULT_MEMORY_USAGE
|
589
669
|
# define FSE_DEFAULT_MEMORY_USAGE 13
|
590
670
|
#endif
|
671
|
+
#if (FSE_DEFAULT_MEMORY_USAGE > FSE_MAX_MEMORY_USAGE)
|
672
|
+
# error "FSE_DEFAULT_MEMORY_USAGE must be <= FSE_MAX_MEMORY_USAGE"
|
673
|
+
#endif
|
591
674
|
|
592
675
|
/*!FSE_MAX_SYMBOL_VALUE :
|
593
676
|
* Maximum symbol value authorized.
|
@@ -621,7 +704,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
|
|
621
704
|
# error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported"
|
622
705
|
#endif
|
623
706
|
|
624
|
-
#define FSE_TABLESTEP(tableSize) ((tableSize>>1) + (tableSize>>3) + 3)
|
707
|
+
#define FSE_TABLESTEP(tableSize) (((tableSize)>>1) + ((tableSize)>>3) + 3)
|
625
708
|
|
626
709
|
|
627
710
|
#endif /* FSE_STATIC_LINKING_ONLY */
|
@@ -630,5 +713,3 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
|
|
630
713
|
#if defined (__cplusplus)
|
631
714
|
}
|
632
715
|
#endif
|
633
|
-
|
634
|
-
#endif /* FSE_H */
|