X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=deps%2Flibchdr%2Fhuffman.h;h=8bcc45acdc97937a9138a8ac1123cd6ca7b799ad;hb=03f41c38234fece3e1b4efefb9f4efb381e24b46;hp=71de399971fe756d168101c538fcb21a44a6b4c7;hpb=8ec1e4de88798ca548481773e49bb01a4de03139;p=pcsx_rearmed.git diff --git a/deps/libchdr/huffman.h b/deps/libchdr/huffman.h index 71de3999..8bcc45ac 100644 --- a/deps/libchdr/huffman.h +++ b/deps/libchdr/huffman.h @@ -1,87 +1,89 @@ -// license:BSD-3-Clause -// copyright-holders:Aaron Giles -/*************************************************************************** - - huffman.h - - Static Huffman compression and decompression helpers. - -***************************************************************************/ - -#pragma once - -#ifndef __HUFFMAN_H__ -#define __HUFFMAN_H__ - -#include "bitstream.h" - - -//************************************************************************** -// CONSTANTS -//************************************************************************** - -enum huffman_error -{ - HUFFERR_NONE = 0, - HUFFERR_TOO_MANY_BITS, - HUFFERR_INVALID_DATA, - HUFFERR_INPUT_BUFFER_TOO_SMALL, - HUFFERR_OUTPUT_BUFFER_TOO_SMALL, - HUFFERR_INTERNAL_INCONSISTENCY, - HUFFERR_TOO_MANY_CONTEXTS -}; - - - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -typedef uint16_t lookup_value; - -// a node in the huffman tree -struct node_t -{ - struct node_t* parent; // pointer to parent node - uint32_t count; // number of hits on this node - uint32_t weight; // assigned weight of this node - uint32_t bits; // bits used to encode the node - uint8_t numbits; // number of bits needed for this node -}; - -// ======================> huffman_context_base - -// context class for decoding -struct huffman_decoder -{ - // internal state - uint32_t numcodes; // number of total codes being processed - uint8_t maxbits; // maximum bits per code - uint8_t prevdata; // value of the previous data (for delta-RLE encoding) - int rleremaining; // number of RLE bytes remaining (for delta-RLE encoding) - lookup_value * lookup; // pointer to the lookup table - struct node_t * huffnode; // array of nodes - uint32_t * datahisto; // histogram of data values - - // array versions of the info we need - //node_t* huffnode_array; //[_NumCodes]; - //lookup_value* lookup_array; //[1 << _MaxBits]; -}; - -// ======================> huffman_decoder - -struct huffman_decoder* create_huffman_decoder(int numcodes, int maxbits); - -// single item operations -uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* bitbuf); - -enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf); -enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf); - -int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight); -enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder); -enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder); - -void huffman_build_lookup_table(struct huffman_decoder* decoder); - -#endif +/* license:BSD-3-Clause + * copyright-holders:Aaron Giles + *************************************************************************** + + huffman.h + + Static Huffman compression and decompression helpers. + +***************************************************************************/ + +#pragma once + +#ifndef __HUFFMAN_H__ +#define __HUFFMAN_H__ + +#include "bitstream.h" + + +/*************************************************************************** + * CONSTANTS + *************************************************************************** + */ + +enum huffman_error +{ + HUFFERR_NONE = 0, + HUFFERR_TOO_MANY_BITS, + HUFFERR_INVALID_DATA, + HUFFERR_INPUT_BUFFER_TOO_SMALL, + HUFFERR_OUTPUT_BUFFER_TOO_SMALL, + HUFFERR_INTERNAL_INCONSISTENCY, + HUFFERR_TOO_MANY_CONTEXTS +}; + +/*************************************************************************** + * TYPE DEFINITIONS + *************************************************************************** + */ + +typedef uint16_t lookup_value; + +/* a node in the huffman tree */ +struct node_t +{ + struct node_t* parent; /* pointer to parent node */ + uint32_t count; /* number of hits on this node */ + uint32_t weight; /* assigned weight of this node */ + uint32_t bits; /* bits used to encode the node */ + uint8_t numbits; /* number of bits needed for this node */ +}; + +/* ======================> huffman_context_base */ + +/* context class for decoding */ +struct huffman_decoder +{ + /* internal state */ + uint32_t numcodes; /* number of total codes being processed */ + uint8_t maxbits; /* maximum bits per code */ + uint8_t prevdata; /* value of the previous data (for delta-RLE encoding) */ + int rleremaining; /* number of RLE bytes remaining (for delta-RLE encoding) */ + lookup_value * lookup; /* pointer to the lookup table */ + struct node_t * huffnode; /* array of nodes */ + uint32_t * datahisto; /* histogram of data values */ + + /* array versions of the info we need */ +#if 0 + node_t* huffnode_array; /* [_NumCodes]; */ + lookup_value* lookup_array; /* [1 << _MaxBits]; */ +#endif +}; + +/* ======================> huffman_decoder */ + +struct huffman_decoder* create_huffman_decoder(int numcodes, int maxbits); + +/* single item operations */ +uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* bitbuf); + +enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf); +enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf); + +int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight); +enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder); +enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder); + +void huffman_build_lookup_table(struct huffman_decoder* decoder); + +#endif