1// CoderMixer2.h
2
3#ifndef __CODER_MIXER2_H
4#define __CODER_MIXER2_H
5
6#include "../../../Common/MyVector.h"
7#include "../../../Common/Types.h"
8#include "../../../Common/MyCom.h"
9#include "../../ICoder.h"
10
11namespace NCoderMixer {
12
13struct CBindPair
14{
15  UInt32 InIndex;
16  UInt32 OutIndex;
17};
18
19struct CCoderStreamsInfo
20{
21  UInt32 NumInStreams;
22  UInt32 NumOutStreams;
23};
24
25struct CBindInfo
26{
27  CRecordVector<CCoderStreamsInfo> Coders;
28  CRecordVector<CBindPair> BindPairs;
29  CRecordVector<UInt32> InStreams;
30  CRecordVector<UInt32> OutStreams;
31
32  void Clear()
33  {
34    Coders.Clear();
35    BindPairs.Clear();
36    InStreams.Clear();
37    OutStreams.Clear();
38  }
39
40  /*
41  UInt32 GetCoderStartOutStream(UInt32 coderIndex) const
42  {
43    UInt32 numOutStreams = 0;
44    for (UInt32 i = 0; i < coderIndex; i++)
45      numOutStreams += Coders[i].NumOutStreams;
46    return numOutStreams;
47  }
48  */
49
50
51  void GetNumStreams(UInt32 &numInStreams, UInt32 &numOutStreams) const
52  {
53    numInStreams = 0;
54    numOutStreams = 0;
55    for (int i = 0; i < Coders.Size(); i++)
56    {
57      const CCoderStreamsInfo &coderStreamsInfo = Coders[i];
58      numInStreams += coderStreamsInfo.NumInStreams;
59      numOutStreams += coderStreamsInfo.NumOutStreams;
60    }
61  }
62
63  int FindBinderForInStream(UInt32 inStream) const
64  {
65    for (int i = 0; i < BindPairs.Size(); i++)
66      if (BindPairs[i].InIndex == inStream)
67        return i;
68    return -1;
69  }
70  int FindBinderForOutStream(UInt32 outStream) const
71  {
72    for (int i = 0; i < BindPairs.Size(); i++)
73      if (BindPairs[i].OutIndex == outStream)
74        return i;
75    return -1;
76  }
77
78  UInt32 GetCoderInStreamIndex(UInt32 coderIndex) const
79  {
80    UInt32 streamIndex = 0;
81    for (UInt32 i = 0; i < coderIndex; i++)
82      streamIndex += Coders[i].NumInStreams;
83    return streamIndex;
84  }
85
86  UInt32 GetCoderOutStreamIndex(UInt32 coderIndex) const
87  {
88    UInt32 streamIndex = 0;
89    for (UInt32 i = 0; i < coderIndex; i++)
90      streamIndex += Coders[i].NumOutStreams;
91    return streamIndex;
92  }
93
94
95  void FindInStream(UInt32 streamIndex, UInt32 &coderIndex,
96      UInt32 &coderStreamIndex) const
97  {
98    for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)
99    {
100      UInt32 curSize = Coders[coderIndex].NumInStreams;
101      if (streamIndex < curSize)
102      {
103        coderStreamIndex = streamIndex;
104        return;
105      }
106      streamIndex -= curSize;
107    }
108    throw 1;
109  }
110  void FindOutStream(UInt32 streamIndex, UInt32 &coderIndex,
111      UInt32 &coderStreamIndex) const
112  {
113    for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)
114    {
115      UInt32 curSize = Coders[coderIndex].NumOutStreams;
116      if (streamIndex < curSize)
117      {
118        coderStreamIndex = streamIndex;
119        return;
120      }
121      streamIndex -= curSize;
122    }
123    throw 1;
124  }
125};
126
127class CBindReverseConverter
128{
129  UInt32 _numSrcOutStreams;
130  NCoderMixer::CBindInfo _srcBindInfo;
131  CRecordVector<UInt32> _srcInToDestOutMap;
132  CRecordVector<UInt32> _srcOutToDestInMap;
133  CRecordVector<UInt32> _destInToSrcOutMap;
134public:
135  UInt32 NumSrcInStreams;
136  CRecordVector<UInt32> DestOutToSrcInMap;
137
138  CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo);
139  void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo);
140};
141
142struct CCoderInfo2
143{
144  CMyComPtr<ICompressCoder> Coder;
145  CMyComPtr<ICompressCoder2> Coder2;
146  UInt32 NumInStreams;
147  UInt32 NumOutStreams;
148
149  CRecordVector<UInt64> InSizes;
150  CRecordVector<UInt64> OutSizes;
151  CRecordVector<const UInt64 *> InSizePointers;
152  CRecordVector<const UInt64 *> OutSizePointers;
153
154  CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams);
155  void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);
156
157  HRESULT QueryInterface(REFGUID iid, void** pp) const
158  {
159    IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2;
160    return p->QueryInterface(iid, pp);
161  }
162};
163
164class CCoderMixer2
165{
166public:
167  virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0;
168  virtual void ReInit() = 0;
169  virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0;
170};
171
172}
173#endif
174
175