11 size_t num_bytes,
size_t position,
12 const uint8_t* ringbuffer,
size_t ringbuffer_mask,
14 Hasher* hasher,
int* dist_cache,
size_t* last_insert_len,
15 Command* commands,
size_t* num_commands,
size_t* num_literals) {
16 HASHER()* privat = &hasher->privat.FN(
_);
19 const size_t position_offset = params->stream_offset;
21 const Command*
const orig_commands = commands;
22 size_t insert_length = *last_insert_len;
23 const size_t pos_end = position + num_bytes;
24 const size_t store_end = num_bytes >=
FN(StoreLookahead)() ?
25 position + num_bytes -
FN(StoreLookahead)() + 1 : position;
28 const size_t random_heuristics_window_size =
29 LiteralSpreeLengthForSparseSearch(params);
30 size_t apply_random_heuristics = position + random_heuristics_window_size;
38 FN(PrepareDistanceCache)(privat, dist_cache);
40 while (position +
FN(HashTypeLength)() < pos_end) {
41 size_t max_length = pos_end - position;
42 size_t max_distance =
BROTLI_MIN(
size_t, position, max_backward_limit);
44 position + position_offset, max_backward_limit);
50 FN(FindLongestMatch)(privat, ¶ms->dictionary,
51 ringbuffer, ringbuffer_mask, dist_cache, position, max_length,
52 max_distance, dictionary_start + gap, params->dist.max_distance, &sr);
53 if (sr.
score > kMinScore) {
55 int delayed_backward_references_in_row = 0;
57 for (;; --max_length) {
58 const score_t cost_diff_lazy = 175;
64 sr2.
score = kMinScore;
65 max_distance =
BROTLI_MIN(
size_t, position + 1, max_backward_limit);
67 position + 1 + position_offset, max_backward_limit);
68 FN(FindLongestMatch)(privat,
70 ringbuffer, ringbuffer_mask, dist_cache, position + 1, max_length,
71 max_distance, dictionary_start + gap, params->dist.max_distance,
79 if (++delayed_backward_references_in_row < 4 &&
80 position +
FN(HashTypeLength)() < pos_end) {
86 apply_random_heuristics =
87 position + 2 * sr.
len + random_heuristics_window_size;
89 position + position_offset, max_backward_limit);
93 size_t distance_code = ComputeDistanceCode(
94 sr.
distance, dictionary_start + gap, dist_cache);
95 if ((sr.
distance <= (dictionary_start + gap)) && distance_code > 0) {
96 dist_cache[3] = dist_cache[2];
97 dist_cache[2] = dist_cache[1];
98 dist_cache[1] = dist_cache[0];
100 FN(PrepareDistanceCache)(privat, dist_cache);
102 InitCommand(commands++, ¶ms->dist, insert_length,
105 *num_literals += insert_length;
112 size_t range_start = position + 2;
113 size_t range_end =
BROTLI_MIN(
size_t, position + sr.
len, store_end);
116 range_start, position + sr.
len - (sr.
distance << 2)));
118 FN(StoreRange)(privat, ringbuffer, ringbuffer_mask, range_start,
129 if (position > apply_random_heuristics) {
132 apply_random_heuristics + 4 * random_heuristics_window_size) {
139 const size_t kMargin =
142 BROTLI_MIN(
size_t, position + 16, pos_end - kMargin);
143 for (; position < pos_jump; position += 4) {
144 FN(Store)(privat, ringbuffer, ringbuffer_mask, position);
148 const size_t kMargin =
151 BROTLI_MIN(
size_t, position + 8, pos_end - kMargin);
152 for (; position < pos_jump; position += 2) {
153 FN(Store)(privat, ringbuffer, ringbuffer_mask, position);
160 insert_length += pos_end - position;
161 *last_insert_len = insert_length;
162 *num_commands += (size_t)(commands - orig_commands);
#define BROTLI_MAX_BACKWARD_LIMIT(W)
Definition constants.h:103
const uint8_t * ContextLut
Definition context.h:105
#define EXPORT_FN(X)
Definition backward_references.c:52
#define FN(X)
Definition backward_references.c:51
#define HASHER()
Definition backward_references.c:56
#define BROTLI_SCORE_BASE
Definition hash.h:101
#define score_t
Definition hash.h:43
#define MIN_QUALITY_FOR_EXTENSIVE_REFERENCE_SEARCH
Definition quality.h:26
score_t score
Definition hash.h:54
size_t distance
Definition hash.h:53
size_t len
Definition hash.h:52
int len_code_delta
Definition hash.h:55
#define _(msgid)
Definition getopt.c:49