1// Bcj2Coder.h
2
3#ifndef __COMPRESS_BCJ2_CODER_H
4#define __COMPRESS_BCJ2_CODER_H
5
6#include "../../Common/MyCom.h"
7
8#include "../ICoder.h"
9
10#include "RangeCoderBit.h"
11
12namespace NCompress {
13namespace NBcj2 {
14
15const unsigned kNumMoveBits = 5;
16
17#ifndef EXTRACT_ONLY
18
19class CEncoder:
20  public ICompressCoder2,
21  public CMyUnknownImp
22{
23  Byte *_buf;
24
25  COutBuffer _mainStream;
26  COutBuffer _callStream;
27  COutBuffer _jumpStream;
28  NRangeCoder::CEncoder _rc;
29  NRangeCoder::CBitEncoder<kNumMoveBits> _statusEncoder[256 + 2];
30
31  HRESULT Flush();
32
33public:
34  MY_UNKNOWN_IMP
35
36  HRESULT CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
37      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
38      ICompressProgressInfo *progress);
39  STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
40      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
41      ICompressProgressInfo *progress);
42
43  CEncoder(): _buf(0) {};
44  ~CEncoder();
45};
46
47#endif
48
49class CDecoder:
50  public ICompressCoder2,
51  public ICompressSetBufSize,
52  public CMyUnknownImp
53{
54  CInBuffer _mainStream;
55  CInBuffer _callStream;
56  CInBuffer _jumpStream;
57  NRangeCoder::CDecoder _rc;
58  NRangeCoder::CBitDecoder<kNumMoveBits> _statusDecoder[256 + 2];
59
60  COutBuffer _outStream;
61  UInt32 _inBufSizes[4];
62  UInt32 _outBufSize;
63
64public:
65  MY_UNKNOWN_IMP1(ICompressSetBufSize);
66
67  HRESULT CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
68      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
69      ICompressProgressInfo *progress);
70  STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
71      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
72      ICompressProgressInfo *progress);
73
74  STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
75  STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
76
77  CDecoder();
78};
79
80}}
81
82#endif
83