Home | History | Annotate | Download | only in Compress
      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 
     12 namespace NCompress {
     13 namespace NBcj2 {
     14 
     15 const int kNumMoveBits = 5;
     16 
     17 #ifndef EXTRACT_ONLY
     18 
     19 class 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();
     33 public:
     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 
     50 public:
     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 
     65 class 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 
     80 public:
     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 
     99 public:
    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