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