1 /* ******************************************************************
2 FSE : Finite State Entropy decoder
3 Copyright (C) 2013-2015, Yann Collet.
5 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are
11 * Redistributions of source code must retain the above copyright
12 notice, this list of conditions and the following disclaimer.
13 * Redistributions in binary form must reproduce the above
14 copyright notice, this list of conditions and the following disclaimer
15 in the documentation and/or other materials provided with the
18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 You can contact the author at :
31 - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
32 - Public forum : https://groups.google.com/forum/#!forum/lz4c
33 ****************************************************************** */
36 /* **************************************************************
38 ****************************************************************/
39 #include <stdlib.h> /* malloc, free, qsort */
40 #include <string.h> /* memcpy, memset */
41 #include "bitstream.h"
43 #define FSE_STATIC_LINKING_ONLY
45 #include "error_private.h"
48 /* **************************************************************
50 ****************************************************************/
51 #define FSE_isError ERR_isError
52 #define FSE_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c) /* use only *after* variable declarations */
54 /* check and forward error code */
56 #define CHECK_F(f) { size_t const e = f; if (FSE_isError(e)) return e; }
60 /* **************************************************************
62 ****************************************************************/
64 designed to be included
65 for type-specific functions (template emulation in C)
66 Objective is to write these functions only once, for improved maintenance
70 #ifndef FSE_FUNCTION_EXTENSION
71 # error "FSE_FUNCTION_EXTENSION must be defined"
73 #ifndef FSE_FUNCTION_TYPE
74 # error "FSE_FUNCTION_TYPE must be defined"
78 #define FSE_CAT(X,Y) X##Y
79 #define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y)
80 #define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y)
83 /* Function templates */
84 FSE_DTable* FSE_createDTable (unsigned tableLog)
86 if (tableLog > FSE_TABLELOG_ABSOLUTE_MAX) tableLog = FSE_TABLELOG_ABSOLUTE_MAX;
87 return (FSE_DTable*)malloc( FSE_DTABLE_SIZE_U32(tableLog) * sizeof (U32) );
90 void FSE_freeDTable (FSE_DTable* dt)
95 size_t FSE_buildDTable(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
97 void* const tdPtr = dt+1; /* because *dt is unsigned, 32-bits aligned on 32-bits */
98 FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*) (tdPtr);
99 U16 symbolNext[FSE_MAX_SYMBOL_VALUE+1];
101 U32 const maxSV1 = maxSymbolValue + 1;
102 U32 const tableSize = 1 << tableLog;
103 U32 highThreshold = tableSize-1;
106 if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return ERROR(maxSymbolValue_tooLarge);
107 if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
109 /* Init, lay down lowprob symbols */
110 { FSE_DTableHeader DTableH;
111 DTableH.tableLog = (U16)tableLog;
112 DTableH.fastMode = 1;
113 { S16 const largeLimit= (S16)(1 << (tableLog-1));
115 for (s=0; s<maxSV1; s++) {
116 if (normalizedCounter[s]==-1) {
117 tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
120 if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
121 symbolNext[s] = normalizedCounter[s];
123 memcpy(dt, &DTableH, sizeof(DTableH));
127 { U32 const tableMask = tableSize-1;
128 U32 const step = FSE_TABLESTEP(tableSize);
130 for (s=0; s<maxSV1; s++) {
132 for (i=0; i<normalizedCounter[s]; i++) {
133 tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
134 position = (position + step) & tableMask;
135 while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
137 if (position!=0) return ERROR(GENERIC); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
140 /* Build Decoding table */
142 for (u=0; u<tableSize; u++) {
143 FSE_FUNCTION_TYPE const symbol = (FSE_FUNCTION_TYPE)(tableDecode[u].symbol);
144 U32 const nextState = symbolNext[symbol]++;
145 tableDecode[u].nbBits = (BYTE) (tableLog - BIT_highbit32(nextState) );
146 tableDecode[u].newState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
153 #ifndef FSE_COMMONDEFS_ONLY
155 /*-*******************************************************
156 * Decompression (Byte symbols)
157 *********************************************************/
158 size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
161 FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
163 FSE_decode_t* const cell = (FSE_decode_t*)dPtr;
165 DTableH->tableLog = 0;
166 DTableH->fastMode = 0;
169 cell->symbol = symbolValue;
176 size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
179 FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
181 FSE_decode_t* const dinfo = (FSE_decode_t*)dPtr;
182 const unsigned tableSize = 1 << nbBits;
183 const unsigned tableMask = tableSize - 1;
184 const unsigned maxSV1 = tableMask+1;
188 if (nbBits < 1) return ERROR(GENERIC); /* min size */
190 /* Build Decoding Table */
191 DTableH->tableLog = (U16)nbBits;
192 DTableH->fastMode = 1;
193 for (s=0; s<maxSV1; s++) {
194 dinfo[s].newState = 0;
195 dinfo[s].symbol = (BYTE)s;
196 dinfo[s].nbBits = (BYTE)nbBits;
202 FORCE_INLINE_TEMPLATE size_t FSE_decompress_usingDTable_generic(
203 void* dst, size_t maxDstSize,
204 const void* cSrc, size_t cSrcSize,
205 const FSE_DTable* dt, const unsigned fast)
207 BYTE* const ostart = (BYTE*) dst;
209 BYTE* const omax = op + maxDstSize;
210 BYTE* const olimit = omax-3;
217 CHECK_F(BIT_initDStream(&bitD, cSrc, cSrcSize));
219 FSE_initDState(&state1, &bitD, dt);
220 FSE_initDState(&state2, &bitD, dt);
222 #define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
224 /* 4 symbols per loop */
225 for ( ; (BIT_reloadDStream(&bitD)==BIT_DStream_unfinished) & (op<olimit) ; op+=4) {
226 op[0] = FSE_GETSYMBOL(&state1);
228 if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
229 BIT_reloadDStream(&bitD);
231 op[1] = FSE_GETSYMBOL(&state2);
233 if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
234 { if (BIT_reloadDStream(&bitD) > BIT_DStream_unfinished) { op+=2; break; } }
236 op[2] = FSE_GETSYMBOL(&state1);
238 if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
239 BIT_reloadDStream(&bitD);
241 op[3] = FSE_GETSYMBOL(&state2);
245 /* note : BIT_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */
247 if (op>(omax-2)) return ERROR(dstSize_tooSmall);
248 *op++ = FSE_GETSYMBOL(&state1);
249 if (BIT_reloadDStream(&bitD)==BIT_DStream_overflow) {
250 *op++ = FSE_GETSYMBOL(&state2);
254 if (op>(omax-2)) return ERROR(dstSize_tooSmall);
255 *op++ = FSE_GETSYMBOL(&state2);
256 if (BIT_reloadDStream(&bitD)==BIT_DStream_overflow) {
257 *op++ = FSE_GETSYMBOL(&state1);
265 size_t FSE_decompress_usingDTable(void* dst, size_t originalSize,
266 const void* cSrc, size_t cSrcSize,
267 const FSE_DTable* dt)
269 const void* ptr = dt;
270 const FSE_DTableHeader* DTableH = (const FSE_DTableHeader*)ptr;
271 const U32 fastMode = DTableH->fastMode;
273 /* select fast mode (static) */
274 if (fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
275 return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
279 size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, FSE_DTable* workSpace, unsigned maxLog)
281 const BYTE* const istart = (const BYTE*)cSrc;
282 const BYTE* ip = istart;
283 short counting[FSE_MAX_SYMBOL_VALUE+1];
285 unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
287 /* normal FSE decoding mode */
288 size_t const NCountLength = FSE_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
289 if (FSE_isError(NCountLength)) return NCountLength;
290 //if (NCountLength >= cSrcSize) return ERROR(srcSize_wrong); /* too small input size; supposed to be already checked in NCountLength, only remaining case : NCountLength==cSrcSize */
291 if (tableLog > maxLog) return ERROR(tableLog_tooLarge);
293 cSrcSize -= NCountLength;
295 CHECK_F( FSE_buildDTable (workSpace, counting, maxSymbolValue, tableLog) );
297 return FSE_decompress_usingDTable (dst, dstCapacity, ip, cSrcSize, workSpace); /* always return, even if it is an error code */
301 typedef FSE_DTable DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
303 size_t FSE_decompress(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize)
305 DTable_max_t dt; /* Static analyzer seems unable to understand this table will be properly initialized later */
306 return FSE_decompress_wksp(dst, dstCapacity, cSrc, cSrcSize, dt, FSE_MAX_TABLELOG);
311 #endif /* FSE_COMMONDEFS_ONLY */