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