summaryrefslogtreecommitdiffstats
path: root/hostTools/lzma/decompress/LenCoder.h
blob: 40552b85758c78d709393d5e17cc34770deacd2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#ifndef __LENCODER_H
#define __LENCODER_H

#include "BitTreeCoder.h"


#define kNumPosStatesBitsMax 4
#define kNumPosStatesMax 16


#define kNumPosStatesBitsEncodingMax 4
#define kNumPosStatesEncodingMax 16


//#define kNumMoveBits 5

#define kNumLenBits 3
#define kNumLowSymbols (1 << kNumLenBits)

#define kNumMidBits 3
#define kNumMidSymbols (1 << kNumMidBits)

#define kNumHighBits 8

#define kNumSymbolsTotal (kNumLowSymbols + kNumMidSymbols + (1 << kNumHighBits))

typedef struct LenDecoder
{
  CBitDecoder       m_Choice;
  CBitDecoder       m_Choice2;
  CBitTreeDecoder   m_LowCoder[kNumPosStatesMax];
  CBitTreeDecoder   m_MidCoder[kNumPosStatesMax];
  CBitTreeDecoder   m_HighCoder; 
  UINT32            m_NumPosStates;
} LenDecoder;

INLINE void LenDecoderCreate(LenDecoder *lenCoder, UINT32 aNumPosStates)
  { 
    lenCoder->m_NumPosStates = aNumPosStates; 
  }

INLINE void LenDecoderInit(LenDecoder *lenCoder)
  {
    UINT32 aPosState;
    BitDecoderInit(&lenCoder->m_Choice);
    for (aPosState = 0; aPosState < lenCoder->m_NumPosStates; aPosState++)
    {
      BitTreeDecoderInit(&lenCoder->m_LowCoder[aPosState],kNumLenBits);
      BitTreeDecoderInit(&lenCoder->m_MidCoder[aPosState],kNumMidBits);
    }
    BitTreeDecoderInit(&lenCoder->m_HighCoder,kNumHighBits);
    BitDecoderInit(&lenCoder->m_Choice2);
  }

INLINE UINT32 LenDecode(ISequentialInStream *in_stream, LenDecoder *lenCoder, CRangeDecoder *aRangeDecoder, UINT32 aPosState)
  {
    if(BitDecode(in_stream, &lenCoder->m_Choice, aRangeDecoder) == 0)
      return BitTreeDecode(in_stream, &lenCoder->m_LowCoder[aPosState],aRangeDecoder);
    else
    {
      UINT32 aSymbol = kNumLowSymbols;
      if(BitDecode(in_stream, &lenCoder->m_Choice2, aRangeDecoder) == 0)
        aSymbol += BitTreeDecode(in_stream, &lenCoder->m_MidCoder[aPosState],aRangeDecoder);
      else
      {
        aSymbol += kNumMidSymbols;
        aSymbol += BitTreeDecode(in_stream, &lenCoder->m_HighCoder,aRangeDecoder);
      }
      return aSymbol;
    }
  }



#endif