Subversion Repositories Games.Carmageddon

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /**
  2.         libsmacker - A C library for decoding .smk Smacker Video files
  3.         Copyright (C) 2012-2017 Greg Kennedy
  4.  
  5.         See smacker.h for more information.
  6.  
  7.         smk_hufftree.h
  8.                 SMK huffmann trees.  There are two types:
  9.                 - a basic 8-bit tree, and
  10.                 - a "big" 16-bit tree which includes a cache for recently
  11.                         searched values.
  12. */
  13.  
  14. #ifndef SMK_HUFFTREE_H
  15. #define SMK_HUFFTREE_H
  16.  
  17. #include "smk_bitstream.h"
  18.  
  19. /** Tree node structures - Forward declaration */
  20. struct smk_huff8_t;
  21. struct smk_huff16_t;
  22.  
  23. /*********************** 8-BIT HUFF-TREE FUNCTIONS ***********************/
  24. /** This macro checks return code from _smk_huff8_build and
  25.         jumps to error label if problems occur. */
  26. #define smk_huff8_build(bs,t) \
  27. { \
  28.         if (!(t = _smk_huff8_build(bs))) \
  29.         { \
  30.                 fprintf(stderr, "libsmacker::smk_huff8_build(" #bs ", " #t ") - ERROR (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \
  31.                 goto error; \
  32.         } \
  33. }
  34. /** Build an 8-bit tree from a bitstream */
  35. struct smk_huff8_t* _smk_huff8_build(struct smk_bit_t* bs);
  36.  
  37. /** This macro checks return code from _smk_huff8_lookup and
  38.         jumps to error label if problems occur. */
  39. #define smk_huff8_lookup(bs,t,s) \
  40. { \
  41.         if ((short)(s = _smk_huff8_lookup(bs, t)) < 0) \
  42.         { \
  43.                 fprintf(stderr, "libsmacker::smk_huff8_lookup(" #bs ", " #t ", " #s ") - ERROR (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \
  44.                 goto error; \
  45.         } \
  46. }
  47. /** Look up an 8-bit value in the referenced tree by following a bitstream
  48.         returns -1 on error */
  49. short _smk_huff8_lookup(struct smk_bit_t* bs, const struct smk_huff8_t* t);
  50.  
  51. /** function to recursively delete an 8-bit huffman tree */
  52. void smk_huff8_free(struct smk_huff8_t* t);
  53.  
  54. /************************ 16-BIT HUFF-TREE FUNCTIONS ************************/
  55. /** This macro checks return code from _smk_huff16_build and
  56.         jumps to error label if problems occur. */
  57. #define smk_huff16_build(bs,t) \
  58. { \
  59.         if (!(t = _smk_huff16_build(bs))) \
  60.         { \
  61.                 fprintf(stderr, "libsmacker::smk_huff16_build(" #bs ", " #t ") - ERROR (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \
  62.                 goto error; \
  63.         } \
  64. }
  65. /** Build a 16-bit tree from a bitstream */
  66. struct smk_huff16_t* _smk_huff16_build(struct smk_bit_t* bs);
  67.  
  68. /** This macro checks return code from smk_huff16_lookup and
  69.         jumps to error label if problems occur. */
  70. #define smk_huff16_lookup(bs,t,s) \
  71. { \
  72.         if ((s = _smk_huff16_lookup(bs, t)) < 0) \
  73.         { \
  74.                 fprintf(stderr, "libsmacker::smk_huff16_lookup(" #bs ", " #t ", " #s ") - ERROR (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \
  75.                 goto error; \
  76.         } \
  77. }
  78. /** Look up a 16-bit value in the bigtree by following a bitstream
  79.         returns -1 on error */
  80. long _smk_huff16_lookup(struct smk_bit_t* bs, struct smk_huff16_t* big);
  81.  
  82. /** Reset the cache in a 16-bit tree */
  83. void smk_huff16_reset(struct smk_huff16_t* big);
  84.  
  85. /** function to recursively delete a 16-bit huffman tree */
  86. void smk_huff16_free(struct smk_huff16_t* big);
  87.  
  88. #endif
  89.