Merge pull request #423 from jdgleaver/set-message-ext
[pcsx_rearmed.git] / deps / libchdr / huffman.h
CommitLineData
ce188d4d 1// license:BSD-3-Clause\r
2// copyright-holders:Aaron Giles\r
3/***************************************************************************\r
4\r
5 huffman.h\r
6\r
7 Static Huffman compression and decompression helpers.\r
8\r
9***************************************************************************/\r
10\r
11#pragma once\r
12\r
13#ifndef __HUFFMAN_H__\r
14#define __HUFFMAN_H__\r
15\r
16#include "bitstream.h"\r
17\r
18\r
19//**************************************************************************\r
20// CONSTANTS\r
21//**************************************************************************\r
22\r
23enum huffman_error\r
24{\r
25 HUFFERR_NONE = 0,\r
26 HUFFERR_TOO_MANY_BITS,\r
27 HUFFERR_INVALID_DATA,\r
28 HUFFERR_INPUT_BUFFER_TOO_SMALL,\r
29 HUFFERR_OUTPUT_BUFFER_TOO_SMALL,\r
30 HUFFERR_INTERNAL_INCONSISTENCY,\r
31 HUFFERR_TOO_MANY_CONTEXTS\r
32};\r
33\r
34\r
35\r
36//**************************************************************************\r
37// TYPE DEFINITIONS\r
38//**************************************************************************\r
39\r
40typedef uint16_t lookup_value;\r
41\r
42// a node in the huffman tree\r
43struct node_t\r
44{\r
45 struct node_t* parent; // pointer to parent node\r
46 uint32_t count; // number of hits on this node\r
47 uint32_t weight; // assigned weight of this node\r
48 uint32_t bits; // bits used to encode the node\r
49 uint8_t numbits; // number of bits needed for this node\r
50};\r
51\r
52// ======================> huffman_context_base\r
53\r
54// context class for decoding\r
55struct huffman_decoder\r
56{\r
57 // internal state\r
58 uint32_t numcodes; // number of total codes being processed\r
59 uint8_t maxbits; // maximum bits per code\r
60 uint8_t prevdata; // value of the previous data (for delta-RLE encoding)\r
61 int rleremaining; // number of RLE bytes remaining (for delta-RLE encoding)\r
62 lookup_value * lookup; // pointer to the lookup table\r
63 struct node_t * huffnode; // array of nodes\r
64 uint32_t * datahisto; // histogram of data values\r
65\r
66 // array versions of the info we need\r
67 //node_t* huffnode_array; //[_NumCodes];\r
68 //lookup_value* lookup_array; //[1 << _MaxBits]; \r
69};\r
70\r
71// ======================> huffman_decoder\r
72\r
73struct huffman_decoder* create_huffman_decoder(int numcodes, int maxbits);\r
74\r
75// single item operations\r
76uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* bitbuf);\r
77\r
78enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf);\r
79enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf);\r
80\r
81int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight);\r
82enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder);\r
83enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder);\r
84\r
85void huffman_build_lookup_table(struct huffman_decoder* decoder);\r
86\r
87#endif\r