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