diff options
author | root <root@lamia.panaceas.james.local> | 2015-12-19 14:18:43 +0000 |
---|---|---|
committer | root <root@lamia.panaceas.james.local> | 2015-12-19 14:18:43 +0000 |
commit | 71478fd62d8483483abb34609cdabb7f9cbadfd6 (patch) | |
tree | 37b8eaba1ffe2d5f775227911eb0ed6fdc3c9553 /hostTools/lzma/compress/LenCoder.cpp | |
parent | 1a2238d1bddc823df06f67312d96ccf9de2893cc (diff) | |
download | bootloader-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.cpp | 73 |
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; +} + +} + |