#ifndef HISTOY_BUFFER_H #define HISTOY_BUFFER_H #include "conv_common.h" // ring buffer of path histories // generates output bits after accumulating sufficient history typedef struct { // history entries must be at least this old to be decoded const uint16_t min_traceback_length; // we'll decode entries in bursts. this tells us the length of the burst const uint16_t traceback_group_length; // we will store a total of cap entries. equal to min_traceback_length + // traceback_group_length const uint16_t cap; // how many states in the shift register? this is one of the dimensions of // history table const uint16_t num_states; // what's the high order bit of the shift register? const shift_register_t highbit; // history is a compact history representation for every shift register // state, // one bit per time slice uint8_t **history; // which slice are we writing next? uint16_t index; // how many valid entries are there? uint16_t len; // temporary store of fetched bits uint8_t *fetched; // how often should we renormalize? uint16_t renormalize_interval; uint16_t renormalize_counter; } history_buffer; history_buffer *history_buffer_create(uint16_t min_traceback_length, uint16_t traceback_group_length, uint16_t renormalize_interval, uint16_t num_states, shift_register_t highbit); void history_buffer_destroy(history_buffer *buf); void history_buffer_reset(history_buffer *buf); void history_buffer_step(history_buffer *buf); uint8_t *history_buffer_get_slice(history_buffer *buf); shift_register_t history_buffer_search(history_buffer *buf, const distance_t *distances, uint16_t search_every); void history_buffer_traceback(history_buffer *buf, shift_register_t bestpath, uint16_t min_traceback_length, bit_writer_t *output); void history_buffer_process_skip(history_buffer *buf, distance_t *distances, bit_writer_t *output, uint16_t skip); void history_buffer_process(history_buffer *buf, distance_t *distances, bit_writer_t *output); void history_buffer_flush(history_buffer *buf, bit_writer_t *output); #endif