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 11namespace NCoderMixer { 12 13struct 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 43class 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); 55public: 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); 70 void SetProgressCoderIndex(int coderIndex) { _progressCoderIndex = coderIndex; } 71 72 void ReInit(); 73 void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) 74 { _coders[coderIndex].SetCoderInfo(inSizes, outSizes); } 75 UInt64 GetWriteProcessedSize(UInt32 binderIndex) const 76 { return _streamBinders[binderIndex].ProcessedSize; } 77}; 78 79} 80#endif 81