/** libsmacker - A C library for decoding .smk Smacker Video files Copyright (C) 2012-2017 Greg Kennedy See smacker.h for more information. smk_hufftree.h SMK huffmann trees. There are two types: - a basic 8-bit tree, and - a "big" 16-bit tree which includes a cache for recently searched values. */ #ifndef SMK_HUFFTREE_H #define SMK_HUFFTREE_H #include "smk_bitstream.h" /** Tree node structures - Forward declaration */ struct smk_huff8_t; struct smk_huff16_t; /*********************** 8-BIT HUFF-TREE FUNCTIONS ***********************/ /** This macro checks return code from _smk_huff8_build and jumps to error label if problems occur. */ #define smk_huff8_build(bs,t) \ { \ if (!(t = _smk_huff8_build(bs))) \ { \ fprintf(stderr, "libsmacker::smk_huff8_build(" #bs ", " #t ") - ERROR (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \ goto error; \ } \ } /** Build an 8-bit tree from a bitstream */ struct smk_huff8_t* _smk_huff8_build(struct smk_bit_t* bs); /** This macro checks return code from _smk_huff8_lookup and jumps to error label if problems occur. */ #define smk_huff8_lookup(bs,t,s) \ { \ if ((short)(s = _smk_huff8_lookup(bs, t)) < 0) \ { \ fprintf(stderr, "libsmacker::smk_huff8_lookup(" #bs ", " #t ", " #s ") - ERROR (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \ goto error; \ } \ } /** Look up an 8-bit value in the referenced tree by following a bitstream returns -1 on error */ short _smk_huff8_lookup(struct smk_bit_t* bs, const struct smk_huff8_t* t); /** function to recursively delete an 8-bit huffman tree */ void smk_huff8_free(struct smk_huff8_t* t); /************************ 16-BIT HUFF-TREE FUNCTIONS ************************/ /** This macro checks return code from _smk_huff16_build and jumps to error label if problems occur. */ #define smk_huff16_build(bs,t) \ { \ if (!(t = _smk_huff16_build(bs))) \ { \ fprintf(stderr, "libsmacker::smk_huff16_build(" #bs ", " #t ") - ERROR (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \ goto error; \ } \ } /** Build a 16-bit tree from a bitstream */ struct smk_huff16_t* _smk_huff16_build(struct smk_bit_t* bs); /** This macro checks return code from smk_huff16_lookup and jumps to error label if problems occur. */ #define smk_huff16_lookup(bs,t,s) \ { \ if ((s = _smk_huff16_lookup(bs, t)) < 0) \ { \ fprintf(stderr, "libsmacker::smk_huff16_lookup(" #bs ", " #t ", " #s ") - ERROR (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \ goto error; \ } \ } /** Look up a 16-bit value in the bigtree by following a bitstream returns -1 on error */ long _smk_huff16_lookup(struct smk_bit_t* bs, struct smk_huff16_t* big); /** Reset the cache in a 16-bit tree */ void smk_huff16_reset(struct smk_huff16_t* big); /** function to recursively delete a 16-bit huffman tree */ void smk_huff16_free(struct smk_huff16_t* big); #endif