You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.8 KiB
88 lines
2.8 KiB
/** |
|
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
|
|
|