⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rangecoderbittree.h

📁 sleuthit-2.09 一个磁盘的工具集
💻 H
字号:
// Compress/RangeCoder/RangeCoderBitTree.h#ifndef __COMPRESS_RANGECODER_BIT_TREE_H#define __COMPRESS_RANGECODER_BIT_TREE_H#include "RangeCoderBit.h"#include "RangeCoderOpt.h"namespace NCompress {namespace NRangeCoder {template <int numMoveBits, int NumBitLevels>class CBitTreeEncoder{  CBitEncoder<numMoveBits> Models[1 << NumBitLevels];public:  void Init()  {    for(UInt32 i = 1; i < (1 << NumBitLevels); i++)      Models[i].Init();  }  void Encode(CEncoder *rangeEncoder, UInt32 symbol)  {    UInt32 modelIndex = 1;    for (int bitIndex = NumBitLevels; bitIndex != 0 ;)    {      bitIndex--;      UInt32 bit = (symbol >> bitIndex) & 1;      Models[modelIndex].Encode(rangeEncoder, bit);      modelIndex = (modelIndex << 1) | bit;    }  };  void ReverseEncode(CEncoder *rangeEncoder, UInt32 symbol)  {    UInt32 modelIndex = 1;    for (int i = 0; i < NumBitLevels; i++)    {      UInt32 bit = symbol & 1;      Models[modelIndex].Encode(rangeEncoder, bit);      modelIndex = (modelIndex << 1) | bit;      symbol >>= 1;    }  }  UInt32 GetPrice(UInt32 symbol) const  {    symbol |= (1 << NumBitLevels);    UInt32 price = 0;    while (symbol != 1)    {      price += Models[symbol >> 1].GetPrice(symbol & 1);      symbol >>= 1;    }    return price;  }  UInt32 ReverseGetPrice(UInt32 symbol) const  {    UInt32 price = 0;    UInt32 modelIndex = 1;    for (int i = NumBitLevels; i != 0; i--)    {      UInt32 bit = symbol & 1;      symbol >>= 1;      price += Models[modelIndex].GetPrice(bit);      modelIndex = (modelIndex << 1) | bit;    }    return price;  }};template <int numMoveBits, int NumBitLevels>class CBitTreeDecoder{  CBitDecoder<numMoveBits> Models[1 << NumBitLevels];public:  void Init()  {    for(UInt32 i = 1; i < (1 << NumBitLevels); i++)      Models[i].Init();  }  UInt32 Decode(CDecoder *rangeDecoder)  {    UInt32 modelIndex = 1;    RC_INIT_VAR    for(int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--)    {      // modelIndex = (modelIndex << 1) + Models[modelIndex].Decode(rangeDecoder);      RC_GETBIT(numMoveBits, Models[modelIndex].Prob, modelIndex)    }    RC_FLUSH_VAR    return modelIndex - (1 << NumBitLevels);  };  UInt32 ReverseDecode(CDecoder *rangeDecoder)  {    UInt32 modelIndex = 1;    UInt32 symbol = 0;    RC_INIT_VAR    for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)    {      // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);      // modelIndex <<= 1;      // modelIndex += bit;      // symbol |= (bit << bitIndex);      RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))    }    RC_FLUSH_VAR    return symbol;  }};template <int numMoveBits>void ReverseBitTreeEncode(CBitEncoder<numMoveBits> *Models,     CEncoder *rangeEncoder, int NumBitLevels, UInt32 symbol){  UInt32 modelIndex = 1;  for (int i = 0; i < NumBitLevels; i++)  {    UInt32 bit = symbol & 1;    Models[modelIndex].Encode(rangeEncoder, bit);    modelIndex = (modelIndex << 1) | bit;    symbol >>= 1;  }}template <int numMoveBits>UInt32 ReverseBitTreeGetPrice(CBitEncoder<numMoveBits> *Models,     UInt32 NumBitLevels, UInt32 symbol){  UInt32 price = 0;  UInt32 modelIndex = 1;  for (int i = NumBitLevels; i != 0; i--)  {    UInt32 bit = symbol & 1;    symbol >>= 1;    price += Models[modelIndex].GetPrice(bit);    modelIndex = (modelIndex << 1) | bit;  }  return price;}template <int numMoveBits>UInt32 ReverseBitTreeDecode(CBitDecoder<numMoveBits> *Models,     CDecoder *rangeDecoder, int NumBitLevels){  UInt32 modelIndex = 1;  UInt32 symbol = 0;  RC_INIT_VAR  for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)  {    // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);    // modelIndex <<= 1;    // modelIndex += bit;    // symbol |= (bit << bitIndex);    RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))  }  RC_FLUSH_VAR  return symbol;}}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -