89 lines
2.8 KiB
C
89 lines
2.8 KiB
C
/**
|
|
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
|