summaryrefslogtreecommitdiffstats
path: root/hostTools/lzma/compress/LenCoder.cpp
diff options
context:
space:
mode:
authorroot <root@lamia.panaceas.james.local>2015-12-19 14:18:43 +0000
committerroot <root@lamia.panaceas.james.local>2015-12-19 14:18:43 +0000
commit71478fd62d8483483abb34609cdabb7f9cbadfd6 (patch)
tree37b8eaba1ffe2d5f775227911eb0ed6fdc3c9553 /hostTools/lzma/compress/LenCoder.cpp
parent1a2238d1bddc823df06f67312d96ccf9de2893cc (diff)
downloadbootloader-71478fd62d8483483abb34609cdabb7f9cbadfd6.tar.gz
bootloader-71478fd62d8483483abb34609cdabb7f9cbadfd6.tar.bz2
bootloader-71478fd62d8483483abb34609cdabb7f9cbadfd6.zip
Add hostTools from https://github.com/Noltari/cfe_bcm63xx
Diffstat (limited to 'hostTools/lzma/compress/LenCoder.cpp')
-rw-r--r--hostTools/lzma/compress/LenCoder.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/hostTools/lzma/compress/LenCoder.cpp b/hostTools/lzma/compress/LenCoder.cpp
new file mode 100644
index 0000000..35162b2
--- /dev/null
+++ b/hostTools/lzma/compress/LenCoder.cpp
@@ -0,0 +1,73 @@
+#include "LenCoder.h"
+
+using namespace NCompression;
+using namespace NArithmetic;
+
+namespace NLength {
+
+void CEncoder::Init()
+{
+ m_Choice.Init();
+ for (UINT32 aPosState = 0; aPosState < m_NumPosStates; aPosState++)
+ {
+ m_LowCoder[aPosState].Init();
+ m_MidCoder[aPosState].Init();
+ }
+ m_Choice2.Init();
+ m_HighCoder.Init();
+}
+
+void CEncoder::Encode(CMyRangeEncoder *aRangeEncoder, UINT32 aSymbol, UINT32 aPosState)
+{
+ if(aSymbol < kNumLowSymbols)
+ {
+ m_Choice.Encode(aRangeEncoder, 0);
+ m_LowCoder[aPosState].Encode(aRangeEncoder, aSymbol);
+ }
+ else
+ {
+ aSymbol -= kNumLowSymbols;
+ m_Choice.Encode(aRangeEncoder, 1);
+ if(aSymbol < kNumMidSymbols)
+ {
+ m_Choice2.Encode(aRangeEncoder, 0);
+ m_MidCoder[aPosState].Encode(aRangeEncoder, aSymbol);
+ }
+ else
+ {
+ aSymbol -= kNumMidSymbols;
+ m_Choice2.Encode(aRangeEncoder, 1);
+ m_HighCoder.Encode(aRangeEncoder, aSymbol);
+ }
+ }
+}
+
+UINT32 CEncoder::GetPrice(UINT32 aSymbol, UINT32 aPosState) const
+{
+ UINT32 aPrice = 0;
+ if(aSymbol < kNumLowSymbols)
+ {
+ aPrice += m_Choice.GetPrice(0);
+ aPrice += m_LowCoder[aPosState].GetPrice(aSymbol);
+ }
+ else
+ {
+ aSymbol -= kNumLowSymbols;
+ aPrice += m_Choice.GetPrice(1);
+ if(aSymbol < kNumMidSymbols)
+ {
+ aPrice += m_Choice2.GetPrice(0);
+ aPrice += m_MidCoder[aPosState].GetPrice(aSymbol);
+ }
+ else
+ {
+ aSymbol -= kNumMidSymbols;
+ aPrice += m_Choice2.GetPrice(1);
+ aPrice += m_HighCoder.GetPrice(aSymbol);
+ }
+ }
+ return aPrice;
+}
+
+}
+