An adaptive order-2 PPM range coder. More...
#include <string.h>#include "enet/enet.h"Defines | |
| #define | ENET_BUILDING_LIB 1 |
| #define | ENET_SYMBOL_CREATE(symbol, value_, count_) |
| #define | ENET_CONTEXT_CREATE(context, escapes_, minimum) |
| #define | ENET_CONTEXT_RESCALE(context, minimum) |
| #define | ENET_RANGE_CODER_OUTPUT(value) |
| #define | ENET_RANGE_CODER_ENCODE(under, count, total) |
| #define | ENET_RANGE_CODER_FLUSH |
| #define | ENET_RANGE_CODER_FREE_SYMBOLS |
| #define | ENET_CONTEXT_ENCODE(context, symbol_, value_, under_, count_, update, minimum) |
| #define | ENET_RANGE_CODER_SEED |
| #define | ENET_RANGE_CODER_READ(total) ((decodeCode - decodeLow) / (decodeRange /= (total))) |
| #define | ENET_RANGE_CODER_DECODE(under, count, total) |
| #define | ENET_CONTEXT_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, createRoot, visitNode, createRight, createLeft) |
| #define | ENET_CONTEXT_TRY_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, exclude) ENET_CONTEXT_DECODE (context, symbol_, code, value_, under_, count_, update, minimum, return 0, exclude (node -> value, after, before), return 0, return 0) |
| #define | ENET_CONTEXT_ROOT_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, exclude) |
| #define | ENET_CONTEXT_NOT_EXCLUDED(value_, after, before) |
Typedefs | |
| typedef struct _ENetSymbol | ENetSymbol |
| typedef struct _ENetRangeCoder | ENetRangeCoder |
Enumerations | |
| enum | { ENET_RANGE_CODER_TOP = 1<<24, ENET_RANGE_CODER_BOTTOM = 1<<16, ENET_CONTEXT_SYMBOL_DELTA = 3, ENET_CONTEXT_SYMBOL_MINIMUM = 1, ENET_CONTEXT_ESCAPE_MINIMUM = 1, ENET_SUBCONTEXT_ORDER = 2, ENET_SUBCONTEXT_SYMBOL_DELTA = 2, ENET_SUBCONTEXT_ESCAPE_DELTA = 5 } |
Functions | |
| void * | enet_range_coder_create (void) |
| void | enet_range_coder_destroy (void *context) |
| size_t | enet_range_coder_compress (void *context, const ENetBuffer *inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 *outData, size_t outLimit) |
| size_t | enet_range_coder_decompress (void *context, const enet_uint8 *inData, size_t inLimit, enet_uint8 *outData, size_t outLimit) |
| int | enet_host_compress_with_range_coder (ENetHost *host) |
| Sets the packet compressor the host should use to the default range coder. | |
| #define ENET_CONTEXT_CREATE | ( | context, | ||
| escapes_, | ||||
| minimum | ||||
| ) |
{ \
ENET_SYMBOL_CREATE (context, 0, 0); \
(context) -> escapes = escapes_; \
(context) -> total = escapes_ + 256*minimum; \
(context) -> symbols = 0; \
}
| #define ENET_CONTEXT_RESCALE | ( | context, | ||
| minimum | ||||
| ) |
{ \
(context) -> total = (context) -> symbols ? enet_symbol_rescale ((context) + (context) -> symbols) : 0; \
(context) -> escapes -= (context) -> escapes >> 1; \
(context) -> total += (context) -> escapes + 256*minimum; \
}
| #define ENET_CONTEXT_ROOT_DECODE | ( | context, | ||
| symbol_, | ||||
| code, | ||||
| value_, | ||||
| under_, | ||||
| count_, | ||||
| update, | ||||
| minimum, | ||||
| exclude | ||||
| ) |
ENET_CONTEXT_DECODE (context, symbol_, code, value_, under_, count_, update, minimum, \
{ \
value_ = code / minimum; \
under_ = code - code%minimum; \
ENET_SYMBOL_CREATE (symbol_, value_, update); \
(context) -> symbols = symbol_ - (context); \
}, \
exclude (node -> value, after, before), \
{ \
value_ = node->value + 1 + (code - after)/minimum; \
under_ = code - (code - after)%minimum; \
ENET_SYMBOL_CREATE (symbol_, value_, update); \
node -> right = symbol_ - node; \
}, \
{ \
value_ = node->value - 1 - (after - before - code - 1)/minimum; \
under_ = code - (after - before - code - 1)%minimum; \
ENET_SYMBOL_CREATE (symbol_, value_, update); \
node -> left = symbol_ - node; \
}) \
| #define ENET_RANGE_CODER_DECODE | ( | under, | ||
| count, | ||||
| total | ||||
| ) |
{ \
decodeLow += (under) * decodeRange; \
decodeRange *= (count); \
for (;;) \
{ \
if((decodeLow ^ (decodeLow + decodeRange)) >= ENET_RANGE_CODER_TOP) \
{ \
if(decodeRange >= ENET_RANGE_CODER_BOTTOM) break; \
decodeRange = -decodeLow & (ENET_RANGE_CODER_BOTTOM - 1); \
} \
decodeCode <<= 8; \
if (inData < inEnd) \
decodeCode |= * inData ++; \
decodeRange <<= 8; \
decodeLow <<= 8; \
} \
}
| #define ENET_RANGE_CODER_ENCODE | ( | under, | ||
| count, | ||||
| total | ||||
| ) |
{ \
encodeRange /= (total); \
encodeLow += (under) * encodeRange; \
encodeRange *= (count); \
for (;;) \
{ \
if((encodeLow ^ (encodeLow + encodeRange)) >= ENET_RANGE_CODER_TOP) \
{ \
if(encodeRange >= ENET_RANGE_CODER_BOTTOM) break; \
encodeRange = -encodeLow & (ENET_RANGE_CODER_BOTTOM - 1); \
} \
ENET_RANGE_CODER_OUTPUT (encodeLow >> 24); \
encodeRange <<= 8; \
encodeLow <<= 8; \
} \
}
| #define ENET_RANGE_CODER_FLUSH |
{ \
while (encodeLow) \
{ \
ENET_RANGE_CODER_OUTPUT (encodeLow >> 24); \
encodeLow <<= 8; \
} \
}
| #define ENET_RANGE_CODER_FREE_SYMBOLS |
{ \
if (nextSymbol >= sizeof (rangeCoder -> symbols) / sizeof (ENetSymbol) - ENET_SUBCONTEXT_ORDER ) \
{ \
nextSymbol = 0; \
ENET_CONTEXT_CREATE (root, ENET_CONTEXT_ESCAPE_MINIMUM, ENET_CONTEXT_SYMBOL_MINIMUM); \
predicted = 0; \
order = 0; \
} \
}
| #define ENET_RANGE_CODER_OUTPUT | ( | value | ) |
{ \
if (outData >= outEnd) \
return 0; \
* outData ++ = value; \
}
| #define ENET_RANGE_CODER_SEED |
{ \
if (inData < inEnd) decodeCode |= * inData ++ << 24; \
if (inData < inEnd) decodeCode |= * inData ++ << 16; \
if (inData < inEnd) decodeCode |= * inData ++ << 8; \
if (inData < inEnd) decodeCode |= * inData ++; \
}
| #define ENET_SYMBOL_CREATE | ( | symbol, | ||
| value_, | ||||
| count_ | ||||
| ) |
{ \
symbol = & rangeCoder -> symbols [nextSymbol ++]; \
symbol -> value = value_; \
symbol -> count = count_; \
symbol -> under = count_; \
symbol -> left = 0; \
symbol -> right = 0; \
symbol -> symbols = 0; \
symbol -> escapes = 0; \
symbol -> total = 0; \
symbol -> parent = 0; \
}
1.7.1