Upload 2.0.2
[physicsfs] / lzma / CPP / 7zip / Archive / Common / CoderMixer2.h
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
11 namespace NCoderMixer {
12
13 struct CBindPair
14 {
15   UInt32 InIndex;
16   UInt32 OutIndex;
17 };
18
19 struct CCoderStreamsInfo
20 {
21   UInt32 NumInStreams;
22   UInt32 NumOutStreams;
23 };
24
25 struct 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
127 class CBindReverseConverter
128 {
129   UInt32 _numSrcOutStreams;
130   NCoderMixer::CBindInfo _srcBindInfo;
131   CRecordVector<UInt32> _srcInToDestOutMap;
132   CRecordVector<UInt32> _srcOutToDestInMap;
133   CRecordVector<UInt32> _destInToSrcOutMap;
134 public:
135   UInt32 NumSrcInStreams;
136   CRecordVector<UInt32> DestOutToSrcInMap;
137
138   CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo);
139   void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo);
140 };
141
142 struct 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
164 class CCoderMixer2
165 {
166 public:
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