rlm@1: // Bcj2Coder.h rlm@1: rlm@1: #ifndef __COMPRESS_BCJ2_CODER_H rlm@1: #define __COMPRESS_BCJ2_CODER_H rlm@1: rlm@1: #include "../../Common/MyCom.h" rlm@1: rlm@1: #include "../ICoder.h" rlm@1: rlm@1: #include "RangeCoderBit.h" rlm@1: rlm@1: namespace NCompress { rlm@1: namespace NBcj2 { rlm@1: rlm@1: const int kNumMoveBits = 5; rlm@1: rlm@1: #ifndef EXTRACT_ONLY rlm@1: rlm@1: class CEncoder: rlm@1: public ICompressCoder2, rlm@1: public CMyUnknownImp rlm@1: { rlm@1: Byte *_buffer; rlm@1: public: rlm@1: CEncoder(): _buffer(0) {}; rlm@1: ~CEncoder(); rlm@1: bool Create(); rlm@1: rlm@1: COutBuffer _mainStream; rlm@1: COutBuffer _callStream; rlm@1: COutBuffer _jumpStream; rlm@1: NCompress::NRangeCoder::CEncoder _rangeEncoder; rlm@1: NCompress::NRangeCoder::CBitEncoder _statusEncoder[256 + 2]; rlm@1: rlm@1: HRESULT Flush(); rlm@1: void ReleaseStreams() rlm@1: { rlm@1: _mainStream.ReleaseStream(); rlm@1: _callStream.ReleaseStream(); rlm@1: _jumpStream.ReleaseStream(); rlm@1: _rangeEncoder.ReleaseStream(); rlm@1: } rlm@1: rlm@1: class CCoderReleaser rlm@1: { rlm@1: CEncoder *_coder; rlm@1: public: rlm@1: CCoderReleaser(CEncoder *coder): _coder(coder) {} rlm@1: ~CCoderReleaser() { _coder->ReleaseStreams(); } rlm@1: }; rlm@1: rlm@1: public: rlm@1: rlm@1: MY_UNKNOWN_IMP rlm@1: rlm@1: HRESULT CodeReal(ISequentialInStream **inStreams, rlm@1: const UInt64 **inSizes, rlm@1: UInt32 numInStreams, rlm@1: ISequentialOutStream **outStreams, rlm@1: const UInt64 **outSizes, rlm@1: UInt32 numOutStreams, rlm@1: ICompressProgressInfo *progress); rlm@1: STDMETHOD(Code)(ISequentialInStream **inStreams, rlm@1: const UInt64 **inSizes, rlm@1: UInt32 numInStreams, rlm@1: ISequentialOutStream **outStreams, rlm@1: const UInt64 **outSizes, rlm@1: UInt32 numOutStreams, rlm@1: ICompressProgressInfo *progress); rlm@1: }; rlm@1: rlm@1: #endif rlm@1: rlm@1: class CDecoder: rlm@1: public ICompressCoder2, rlm@1: public CMyUnknownImp rlm@1: { rlm@1: public: rlm@1: CInBuffer _mainInStream; rlm@1: CInBuffer _callStream; rlm@1: CInBuffer _jumpStream; rlm@1: NCompress::NRangeCoder::CDecoder _rangeDecoder; rlm@1: NCompress::NRangeCoder::CBitDecoder _statusDecoder[256 + 2]; rlm@1: rlm@1: COutBuffer _outStream; rlm@1: rlm@1: void ReleaseStreams() rlm@1: { rlm@1: _mainInStream.ReleaseStream(); rlm@1: _callStream.ReleaseStream(); rlm@1: _jumpStream.ReleaseStream(); rlm@1: _rangeDecoder.ReleaseStream(); rlm@1: _outStream.ReleaseStream(); rlm@1: } rlm@1: rlm@1: HRESULT Flush() { return _outStream.Flush(); } rlm@1: class CCoderReleaser rlm@1: { rlm@1: CDecoder *_coder; rlm@1: public: rlm@1: CCoderReleaser(CDecoder *coder): _coder(coder) {} rlm@1: ~CCoderReleaser() { _coder->ReleaseStreams(); } rlm@1: }; rlm@1: rlm@1: public: rlm@1: MY_UNKNOWN_IMP rlm@1: HRESULT CodeReal(ISequentialInStream **inStreams, rlm@1: const UInt64 **inSizes, rlm@1: UInt32 numInStreams, rlm@1: ISequentialOutStream **outStreams, rlm@1: const UInt64 **outSizes, rlm@1: UInt32 numOutStreams, rlm@1: ICompressProgressInfo *progress); rlm@1: STDMETHOD(Code)(ISequentialInStream **inStreams, rlm@1: const UInt64 **inSizes, rlm@1: UInt32 numInStreams, rlm@1: ISequentialOutStream **outStreams, rlm@1: const UInt64 **outSizes, rlm@1: UInt32 numOutStreams, rlm@1: ICompressProgressInfo *progress); rlm@1: }; rlm@1: rlm@1: }} rlm@1: rlm@1: #endif