| // Copyright 2011 Google Inc. All Rights Reserved. |
| // |
| // This code is licensed under the same terms as WebM: |
| // Software License Agreement: http://www.webmproject.org/license/software/ |
| // Additional IP Rights Grant: http://www.webmproject.org/license/additional/ |
| // ----------------------------------------------------------------------------- |
| // |
| // Tree-coder using VP8's boolean coder |
| // |
| // Symbols are stored as nodes of a tree that records their frequencies and |
| // is dynamically updated. |
| // |
| // Author: Skal (pascal.massimino@gmail.com) |
| // |
| // Encoding example: |
| /* |
| static int Compress(const uint8_t* src, int src_length, |
| uint8_t** output, size_t* output_size) { |
| int i; |
| TCoder* coder = TCoderNew(255); |
| VP8BitWriter bw; |
| |
| VP8BitWriterInit(&bw, 0); |
| for (i = 0; i < src_length; ++i) |
| TCoderEncode(coder, src[i], &bw); |
| TCoderDelete(coder); |
| VP8BitWriterFinish(&bw); |
| |
| *output = VP8BitWriterBuf(&bw); |
| *output_size = VP8BitWriterSize(&bw); |
| return !bw.error_; |
| } |
| */ |
| // |
| // Decoding example: |
| /* |
| static int Decompress(const uint8_t* src, size_t src_size, |
| uint8_t* dst, int dst_length) { |
| int i; |
| TCoder* coder = TCoderNew(255); |
| VP8BitReader br; |
| |
| VP8InitBitReader(&br, src, src + src_size); |
| for (i = 0; i < dst_length; ++i) |
| dst[i] = TCoderDecode(coder, &br); |
| TCoderDelete(coder); |
| return !br.eof_; |
| } |
| */ |
| |
| #ifndef WEBP_UTILS_TCODER_H_ |
| #define WEBP_UTILS_TCODER_H_ |
| |
| #if defined(__cplusplus) || defined(c_plusplus) |
| extern "C" { |
| #endif |
| |
| struct VP8BitReader; |
| struct VP8BitWriter; |
| typedef struct TCoder TCoder; |
| |
| // Creates a tree-coder capable of coding symbols in |
| // the [0, max_symbol] range. Returns NULL in case of memory error. |
| // 'max_symbol' must be in the range [0, TCODER_MAX_SYMBOL) |
| #define TCODER_MAX_SYMBOL (1 << 24) |
| TCoder* TCoderNew(int max_symbol); |
| // Re-initialize an existing object, make it ready for a new encoding or |
| // decoding cycle. |
| void TCoderInit(TCoder* const c); |
| // destroys the tree-coder object and frees memory. |
| void TCoderDelete(TCoder* const c); |
| |
| // Code next symbol 's'. If the bit-writer 'bw' is NULL, the function will |
| // just record the symbol, and update the internal frequency counters. |
| void TCoderEncode(TCoder* const c, int s, struct VP8BitWriter* const bw); |
| // Decode and return next symbol. |
| int TCoderDecode(TCoder* const c, struct VP8BitReader* const br); |
| |
| // Theoretical number of bits needed to code 'symbol' in the current state. |
| double TCoderSymbolCost(const TCoder* const c, int symbol); |
| |
| #if defined(__cplusplus) || defined(c_plusplus) |
| } // extern "C" |
| #endif |
| |
| #endif // WEBP_UTILS_TCODER_H_ |