1
// Compress/BZip2Encoder.h
3
#ifndef __COMPRESS_BZIP2_ENCODER_H
4
#define __COMPRESS_BZIP2_ENCODER_H
6
#include "../../Common/Defs.h"
7
#include "../../Common/MyCom.h"
9
#ifdef COMPRESS_BZIP2_MT
10
#include "../../Windows/Synchronization.h"
11
#include "../../Windows/Thread.h"
14
#include "../ICoder.h"
16
#include "../Common/InBuffer.h"
17
#include "../Common/OutBuffer.h"
19
#include "BitmEncoder.h"
20
#include "BZip2Const.h"
26
class CMsbfEncoderTemp
33
void SetStream(Byte *buffer) { Buffer = buffer; }
34
Byte *GetStream() const { return Buffer; }
46
WriteBits(0, m_BitPos);
49
void WriteBits(UInt32 value, int numBits)
53
int numNewBits = MyMin(numBits, m_BitPos);
54
numBits -= numNewBits;
56
m_CurByte <<= numNewBits;
57
UInt32 newBits = value >> numBits;
58
m_CurByte |= Byte(newBits);
59
value -= (newBits << numBits);
61
m_BitPos -= numNewBits;
65
Buffer[m_Pos++] = m_CurByte;
71
UInt32 GetBytePos() const { return m_Pos ; }
72
UInt32 GetPos() const { return m_Pos * 8 + (8 - m_BitPos); }
73
Byte GetCurByte() const { return m_CurByte; }
74
void SetPos(UInt32 bitPos)
77
m_BitPos = 8 - ((int)bitPos & 7);
79
void SetCurState(int bitPos, Byte curByte)
81
m_BitPos = 8 - bitPos;
88
const int kNumPassesMax = 10;
97
UInt32 *m_BlockSorterIndex;
99
CMsbfEncoderTemp *m_OutStreamCurrent;
101
Byte Lens[kNumTablesMax][kMaxAlphaSize];
102
UInt32 Freqs[kNumTablesMax][kMaxAlphaSize];
103
UInt32 Codes[kNumTablesMax][kMaxAlphaSize];
105
Byte m_Selectors[kNumSelectorsMax];
107
UInt32 m_CRCs[1 << kNumPassesMax];
112
void WriteBits2(UInt32 value, UInt32 numBits);
113
void WriteByte2(Byte b);
114
void WriteBit2(bool v);
115
void WriteCrc2(UInt32 v);
117
void EncodeBlock(const Byte *block, UInt32 blockSize);
118
UInt32 EncodeBlockWithHeaders(const Byte *block, UInt32 blockSize);
119
void EncodeBlock2(const Byte *block, UInt32 blockSize, UInt32 numPasses);
121
bool m_OptimizeNumTables;
123
#ifdef COMPRESS_BZIP2_MT
124
NWindows::CThread Thread;
126
NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent;
127
NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent;
129
// it's not member of this thread. We just need one event per thread
130
NWindows::NSynchronization::CAutoResetEvent CanWriteEvent;
134
Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
136
void FinishStream(bool needLeave);
140
CThreadInfo(): m_BlockSorterIndex(0), m_Block(0) {}
141
~CThreadInfo() { Free(); }
145
HRESULT EncodeBlock3(UInt32 blockSize);
149
public ICompressCoder,
150
public ICompressSetCoderProperties,
151
#ifdef COMPRESS_BZIP2_MT
152
public ICompressSetCoderMt,
156
UInt32 m_BlockSizeMult;
157
bool m_OptimizeNumTables;
159
UInt32 m_NumPassesPrev;
161
UInt32 m_NumThreadsPrev;
163
CInBuffer m_InStream;
164
Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
165
CBitmEncoder<COutBuffer> m_OutStream;
167
CBZip2CombinedCrc CombinedCrc;
169
#ifdef COMPRESS_BZIP2_MT
170
CThreadInfo *ThreadsInfo;
171
NWindows::NSynchronization::CManualResetEvent CanProcessEvent;
172
NWindows::NSynchronization::CCriticalSection CS;
175
UInt32 NextBlockIndex;
178
bool StreamWasFinished;
179
NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent;
182
ICompressProgressInfo *Progress;
184
CThreadInfo ThreadsInfo;
187
UInt32 ReadRleBlock(Byte *buffer);
188
void WriteBytes(const Byte *data, UInt32 sizeInBits, Byte lastByte);
190
void WriteBits(UInt32 value, UInt32 numBits);
191
void WriteByte(Byte b);
192
void WriteBit(bool v);
193
void WriteCrc(UInt32 v);
195
#ifdef COMPRESS_BZIP2_MT
202
#ifdef COMPRESS_BZIP2_MT
206
HRESULT Flush() { return m_OutStream.Flush(); }
208
void ReleaseStreams()
210
m_InStream.ReleaseStream();
211
m_OutStream.ReleaseStream();
219
CFlusher(CEncoder *coder): _coder(coder), NeedFlush(true) {}
224
_coder->ReleaseStreams();
228
#ifdef COMPRESS_BZIP2_MT
229
MY_UNKNOWN_IMP2(ICompressSetCoderMt, ICompressSetCoderProperties)
231
MY_UNKNOWN_IMP1(ICompressSetCoderProperties)
234
HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
235
const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
237
STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
238
const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
239
STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
241
#ifdef COMPRESS_BZIP2_MT
242
STDMETHOD(SetNumberOfThreads)(UInt32 numThreads);