1 // CoderMixer2MT.h
2 
3 #ifndef __CODER_MIXER2_MT_H
4 #define __CODER_MIXER2_MT_H
5 
6 #include "CoderMixer2.h"
7 #include "../../../Common/MyCom.h"
8 #include "../../Common/StreamBinder.h"
9 #include "../../Common/VirtThread.h"
10 
11 namespace NCoderMixer {
12 
13 struct CCoder2: public CCoderInfo2, public CVirtThread
14 {
15   HRESULT Result;
16   CObjectVector< CMyComPtr<ISequentialInStream> > InStreams;
17   CObjectVector< CMyComPtr<ISequentialOutStream> > OutStreams;
18   CRecordVector<ISequentialInStream*> InStreamPointers;
19   CRecordVector<ISequentialOutStream*> OutStreamPointers;
20 
21   CCoder2(UInt32 numInStreams, UInt32 numOutStreams);
22   void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);
23   virtual void Execute();
24   void Code(ICompressProgressInfo *progress);
25 };
26 
27 
28 /*
29   SetBindInfo()
30   for each coder
31     AddCoder[2]()
32   SetProgressIndex(UInt32 coderIndex);
33 
34   for each file
35   {
36     ReInit()
37     for each coder
38       SetCoderInfo
39     Code
40   }
41 */
42 
43 class CCoderMixer2MT:
44   public ICompressCoder2,
45   public CCoderMixer2,
46   public CMyUnknownImp
47 {
48   CBindInfo _bindInfo;
49   CObjectVector<CStreamBinder> _streamBinders;
50   int _progressCoderIndex;
51 
52   void AddCoderCommon();
53   HRESULT Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams);
54   HRESULT ReturnIfError(HRESULT code);
55 public:
56   CObjectVector<CCoder2> _coders;
57   MY_UNKNOWN_IMP
58 
59   STDMETHOD(Code)(ISequentialInStream **inStreams,
60       const UInt64 **inSizes,
61       UInt32 numInStreams,
62       ISequentialOutStream **outStreams,
63       const UInt64 **outSizes,
64       UInt32 numOutStreams,
65       ICompressProgressInfo *progress);
66 
67   HRESULT SetBindInfo(const CBindInfo &bindInfo);
68   void AddCoder(ICompressCoder *coder);
69   void AddCoder2(ICompressCoder2 *coder);
SetProgressCoderIndex(int coderIndex)70   void SetProgressCoderIndex(int coderIndex) {  _progressCoderIndex = coderIndex; }
71 
72   void ReInit();
SetCoderInfo(UInt32 coderIndex,const UInt64 ** inSizes,const UInt64 ** outSizes)73   void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes)
74     {  _coders[coderIndex].SetCoderInfo(inSizes, outSizes); }
GetWriteProcessedSize(UInt32 binderIndex)75   UInt64 GetWriteProcessedSize(UInt32 binderIndex) const
76     {  return _streamBinders[binderIndex].ProcessedSize; }
77 };
78 
79 }
80 #endif
81