VirtualBox

source: vbox/trunk/src/libs/liblzma-5.4.1/lzma/lzma_encoder_private.h@ 104197

Last change on this file since 104197 was 98730, checked in by vboxsync, 23 months ago

libs/liblzma-5.4.1: Export to OSE, bugref:10254

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.3 KB
Line 
1///////////////////////////////////////////////////////////////////////////////
2//
3/// \file lzma_encoder_private.h
4/// \brief Private definitions for LZMA encoder
5///
6// Authors: Igor Pavlov
7// Lasse Collin
8//
9// This file has been put into the public domain.
10// You can do whatever you want with this file.
11//
12///////////////////////////////////////////////////////////////////////////////
13
14#ifndef LZMA_LZMA_ENCODER_PRIVATE_H
15#define LZMA_LZMA_ENCODER_PRIVATE_H
16
17#include "lz_encoder.h"
18#include "range_encoder.h"
19#include "lzma_common.h"
20#include "lzma_encoder.h"
21
22
23// Macro to compare if the first two bytes in two buffers differ. This is
24// needed in lzma_lzma_optimum_*() to test if the match is at least
25// MATCH_LEN_MIN bytes. Unaligned access gives tiny gain so there's no
26// reason to not use it when it is supported.
27#ifdef TUKLIB_FAST_UNALIGNED_ACCESS
28# define not_equal_16(a, b) (read16ne(a) != read16ne(b))
29#else
30# define not_equal_16(a, b) \
31 ((a)[0] != (b)[0] || (a)[1] != (b)[1])
32#endif
33
34
35// Optimal - Number of entries in the optimum array.
36#define OPTS (1 << 12)
37
38
39typedef struct {
40 probability choice;
41 probability choice2;
42 probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS];
43 probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS];
44 probability high[LEN_HIGH_SYMBOLS];
45
46 uint32_t prices[POS_STATES_MAX][LEN_SYMBOLS];
47 uint32_t table_size;
48 uint32_t counters[POS_STATES_MAX];
49
50} lzma_length_encoder;
51
52
53typedef struct {
54 lzma_lzma_state state;
55
56 bool prev_1_is_literal;
57 bool prev_2;
58
59 uint32_t pos_prev_2;
60 uint32_t back_prev_2;
61
62 uint32_t price;
63 uint32_t pos_prev; // pos_next;
64 uint32_t back_prev;
65
66 uint32_t backs[REPS];
67
68} lzma_optimal;
69
70
71struct lzma_lzma1_encoder_s {
72 /// Range encoder
73 lzma_range_encoder rc;
74
75 /// Uncompressed size (doesn't include possible preset dictionary)
76 uint64_t uncomp_size;
77
78 /// If non-zero, produce at most this much output.
79 /// Some input may then be missing from the output.
80 uint64_t out_limit;
81
82 /// If the above out_limit is non-zero, *uncomp_size_ptr is set to
83 /// the amount of uncompressed data that we were able to fit
84 /// in the output buffer.
85 uint64_t *uncomp_size_ptr;
86
87 /// State
88 lzma_lzma_state state;
89
90 /// The four most recent match distances
91 uint32_t reps[REPS];
92
93 /// Array of match candidates
94 lzma_match matches[MATCH_LEN_MAX + 1];
95
96 /// Number of match candidates in matches[]
97 uint32_t matches_count;
98
99 /// Variable to hold the length of the longest match between calls
100 /// to lzma_lzma_optimum_*().
101 uint32_t longest_match_length;
102
103 /// True if using getoptimumfast
104 bool fast_mode;
105
106 /// True if the encoder has been initialized by encoding the first
107 /// byte as a literal.
108 bool is_initialized;
109
110 /// True if the range encoder has been flushed, but not all bytes
111 /// have been written to the output buffer yet.
112 bool is_flushed;
113
114 /// True if end of payload marker will be written.
115 bool use_eopm;
116
117 uint32_t pos_mask; ///< (1 << pos_bits) - 1
118 uint32_t literal_context_bits;
119 uint32_t literal_pos_mask;
120
121 // These are the same as in lzma_decoder.c. See comments there.
122 probability literal[LITERAL_CODERS_MAX][LITERAL_CODER_SIZE];
123 probability is_match[STATES][POS_STATES_MAX];
124 probability is_rep[STATES];
125 probability is_rep0[STATES];
126 probability is_rep1[STATES];
127 probability is_rep2[STATES];
128 probability is_rep0_long[STATES][POS_STATES_MAX];
129 probability dist_slot[DIST_STATES][DIST_SLOTS];
130 probability dist_special[FULL_DISTANCES - DIST_MODEL_END];
131 probability dist_align[ALIGN_SIZE];
132
133 // These are the same as in lzma_decoder.c except that the encoders
134 // include also price tables.
135 lzma_length_encoder match_len_encoder;
136 lzma_length_encoder rep_len_encoder;
137
138 // Price tables
139 uint32_t dist_slot_prices[DIST_STATES][DIST_SLOTS];
140 uint32_t dist_prices[DIST_STATES][FULL_DISTANCES];
141 uint32_t dist_table_size;
142 uint32_t match_price_count;
143
144 uint32_t align_prices[ALIGN_SIZE];
145 uint32_t align_price_count;
146
147 // Optimal
148 uint32_t opts_end_index;
149 uint32_t opts_current_index;
150 lzma_optimal opts[OPTS];
151};
152
153
154extern void lzma_lzma_optimum_fast(
155 lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
156 uint32_t *restrict back_res, uint32_t *restrict len_res);
157
158extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
159 lzma_mf *restrict mf, uint32_t *restrict back_res,
160 uint32_t *restrict len_res, uint32_t position);
161
162#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette