xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Common/CoderMixer2.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // CoderMixer2.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_CODER_MIXER2_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_CODER_MIXER2_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyVector.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../ICoder.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/CreateCoder.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_ST
14*f6dc9357SAndroid Build Coastguard Worker   #define USE_MIXER_ST
15*f6dc9357SAndroid Build Coastguard Worker #else
16*f6dc9357SAndroid Build Coastguard Worker   #define USE_MIXER_MT
17*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
18*f6dc9357SAndroid Build Coastguard Worker     #define USE_MIXER_ST
19*f6dc9357SAndroid Build Coastguard Worker   #endif
20*f6dc9357SAndroid Build Coastguard Worker #endif
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_MT
23*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StreamBinder.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/VirtThread.h"
25*f6dc9357SAndroid Build Coastguard Worker #endif
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_ST
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1(
32*f6dc9357SAndroid Build Coastguard Worker   CSequentialInStreamCalcSize
33*f6dc9357SAndroid Build Coastguard Worker   , ISequentialInStream
34*f6dc9357SAndroid Build Coastguard Worker )
35*f6dc9357SAndroid Build Coastguard Worker   bool _wasFinished;
36*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialInStream> _stream;
37*f6dc9357SAndroid Build Coastguard Worker   UInt64 _size;
38*f6dc9357SAndroid Build Coastguard Worker public:
SetStream(ISequentialInStream * stream)39*f6dc9357SAndroid Build Coastguard Worker   void SetStream(ISequentialInStream *stream) { _stream = stream;  }
Init()40*f6dc9357SAndroid Build Coastguard Worker   void Init()
41*f6dc9357SAndroid Build Coastguard Worker   {
42*f6dc9357SAndroid Build Coastguard Worker     _size = 0;
43*f6dc9357SAndroid Build Coastguard Worker     _wasFinished = false;
44*f6dc9357SAndroid Build Coastguard Worker   }
ReleaseStream()45*f6dc9357SAndroid Build Coastguard Worker   void ReleaseStream() { _stream.Release(); }
GetSize()46*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetSize() const { return _size; }
WasFinished()47*f6dc9357SAndroid Build Coastguard Worker   bool WasFinished() const { return _wasFinished; }
48*f6dc9357SAndroid Build Coastguard Worker };
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_2(
52*f6dc9357SAndroid Build Coastguard Worker   COutStreamCalcSize
53*f6dc9357SAndroid Build Coastguard Worker   , ISequentialOutStream
54*f6dc9357SAndroid Build Coastguard Worker   , IOutStreamFinish
55*f6dc9357SAndroid Build Coastguard Worker )
56*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialOutStream> _stream;
57*f6dc9357SAndroid Build Coastguard Worker   UInt64 _size;
58*f6dc9357SAndroid Build Coastguard Worker public:
59*f6dc9357SAndroid Build Coastguard Worker   void SetStream(ISequentialOutStream *stream) { _stream = stream; }
60*f6dc9357SAndroid Build Coastguard Worker   void ReleaseStream() { _stream.Release(); }
61*f6dc9357SAndroid Build Coastguard Worker   void Init() { _size = 0; }
62*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetSize() const { return _size; }
63*f6dc9357SAndroid Build Coastguard Worker };
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker #endif
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker 
69*f6dc9357SAndroid Build Coastguard Worker namespace NCoderMixer2 {
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker struct CBond
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker   UInt32 PackIndex;
74*f6dc9357SAndroid Build Coastguard Worker   UInt32 UnpackIndex;
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_InIndex(bool encodeMode) const { return encodeMode ? UnpackIndex : PackIndex; }
77*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_OutIndex(bool encodeMode) const { return encodeMode ? PackIndex : UnpackIndex; }
78*f6dc9357SAndroid Build Coastguard Worker };
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker 
81*f6dc9357SAndroid Build Coastguard Worker struct CCoderStreamsInfo
82*f6dc9357SAndroid Build Coastguard Worker {
83*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumStreams;
84*f6dc9357SAndroid Build Coastguard Worker };
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker 
87*f6dc9357SAndroid Build Coastguard Worker struct CBindInfo
88*f6dc9357SAndroid Build Coastguard Worker {
89*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CCoderStreamsInfo> Coders;
90*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CBond> Bonds;
91*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> PackStreams;
92*f6dc9357SAndroid Build Coastguard Worker   unsigned UnpackCoder;
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker   unsigned GetNum_Bonds_and_PackStreams() const { return Bonds.Size() + PackStreams.Size(); }
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker   int FindBond_for_PackStream(UInt32 packStream) const
97*f6dc9357SAndroid Build Coastguard Worker   {
98*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Bonds)
99*f6dc9357SAndroid Build Coastguard Worker       if (Bonds[i].PackIndex == packStream)
100*f6dc9357SAndroid Build Coastguard Worker         return (int)i;
101*f6dc9357SAndroid Build Coastguard Worker     return -1;
102*f6dc9357SAndroid Build Coastguard Worker   }
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker   int FindBond_for_UnpackStream(UInt32 unpackStream) const
105*f6dc9357SAndroid Build Coastguard Worker   {
106*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Bonds)
107*f6dc9357SAndroid Build Coastguard Worker       if (Bonds[i].UnpackIndex == unpackStream)
108*f6dc9357SAndroid Build Coastguard Worker         return (int)i;
109*f6dc9357SAndroid Build Coastguard Worker     return -1;
110*f6dc9357SAndroid Build Coastguard Worker   }
111*f6dc9357SAndroid Build Coastguard Worker 
112*f6dc9357SAndroid Build Coastguard Worker   bool SetUnpackCoder()
113*f6dc9357SAndroid Build Coastguard Worker   {
114*f6dc9357SAndroid Build Coastguard Worker     bool isOk = false;
115*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Coders)
116*f6dc9357SAndroid Build Coastguard Worker     {
117*f6dc9357SAndroid Build Coastguard Worker       if (FindBond_for_UnpackStream(i) < 0)
118*f6dc9357SAndroid Build Coastguard Worker       {
119*f6dc9357SAndroid Build Coastguard Worker         if (isOk)
120*f6dc9357SAndroid Build Coastguard Worker           return false;
121*f6dc9357SAndroid Build Coastguard Worker         UnpackCoder = i;
122*f6dc9357SAndroid Build Coastguard Worker         isOk = true;
123*f6dc9357SAndroid Build Coastguard Worker       }
124*f6dc9357SAndroid Build Coastguard Worker     }
125*f6dc9357SAndroid Build Coastguard Worker     return isOk;
126*f6dc9357SAndroid Build Coastguard Worker   }
127*f6dc9357SAndroid Build Coastguard Worker 
128*f6dc9357SAndroid Build Coastguard Worker   bool IsStream_in_PackStreams(UInt32 streamIndex) const
129*f6dc9357SAndroid Build Coastguard Worker   {
130*f6dc9357SAndroid Build Coastguard Worker     return FindStream_in_PackStreams(streamIndex) >= 0;
131*f6dc9357SAndroid Build Coastguard Worker   }
132*f6dc9357SAndroid Build Coastguard Worker 
133*f6dc9357SAndroid Build Coastguard Worker   int FindStream_in_PackStreams(UInt32 streamIndex) const
134*f6dc9357SAndroid Build Coastguard Worker   {
135*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, PackStreams)
136*f6dc9357SAndroid Build Coastguard Worker       if (PackStreams[i] == streamIndex)
137*f6dc9357SAndroid Build Coastguard Worker         return (int)i;
138*f6dc9357SAndroid Build Coastguard Worker     return -1;
139*f6dc9357SAndroid Build Coastguard Worker   }
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker   // that function is used before Maps is calculated
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetStream_for_Coder(UInt32 coderIndex) const
145*f6dc9357SAndroid Build Coastguard Worker   {
146*f6dc9357SAndroid Build Coastguard Worker     UInt32 streamIndex = 0;
147*f6dc9357SAndroid Build Coastguard Worker     for (UInt32 i = 0; i < coderIndex; i++)
148*f6dc9357SAndroid Build Coastguard Worker       streamIndex += Coders[i].NumStreams;
149*f6dc9357SAndroid Build Coastguard Worker     return streamIndex;
150*f6dc9357SAndroid Build Coastguard Worker   }
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker   // ---------- Maps Section ----------
153*f6dc9357SAndroid Build Coastguard Worker 
154*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> Coder_to_Stream;
155*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> Stream_to_Coder;
156*f6dc9357SAndroid Build Coastguard Worker 
157*f6dc9357SAndroid Build Coastguard Worker   void ClearMaps();
158*f6dc9357SAndroid Build Coastguard Worker   bool CalcMapsAndCheck();
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker   // ---------- End of Maps Section ----------
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker   void Clear()
163*f6dc9357SAndroid Build Coastguard Worker   {
164*f6dc9357SAndroid Build Coastguard Worker     Coders.Clear();
165*f6dc9357SAndroid Build Coastguard Worker     Bonds.Clear();
166*f6dc9357SAndroid Build Coastguard Worker     PackStreams.Clear();
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker     ClearMaps();
169*f6dc9357SAndroid Build Coastguard Worker   }
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker   void GetCoder_for_Stream(UInt32 streamIndex, UInt32 &coderIndex, UInt32 &coderStreamIndex) const
172*f6dc9357SAndroid Build Coastguard Worker   {
173*f6dc9357SAndroid Build Coastguard Worker     coderIndex = Stream_to_Coder[streamIndex];
174*f6dc9357SAndroid Build Coastguard Worker     coderStreamIndex = streamIndex - Coder_to_Stream[coderIndex];
175*f6dc9357SAndroid Build Coastguard Worker   }
176*f6dc9357SAndroid Build Coastguard Worker };
177*f6dc9357SAndroid Build Coastguard Worker 
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker class CCoder
181*f6dc9357SAndroid Build Coastguard Worker {
182*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CCoder)
183*f6dc9357SAndroid Build Coastguard Worker public:
184*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICompressCoder> Coder;
185*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICompressCoder2> Coder2;
186*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumStreams;
187*f6dc9357SAndroid Build Coastguard Worker   bool Finish;
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker   UInt64 UnpackSize;
190*f6dc9357SAndroid Build Coastguard Worker   const UInt64 *UnpackSizePointer;
191*f6dc9357SAndroid Build Coastguard Worker 
192*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt64> PackSizes;
193*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<const UInt64 *> PackSizePointers;
194*f6dc9357SAndroid Build Coastguard Worker 
195*f6dc9357SAndroid Build Coastguard Worker   CCoder(): Finish(false) {}
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker   void SetCoderInfo(const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish);
198*f6dc9357SAndroid Build Coastguard Worker 
199*f6dc9357SAndroid Build Coastguard Worker   HRESULT CheckDataAfterEnd(bool &dataAfterEnd_Error /* , bool &InternalPackSizeError */) const;
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker   IUnknown *GetUnknown() const
202*f6dc9357SAndroid Build Coastguard Worker   {
203*f6dc9357SAndroid Build Coastguard Worker     return Coder ? (IUnknown *)Coder : (IUnknown *)Coder2;
204*f6dc9357SAndroid Build Coastguard Worker   }
205*f6dc9357SAndroid Build Coastguard Worker 
206*f6dc9357SAndroid Build Coastguard Worker   HRESULT QueryInterface(REFGUID iid, void** pp) const
207*f6dc9357SAndroid Build Coastguard Worker   {
208*f6dc9357SAndroid Build Coastguard Worker     return GetUnknown()->QueryInterface(iid, pp);
209*f6dc9357SAndroid Build Coastguard Worker   }
210*f6dc9357SAndroid Build Coastguard Worker };
211*f6dc9357SAndroid Build Coastguard Worker 
212*f6dc9357SAndroid Build Coastguard Worker 
213*f6dc9357SAndroid Build Coastguard Worker 
214*f6dc9357SAndroid Build Coastguard Worker class CMixer
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker   bool Is_PackSize_Correct_for_Stream(UInt32 streamIndex);
217*f6dc9357SAndroid Build Coastguard Worker 
218*f6dc9357SAndroid Build Coastguard Worker protected:
219*f6dc9357SAndroid Build Coastguard Worker   CBindInfo _bi;
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker   int FindBond_for_Stream(bool forInputStream, UInt32 streamIndex) const
222*f6dc9357SAndroid Build Coastguard Worker   {
223*f6dc9357SAndroid Build Coastguard Worker     if (EncodeMode == forInputStream)
224*f6dc9357SAndroid Build Coastguard Worker       return _bi.FindBond_for_UnpackStream(streamIndex);
225*f6dc9357SAndroid Build Coastguard Worker     else
226*f6dc9357SAndroid Build Coastguard Worker       return _bi.FindBond_for_PackStream(streamIndex);
227*f6dc9357SAndroid Build Coastguard Worker   }
228*f6dc9357SAndroid Build Coastguard Worker 
229*f6dc9357SAndroid Build Coastguard Worker   CBoolVector IsFilter_Vector;
230*f6dc9357SAndroid Build Coastguard Worker   CBoolVector IsExternal_Vector;
231*f6dc9357SAndroid Build Coastguard Worker   bool EncodeMode;
232*f6dc9357SAndroid Build Coastguard Worker public:
233*f6dc9357SAndroid Build Coastguard Worker   unsigned MainCoderIndex;
234*f6dc9357SAndroid Build Coastguard Worker 
235*f6dc9357SAndroid Build Coastguard Worker   // bool InternalPackSizeError;
236*f6dc9357SAndroid Build Coastguard Worker 
237*f6dc9357SAndroid Build Coastguard Worker   CMixer(bool encodeMode):
238*f6dc9357SAndroid Build Coastguard Worker       EncodeMode(encodeMode),
239*f6dc9357SAndroid Build Coastguard Worker       MainCoderIndex(0)
240*f6dc9357SAndroid Build Coastguard Worker       // , InternalPackSizeError(false)
241*f6dc9357SAndroid Build Coastguard Worker       {}
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker   virtual ~CMixer() {}
244*f6dc9357SAndroid Build Coastguard Worker   /*
245*f6dc9357SAndroid Build Coastguard Worker   Sequence of calling:
246*f6dc9357SAndroid Build Coastguard Worker 
247*f6dc9357SAndroid Build Coastguard Worker       SetBindInfo();
248*f6dc9357SAndroid Build Coastguard Worker       for each coder
249*f6dc9357SAndroid Build Coastguard Worker         AddCoder();
250*f6dc9357SAndroid Build Coastguard Worker       SelectMainCoder();
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker       for each file
253*f6dc9357SAndroid Build Coastguard Worker       {
254*f6dc9357SAndroid Build Coastguard Worker         ReInit()
255*f6dc9357SAndroid Build Coastguard Worker         for each coder
256*f6dc9357SAndroid Build Coastguard Worker           SetCoderInfo();
257*f6dc9357SAndroid Build Coastguard Worker         Code();
258*f6dc9357SAndroid Build Coastguard Worker       }
259*f6dc9357SAndroid Build Coastguard Worker   */
260*f6dc9357SAndroid Build Coastguard Worker 
261*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT SetBindInfo(const CBindInfo &bindInfo)
262*f6dc9357SAndroid Build Coastguard Worker   {
263*f6dc9357SAndroid Build Coastguard Worker     _bi = bindInfo;
264*f6dc9357SAndroid Build Coastguard Worker     IsFilter_Vector.Clear();
265*f6dc9357SAndroid Build Coastguard Worker     MainCoderIndex = 0;
266*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
267*f6dc9357SAndroid Build Coastguard Worker   }
268*f6dc9357SAndroid Build Coastguard Worker 
269*f6dc9357SAndroid Build Coastguard Worker   virtual void AddCoder(const CCreatedCoder &cod) = 0;
270*f6dc9357SAndroid Build Coastguard Worker   virtual CCoder &GetCoder(unsigned index) = 0;
271*f6dc9357SAndroid Build Coastguard Worker   virtual void SelectMainCoder(bool useFirst) = 0;
272*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT ReInit2() = 0;
273*f6dc9357SAndroid Build Coastguard Worker   virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish) = 0;
274*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT Code(
275*f6dc9357SAndroid Build Coastguard Worker       ISequentialInStream * const *inStreams,
276*f6dc9357SAndroid Build Coastguard Worker       ISequentialOutStream * const *outStreams,
277*f6dc9357SAndroid Build Coastguard Worker       ICompressProgressInfo *progress,
278*f6dc9357SAndroid Build Coastguard Worker       bool &dataAfterEnd_Error) = 0;
279*f6dc9357SAndroid Build Coastguard Worker   virtual UInt64 GetBondStreamSize(unsigned bondIndex) const = 0;
280*f6dc9357SAndroid Build Coastguard Worker 
281*f6dc9357SAndroid Build Coastguard Worker   bool Is_UnpackSize_Correct_for_Coder(UInt32 coderIndex);
282*f6dc9357SAndroid Build Coastguard Worker   bool Is_PackSize_Correct_for_Coder(UInt32 coderIndex);
283*f6dc9357SAndroid Build Coastguard Worker   bool IsThere_ExternalCoder_in_PackTree(UInt32 coderIndex);
284*f6dc9357SAndroid Build Coastguard Worker };
285*f6dc9357SAndroid Build Coastguard Worker 
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker 
288*f6dc9357SAndroid Build Coastguard Worker 
289*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_ST
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker struct CCoderST: public CCoder
292*f6dc9357SAndroid Build Coastguard Worker {
293*f6dc9357SAndroid Build Coastguard Worker   bool CanRead;
294*f6dc9357SAndroid Build Coastguard Worker   bool CanWrite;
295*f6dc9357SAndroid Build Coastguard Worker 
296*f6dc9357SAndroid Build Coastguard Worker   CCoderST(): CanRead(false), CanWrite(false) {}
297*f6dc9357SAndroid Build Coastguard Worker };
298*f6dc9357SAndroid Build Coastguard Worker 
299*f6dc9357SAndroid Build Coastguard Worker 
300*f6dc9357SAndroid Build Coastguard Worker struct CStBinderStream
301*f6dc9357SAndroid Build Coastguard Worker {
302*f6dc9357SAndroid Build Coastguard Worker   CSequentialInStreamCalcSize *InStreamSpec;
303*f6dc9357SAndroid Build Coastguard Worker   COutStreamCalcSize *OutStreamSpec;
304*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IUnknown> StreamRef;
305*f6dc9357SAndroid Build Coastguard Worker 
306*f6dc9357SAndroid Build Coastguard Worker   CStBinderStream(): InStreamSpec(NULL), OutStreamSpec(NULL) {}
307*f6dc9357SAndroid Build Coastguard Worker };
308*f6dc9357SAndroid Build Coastguard Worker 
309*f6dc9357SAndroid Build Coastguard Worker 
310*f6dc9357SAndroid Build Coastguard Worker class CMixerST:
311*f6dc9357SAndroid Build Coastguard Worker   public IUnknown,
312*f6dc9357SAndroid Build Coastguard Worker   public CMixer,
313*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp
314*f6dc9357SAndroid Build Coastguard Worker {
315*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_0
316*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CMixerST)
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetInStream2(ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */
319*f6dc9357SAndroid Build Coastguard Worker       UInt32 outStreamIndex, ISequentialInStream **inStreamRes);
320*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetInStream(ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */
321*f6dc9357SAndroid Build Coastguard Worker       UInt32 inStreamIndex, ISequentialInStream **inStreamRes);
322*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetOutStream(ISequentialOutStream * const *outStreams, /* const UInt64 * const *outSizes, */
323*f6dc9357SAndroid Build Coastguard Worker       UInt32 outStreamIndex, ISequentialOutStream **outStreamRes);
324*f6dc9357SAndroid Build Coastguard Worker 
325*f6dc9357SAndroid Build Coastguard Worker   HRESULT FinishStream(UInt32 streamIndex);
326*f6dc9357SAndroid Build Coastguard Worker   HRESULT FinishCoder(UInt32 coderIndex);
327*f6dc9357SAndroid Build Coastguard Worker 
328*f6dc9357SAndroid Build Coastguard Worker public:
329*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CCoderST> _coders;
330*f6dc9357SAndroid Build Coastguard Worker 
331*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CStBinderStream> _binderStreams;
332*f6dc9357SAndroid Build Coastguard Worker 
333*f6dc9357SAndroid Build Coastguard Worker   CMixerST(bool encodeMode);
334*f6dc9357SAndroid Build Coastguard Worker   ~CMixerST() Z7_DESTRUCTOR_override;
335*f6dc9357SAndroid Build Coastguard Worker 
336*f6dc9357SAndroid Build Coastguard Worker   virtual void AddCoder(const CCreatedCoder &cod) Z7_override;
337*f6dc9357SAndroid Build Coastguard Worker   virtual CCoder &GetCoder(unsigned index) Z7_override;
338*f6dc9357SAndroid Build Coastguard Worker   virtual void SelectMainCoder(bool useFirst) Z7_override;
339*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT ReInit2() Z7_override;
340*f6dc9357SAndroid Build Coastguard Worker   virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish) Z7_override
341*f6dc9357SAndroid Build Coastguard Worker     { _coders[coderIndex].SetCoderInfo(unpackSize, packSizes, finish); }
342*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT Code(
343*f6dc9357SAndroid Build Coastguard Worker       ISequentialInStream * const *inStreams,
344*f6dc9357SAndroid Build Coastguard Worker       ISequentialOutStream * const *outStreams,
345*f6dc9357SAndroid Build Coastguard Worker       ICompressProgressInfo *progress,
346*f6dc9357SAndroid Build Coastguard Worker       bool &dataAfterEnd_Error) Z7_override;
347*f6dc9357SAndroid Build Coastguard Worker   virtual UInt64 GetBondStreamSize(unsigned bondIndex) const Z7_override;
348*f6dc9357SAndroid Build Coastguard Worker 
349*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetMainUnpackStream(
350*f6dc9357SAndroid Build Coastguard Worker       ISequentialInStream * const *inStreams,
351*f6dc9357SAndroid Build Coastguard Worker       ISequentialInStream **inStreamRes);
352*f6dc9357SAndroid Build Coastguard Worker };
353*f6dc9357SAndroid Build Coastguard Worker 
354*f6dc9357SAndroid Build Coastguard Worker #endif
355*f6dc9357SAndroid Build Coastguard Worker 
356*f6dc9357SAndroid Build Coastguard Worker 
357*f6dc9357SAndroid Build Coastguard Worker 
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_MT
360*f6dc9357SAndroid Build Coastguard Worker 
361*f6dc9357SAndroid Build Coastguard Worker class CCoderMT: public CCoder, public CVirtThread
362*f6dc9357SAndroid Build Coastguard Worker {
363*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CCoderMT)
364*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<ISequentialInStream*> InStreamPointers;
365*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<ISequentialOutStream*> OutStreamPointers;
366*f6dc9357SAndroid Build Coastguard Worker 
367*f6dc9357SAndroid Build Coastguard Worker private:
368*f6dc9357SAndroid Build Coastguard Worker   virtual void Execute() Z7_override;
369*f6dc9357SAndroid Build Coastguard Worker public:
370*f6dc9357SAndroid Build Coastguard Worker   bool EncodeMode;
371*f6dc9357SAndroid Build Coastguard Worker   HRESULT Result;
372*f6dc9357SAndroid Build Coastguard Worker   CObjectVector< CMyComPtr<ISequentialInStream> > InStreams;
373*f6dc9357SAndroid Build Coastguard Worker   CObjectVector< CMyComPtr<ISequentialOutStream> > OutStreams;
374*f6dc9357SAndroid Build Coastguard Worker 
375*f6dc9357SAndroid Build Coastguard Worker   void Release()
376*f6dc9357SAndroid Build Coastguard Worker   {
377*f6dc9357SAndroid Build Coastguard Worker     InStreamPointers.Clear();
378*f6dc9357SAndroid Build Coastguard Worker     OutStreamPointers.Clear();
379*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
380*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < InStreams.Size(); i++)
381*f6dc9357SAndroid Build Coastguard Worker       InStreams[i].Release();
382*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < OutStreams.Size(); i++)
383*f6dc9357SAndroid Build Coastguard Worker       OutStreams[i].Release();
384*f6dc9357SAndroid Build Coastguard Worker   }
385*f6dc9357SAndroid Build Coastguard Worker 
386*f6dc9357SAndroid Build Coastguard Worker   class CReleaser
387*f6dc9357SAndroid Build Coastguard Worker   {
388*f6dc9357SAndroid Build Coastguard Worker     Z7_CLASS_NO_COPY(CReleaser)
389*f6dc9357SAndroid Build Coastguard Worker     CCoderMT &_c;
390*f6dc9357SAndroid Build Coastguard Worker   public:
391*f6dc9357SAndroid Build Coastguard Worker     CReleaser(CCoderMT &c): _c(c) {}
392*f6dc9357SAndroid Build Coastguard Worker     ~CReleaser() { _c.Release(); }
393*f6dc9357SAndroid Build Coastguard Worker   };
394*f6dc9357SAndroid Build Coastguard Worker 
395*f6dc9357SAndroid Build Coastguard Worker   CCoderMT(): EncodeMode(false) {}
396*f6dc9357SAndroid Build Coastguard Worker   ~CCoderMT() Z7_DESTRUCTOR_override
397*f6dc9357SAndroid Build Coastguard Worker   {
398*f6dc9357SAndroid Build Coastguard Worker     /* WaitThreadFinish() will be called in ~CVirtThread().
399*f6dc9357SAndroid Build Coastguard Worker        But we need WaitThreadFinish() call before CCoder destructor,
400*f6dc9357SAndroid Build Coastguard Worker        and before destructors of this class members.
401*f6dc9357SAndroid Build Coastguard Worker     */
402*f6dc9357SAndroid Build Coastguard Worker     CVirtThread::WaitThreadFinish();
403*f6dc9357SAndroid Build Coastguard Worker   }
404*f6dc9357SAndroid Build Coastguard Worker 
405*f6dc9357SAndroid Build Coastguard Worker   void Code(ICompressProgressInfo *progress);
406*f6dc9357SAndroid Build Coastguard Worker };
407*f6dc9357SAndroid Build Coastguard Worker 
408*f6dc9357SAndroid Build Coastguard Worker 
409*f6dc9357SAndroid Build Coastguard Worker class CMixerMT:
410*f6dc9357SAndroid Build Coastguard Worker   public IUnknown,
411*f6dc9357SAndroid Build Coastguard Worker   public CMixer,
412*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp
413*f6dc9357SAndroid Build Coastguard Worker {
414*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_0
415*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CMixerMT)
416*f6dc9357SAndroid Build Coastguard Worker 
417*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CStreamBinder> _streamBinders;
418*f6dc9357SAndroid Build Coastguard Worker 
419*f6dc9357SAndroid Build Coastguard Worker   HRESULT Init(ISequentialInStream * const *inStreams, ISequentialOutStream * const *outStreams);
420*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReturnIfError(HRESULT code);
421*f6dc9357SAndroid Build Coastguard Worker 
422*f6dc9357SAndroid Build Coastguard Worker   // virtual ~CMixerMT() {}
423*f6dc9357SAndroid Build Coastguard Worker public:
424*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CCoderMT> _coders;
425*f6dc9357SAndroid Build Coastguard Worker 
426*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) Z7_override;
427*f6dc9357SAndroid Build Coastguard Worker   virtual void AddCoder(const CCreatedCoder &cod) Z7_override;
428*f6dc9357SAndroid Build Coastguard Worker   virtual CCoder &GetCoder(unsigned index) Z7_override;
429*f6dc9357SAndroid Build Coastguard Worker   virtual void SelectMainCoder(bool useFirst) Z7_override;
430*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT ReInit2() Z7_override;
431*f6dc9357SAndroid Build Coastguard Worker   virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish) Z7_override
432*f6dc9357SAndroid Build Coastguard Worker     { _coders[coderIndex].SetCoderInfo(unpackSize, packSizes, finish); }
433*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT Code(
434*f6dc9357SAndroid Build Coastguard Worker       ISequentialInStream * const *inStreams,
435*f6dc9357SAndroid Build Coastguard Worker       ISequentialOutStream * const *outStreams,
436*f6dc9357SAndroid Build Coastguard Worker       ICompressProgressInfo *progress,
437*f6dc9357SAndroid Build Coastguard Worker       bool &dataAfterEnd_Error) Z7_override;
438*f6dc9357SAndroid Build Coastguard Worker   virtual UInt64 GetBondStreamSize(unsigned bondIndex) const Z7_override;
439*f6dc9357SAndroid Build Coastguard Worker 
440*f6dc9357SAndroid Build Coastguard Worker   CMixerMT(bool encodeMode): CMixer(encodeMode) {}
441*f6dc9357SAndroid Build Coastguard Worker };
442*f6dc9357SAndroid Build Coastguard Worker 
443*f6dc9357SAndroid Build Coastguard Worker #endif
444*f6dc9357SAndroid Build Coastguard Worker 
445*f6dc9357SAndroid Build Coastguard Worker }
446*f6dc9357SAndroid Build Coastguard Worker 
447*f6dc9357SAndroid Build Coastguard Worker #endif
448