X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Flzms-compress.c;h=5f5e37412db828a0c1a96d667b9e854e4b5a0959;hp=3686db0a5af9814cf0bd1a5fea7ce0f8cc16c85d;hb=855b49ef85d274588a2848d9c69974f9b88d343a;hpb=98330a8da16ff7d8a24ed020a4761fa4d2a43589 diff --git a/src/lzms-compress.c b/src/lzms-compress.c index 3686db0a..5f5e3741 100644 --- a/src/lzms-compress.c +++ b/src/lzms-compress.c @@ -206,6 +206,33 @@ struct lzms_compressor { u8 offset_slot_fast[LZMS_NUM_FAST_OFFSETS]; }; +struct lzms_lz_lru_queue { + u32 recent_offsets[LZMS_NUM_RECENT_OFFSETS + 1]; + u32 prev_offset; + u32 upcoming_offset; +}; + +static void +lzms_init_lz_lru_queue(struct lzms_lz_lru_queue *queue) +{ + for (int i = 0; i < LZMS_NUM_RECENT_OFFSETS + 1; i++) + queue->recent_offsets[i] = i + 1; + + queue->prev_offset = 0; + queue->upcoming_offset = 0; +} + +static void +lzms_update_lz_lru_queue(struct lzms_lz_lru_queue *queue) +{ + if (queue->prev_offset != 0) { + for (int i = LZMS_NUM_RECENT_OFFSETS - 1; i >= 0; i--) + queue->recent_offsets[i + 1] = queue->recent_offsets[i]; + queue->recent_offsets[0] = queue->prev_offset; + } + queue->prev_offset = queue->upcoming_offset; +} + /* * Match chooser position data: * @@ -258,7 +285,7 @@ struct lzms_mc_pos_data { * entries or current Huffman codewords. Those aren't maintained * per-position and are only updated occassionally. */ struct lzms_adaptive_state { - struct lzms_lz_lru_queues lru; + struct lzms_lz_lru_queue lru; u8 main_state; u8 match_state; u8 lz_match_state; @@ -898,7 +925,7 @@ lzms_init_adaptive_state(struct lzms_adaptive_state *state) { unsigned i; - lzms_init_lz_lru_queues(&state->lru); + lzms_init_lz_lru_queue(&state->lru); state->main_state = 0; state->match_state = 0; state->lz_match_state = 0; @@ -1234,10 +1261,7 @@ lzms_init_range_encoder(struct lzms_range_encoder *enc, enc->state = 0; LZMS_ASSERT(is_power_of_2(num_states)); enc->mask = num_states - 1; - for (u32 i = 0; i < num_states; i++) { - enc->prob_entries[i].num_recent_zero_bits = LZMS_INITIAL_PROBABILITY; - enc->prob_entries[i].recent_bits = LZMS_INITIAL_RECENT_BITS; - } + lzms_init_probability_entries(enc->prob_entries, num_states); } static void @@ -1291,7 +1315,7 @@ lzms_prepare_compressor(struct lzms_compressor *c, const u8 *udata, u32 ulen, LZMS_LZ_OFFSET_CODE_REBUILD_FREQ); lzms_init_huffman_encoder(&c->length_encoder, &c->os, - LZMS_NUM_LEN_SYMS, + LZMS_NUM_LENGTH_SYMS, LZMS_LENGTH_CODE_REBUILD_FREQ); lzms_init_huffman_encoder(&c->delta_offset_encoder, &c->os, @@ -1489,8 +1513,6 @@ lzms_create_compressor(size_t max_block_size, unsigned int compression_level, goto oom; c->optimum_end = &c->optimum[params.optim_array_length]; - lzms_init_slots(); - lzms_init_rc_costs(); lzms_init_fast_slots(c);