3 #ifndef __COMPRESS_BCJ2_CODER_H
\r
4 #define __COMPRESS_BCJ2_CODER_H
\r
6 #include "../../Common/MyCom.h"
\r
8 #include "../ICoder.h"
\r
10 #include "RangeCoderBit.h"
\r
12 namespace NCompress {
\r
15 const int kNumMoveBits = 5;
\r
17 #ifndef EXTRACT_ONLY
\r
20 public ICompressCoder2,
\r
21 public CMyUnknownImp
\r
26 COutBuffer _mainStream;
\r
27 COutBuffer _callStream;
\r
28 COutBuffer _jumpStream;
\r
29 NCompress::NRangeCoder::CEncoder _rangeEncoder;
\r
30 NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusEncoder[256 + 2];
\r
34 void ReleaseStreams()
\r
36 _mainStream.ReleaseStream();
\r
37 _callStream.ReleaseStream();
\r
38 _jumpStream.ReleaseStream();
\r
39 _rangeEncoder.ReleaseStream();
\r
42 class CCoderReleaser
\r
46 CCoderReleaser(CEncoder *coder): _coder(coder) {}
\r
47 ~CCoderReleaser() { _coder->ReleaseStreams(); }
\r
53 HRESULT CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
\r
54 ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
\r
55 ICompressProgressInfo *progress);
\r
56 STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
\r
57 ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
\r
58 ICompressProgressInfo *progress);
\r
59 CEncoder(): _buffer(0) {};
\r
66 public ICompressCoder2,
\r
67 public ICompressSetBufSize,
\r
68 public CMyUnknownImp
\r
70 CInBuffer _mainInStream;
\r
71 CInBuffer _callStream;
\r
72 CInBuffer _jumpStream;
\r
73 NCompress::NRangeCoder::CDecoder _rangeDecoder;
\r
74 NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusDecoder[256 + 2];
\r
76 COutBuffer _outStream;
\r
77 UInt32 _inBufSizes[4];
\r
81 void ReleaseStreams()
\r
83 _mainInStream.ReleaseStream();
\r
84 _callStream.ReleaseStream();
\r
85 _jumpStream.ReleaseStream();
\r
86 _rangeDecoder.ReleaseStream();
\r
87 _outStream.ReleaseStream();
\r
90 HRESULT Flush() { return _outStream.Flush(); }
\r
91 class CCoderReleaser
\r
95 CCoderReleaser(CDecoder *coder): _coder(coder) {}
\r
96 ~CCoderReleaser() { _coder->ReleaseStreams(); }
\r
100 MY_UNKNOWN_IMP1(ICompressSetBufSize);
\r
101 HRESULT CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
\r
102 ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
\r
103 ICompressProgressInfo *progress);
\r
104 STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
\r
105 ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
\r
106 ICompressProgressInfo *progress);
\r
108 STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
\r
109 STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
\r