Minor changes to educational decoder
This commit is contained in:
parent
f191be2fe6
commit
eb52dbd4fe
@ -1258,7 +1258,7 @@ static void decode_seq_table(istream_t *const in, FSE_dtable *const table,
|
|||||||
}
|
}
|
||||||
case seq_rle: {
|
case seq_rle: {
|
||||||
// "RLE_Mode : it's a single code, repeated Number_of_Sequences times."
|
// "RLE_Mode : it's a single code, repeated Number_of_Sequences times."
|
||||||
const u8 symb = IO_read_bits(in, 8);
|
const u8 symb = IO_read_bytes(in, 1)[0];
|
||||||
FSE_init_dtable_rle(table, symb);
|
FSE_init_dtable_rle(table, symb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1572,8 +1572,8 @@ static void free_dictionary(dictionary_t *const dict) {
|
|||||||
#define UNALIGNED() ERROR("Attempting to operate on a non-byte aligned stream")
|
#define UNALIGNED() ERROR("Attempting to operate on a non-byte aligned stream")
|
||||||
/// Reads `num` bits from a bitstream, and updates the internal offset
|
/// Reads `num` bits from a bitstream, and updates the internal offset
|
||||||
static inline u64 IO_read_bits(istream_t *const in, const int num) {
|
static inline u64 IO_read_bits(istream_t *const in, const int num) {
|
||||||
if (num > 64) {
|
if (num > 64 || num <= 0) {
|
||||||
return -1;
|
ERROR("Attempt to read an invalid number of bits");
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t bytes = (num + in->bit_offset + 7) / 8;
|
const size_t bytes = (num + in->bit_offset + 7) / 8;
|
||||||
@ -1710,7 +1710,7 @@ static inline istream_t IO_make_sub_istream(istream_t *const in, size_t len) {
|
|||||||
static inline u64 read_bits_LE(const u8 *src, const int num,
|
static inline u64 read_bits_LE(const u8 *src, const int num,
|
||||||
const size_t offset) {
|
const size_t offset) {
|
||||||
if (num > 64) {
|
if (num > 64) {
|
||||||
return -1;
|
ERROR("Attempt to read an invalid number of bits");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip over bytes that aren't in range
|
// Skip over bytes that aren't in range
|
||||||
@ -1871,6 +1871,11 @@ static size_t HUF_decompress_4stream(const HUF_dtable *const dtable,
|
|||||||
return total_output;
|
return total_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Initializes a Huffman table using canonical Huffman codes
|
||||||
|
/// For more explanation on canonical Huffman codes see
|
||||||
|
/// http://www.cs.uofs.edu/~mccloske/courses/cmps340/huff_canonical_dec2015.html
|
||||||
|
/// Codes within a level are allocated in symbol order (i.e. smaller symbols get
|
||||||
|
/// earlier codes)
|
||||||
static void HUF_init_dtable(HUF_dtable *const table, const u8 *const bits,
|
static void HUF_init_dtable(HUF_dtable *const table, const u8 *const bits,
|
||||||
const int num_symbs) {
|
const int num_symbs) {
|
||||||
memset(table, 0, sizeof(HUF_dtable));
|
memset(table, 0, sizeof(HUF_dtable));
|
||||||
@ -2004,6 +2009,9 @@ static void HUF_copy_dtable(HUF_dtable *const dst,
|
|||||||
/******* END HUFFMAN PRIMITIVES ***********************************************/
|
/******* END HUFFMAN PRIMITIVES ***********************************************/
|
||||||
|
|
||||||
/******* FSE PRIMITIVES *******************************************************/
|
/******* FSE PRIMITIVES *******************************************************/
|
||||||
|
/// For more description of FSE see
|
||||||
|
/// https://github.com/Cyan4973/FiniteStateEntropy/
|
||||||
|
|
||||||
/// Allow a symbol to be decoded without updating state
|
/// Allow a symbol to be decoded without updating state
|
||||||
static inline u8 FSE_peek_symbol(const FSE_dtable *const dtable,
|
static inline u8 FSE_peek_symbol(const FSE_dtable *const dtable,
|
||||||
const u16 state) {
|
const u16 state) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user