This commit is contained in:
Igor Pavlov
2023-12-22 17:17:05 +00:00
committed by Kornel
parent ec44a8a070
commit a36c48cece
954 changed files with 42199 additions and 25482 deletions

View File

@@ -1,7 +1,7 @@
// CoderMixer2.h
#ifndef __CODER_MIXER2_H
#define __CODER_MIXER2_H
#ifndef ZIP7_INC_CODER_MIXER2_H
#define ZIP7_INC_CODER_MIXER2_H
#include "../../../Common/MyCom.h"
#include "../../../Common/MyVector.h"
@@ -10,11 +10,11 @@
#include "../../Common/CreateCoder.h"
#ifdef _7ZIP_ST
#ifdef Z7_ST
#define USE_MIXER_ST
#else
#define USE_MIXER_MT
#ifndef _SFX
#ifndef Z7_SFX
#define USE_MIXER_ST
#endif
#endif
@@ -28,18 +28,13 @@
#ifdef USE_MIXER_ST
class CSequentialInStreamCalcSize:
public ISequentialInStream,
public CMyUnknownImp
{
public:
MY_UNKNOWN_IMP1(ISequentialInStream)
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
private:
Z7_CLASS_IMP_COM_1(
CSequentialInStreamCalcSize
, ISequentialInStream
)
bool _wasFinished;
CMyComPtr<ISequentialInStream> _stream;
UInt64 _size;
bool _wasFinished;
public:
void SetStream(ISequentialInStream *stream) { _stream = stream; }
void Init()
@@ -53,19 +48,14 @@ public:
};
class COutStreamCalcSize:
public ISequentialOutStream,
public IOutStreamFinish,
public CMyUnknownImp
{
Z7_CLASS_IMP_COM_2(
COutStreamCalcSize
, ISequentialOutStream
, IOutStreamFinish
)
CMyComPtr<ISequentialOutStream> _stream;
UInt64 _size;
public:
MY_UNKNOWN_IMP2(ISequentialOutStream, IOutStreamFinish)
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
STDMETHOD(OutStreamFinish)();
void SetStream(ISequentialOutStream *stream) { _stream = stream; }
void ReleaseStream() { _stream.Release(); }
void Init() { _size = 0; }
@@ -122,7 +112,7 @@ struct CBindInfo
bool SetUnpackCoder()
{
bool isOk = false;
FOR_VECTOR(i, Coders)
FOR_VECTOR (i, Coders)
{
if (FindBond_for_UnpackStream(i) < 0)
{
@@ -142,7 +132,7 @@ struct CBindInfo
int FindStream_in_PackStreams(UInt32 streamIndex) const
{
FOR_VECTOR(i, PackStreams)
FOR_VECTOR (i, PackStreams)
if (PackStreams[i] == streamIndex)
return (int)i;
return -1;
@@ -189,11 +179,12 @@ struct CBindInfo
class CCoder
{
CLASS_NO_COPY(CCoder);
Z7_CLASS_NO_COPY(CCoder)
public:
CMyComPtr<ICompressCoder> Coder;
CMyComPtr<ICompressCoder2> Coder2;
UInt32 NumStreams;
bool Finish;
UInt64 UnpackSize;
const UInt64 *UnpackSizePointer;
@@ -201,8 +192,6 @@ public:
CRecordVector<UInt64> PackSizes;
CRecordVector<const UInt64 *> PackSizePointers;
bool Finish;
CCoder(): Finish(false) {}
void SetCoderInfo(const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish);
@@ -251,7 +240,7 @@ public:
// , InternalPackSizeError(false)
{}
virtual ~CMixer() {};
virtual ~CMixer() {}
/*
Sequence of calling:
@@ -323,7 +312,8 @@ class CMixerST:
public CMixer,
public CMyUnknownImp
{
CLASS_NO_COPY(CMixerST)
Z7_COM_UNKNOWN_IMP_0
Z7_CLASS_NO_COPY(CMixerST)
HRESULT GetInStream2(ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */
UInt32 outStreamIndex, ISequentialInStream **inStreamRes);
@@ -340,23 +330,21 @@ public:
CObjectVector<CStBinderStream> _binderStreams;
MY_UNKNOWN_IMP
CMixerST(bool encodeMode);
~CMixerST();
~CMixerST() Z7_DESTRUCTOR_override;
virtual void AddCoder(const CCreatedCoder &cod);
virtual CCoder &GetCoder(unsigned index);
virtual void SelectMainCoder(bool useFirst);
virtual HRESULT ReInit2();
virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish)
virtual void AddCoder(const CCreatedCoder &cod) Z7_override;
virtual CCoder &GetCoder(unsigned index) Z7_override;
virtual void SelectMainCoder(bool useFirst) Z7_override;
virtual HRESULT ReInit2() Z7_override;
virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish) Z7_override
{ _coders[coderIndex].SetCoderInfo(unpackSize, packSizes, finish); }
virtual HRESULT Code(
ISequentialInStream * const *inStreams,
ISequentialOutStream * const *outStreams,
ICompressProgressInfo *progress,
bool &dataAfterEnd_Error);
virtual UInt64 GetBondStreamSize(unsigned bondIndex) const;
bool &dataAfterEnd_Error) Z7_override;
virtual UInt64 GetBondStreamSize(unsigned bondIndex) const Z7_override;
HRESULT GetMainUnpackStream(
ISequentialInStream * const *inStreams,
@@ -372,12 +360,12 @@ public:
class CCoderMT: public CCoder, public CVirtThread
{
CLASS_NO_COPY(CCoderMT)
Z7_CLASS_NO_COPY(CCoderMT)
CRecordVector<ISequentialInStream*> InStreamPointers;
CRecordVector<ISequentialOutStream*> OutStreamPointers;
private:
void Execute();
virtual void Execute() Z7_override;
public:
bool EncodeMode;
HRESULT Result;
@@ -397,7 +385,7 @@ public:
class CReleaser
{
CLASS_NO_COPY(CReleaser)
Z7_CLASS_NO_COPY(CReleaser)
CCoderMT &_c;
public:
CReleaser(CCoderMT &c): _c(c) {}
@@ -405,7 +393,14 @@ public:
};
CCoderMT(): EncodeMode(false) {}
virtual ~CCoderMT() { CVirtThread::WaitThreadFinish(); }
~CCoderMT() Z7_DESTRUCTOR_override
{
/* WaitThreadFinish() will be called in ~CVirtThread().
But we need WaitThreadFinish() call before CCoder destructor,
and before destructors of this class members.
*/
CVirtThread::WaitThreadFinish();
}
void Code(ICompressProgressInfo *progress);
};
@@ -416,32 +411,31 @@ class CMixerMT:
public CMixer,
public CMyUnknownImp
{
CLASS_NO_COPY(CMixerMT)
Z7_COM_UNKNOWN_IMP_0
Z7_CLASS_NO_COPY(CMixerMT)
CObjectVector<CStreamBinder> _streamBinders;
HRESULT Init(ISequentialInStream * const *inStreams, ISequentialOutStream * const *outStreams);
HRESULT ReturnIfError(HRESULT code);
// virtual ~CMixerMT() {};
// virtual ~CMixerMT() {}
public:
CObjectVector<CCoderMT> _coders;
MY_UNKNOWN_IMP
virtual HRESULT SetBindInfo(const CBindInfo &bindInfo);
virtual void AddCoder(const CCreatedCoder &cod);
virtual CCoder &GetCoder(unsigned index);
virtual void SelectMainCoder(bool useFirst);
virtual HRESULT ReInit2();
virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish)
virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) Z7_override;
virtual void AddCoder(const CCreatedCoder &cod) Z7_override;
virtual CCoder &GetCoder(unsigned index) Z7_override;
virtual void SelectMainCoder(bool useFirst) Z7_override;
virtual HRESULT ReInit2() Z7_override;
virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish) Z7_override
{ _coders[coderIndex].SetCoderInfo(unpackSize, packSizes, finish); }
virtual HRESULT Code(
ISequentialInStream * const *inStreams,
ISequentialOutStream * const *outStreams,
ICompressProgressInfo *progress,
bool &dataAfterEnd_Error);
virtual UInt64 GetBondStreamSize(unsigned bondIndex) const;
bool &dataAfterEnd_Error) Z7_override;
virtual UInt64 GetBondStreamSize(unsigned bondIndex) const Z7_override;
CMixerMT(bool encodeMode): CMixer(encodeMode) {}
};