rlm@1
|
1 // Bcj2Coder.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __COMPRESS_BCJ2_CODER_H
|
rlm@1
|
4 #define __COMPRESS_BCJ2_CODER_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "../../Common/MyCom.h"
|
rlm@1
|
7
|
rlm@1
|
8 #include "../ICoder.h"
|
rlm@1
|
9
|
rlm@1
|
10 #include "RangeCoderBit.h"
|
rlm@1
|
11
|
rlm@1
|
12 namespace NCompress {
|
rlm@1
|
13 namespace NBcj2 {
|
rlm@1
|
14
|
rlm@1
|
15 const int kNumMoveBits = 5;
|
rlm@1
|
16
|
rlm@1
|
17 #ifndef EXTRACT_ONLY
|
rlm@1
|
18
|
rlm@1
|
19 class CEncoder:
|
rlm@1
|
20 public ICompressCoder2,
|
rlm@1
|
21 public CMyUnknownImp
|
rlm@1
|
22 {
|
rlm@1
|
23 Byte *_buffer;
|
rlm@1
|
24 public:
|
rlm@1
|
25 CEncoder(): _buffer(0) {};
|
rlm@1
|
26 ~CEncoder();
|
rlm@1
|
27 bool Create();
|
rlm@1
|
28
|
rlm@1
|
29 COutBuffer _mainStream;
|
rlm@1
|
30 COutBuffer _callStream;
|
rlm@1
|
31 COutBuffer _jumpStream;
|
rlm@1
|
32 NCompress::NRangeCoder::CEncoder _rangeEncoder;
|
rlm@1
|
33 NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusEncoder[256 + 2];
|
rlm@1
|
34
|
rlm@1
|
35 HRESULT Flush();
|
rlm@1
|
36 void ReleaseStreams()
|
rlm@1
|
37 {
|
rlm@1
|
38 _mainStream.ReleaseStream();
|
rlm@1
|
39 _callStream.ReleaseStream();
|
rlm@1
|
40 _jumpStream.ReleaseStream();
|
rlm@1
|
41 _rangeEncoder.ReleaseStream();
|
rlm@1
|
42 }
|
rlm@1
|
43
|
rlm@1
|
44 class CCoderReleaser
|
rlm@1
|
45 {
|
rlm@1
|
46 CEncoder *_coder;
|
rlm@1
|
47 public:
|
rlm@1
|
48 CCoderReleaser(CEncoder *coder): _coder(coder) {}
|
rlm@1
|
49 ~CCoderReleaser() { _coder->ReleaseStreams(); }
|
rlm@1
|
50 };
|
rlm@1
|
51
|
rlm@1
|
52 public:
|
rlm@1
|
53
|
rlm@1
|
54 MY_UNKNOWN_IMP
|
rlm@1
|
55
|
rlm@1
|
56 HRESULT CodeReal(ISequentialInStream **inStreams,
|
rlm@1
|
57 const UInt64 **inSizes,
|
rlm@1
|
58 UInt32 numInStreams,
|
rlm@1
|
59 ISequentialOutStream **outStreams,
|
rlm@1
|
60 const UInt64 **outSizes,
|
rlm@1
|
61 UInt32 numOutStreams,
|
rlm@1
|
62 ICompressProgressInfo *progress);
|
rlm@1
|
63 STDMETHOD(Code)(ISequentialInStream **inStreams,
|
rlm@1
|
64 const UInt64 **inSizes,
|
rlm@1
|
65 UInt32 numInStreams,
|
rlm@1
|
66 ISequentialOutStream **outStreams,
|
rlm@1
|
67 const UInt64 **outSizes,
|
rlm@1
|
68 UInt32 numOutStreams,
|
rlm@1
|
69 ICompressProgressInfo *progress);
|
rlm@1
|
70 };
|
rlm@1
|
71
|
rlm@1
|
72 #endif
|
rlm@1
|
73
|
rlm@1
|
74 class CDecoder:
|
rlm@1
|
75 public ICompressCoder2,
|
rlm@1
|
76 public CMyUnknownImp
|
rlm@1
|
77 {
|
rlm@1
|
78 public:
|
rlm@1
|
79 CInBuffer _mainInStream;
|
rlm@1
|
80 CInBuffer _callStream;
|
rlm@1
|
81 CInBuffer _jumpStream;
|
rlm@1
|
82 NCompress::NRangeCoder::CDecoder _rangeDecoder;
|
rlm@1
|
83 NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusDecoder[256 + 2];
|
rlm@1
|
84
|
rlm@1
|
85 COutBuffer _outStream;
|
rlm@1
|
86
|
rlm@1
|
87 void ReleaseStreams()
|
rlm@1
|
88 {
|
rlm@1
|
89 _mainInStream.ReleaseStream();
|
rlm@1
|
90 _callStream.ReleaseStream();
|
rlm@1
|
91 _jumpStream.ReleaseStream();
|
rlm@1
|
92 _rangeDecoder.ReleaseStream();
|
rlm@1
|
93 _outStream.ReleaseStream();
|
rlm@1
|
94 }
|
rlm@1
|
95
|
rlm@1
|
96 HRESULT Flush() { return _outStream.Flush(); }
|
rlm@1
|
97 class CCoderReleaser
|
rlm@1
|
98 {
|
rlm@1
|
99 CDecoder *_coder;
|
rlm@1
|
100 public:
|
rlm@1
|
101 CCoderReleaser(CDecoder *coder): _coder(coder) {}
|
rlm@1
|
102 ~CCoderReleaser() { _coder->ReleaseStreams(); }
|
rlm@1
|
103 };
|
rlm@1
|
104
|
rlm@1
|
105 public:
|
rlm@1
|
106 MY_UNKNOWN_IMP
|
rlm@1
|
107 HRESULT CodeReal(ISequentialInStream **inStreams,
|
rlm@1
|
108 const UInt64 **inSizes,
|
rlm@1
|
109 UInt32 numInStreams,
|
rlm@1
|
110 ISequentialOutStream **outStreams,
|
rlm@1
|
111 const UInt64 **outSizes,
|
rlm@1
|
112 UInt32 numOutStreams,
|
rlm@1
|
113 ICompressProgressInfo *progress);
|
rlm@1
|
114 STDMETHOD(Code)(ISequentialInStream **inStreams,
|
rlm@1
|
115 const UInt64 **inSizes,
|
rlm@1
|
116 UInt32 numInStreams,
|
rlm@1
|
117 ISequentialOutStream **outStreams,
|
rlm@1
|
118 const UInt64 **outSizes,
|
rlm@1
|
119 UInt32 numOutStreams,
|
rlm@1
|
120 ICompressProgressInfo *progress);
|
rlm@1
|
121 };
|
rlm@1
|
122
|
rlm@1
|
123 }}
|
rlm@1
|
124
|
rlm@1
|
125 #endif
|