mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
6.5 KiB
235 lines
6.5 KiB
/*
|
|
* encdefs.h
|
|
*
|
|
* Encoder #define's and structure definitions.
|
|
*/
|
|
|
|
/*
|
|
* NOTES:
|
|
*
|
|
* To maximise compression one can set both BREAK_LENGTH
|
|
* and FAST_DECISION_THRESHOLD to 250, define
|
|
* INSERT_NEAR_LONG_MATCHES, and crank up EXTRA_SIZE to
|
|
* a larger value (don't get too large, otherwise we
|
|
* might overflow our ushort cumbits[]), but the improvement
|
|
* is really marginal; e.g. 3600 bytes on winword.exe
|
|
* (3.9 MB compressed). It really hurts performance too.
|
|
*/
|
|
|
|
|
|
/*
|
|
* See optenc.c
|
|
*
|
|
* EXTRA_SIZE is the amount of extra data we allocate in addition
|
|
* to the window, and LOOK is the amount of data the optimal
|
|
* parser will look ahead. LOOK is dependent on EXTRA_SIZE.
|
|
*
|
|
* Changing EXTRA_SIZE to 8K doesn't really do anything for
|
|
* compression. 4K is a fairly optimal value.
|
|
*
|
|
*/
|
|
#define EXTRA_SIZE 16384
|
|
#define LOOK (EXTRA_SIZE-MAX_MATCH-2)
|
|
|
|
|
|
/*
|
|
* Number of search trees used (for storing root nodes)
|
|
*/
|
|
#define NUM_SEARCH_TREES 65536
|
|
|
|
|
|
/*
|
|
* Chunk size required by FCI
|
|
*/
|
|
#define CHUNK_SIZE 32768
|
|
|
|
|
|
/*
|
|
* The maximum amount of data we will allow in our output buffer before
|
|
* calling lzx_output_callback() to get rid of it. Since we do this
|
|
* for every 32K of input data, the output buffer only has to be able
|
|
* to contain 32K + some spillover, which won't be much, because we
|
|
* output uncompressed blocks if we determine a block is going to be
|
|
* too large.
|
|
*/
|
|
#define OUTPUT_BUFFER_SIZE (CHUNK_SIZE+MAX_GROWTH)
|
|
|
|
|
|
/*
|
|
* Maximum allowable number of block splits per 32K of uncompressed
|
|
* data; if increased, then MAX_GROWTH will have to be increased also.
|
|
*/
|
|
#define MAX_BLOCK_SPLITS 4
|
|
|
|
|
|
/*
|
|
* Max growth is calculated as follows:
|
|
*
|
|
* TREE AND BLOCK INFO
|
|
* ===================
|
|
*
|
|
* The very first time the encoder is run, it outputs a 32 bit
|
|
* file translation size.
|
|
*
|
|
* 3 bits to output block type
|
|
* 24 bits for block size in uncompressed bytes.
|
|
*
|
|
* Max size of a tree of n elements is 20*4 + 5*n bits
|
|
*
|
|
* There is a main tree of max 700 elements which is really encoded
|
|
* as two separate trees of 256 and 444(max). There is also a
|
|
* secondary length tree of 249 elements.
|
|
*
|
|
* That is 1360 bits, plus 2300 bits, plus 1325 bits.
|
|
*
|
|
* There may also be an aligned offset tree, which is 24 bits.
|
|
*
|
|
* Flushing output bit buffer; max 16 bits.
|
|
*
|
|
* Grand total: 5084 bits/block.
|
|
*
|
|
*
|
|
* PARSER INFO
|
|
* ===========
|
|
*
|
|
* Parser worst case scenario is with 2 MB buffer (50 position slots),
|
|
* all matches of length 2, distributed over slots 32 and 33 (since
|
|
* matches of length 2 further away than 128K are prohibited). These
|
|
* slots have 15 verbatim bits. Maximum size per code is then
|
|
* 2 bits to say which slot (taking into account that there will be
|
|
* at least another code in the tree) plus 15 verbatim bits, for a
|
|
* total of 17 bits. Max growth on 32K of input data is therefore
|
|
* 1/16 * 32K, or 2K bytes.
|
|
*
|
|
* Alternatively, if there is only one match and everything else
|
|
* is a character, then 255 characters will be length 8, and one
|
|
* character and the match will be length 9. Assume the true
|
|
* frequency of the demoted character is almost a 1 in 2^7
|
|
* probability (it got remoted from a 2^8, but it was fairly
|
|
* close to being 2^7). If there are 32768/256, or 128, occurrences
|
|
* of each character, but, say, almost 256 for the demoted character,
|
|
* then the demoted character will expand the data by less than
|
|
* 1 bit * 256, or 256 bits. The match will take a little to
|
|
* output, but max growth for "all characters" is about 256 bits.
|
|
*
|
|
*
|
|
* END RESULT
|
|
* ==========
|
|
*
|
|
* The maximum number of blocks which can be output is limited to
|
|
* 4 per 32K of uncompressed data.
|
|
*
|
|
* Therefore, max growth is 4*5084 bits, plus 2K bytes, or 4590
|
|
* bytes.
|
|
*/
|
|
#define MAX_GROWTH 6144
|
|
|
|
/*
|
|
* Don't allow match length 2's which are further away than this
|
|
* (see above)
|
|
*/
|
|
#define MAX_LENGTH_TWO_OFFSET (128*1024)
|
|
|
|
|
|
/*
|
|
* When we find a match which is at least this long, prematurely
|
|
* exit the binary search.
|
|
*
|
|
* This avoids us inserting huge match lengths of 257 zeroes, for
|
|
* example. Compression will improve very *very* marginally by
|
|
* increasing this figure, but it will seriously impact
|
|
* performance.
|
|
*
|
|
* Don't make this number >= (MAX_MATCH-2); see bsearch.c.
|
|
*/
|
|
#define BREAK_LENGTH 100
|
|
|
|
|
|
/*
|
|
* If this option is defined, the parser will insert all bytes of
|
|
* matches with lengths >= 16 with a distance of 1; this is a bad
|
|
* idea, since matches like that are generally zeroes, which we
|
|
* want to avoid inserting into the search tree.
|
|
*/
|
|
|
|
//#define INSERT_NEAR_LONG_MATCHES
|
|
|
|
|
|
/*
|
|
* If the optimal parser finds a match which is this long or
|
|
* longer, it will take it automatically. The compression
|
|
* penalty is basically zero, and it helps performance.
|
|
*/
|
|
#define FAST_DECISION_THRESHOLD 100
|
|
|
|
|
|
/*
|
|
* Every TREE_CREATE_INTERVAL items, recreate the trees from
|
|
* the literals we've encountered so far, to update our cost
|
|
* estimations.
|
|
*
|
|
* 4K seems pretty optimal.
|
|
*/
|
|
#define TREE_CREATE_INTERVAL 4096
|
|
|
|
|
|
/*
|
|
* When we're forced to break in our parsing (we exceed
|
|
* our span), don't output a match length 2 if it is
|
|
* further away than this.
|
|
*
|
|
* Could make this a variable rather than a constant
|
|
*
|
|
* On a bad binary file, two chars = 18 bits
|
|
* On a good text file, two chars = 12 bits
|
|
*
|
|
* But match length two's are very uncommon on text files.
|
|
*/
|
|
#define BREAK_MAX_LENGTH_TWO_OFFSET 2048
|
|
|
|
|
|
/*
|
|
* When MatchPos >= MPSLOT3_CUTOFF, extra_bits[MP_SLOT(MatchPos)] >= 3
|
|
*
|
|
* matchpos: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
|
|
* extrabits: 0,0,0,0,1,1,1,1,2,2, 2, 2, 2, 2, 2, 2, 3, ...
|
|
*
|
|
* Used for aligned offset blocks and statistics.
|
|
*/
|
|
#define MPSLOT3_CUTOFF 16
|
|
|
|
|
|
/*
|
|
* Number of elements in the main tree
|
|
*/
|
|
#define MAIN_TREE_ELEMENTS (NUM_CHARS+(((long) context->enc_num_position_slots) << NL_SHIFT))
|
|
|
|
|
|
/*
|
|
* Max number of literals to hold.
|
|
*
|
|
* Memory required is MAX_LITERAL_ITEMS for enc_LitData[] array,
|
|
* plus MAX_LITERAL_ITEMS/8 for enc_ItemType[] array.
|
|
*
|
|
* Must not exceed 64K, since that will cause our ushort
|
|
* frequencies to overflow.
|
|
*/
|
|
#define MAX_LITERAL_ITEMS 65536
|
|
|
|
|
|
/*
|
|
* Max number of distances to hold
|
|
*
|
|
* Memory required is MAX_DIST_ITEMS*4 for enc_DistData[] array
|
|
*
|
|
* MAX_DIST_ITEMS should never be greater than MAX_LITERAL_ITEMS,
|
|
* since that just wastes space.
|
|
*
|
|
* However, it's extremely unlikely that one will get 65536 match
|
|
* length 2's! In any case, the literal and distance buffers
|
|
* are checked independently, and a block is output if either
|
|
* overflows.
|
|
*
|
|
* Bitmaps are highly redundant, though; lots of matches.
|
|
*/
|
|
#define MAX_DIST_ITEMS 32768
|