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 int kNumMoveBits = 5;
16
17#ifndef EXTRACT_ONLY
18
19class CEncoder:
20  public ICompressCoder2,
21  public CMyUnknownImp
22{
23  Byte *_buffer;
24  bool Create();
25
26  COutBuffer _mainStream;
27  COutBuffer _callStream;
28  COutBuffer _jumpStream;
29  NCompress::NRangeCoder::CEncoder _rangeEncoder;
30  NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusEncoder[256 + 2];
31
32  HRESULT Flush();
33public:
34  void ReleaseStreams()
35  {
36    _mainStream.ReleaseStream();
37    _callStream.ReleaseStream();
38    _jumpStream.ReleaseStream();
39    _rangeEncoder.ReleaseStream();
40  }
41
42  class CCoderReleaser
43  {
44    CEncoder *_coder;
45  public:
46    CCoderReleaser(CEncoder *coder): _coder(coder) {}
47    ~CCoderReleaser() {  _coder->ReleaseStreams(); }
48  };
49
50public:
51  MY_UNKNOWN_IMP
52
53  HRESULT CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
54      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
55      ICompressProgressInfo *progress);
56  STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
57      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
58      ICompressProgressInfo *progress);
59  CEncoder(): _buffer(0) {};
60  ~CEncoder();
61};
62
63#endif
64
65class CDecoder:
66  public ICompressCoder2,
67  public ICompressSetBufSize,
68  public CMyUnknownImp
69{
70  CInBuffer _mainInStream;
71  CInBuffer _callStream;
72  CInBuffer _jumpStream;
73  NCompress::NRangeCoder::CDecoder _rangeDecoder;
74  NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusDecoder[256 + 2];
75
76  COutBuffer _outStream;
77  UInt32 _inBufSizes[4];
78  UInt32 _outBufSize;
79
80public:
81  void ReleaseStreams()
82  {
83    _mainInStream.ReleaseStream();
84    _callStream.ReleaseStream();
85    _jumpStream.ReleaseStream();
86    _rangeDecoder.ReleaseStream();
87    _outStream.ReleaseStream();
88  }
89
90  HRESULT Flush() { return _outStream.Flush(); }
91  class CCoderReleaser
92  {
93    CDecoder *_coder;
94  public:
95    CCoderReleaser(CDecoder *coder): _coder(coder) {}
96    ~CCoderReleaser()  { _coder->ReleaseStreams(); }
97  };
98
99public:
100  MY_UNKNOWN_IMP1(ICompressSetBufSize);
101  HRESULT CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
102      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
103      ICompressProgressInfo *progress);
104  STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
105      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
106      ICompressProgressInfo *progress);
107
108  STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
109  STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
110  CDecoder();
111};
112
113}}
114
115#endif
116