summaryrefslogtreecommitdiffstats
path: root/hostTools/lzma/compress/BitTreeCoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'hostTools/lzma/compress/BitTreeCoder.h')
-rw-r--r--hostTools/lzma/compress/BitTreeCoder.h290
1 files changed, 290 insertions, 0 deletions
diff --git a/hostTools/lzma/compress/BitTreeCoder.h b/hostTools/lzma/compress/BitTreeCoder.h
new file mode 100644
index 0000000..a77f32f
--- /dev/null
+++ b/hostTools/lzma/compress/BitTreeCoder.h
@@ -0,0 +1,290 @@
+#ifndef __BITTREECODER_H
+#define __BITTREECODER_H
+
+#include "AriBitCoder.h"
+#include "RCDefs.h"
+
+//////////////////////////
+// CBitTreeEncoder
+
+template <int aNumMoveBits, UINT32 m_NumBitLevels>
+class CBitTreeEncoder
+{
+ CMyBitEncoder<aNumMoveBits> m_Models[1 << m_NumBitLevels];
+public:
+ void Init()
+ {
+ for(UINT32 i = 1; i < (1 << m_NumBitLevels); i++)
+ m_Models[i].Init();
+ }
+ void Encode(CMyRangeEncoder *aRangeEncoder, UINT32 aSymbol)
+ {
+ UINT32 aModelIndex = 1;
+ for (UINT32 aBitIndex = m_NumBitLevels; aBitIndex > 0 ;)
+ {
+ aBitIndex--;
+ UINT32 aBit = (aSymbol >> aBitIndex ) & 1;
+ m_Models[aModelIndex].Encode(aRangeEncoder, aBit);
+ aModelIndex = (aModelIndex << 1) | aBit;
+ }
+ };
+ UINT32 GetPrice(UINT32 aSymbol) const
+ {
+ UINT32 aPrice = 0;
+ UINT32 aModelIndex = 1;
+ for (UINT32 aBitIndex = m_NumBitLevels; aBitIndex > 0 ;)
+ {
+ aBitIndex--;
+ UINT32 aBit = (aSymbol >> aBitIndex ) & 1;
+ aPrice += m_Models[aModelIndex].GetPrice(aBit);
+ aModelIndex = (aModelIndex << 1) + aBit;
+ }
+ return aPrice;
+ }
+};
+
+//////////////////////////
+// CBitTreeDecoder
+
+template <int aNumMoveBits, UINT32 m_NumBitLevels>
+class CBitTreeDecoder
+{
+ CMyBitDecoder<aNumMoveBits> m_Models[1 << m_NumBitLevels];
+public:
+ void Init()
+ {
+ for(UINT32 i = 1; i < (1 << m_NumBitLevels); i++)
+ m_Models[i].Init();
+ }
+ UINT32 Decode(CMyRangeDecoder *aRangeDecoder)
+ {
+ UINT32 aModelIndex = 1;
+ RC_INIT_VAR
+ for(UINT32 aBitIndex = m_NumBitLevels; aBitIndex > 0; aBitIndex--)
+ {
+ // aModelIndex = (aModelIndex << 1) + m_Models[aModelIndex].Decode(aRangeDecoder);
+ RC_GETBIT(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex)
+ }
+ RC_FLUSH_VAR
+ return aModelIndex - (1 << m_NumBitLevels);
+ };
+};
+
+
+
+////////////////////////////////
+// CReverseBitTreeEncoder
+
+template <int aNumMoveBits>
+class CReverseBitTreeEncoder2
+{
+ CMyBitEncoder<aNumMoveBits> *m_Models;
+ UINT32 m_NumBitLevels;
+public:
+ CReverseBitTreeEncoder2(): m_Models(0) { }
+ ~CReverseBitTreeEncoder2() { delete []m_Models; }
+ bool Create(UINT32 aNumBitLevels)
+ {
+ m_NumBitLevels = aNumBitLevels;
+ m_Models = new CMyBitEncoder<aNumMoveBits>[1 << aNumBitLevels];
+ return (m_Models != 0);
+ }
+ void Init()
+ {
+ UINT32 aNumModels = 1 << m_NumBitLevels;
+ for(UINT32 i = 1; i < aNumModels; i++)
+ m_Models[i].Init();
+ }
+ void Encode(CMyRangeEncoder *aRangeEncoder, UINT32 aSymbol)
+ {
+ UINT32 aModelIndex = 1;
+ for (UINT32 i = 0; i < m_NumBitLevels; i++)
+ {
+ UINT32 aBit = aSymbol & 1;
+ m_Models[aModelIndex].Encode(aRangeEncoder, aBit);
+ aModelIndex = (aModelIndex << 1) | aBit;
+ aSymbol >>= 1;
+ }
+ }
+ UINT32 GetPrice(UINT32 aSymbol) const
+ {
+ UINT32 aPrice = 0;
+ UINT32 aModelIndex = 1;
+ for (UINT32 i = m_NumBitLevels; i > 0; i--)
+ {
+ UINT32 aBit = aSymbol & 1;
+ aSymbol >>= 1;
+ aPrice += m_Models[aModelIndex].GetPrice(aBit);
+ aModelIndex = (aModelIndex << 1) | aBit;
+ }
+ return aPrice;
+ }
+};
+
+/*
+template <int aNumMoveBits, int aNumBitLevels>
+class CReverseBitTreeEncoder: public CReverseBitTreeEncoder2<aNumMoveBits>
+{
+public:
+ CReverseBitTreeEncoder()
+ { Create(aNumBitLevels); }
+};
+*/
+////////////////////////////////
+// CReverseBitTreeDecoder
+
+template <int aNumMoveBits>
+class CReverseBitTreeDecoder2
+{
+ CMyBitDecoder<aNumMoveBits> *m_Models;
+ UINT32 m_NumBitLevels;
+public:
+ CReverseBitTreeDecoder2(): m_Models(0) { }
+ ~CReverseBitTreeDecoder2() { delete []m_Models; }
+ bool Create(UINT32 aNumBitLevels)
+ {
+ m_NumBitLevels = aNumBitLevels;
+ m_Models = new CMyBitDecoder<aNumMoveBits>[1 << aNumBitLevels];
+ return (m_Models != 0);
+ }
+ void Init()
+ {
+ UINT32 aNumModels = 1 << m_NumBitLevels;
+ for(UINT32 i = 1; i < aNumModels; i++)
+ m_Models[i].Init();
+ }
+ UINT32 Decode(CMyRangeDecoder *aRangeDecoder)
+ {
+ UINT32 aModelIndex = 1;
+ UINT32 aSymbol = 0;
+ RC_INIT_VAR
+ for(UINT32 aBitIndex = 0; aBitIndex < m_NumBitLevels; aBitIndex++)
+ {
+ // UINT32 aBit = m_Models[aModelIndex].Decode(aRangeDecoder);
+ // aModelIndex <<= 1;
+ // aModelIndex += aBit;
+ // aSymbol |= (aBit << aBitIndex);
+ RC_GETBIT2(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex, ; , aSymbol |= (1 << aBitIndex))
+ }
+ RC_FLUSH_VAR
+ return aSymbol;
+ };
+};
+////////////////////////////
+// CReverseBitTreeDecoder2
+
+template <int aNumMoveBits, UINT32 m_NumBitLevels>
+class CReverseBitTreeDecoder
+{
+ CMyBitDecoder<aNumMoveBits> m_Models[1 << m_NumBitLevels];
+public:
+ void Init()
+ {
+ for(UINT32 i = 1; i < (1 << m_NumBitLevels); i++)
+ m_Models[i].Init();
+ }
+ UINT32 Decode(CMyRangeDecoder *aRangeDecoder)
+ {
+ UINT32 aModelIndex = 1;
+ UINT32 aSymbol = 0;
+ RC_INIT_VAR
+ for(UINT32 aBitIndex = 0; aBitIndex < m_NumBitLevels; aBitIndex++)
+ {
+ // UINT32 aBit = m_Models[aModelIndex].Decode(aRangeDecoder);
+ // aModelIndex <<= 1;
+ // aModelIndex += aBit;
+ // aSymbol |= (aBit << aBitIndex);
+ RC_GETBIT2(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex, ; , aSymbol |= (1 << aBitIndex))
+ }
+ RC_FLUSH_VAR
+ return aSymbol;
+ }
+};
+
+/*
+//////////////////////////
+// CBitTreeEncoder2
+
+template <int aNumMoveBits>
+class CBitTreeEncoder2
+{
+ NCompression::NArithmetic::CBitEncoder<aNumMoveBits> *m_Models;
+ UINT32 m_NumBitLevels;
+public:
+ bool Create(UINT32 aNumBitLevels)
+ {
+ m_NumBitLevels = aNumBitLevels;
+ m_Models = new NCompression::NArithmetic::CBitEncoder<aNumMoveBits>[1 << aNumBitLevels];
+ return (m_Models != 0);
+ }
+ void Init()
+ {
+ UINT32 aNumModels = 1 << m_NumBitLevels;
+ for(UINT32 i = 1; i < aNumModels; i++)
+ m_Models[i].Init();
+ }
+ void Encode(CMyRangeEncoder *aRangeEncoder, UINT32 aSymbol)
+ {
+ UINT32 aModelIndex = 1;
+ for (UINT32 aBitIndex = m_NumBitLevels; aBitIndex > 0 ;)
+ {
+ aBitIndex--;
+ UINT32 aBit = (aSymbol >> aBitIndex ) & 1;
+ m_Models[aModelIndex].Encode(aRangeEncoder, aBit);
+ aModelIndex = (aModelIndex << 1) | aBit;
+ }
+ }
+ UINT32 GetPrice(UINT32 aSymbol) const
+ {
+ UINT32 aPrice = 0;
+ UINT32 aModelIndex = 1;
+ for (UINT32 aBitIndex = m_NumBitLevels; aBitIndex > 0 ;)
+ {
+ aBitIndex--;
+ UINT32 aBit = (aSymbol >> aBitIndex ) & 1;
+ aPrice += m_Models[aModelIndex].GetPrice(aBit);
+ aModelIndex = (aModelIndex << 1) + aBit;
+ }
+ return aPrice;
+ }
+};
+
+
+//////////////////////////
+// CBitTreeDecoder2
+
+template <int aNumMoveBits>
+class CBitTreeDecoder2
+{
+ NCompression::NArithmetic::CBitDecoder<aNumMoveBits> *m_Models;
+ UINT32 m_NumBitLevels;
+public:
+ bool Create(UINT32 aNumBitLevels)
+ {
+ m_NumBitLevels = aNumBitLevels;
+ m_Models = new NCompression::NArithmetic::CBitDecoder<aNumMoveBits>[1 << aNumBitLevels];
+ return (m_Models != 0);
+ }
+ void Init()
+ {
+ UINT32 aNumModels = 1 << m_NumBitLevels;
+ for(UINT32 i = 1; i < aNumModels; i++)
+ m_Models[i].Init();
+ }
+ UINT32 Decode(CMyRangeDecoder *aRangeDecoder)
+ {
+ UINT32 aModelIndex = 1;
+ RC_INIT_VAR
+ for(UINT32 aBitIndex = m_NumBitLevels; aBitIndex > 0; aBitIndex--)
+ {
+ // aModelIndex = (aModelIndex << 1) + m_Models[aModelIndex].Decode(aRangeDecoder);
+ RC_GETBIT(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex)
+ }
+ RC_FLUSH_VAR
+ return aModelIndex - (1 << m_NumBitLevels);
+ }
+};
+*/
+
+
+#endif