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