• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Bcj2Coder.h
2 
3 #ifndef __COMPRESS_BCJ2_CODER_H
4 #define __COMPRESS_BCJ2_CODER_H
5 
6 #include "../../../C/Bcj2.h"
7 
8 #include "../../Common/MyCom.h"
9 
10 #include "../ICoder.h"
11 
12 namespace NCompress {
13 namespace NBcj2 {
14 
15 class CBaseCoder
16 {
17 protected:
18   Byte *_bufs[BCJ2_NUM_STREAMS + 1];
19   UInt32 _bufsCurSizes[BCJ2_NUM_STREAMS + 1];
20   UInt32 _bufsNewSizes[BCJ2_NUM_STREAMS + 1];
21 
22   HRESULT Alloc(bool allocForOrig = true);
23 public:
24   CBaseCoder();
25   ~CBaseCoder();
26 };
27 
28 
29 #ifndef EXTRACT_ONLY
30 
31 class CEncoder:
32   public ICompressCoder2,
33   public ICompressSetCoderProperties,
34   public ICompressSetBufSize,
35   public CMyUnknownImp,
36   public CBaseCoder
37 {
38   UInt32 _relatLim;
39 
40   HRESULT CodeReal(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams,
41       ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams,
42       ICompressProgressInfo *progress);
43 
44 public:
45   MY_UNKNOWN_IMP3(ICompressCoder2, ICompressSetCoderProperties, ICompressSetBufSize)
46 
47   STDMETHOD(Code)(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams,
48       ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams,
49       ICompressProgressInfo *progress);
50 
51   STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
52 
53   STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
54   STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
55 
56   CEncoder();
57   ~CEncoder();
58 };
59 
60 #endif
61 
62 class CDecoder:
63   public ICompressCoder2,
64   public ICompressSetFinishMode,
65   public ICompressSetInStream2,
66   public ISequentialInStream,
67   public ICompressSetOutStreamSize,
68   public ICompressSetBufSize,
69   public CMyUnknownImp,
70   public CBaseCoder
71 {
72   unsigned _extraReadSizes[BCJ2_NUM_STREAMS];
73   UInt64 _inStreamsProcessed[BCJ2_NUM_STREAMS];
74   HRESULT _readRes[BCJ2_NUM_STREAMS];
75   CMyComPtr<ISequentialInStream> _inStreams[BCJ2_NUM_STREAMS];
76 
77   bool _finishMode;
78   bool _outSizeDefined;
79   UInt64 _outSize;
80   UInt64 _outSize_Processed;
81   CBcj2Dec dec;
82 
83   void InitCommon();
84   // HRESULT ReadSpec();
85 
86 public:
87   MY_UNKNOWN_IMP6(
88     ICompressCoder2,
89     ICompressSetFinishMode,
90     ICompressSetInStream2,
91     ISequentialInStream,
92     ICompressSetOutStreamSize,
93     ICompressSetBufSize
94     );
95 
96   STDMETHOD(Code)(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams,
97       ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams,
98       ICompressProgressInfo *progress);
99 
100   STDMETHOD(SetFinishMode)(UInt32 finishMode);
101 
102   STDMETHOD(SetInStream2)(UInt32 streamIndex, ISequentialInStream *inStream);
103   STDMETHOD(ReleaseInStream2)(UInt32 streamIndex);
104 
105   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
106 
107   STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
108 
109   STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
110   STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
111 
112   CDecoder();
113 };
114 
115 }}
116 
117 #endif
118