1*f6dc9357SAndroid Build Coastguard Worker // CoderMixer2.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "CoderMixer2.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_ST
8*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CSequentialInStreamCalcSize::Read (void * data,UInt32 size,UInt32 * processedSize))9*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CSequentialInStreamCalcSize::Read(void *data, UInt32 size, UInt32 *processedSize))
10*f6dc9357SAndroid Build Coastguard Worker {
11*f6dc9357SAndroid Build Coastguard Worker UInt32 realProcessed = 0;
12*f6dc9357SAndroid Build Coastguard Worker HRESULT result = S_OK;
13*f6dc9357SAndroid Build Coastguard Worker if (_stream)
14*f6dc9357SAndroid Build Coastguard Worker result = _stream->Read(data, size, &realProcessed);
15*f6dc9357SAndroid Build Coastguard Worker _size += realProcessed;
16*f6dc9357SAndroid Build Coastguard Worker if (size != 0 && realProcessed == 0)
17*f6dc9357SAndroid Build Coastguard Worker _wasFinished = true;
18*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
19*f6dc9357SAndroid Build Coastguard Worker *processedSize = realProcessed;
20*f6dc9357SAndroid Build Coastguard Worker return result;
21*f6dc9357SAndroid Build Coastguard Worker }
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(COutStreamCalcSize::Write (const void * data,UInt32 size,UInt32 * processedSize))24*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(COutStreamCalcSize::Write(const void *data, UInt32 size, UInt32 *processedSize))
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker HRESULT result = S_OK;
27*f6dc9357SAndroid Build Coastguard Worker if (_stream)
28*f6dc9357SAndroid Build Coastguard Worker result = _stream->Write(data, size, &size);
29*f6dc9357SAndroid Build Coastguard Worker _size += size;
30*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
31*f6dc9357SAndroid Build Coastguard Worker *processedSize = size;
32*f6dc9357SAndroid Build Coastguard Worker return result;
33*f6dc9357SAndroid Build Coastguard Worker }
34*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(COutStreamCalcSize::OutStreamFinish ())35*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(COutStreamCalcSize::OutStreamFinish())
36*f6dc9357SAndroid Build Coastguard Worker {
37*f6dc9357SAndroid Build Coastguard Worker HRESULT result = S_OK;
38*f6dc9357SAndroid Build Coastguard Worker if (_stream)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IOutStreamFinish> outStreamFinish;
41*f6dc9357SAndroid Build Coastguard Worker _stream.QueryInterface(IID_IOutStreamFinish, &outStreamFinish);
42*f6dc9357SAndroid Build Coastguard Worker if (outStreamFinish)
43*f6dc9357SAndroid Build Coastguard Worker result = outStreamFinish->OutStreamFinish();
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker return result;
46*f6dc9357SAndroid Build Coastguard Worker }
47*f6dc9357SAndroid Build Coastguard Worker
48*f6dc9357SAndroid Build Coastguard Worker #endif
49*f6dc9357SAndroid Build Coastguard Worker
50*f6dc9357SAndroid Build Coastguard Worker
51*f6dc9357SAndroid Build Coastguard Worker
52*f6dc9357SAndroid Build Coastguard Worker
53*f6dc9357SAndroid Build Coastguard Worker namespace NCoderMixer2 {
54*f6dc9357SAndroid Build Coastguard Worker
BoolVector_Fill_False(CBoolVector & v,unsigned size)55*f6dc9357SAndroid Build Coastguard Worker static void BoolVector_Fill_False(CBoolVector &v, unsigned size)
56*f6dc9357SAndroid Build Coastguard Worker {
57*f6dc9357SAndroid Build Coastguard Worker v.ClearAndSetSize(size);
58*f6dc9357SAndroid Build Coastguard Worker bool *p = &v[0];
59*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < size; i++)
60*f6dc9357SAndroid Build Coastguard Worker p[i] = false;
61*f6dc9357SAndroid Build Coastguard Worker }
62*f6dc9357SAndroid Build Coastguard Worker
63*f6dc9357SAndroid Build Coastguard Worker
CheckDataAfterEnd(bool & dataAfterEnd_Error) const64*f6dc9357SAndroid Build Coastguard Worker HRESULT CCoder::CheckDataAfterEnd(bool &dataAfterEnd_Error /* , bool &InternalPackSizeError */) const
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker if (Coder)
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker if (PackSizePointers.IsEmpty() || !PackSizePointers[0])
69*f6dc9357SAndroid Build Coastguard Worker return S_OK;
70*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressGetInStreamProcessedSize> getInStreamProcessedSize;
71*f6dc9357SAndroid Build Coastguard Worker Coder.QueryInterface(IID_ICompressGetInStreamProcessedSize, (void **)&getInStreamProcessedSize);
72*f6dc9357SAndroid Build Coastguard Worker // if (!getInStreamProcessedSize) return E_FAIL;
73*f6dc9357SAndroid Build Coastguard Worker if (getInStreamProcessedSize)
74*f6dc9357SAndroid Build Coastguard Worker {
75*f6dc9357SAndroid Build Coastguard Worker UInt64 processed;
76*f6dc9357SAndroid Build Coastguard Worker RINOK(getInStreamProcessedSize->GetInStreamProcessedSize(&processed))
77*f6dc9357SAndroid Build Coastguard Worker if (processed != (UInt64)(Int64)-1)
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker const UInt64 size = PackSizes[0];
80*f6dc9357SAndroid Build Coastguard Worker if (processed < size && Finish)
81*f6dc9357SAndroid Build Coastguard Worker dataAfterEnd_Error = true;
82*f6dc9357SAndroid Build Coastguard Worker if (processed > size)
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker // InternalPackSizeError = true;
85*f6dc9357SAndroid Build Coastguard Worker // return S_FALSE;
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker }
89*f6dc9357SAndroid Build Coastguard Worker }
90*f6dc9357SAndroid Build Coastguard Worker else if (Coder2)
91*f6dc9357SAndroid Build Coastguard Worker {
92*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressGetInStreamProcessedSize2> getInStreamProcessedSize2;
93*f6dc9357SAndroid Build Coastguard Worker Coder2.QueryInterface(IID_ICompressGetInStreamProcessedSize2, (void **)&getInStreamProcessedSize2);
94*f6dc9357SAndroid Build Coastguard Worker if (getInStreamProcessedSize2)
95*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, PackSizePointers)
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker if (!PackSizePointers[i])
98*f6dc9357SAndroid Build Coastguard Worker continue;
99*f6dc9357SAndroid Build Coastguard Worker UInt64 processed;
100*f6dc9357SAndroid Build Coastguard Worker RINOK(getInStreamProcessedSize2->GetInStreamProcessedSize2(i, &processed))
101*f6dc9357SAndroid Build Coastguard Worker if (processed != (UInt64)(Int64)-1)
102*f6dc9357SAndroid Build Coastguard Worker {
103*f6dc9357SAndroid Build Coastguard Worker const UInt64 size = PackSizes[i];
104*f6dc9357SAndroid Build Coastguard Worker if (processed < size && Finish)
105*f6dc9357SAndroid Build Coastguard Worker dataAfterEnd_Error = true;
106*f6dc9357SAndroid Build Coastguard Worker else if (processed > size)
107*f6dc9357SAndroid Build Coastguard Worker {
108*f6dc9357SAndroid Build Coastguard Worker // InternalPackSizeError = true;
109*f6dc9357SAndroid Build Coastguard Worker // return S_FALSE;
110*f6dc9357SAndroid Build Coastguard Worker }
111*f6dc9357SAndroid Build Coastguard Worker }
112*f6dc9357SAndroid Build Coastguard Worker }
113*f6dc9357SAndroid Build Coastguard Worker }
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Worker return S_OK;
116*f6dc9357SAndroid Build Coastguard Worker }
117*f6dc9357SAndroid Build Coastguard Worker
118*f6dc9357SAndroid Build Coastguard Worker
119*f6dc9357SAndroid Build Coastguard Worker
120*f6dc9357SAndroid Build Coastguard Worker class CBondsChecks
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker CBoolVector _coderUsed;
123*f6dc9357SAndroid Build Coastguard Worker
124*f6dc9357SAndroid Build Coastguard Worker bool Init();
125*f6dc9357SAndroid Build Coastguard Worker bool CheckCoder(unsigned coderIndex);
126*f6dc9357SAndroid Build Coastguard Worker public:
127*f6dc9357SAndroid Build Coastguard Worker const CBindInfo *BindInfo;
128*f6dc9357SAndroid Build Coastguard Worker
129*f6dc9357SAndroid Build Coastguard Worker bool Check();
130*f6dc9357SAndroid Build Coastguard Worker };
131*f6dc9357SAndroid Build Coastguard Worker
CheckCoder(unsigned coderIndex)132*f6dc9357SAndroid Build Coastguard Worker bool CBondsChecks::CheckCoder(unsigned coderIndex)
133*f6dc9357SAndroid Build Coastguard Worker {
134*f6dc9357SAndroid Build Coastguard Worker const CCoderStreamsInfo &coder = BindInfo->Coders[coderIndex];
135*f6dc9357SAndroid Build Coastguard Worker
136*f6dc9357SAndroid Build Coastguard Worker if (coderIndex >= _coderUsed.Size() || _coderUsed[coderIndex])
137*f6dc9357SAndroid Build Coastguard Worker return false;
138*f6dc9357SAndroid Build Coastguard Worker _coderUsed[coderIndex] = true;
139*f6dc9357SAndroid Build Coastguard Worker
140*f6dc9357SAndroid Build Coastguard Worker const UInt32 start = BindInfo->Coder_to_Stream[coderIndex];
141*f6dc9357SAndroid Build Coastguard Worker
142*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < coder.NumStreams; i++)
143*f6dc9357SAndroid Build Coastguard Worker {
144*f6dc9357SAndroid Build Coastguard Worker UInt32 ind = start + i;
145*f6dc9357SAndroid Build Coastguard Worker
146*f6dc9357SAndroid Build Coastguard Worker if (BindInfo->IsStream_in_PackStreams(ind))
147*f6dc9357SAndroid Build Coastguard Worker continue;
148*f6dc9357SAndroid Build Coastguard Worker
149*f6dc9357SAndroid Build Coastguard Worker const int bond = BindInfo->FindBond_for_PackStream(ind);
150*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
151*f6dc9357SAndroid Build Coastguard Worker return false;
152*f6dc9357SAndroid Build Coastguard Worker if (!CheckCoder(BindInfo->Bonds[(unsigned)bond].UnpackIndex))
153*f6dc9357SAndroid Build Coastguard Worker return false;
154*f6dc9357SAndroid Build Coastguard Worker }
155*f6dc9357SAndroid Build Coastguard Worker
156*f6dc9357SAndroid Build Coastguard Worker return true;
157*f6dc9357SAndroid Build Coastguard Worker }
158*f6dc9357SAndroid Build Coastguard Worker
Check()159*f6dc9357SAndroid Build Coastguard Worker bool CBondsChecks::Check()
160*f6dc9357SAndroid Build Coastguard Worker {
161*f6dc9357SAndroid Build Coastguard Worker BoolVector_Fill_False(_coderUsed, BindInfo->Coders.Size());
162*f6dc9357SAndroid Build Coastguard Worker
163*f6dc9357SAndroid Build Coastguard Worker if (!CheckCoder(BindInfo->UnpackCoder))
164*f6dc9357SAndroid Build Coastguard Worker return false;
165*f6dc9357SAndroid Build Coastguard Worker
166*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, _coderUsed)
167*f6dc9357SAndroid Build Coastguard Worker if (!_coderUsed[i])
168*f6dc9357SAndroid Build Coastguard Worker return false;
169*f6dc9357SAndroid Build Coastguard Worker
170*f6dc9357SAndroid Build Coastguard Worker return true;
171*f6dc9357SAndroid Build Coastguard Worker }
172*f6dc9357SAndroid Build Coastguard Worker
ClearMaps()173*f6dc9357SAndroid Build Coastguard Worker void CBindInfo::ClearMaps()
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker Coder_to_Stream.Clear();
176*f6dc9357SAndroid Build Coastguard Worker Stream_to_Coder.Clear();
177*f6dc9357SAndroid Build Coastguard Worker }
178*f6dc9357SAndroid Build Coastguard Worker
CalcMapsAndCheck()179*f6dc9357SAndroid Build Coastguard Worker bool CBindInfo::CalcMapsAndCheck()
180*f6dc9357SAndroid Build Coastguard Worker {
181*f6dc9357SAndroid Build Coastguard Worker ClearMaps();
182*f6dc9357SAndroid Build Coastguard Worker
183*f6dc9357SAndroid Build Coastguard Worker UInt32 numStreams = 0;
184*f6dc9357SAndroid Build Coastguard Worker
185*f6dc9357SAndroid Build Coastguard Worker if (Coders.Size() == 0)
186*f6dc9357SAndroid Build Coastguard Worker return false;
187*f6dc9357SAndroid Build Coastguard Worker if (Coders.Size() - 1 != Bonds.Size())
188*f6dc9357SAndroid Build Coastguard Worker return false;
189*f6dc9357SAndroid Build Coastguard Worker
190*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, Coders)
191*f6dc9357SAndroid Build Coastguard Worker {
192*f6dc9357SAndroid Build Coastguard Worker Coder_to_Stream.Add(numStreams);
193*f6dc9357SAndroid Build Coastguard Worker
194*f6dc9357SAndroid Build Coastguard Worker const CCoderStreamsInfo &c = Coders[i];
195*f6dc9357SAndroid Build Coastguard Worker
196*f6dc9357SAndroid Build Coastguard Worker for (unsigned j = 0; j < c.NumStreams; j++)
197*f6dc9357SAndroid Build Coastguard Worker Stream_to_Coder.Add(i);
198*f6dc9357SAndroid Build Coastguard Worker
199*f6dc9357SAndroid Build Coastguard Worker numStreams += c.NumStreams;
200*f6dc9357SAndroid Build Coastguard Worker }
201*f6dc9357SAndroid Build Coastguard Worker
202*f6dc9357SAndroid Build Coastguard Worker if (numStreams != GetNum_Bonds_and_PackStreams())
203*f6dc9357SAndroid Build Coastguard Worker return false;
204*f6dc9357SAndroid Build Coastguard Worker
205*f6dc9357SAndroid Build Coastguard Worker CBondsChecks bc;
206*f6dc9357SAndroid Build Coastguard Worker bc.BindInfo = this;
207*f6dc9357SAndroid Build Coastguard Worker return bc.Check();
208*f6dc9357SAndroid Build Coastguard Worker }
209*f6dc9357SAndroid Build Coastguard Worker
210*f6dc9357SAndroid Build Coastguard Worker
SetCoderInfo(const UInt64 * unpackSize,const UInt64 * const * packSizes,bool finish)211*f6dc9357SAndroid Build Coastguard Worker void CCoder::SetCoderInfo(const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish)
212*f6dc9357SAndroid Build Coastguard Worker {
213*f6dc9357SAndroid Build Coastguard Worker Finish = finish;
214*f6dc9357SAndroid Build Coastguard Worker
215*f6dc9357SAndroid Build Coastguard Worker if (unpackSize)
216*f6dc9357SAndroid Build Coastguard Worker {
217*f6dc9357SAndroid Build Coastguard Worker UnpackSize = *unpackSize;
218*f6dc9357SAndroid Build Coastguard Worker UnpackSizePointer = &UnpackSize;
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker else
221*f6dc9357SAndroid Build Coastguard Worker {
222*f6dc9357SAndroid Build Coastguard Worker UnpackSize = 0;
223*f6dc9357SAndroid Build Coastguard Worker UnpackSizePointer = NULL;
224*f6dc9357SAndroid Build Coastguard Worker }
225*f6dc9357SAndroid Build Coastguard Worker
226*f6dc9357SAndroid Build Coastguard Worker PackSizes.ClearAndSetSize((unsigned)NumStreams);
227*f6dc9357SAndroid Build Coastguard Worker PackSizePointers.ClearAndSetSize((unsigned)NumStreams);
228*f6dc9357SAndroid Build Coastguard Worker
229*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumStreams; i++)
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker if (packSizes && packSizes[i])
232*f6dc9357SAndroid Build Coastguard Worker {
233*f6dc9357SAndroid Build Coastguard Worker PackSizes[i] = *(packSizes[i]);
234*f6dc9357SAndroid Build Coastguard Worker PackSizePointers[i] = &PackSizes[i];
235*f6dc9357SAndroid Build Coastguard Worker }
236*f6dc9357SAndroid Build Coastguard Worker else
237*f6dc9357SAndroid Build Coastguard Worker {
238*f6dc9357SAndroid Build Coastguard Worker PackSizes[i] = 0;
239*f6dc9357SAndroid Build Coastguard Worker PackSizePointers[i] = NULL;
240*f6dc9357SAndroid Build Coastguard Worker }
241*f6dc9357SAndroid Build Coastguard Worker }
242*f6dc9357SAndroid Build Coastguard Worker }
243*f6dc9357SAndroid Build Coastguard Worker
Is_UnpackSize_Correct_for_Coder(UInt32 coderIndex)244*f6dc9357SAndroid Build Coastguard Worker bool CMixer::Is_UnpackSize_Correct_for_Coder(UInt32 coderIndex)
245*f6dc9357SAndroid Build Coastguard Worker {
246*f6dc9357SAndroid Build Coastguard Worker if (coderIndex == _bi.UnpackCoder)
247*f6dc9357SAndroid Build Coastguard Worker return true;
248*f6dc9357SAndroid Build Coastguard Worker
249*f6dc9357SAndroid Build Coastguard Worker const int bond = _bi.FindBond_for_UnpackStream(coderIndex);
250*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
251*f6dc9357SAndroid Build Coastguard Worker throw 20150213;
252*f6dc9357SAndroid Build Coastguard Worker
253*f6dc9357SAndroid Build Coastguard Worker /*
254*f6dc9357SAndroid Build Coastguard Worker UInt32 coderIndex, coderStreamIndex;
255*f6dc9357SAndroid Build Coastguard Worker _bi.GetCoder_for_Stream(_bi.Bonds[(unsigned)bond].PackIndex, coderIndex, coderStreamIndex);
256*f6dc9357SAndroid Build Coastguard Worker */
257*f6dc9357SAndroid Build Coastguard Worker const UInt32 nextCoder = _bi.Stream_to_Coder[_bi.Bonds[(unsigned)bond].PackIndex];
258*f6dc9357SAndroid Build Coastguard Worker
259*f6dc9357SAndroid Build Coastguard Worker if (!IsFilter_Vector[nextCoder])
260*f6dc9357SAndroid Build Coastguard Worker return false;
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard Worker return Is_UnpackSize_Correct_for_Coder(nextCoder);
263*f6dc9357SAndroid Build Coastguard Worker }
264*f6dc9357SAndroid Build Coastguard Worker
Is_PackSize_Correct_for_Stream(UInt32 streamIndex)265*f6dc9357SAndroid Build Coastguard Worker bool CMixer::Is_PackSize_Correct_for_Stream(UInt32 streamIndex)
266*f6dc9357SAndroid Build Coastguard Worker {
267*f6dc9357SAndroid Build Coastguard Worker if (_bi.IsStream_in_PackStreams(streamIndex))
268*f6dc9357SAndroid Build Coastguard Worker return true;
269*f6dc9357SAndroid Build Coastguard Worker
270*f6dc9357SAndroid Build Coastguard Worker const int bond = _bi.FindBond_for_PackStream(streamIndex);
271*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
272*f6dc9357SAndroid Build Coastguard Worker throw 20150213;
273*f6dc9357SAndroid Build Coastguard Worker
274*f6dc9357SAndroid Build Coastguard Worker const UInt32 nextCoder = _bi.Bonds[(unsigned)bond].UnpackIndex;
275*f6dc9357SAndroid Build Coastguard Worker
276*f6dc9357SAndroid Build Coastguard Worker if (!IsFilter_Vector[nextCoder])
277*f6dc9357SAndroid Build Coastguard Worker return false;
278*f6dc9357SAndroid Build Coastguard Worker
279*f6dc9357SAndroid Build Coastguard Worker return Is_PackSize_Correct_for_Coder(nextCoder);
280*f6dc9357SAndroid Build Coastguard Worker }
281*f6dc9357SAndroid Build Coastguard Worker
Is_PackSize_Correct_for_Coder(UInt32 coderIndex)282*f6dc9357SAndroid Build Coastguard Worker bool CMixer::Is_PackSize_Correct_for_Coder(UInt32 coderIndex)
283*f6dc9357SAndroid Build Coastguard Worker {
284*f6dc9357SAndroid Build Coastguard Worker const UInt32 startIndex = _bi.Coder_to_Stream[coderIndex];
285*f6dc9357SAndroid Build Coastguard Worker const UInt32 numStreams = _bi.Coders[coderIndex].NumStreams;
286*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numStreams; i++)
287*f6dc9357SAndroid Build Coastguard Worker if (!Is_PackSize_Correct_for_Stream(startIndex + i))
288*f6dc9357SAndroid Build Coastguard Worker return false;
289*f6dc9357SAndroid Build Coastguard Worker return true;
290*f6dc9357SAndroid Build Coastguard Worker }
291*f6dc9357SAndroid Build Coastguard Worker
IsThere_ExternalCoder_in_PackTree(UInt32 coderIndex)292*f6dc9357SAndroid Build Coastguard Worker bool CMixer::IsThere_ExternalCoder_in_PackTree(UInt32 coderIndex)
293*f6dc9357SAndroid Build Coastguard Worker {
294*f6dc9357SAndroid Build Coastguard Worker if (IsExternal_Vector[coderIndex])
295*f6dc9357SAndroid Build Coastguard Worker return true;
296*f6dc9357SAndroid Build Coastguard Worker const UInt32 startIndex = _bi.Coder_to_Stream[coderIndex];
297*f6dc9357SAndroid Build Coastguard Worker const UInt32 numStreams = _bi.Coders[coderIndex].NumStreams;
298*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numStreams; i++)
299*f6dc9357SAndroid Build Coastguard Worker {
300*f6dc9357SAndroid Build Coastguard Worker const UInt32 si = startIndex + i;
301*f6dc9357SAndroid Build Coastguard Worker if (_bi.IsStream_in_PackStreams(si))
302*f6dc9357SAndroid Build Coastguard Worker continue;
303*f6dc9357SAndroid Build Coastguard Worker
304*f6dc9357SAndroid Build Coastguard Worker const int bond = _bi.FindBond_for_PackStream(si);
305*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
306*f6dc9357SAndroid Build Coastguard Worker throw 20150213;
307*f6dc9357SAndroid Build Coastguard Worker
308*f6dc9357SAndroid Build Coastguard Worker if (IsThere_ExternalCoder_in_PackTree(_bi.Bonds[(unsigned)bond].UnpackIndex))
309*f6dc9357SAndroid Build Coastguard Worker return true;
310*f6dc9357SAndroid Build Coastguard Worker }
311*f6dc9357SAndroid Build Coastguard Worker return false;
312*f6dc9357SAndroid Build Coastguard Worker }
313*f6dc9357SAndroid Build Coastguard Worker
314*f6dc9357SAndroid Build Coastguard Worker
315*f6dc9357SAndroid Build Coastguard Worker
316*f6dc9357SAndroid Build Coastguard Worker
317*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_ST
318*f6dc9357SAndroid Build Coastguard Worker
CMixerST(bool encodeMode)319*f6dc9357SAndroid Build Coastguard Worker CMixerST::CMixerST(bool encodeMode):
320*f6dc9357SAndroid Build Coastguard Worker CMixer(encodeMode)
321*f6dc9357SAndroid Build Coastguard Worker {}
322*f6dc9357SAndroid Build Coastguard Worker
~CMixerST()323*f6dc9357SAndroid Build Coastguard Worker CMixerST::~CMixerST() {}
324*f6dc9357SAndroid Build Coastguard Worker
AddCoder(const CCreatedCoder & cod)325*f6dc9357SAndroid Build Coastguard Worker void CMixerST::AddCoder(const CCreatedCoder &cod)
326*f6dc9357SAndroid Build Coastguard Worker {
327*f6dc9357SAndroid Build Coastguard Worker IsFilter_Vector.Add(cod.IsFilter);
328*f6dc9357SAndroid Build Coastguard Worker IsExternal_Vector.Add(cod.IsExternal);
329*f6dc9357SAndroid Build Coastguard Worker // const CCoderStreamsInfo &c = _bi.Coders[_coders.Size()];
330*f6dc9357SAndroid Build Coastguard Worker CCoderST &c2 = _coders.AddNew();
331*f6dc9357SAndroid Build Coastguard Worker c2.NumStreams = cod.NumStreams;
332*f6dc9357SAndroid Build Coastguard Worker c2.Coder = cod.Coder;
333*f6dc9357SAndroid Build Coastguard Worker c2.Coder2 = cod.Coder2;
334*f6dc9357SAndroid Build Coastguard Worker
335*f6dc9357SAndroid Build Coastguard Worker /*
336*f6dc9357SAndroid Build Coastguard Worker if (isFilter)
337*f6dc9357SAndroid Build Coastguard Worker {
338*f6dc9357SAndroid Build Coastguard Worker c2.CanRead = true;
339*f6dc9357SAndroid Build Coastguard Worker c2.CanWrite = true;
340*f6dc9357SAndroid Build Coastguard Worker }
341*f6dc9357SAndroid Build Coastguard Worker else
342*f6dc9357SAndroid Build Coastguard Worker */
343*f6dc9357SAndroid Build Coastguard Worker {
344*f6dc9357SAndroid Build Coastguard Worker IUnknown *unk = (cod.Coder ? (IUnknown *)cod.Coder : (IUnknown *)cod.Coder2);
345*f6dc9357SAndroid Build Coastguard Worker {
346*f6dc9357SAndroid Build Coastguard Worker Z7_DECL_CMyComPtr_QI_FROM(ISequentialInStream, s, unk)
347*f6dc9357SAndroid Build Coastguard Worker c2.CanRead = (s != NULL);
348*f6dc9357SAndroid Build Coastguard Worker }
349*f6dc9357SAndroid Build Coastguard Worker {
350*f6dc9357SAndroid Build Coastguard Worker Z7_DECL_CMyComPtr_QI_FROM(ISequentialOutStream, s, unk)
351*f6dc9357SAndroid Build Coastguard Worker c2.CanWrite = (s != NULL);
352*f6dc9357SAndroid Build Coastguard Worker }
353*f6dc9357SAndroid Build Coastguard Worker }
354*f6dc9357SAndroid Build Coastguard Worker }
355*f6dc9357SAndroid Build Coastguard Worker
GetCoder(unsigned index)356*f6dc9357SAndroid Build Coastguard Worker CCoder &CMixerST::GetCoder(unsigned index)
357*f6dc9357SAndroid Build Coastguard Worker {
358*f6dc9357SAndroid Build Coastguard Worker return _coders[index];
359*f6dc9357SAndroid Build Coastguard Worker }
360*f6dc9357SAndroid Build Coastguard Worker
ReInit2()361*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerST::ReInit2() { return S_OK; }
362*f6dc9357SAndroid Build Coastguard Worker
GetInStream2(ISequentialInStream * const * inStreams,UInt32 outStreamIndex,ISequentialInStream ** inStreamRes)363*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerST::GetInStream2(
364*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */
365*f6dc9357SAndroid Build Coastguard Worker UInt32 outStreamIndex, ISequentialInStream **inStreamRes)
366*f6dc9357SAndroid Build Coastguard Worker {
367*f6dc9357SAndroid Build Coastguard Worker UInt32 coderIndex = outStreamIndex, coderStreamIndex = 0;
368*f6dc9357SAndroid Build Coastguard Worker
369*f6dc9357SAndroid Build Coastguard Worker if (EncodeMode)
370*f6dc9357SAndroid Build Coastguard Worker {
371*f6dc9357SAndroid Build Coastguard Worker _bi.GetCoder_for_Stream(outStreamIndex, coderIndex, coderStreamIndex);
372*f6dc9357SAndroid Build Coastguard Worker if (coderStreamIndex != 0)
373*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
374*f6dc9357SAndroid Build Coastguard Worker }
375*f6dc9357SAndroid Build Coastguard Worker
376*f6dc9357SAndroid Build Coastguard Worker const CCoder &coder = _coders[coderIndex];
377*f6dc9357SAndroid Build Coastguard Worker
378*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> seqInStream;
379*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_ISequentialInStream, (void **)&seqInStream);
380*f6dc9357SAndroid Build Coastguard Worker if (!seqInStream)
381*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
382*f6dc9357SAndroid Build Coastguard Worker
383*f6dc9357SAndroid Build Coastguard Worker const UInt32 numInStreams = EncodeMode ? 1 : coder.NumStreams;
384*f6dc9357SAndroid Build Coastguard Worker const UInt32 startIndex = EncodeMode ? coderIndex : _bi.Coder_to_Stream[coderIndex];
385*f6dc9357SAndroid Build Coastguard Worker
386*f6dc9357SAndroid Build Coastguard Worker bool isSet = false;
387*f6dc9357SAndroid Build Coastguard Worker
388*f6dc9357SAndroid Build Coastguard Worker if (numInStreams == 1)
389*f6dc9357SAndroid Build Coastguard Worker {
390*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressSetInStream> setStream;
391*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_ICompressSetInStream, (void **)&setStream);
392*f6dc9357SAndroid Build Coastguard Worker if (setStream)
393*f6dc9357SAndroid Build Coastguard Worker {
394*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> seqInStream2;
395*f6dc9357SAndroid Build Coastguard Worker RINOK(GetInStream(inStreams, /* inSizes, */ startIndex + 0, &seqInStream2))
396*f6dc9357SAndroid Build Coastguard Worker RINOK(setStream->SetInStream(seqInStream2))
397*f6dc9357SAndroid Build Coastguard Worker isSet = true;
398*f6dc9357SAndroid Build Coastguard Worker }
399*f6dc9357SAndroid Build Coastguard Worker }
400*f6dc9357SAndroid Build Coastguard Worker
401*f6dc9357SAndroid Build Coastguard Worker if (!isSet && numInStreams != 0)
402*f6dc9357SAndroid Build Coastguard Worker {
403*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressSetInStream2> setStream2;
404*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_ICompressSetInStream2, (void **)&setStream2);
405*f6dc9357SAndroid Build Coastguard Worker if (!setStream2)
406*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
407*f6dc9357SAndroid Build Coastguard Worker
408*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numInStreams; i++)
409*f6dc9357SAndroid Build Coastguard Worker {
410*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> seqInStream2;
411*f6dc9357SAndroid Build Coastguard Worker RINOK(GetInStream(inStreams, /* inSizes, */ startIndex + i, &seqInStream2))
412*f6dc9357SAndroid Build Coastguard Worker RINOK(setStream2->SetInStream2(i, seqInStream2))
413*f6dc9357SAndroid Build Coastguard Worker }
414*f6dc9357SAndroid Build Coastguard Worker }
415*f6dc9357SAndroid Build Coastguard Worker
416*f6dc9357SAndroid Build Coastguard Worker *inStreamRes = seqInStream.Detach();
417*f6dc9357SAndroid Build Coastguard Worker return S_OK;
418*f6dc9357SAndroid Build Coastguard Worker }
419*f6dc9357SAndroid Build Coastguard Worker
420*f6dc9357SAndroid Build Coastguard Worker
GetInStream(ISequentialInStream * const * inStreams,UInt32 inStreamIndex,ISequentialInStream ** inStreamRes)421*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerST::GetInStream(
422*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */
423*f6dc9357SAndroid Build Coastguard Worker UInt32 inStreamIndex, ISequentialInStream **inStreamRes)
424*f6dc9357SAndroid Build Coastguard Worker {
425*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> seqInStream;
426*f6dc9357SAndroid Build Coastguard Worker
427*f6dc9357SAndroid Build Coastguard Worker {
428*f6dc9357SAndroid Build Coastguard Worker int index = -1;
429*f6dc9357SAndroid Build Coastguard Worker if (EncodeMode)
430*f6dc9357SAndroid Build Coastguard Worker {
431*f6dc9357SAndroid Build Coastguard Worker if (_bi.UnpackCoder == inStreamIndex)
432*f6dc9357SAndroid Build Coastguard Worker index = 0;
433*f6dc9357SAndroid Build Coastguard Worker }
434*f6dc9357SAndroid Build Coastguard Worker else
435*f6dc9357SAndroid Build Coastguard Worker index = _bi.FindStream_in_PackStreams(inStreamIndex);
436*f6dc9357SAndroid Build Coastguard Worker
437*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
438*f6dc9357SAndroid Build Coastguard Worker {
439*f6dc9357SAndroid Build Coastguard Worker seqInStream = inStreams[(unsigned)index];
440*f6dc9357SAndroid Build Coastguard Worker *inStreamRes = seqInStream.Detach();
441*f6dc9357SAndroid Build Coastguard Worker return S_OK;
442*f6dc9357SAndroid Build Coastguard Worker }
443*f6dc9357SAndroid Build Coastguard Worker }
444*f6dc9357SAndroid Build Coastguard Worker
445*f6dc9357SAndroid Build Coastguard Worker const int bond = FindBond_for_Stream(
446*f6dc9357SAndroid Build Coastguard Worker true, // forInputStream
447*f6dc9357SAndroid Build Coastguard Worker inStreamIndex);
448*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
449*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
450*f6dc9357SAndroid Build Coastguard Worker
451*f6dc9357SAndroid Build Coastguard Worker RINOK(GetInStream2(inStreams, /* inSizes, */
452*f6dc9357SAndroid Build Coastguard Worker _bi.Bonds[(unsigned)bond].Get_OutIndex(EncodeMode), &seqInStream))
453*f6dc9357SAndroid Build Coastguard Worker
454*f6dc9357SAndroid Build Coastguard Worker while (_binderStreams.Size() <= (unsigned)bond)
455*f6dc9357SAndroid Build Coastguard Worker _binderStreams.AddNew();
456*f6dc9357SAndroid Build Coastguard Worker CStBinderStream &bs = _binderStreams[(unsigned)bond];
457*f6dc9357SAndroid Build Coastguard Worker
458*f6dc9357SAndroid Build Coastguard Worker if (bs.StreamRef || bs.InStreamSpec)
459*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
460*f6dc9357SAndroid Build Coastguard Worker
461*f6dc9357SAndroid Build Coastguard Worker CSequentialInStreamCalcSize *spec = new CSequentialInStreamCalcSize;
462*f6dc9357SAndroid Build Coastguard Worker bs.StreamRef = spec;
463*f6dc9357SAndroid Build Coastguard Worker bs.InStreamSpec = spec;
464*f6dc9357SAndroid Build Coastguard Worker
465*f6dc9357SAndroid Build Coastguard Worker spec->SetStream(seqInStream);
466*f6dc9357SAndroid Build Coastguard Worker spec->Init();
467*f6dc9357SAndroid Build Coastguard Worker
468*f6dc9357SAndroid Build Coastguard Worker seqInStream = bs.InStreamSpec;
469*f6dc9357SAndroid Build Coastguard Worker
470*f6dc9357SAndroid Build Coastguard Worker *inStreamRes = seqInStream.Detach();
471*f6dc9357SAndroid Build Coastguard Worker return S_OK;
472*f6dc9357SAndroid Build Coastguard Worker }
473*f6dc9357SAndroid Build Coastguard Worker
474*f6dc9357SAndroid Build Coastguard Worker
GetOutStream(ISequentialOutStream * const * outStreams,UInt32 outStreamIndex,ISequentialOutStream ** outStreamRes)475*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerST::GetOutStream(
476*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream * const *outStreams, /* const UInt64 * const *outSizes, */
477*f6dc9357SAndroid Build Coastguard Worker UInt32 outStreamIndex, ISequentialOutStream **outStreamRes)
478*f6dc9357SAndroid Build Coastguard Worker {
479*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> seqOutStream;
480*f6dc9357SAndroid Build Coastguard Worker
481*f6dc9357SAndroid Build Coastguard Worker {
482*f6dc9357SAndroid Build Coastguard Worker int index = -1;
483*f6dc9357SAndroid Build Coastguard Worker if (!EncodeMode)
484*f6dc9357SAndroid Build Coastguard Worker {
485*f6dc9357SAndroid Build Coastguard Worker if (_bi.UnpackCoder == outStreamIndex)
486*f6dc9357SAndroid Build Coastguard Worker index = 0;
487*f6dc9357SAndroid Build Coastguard Worker }
488*f6dc9357SAndroid Build Coastguard Worker else
489*f6dc9357SAndroid Build Coastguard Worker index = _bi.FindStream_in_PackStreams(outStreamIndex);
490*f6dc9357SAndroid Build Coastguard Worker
491*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
492*f6dc9357SAndroid Build Coastguard Worker {
493*f6dc9357SAndroid Build Coastguard Worker seqOutStream = outStreams[(unsigned)index];
494*f6dc9357SAndroid Build Coastguard Worker *outStreamRes = seqOutStream.Detach();
495*f6dc9357SAndroid Build Coastguard Worker return S_OK;
496*f6dc9357SAndroid Build Coastguard Worker }
497*f6dc9357SAndroid Build Coastguard Worker }
498*f6dc9357SAndroid Build Coastguard Worker
499*f6dc9357SAndroid Build Coastguard Worker const int bond = FindBond_for_Stream(
500*f6dc9357SAndroid Build Coastguard Worker false, // forInputStream
501*f6dc9357SAndroid Build Coastguard Worker outStreamIndex);
502*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
503*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
504*f6dc9357SAndroid Build Coastguard Worker
505*f6dc9357SAndroid Build Coastguard Worker const UInt32 inStreamIndex = _bi.Bonds[(unsigned)bond].Get_InIndex(EncodeMode);
506*f6dc9357SAndroid Build Coastguard Worker
507*f6dc9357SAndroid Build Coastguard Worker UInt32 coderIndex = inStreamIndex;
508*f6dc9357SAndroid Build Coastguard Worker UInt32 coderStreamIndex = 0;
509*f6dc9357SAndroid Build Coastguard Worker
510*f6dc9357SAndroid Build Coastguard Worker if (!EncodeMode)
511*f6dc9357SAndroid Build Coastguard Worker _bi.GetCoder_for_Stream(inStreamIndex, coderIndex, coderStreamIndex);
512*f6dc9357SAndroid Build Coastguard Worker
513*f6dc9357SAndroid Build Coastguard Worker CCoder &coder = _coders[coderIndex];
514*f6dc9357SAndroid Build Coastguard Worker
515*f6dc9357SAndroid Build Coastguard Worker /*
516*f6dc9357SAndroid Build Coastguard Worker if (!coder.Coder)
517*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
518*f6dc9357SAndroid Build Coastguard Worker */
519*f6dc9357SAndroid Build Coastguard Worker
520*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_ISequentialOutStream, (void **)&seqOutStream);
521*f6dc9357SAndroid Build Coastguard Worker if (!seqOutStream)
522*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
523*f6dc9357SAndroid Build Coastguard Worker
524*f6dc9357SAndroid Build Coastguard Worker const UInt32 numOutStreams = EncodeMode ? coder.NumStreams : 1;
525*f6dc9357SAndroid Build Coastguard Worker const UInt32 startIndex = EncodeMode ? _bi.Coder_to_Stream[coderIndex]: coderIndex;
526*f6dc9357SAndroid Build Coastguard Worker
527*f6dc9357SAndroid Build Coastguard Worker bool isSet = false;
528*f6dc9357SAndroid Build Coastguard Worker
529*f6dc9357SAndroid Build Coastguard Worker if (numOutStreams == 1)
530*f6dc9357SAndroid Build Coastguard Worker {
531*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressSetOutStream> setOutStream;
532*f6dc9357SAndroid Build Coastguard Worker coder.Coder.QueryInterface(IID_ICompressSetOutStream, &setOutStream);
533*f6dc9357SAndroid Build Coastguard Worker if (setOutStream)
534*f6dc9357SAndroid Build Coastguard Worker {
535*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> seqOutStream2;
536*f6dc9357SAndroid Build Coastguard Worker RINOK(GetOutStream(outStreams, /* outSizes, */ startIndex + 0, &seqOutStream2))
537*f6dc9357SAndroid Build Coastguard Worker RINOK(setOutStream->SetOutStream(seqOutStream2))
538*f6dc9357SAndroid Build Coastguard Worker isSet = true;
539*f6dc9357SAndroid Build Coastguard Worker }
540*f6dc9357SAndroid Build Coastguard Worker }
541*f6dc9357SAndroid Build Coastguard Worker
542*f6dc9357SAndroid Build Coastguard Worker if (!isSet && numOutStreams != 0)
543*f6dc9357SAndroid Build Coastguard Worker {
544*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
545*f6dc9357SAndroid Build Coastguard Worker /*
546*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressSetOutStream2> setStream2;
547*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_ICompressSetOutStream2, (void **)&setStream2);
548*f6dc9357SAndroid Build Coastguard Worker if (!setStream2)
549*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
550*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numOutStreams; i++)
551*f6dc9357SAndroid Build Coastguard Worker {
552*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> seqOutStream2;
553*f6dc9357SAndroid Build Coastguard Worker RINOK(GetOutStream(outStreams, startIndex + i, &seqOutStream2))
554*f6dc9357SAndroid Build Coastguard Worker RINOK(setStream2->SetOutStream2(i, seqOutStream2))
555*f6dc9357SAndroid Build Coastguard Worker }
556*f6dc9357SAndroid Build Coastguard Worker */
557*f6dc9357SAndroid Build Coastguard Worker }
558*f6dc9357SAndroid Build Coastguard Worker
559*f6dc9357SAndroid Build Coastguard Worker while (_binderStreams.Size() <= (unsigned)bond)
560*f6dc9357SAndroid Build Coastguard Worker _binderStreams.AddNew();
561*f6dc9357SAndroid Build Coastguard Worker CStBinderStream &bs = _binderStreams[(unsigned)bond];
562*f6dc9357SAndroid Build Coastguard Worker
563*f6dc9357SAndroid Build Coastguard Worker if (bs.StreamRef || bs.OutStreamSpec)
564*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
565*f6dc9357SAndroid Build Coastguard Worker
566*f6dc9357SAndroid Build Coastguard Worker COutStreamCalcSize *spec = new COutStreamCalcSize;
567*f6dc9357SAndroid Build Coastguard Worker bs.StreamRef = (ISequentialOutStream *)spec;
568*f6dc9357SAndroid Build Coastguard Worker bs.OutStreamSpec = spec;
569*f6dc9357SAndroid Build Coastguard Worker
570*f6dc9357SAndroid Build Coastguard Worker spec->SetStream(seqOutStream);
571*f6dc9357SAndroid Build Coastguard Worker spec->Init();
572*f6dc9357SAndroid Build Coastguard Worker
573*f6dc9357SAndroid Build Coastguard Worker seqOutStream = bs.OutStreamSpec;
574*f6dc9357SAndroid Build Coastguard Worker
575*f6dc9357SAndroid Build Coastguard Worker *outStreamRes = seqOutStream.Detach();
576*f6dc9357SAndroid Build Coastguard Worker return S_OK;
577*f6dc9357SAndroid Build Coastguard Worker }
578*f6dc9357SAndroid Build Coastguard Worker
579*f6dc9357SAndroid Build Coastguard Worker
GetError(HRESULT res,HRESULT res2)580*f6dc9357SAndroid Build Coastguard Worker static HRESULT GetError(HRESULT res, HRESULT res2)
581*f6dc9357SAndroid Build Coastguard Worker {
582*f6dc9357SAndroid Build Coastguard Worker if (res == res2)
583*f6dc9357SAndroid Build Coastguard Worker return res;
584*f6dc9357SAndroid Build Coastguard Worker if (res == S_OK)
585*f6dc9357SAndroid Build Coastguard Worker return res2;
586*f6dc9357SAndroid Build Coastguard Worker if (res == k_My_HRESULT_WritingWasCut)
587*f6dc9357SAndroid Build Coastguard Worker {
588*f6dc9357SAndroid Build Coastguard Worker if (res2 != S_OK)
589*f6dc9357SAndroid Build Coastguard Worker return res2;
590*f6dc9357SAndroid Build Coastguard Worker }
591*f6dc9357SAndroid Build Coastguard Worker return res;
592*f6dc9357SAndroid Build Coastguard Worker }
593*f6dc9357SAndroid Build Coastguard Worker
594*f6dc9357SAndroid Build Coastguard Worker
FinishStream(UInt32 streamIndex)595*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerST::FinishStream(UInt32 streamIndex)
596*f6dc9357SAndroid Build Coastguard Worker {
597*f6dc9357SAndroid Build Coastguard Worker {
598*f6dc9357SAndroid Build Coastguard Worker int index = -1;
599*f6dc9357SAndroid Build Coastguard Worker if (!EncodeMode)
600*f6dc9357SAndroid Build Coastguard Worker {
601*f6dc9357SAndroid Build Coastguard Worker if (_bi.UnpackCoder == streamIndex)
602*f6dc9357SAndroid Build Coastguard Worker index = 0;
603*f6dc9357SAndroid Build Coastguard Worker }
604*f6dc9357SAndroid Build Coastguard Worker else
605*f6dc9357SAndroid Build Coastguard Worker index = _bi.FindStream_in_PackStreams(streamIndex);
606*f6dc9357SAndroid Build Coastguard Worker
607*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
608*f6dc9357SAndroid Build Coastguard Worker return S_OK;
609*f6dc9357SAndroid Build Coastguard Worker }
610*f6dc9357SAndroid Build Coastguard Worker
611*f6dc9357SAndroid Build Coastguard Worker const int bond = FindBond_for_Stream(
612*f6dc9357SAndroid Build Coastguard Worker false, // forInputStream
613*f6dc9357SAndroid Build Coastguard Worker streamIndex);
614*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
615*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
616*f6dc9357SAndroid Build Coastguard Worker
617*f6dc9357SAndroid Build Coastguard Worker const UInt32 inStreamIndex = _bi.Bonds[(unsigned)bond].Get_InIndex(EncodeMode);
618*f6dc9357SAndroid Build Coastguard Worker
619*f6dc9357SAndroid Build Coastguard Worker UInt32 coderIndex = inStreamIndex;
620*f6dc9357SAndroid Build Coastguard Worker UInt32 coderStreamIndex = 0;
621*f6dc9357SAndroid Build Coastguard Worker if (!EncodeMode)
622*f6dc9357SAndroid Build Coastguard Worker _bi.GetCoder_for_Stream(inStreamIndex, coderIndex, coderStreamIndex);
623*f6dc9357SAndroid Build Coastguard Worker
624*f6dc9357SAndroid Build Coastguard Worker CCoder &coder = _coders[coderIndex];
625*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IOutStreamFinish> finish;
626*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_IOutStreamFinish, (void **)&finish);
627*f6dc9357SAndroid Build Coastguard Worker HRESULT res = S_OK;
628*f6dc9357SAndroid Build Coastguard Worker if (finish)
629*f6dc9357SAndroid Build Coastguard Worker {
630*f6dc9357SAndroid Build Coastguard Worker res = finish->OutStreamFinish();
631*f6dc9357SAndroid Build Coastguard Worker }
632*f6dc9357SAndroid Build Coastguard Worker return GetError(res, FinishCoder(coderIndex));
633*f6dc9357SAndroid Build Coastguard Worker }
634*f6dc9357SAndroid Build Coastguard Worker
635*f6dc9357SAndroid Build Coastguard Worker
FinishCoder(UInt32 coderIndex)636*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerST::FinishCoder(UInt32 coderIndex)
637*f6dc9357SAndroid Build Coastguard Worker {
638*f6dc9357SAndroid Build Coastguard Worker CCoder &coder = _coders[coderIndex];
639*f6dc9357SAndroid Build Coastguard Worker
640*f6dc9357SAndroid Build Coastguard Worker const UInt32 numOutStreams = EncodeMode ? coder.NumStreams : 1;
641*f6dc9357SAndroid Build Coastguard Worker const UInt32 startIndex = EncodeMode ? _bi.Coder_to_Stream[coderIndex]: coderIndex;
642*f6dc9357SAndroid Build Coastguard Worker
643*f6dc9357SAndroid Build Coastguard Worker HRESULT res = S_OK;
644*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < numOutStreams; i++)
645*f6dc9357SAndroid Build Coastguard Worker res = GetError(res, FinishStream(startIndex + i));
646*f6dc9357SAndroid Build Coastguard Worker return res;
647*f6dc9357SAndroid Build Coastguard Worker }
648*f6dc9357SAndroid Build Coastguard Worker
649*f6dc9357SAndroid Build Coastguard Worker
SelectMainCoder(bool useFirst)650*f6dc9357SAndroid Build Coastguard Worker void CMixerST::SelectMainCoder(bool useFirst)
651*f6dc9357SAndroid Build Coastguard Worker {
652*f6dc9357SAndroid Build Coastguard Worker unsigned ci = _bi.UnpackCoder;
653*f6dc9357SAndroid Build Coastguard Worker
654*f6dc9357SAndroid Build Coastguard Worker int firstNonFilter = -1;
655*f6dc9357SAndroid Build Coastguard Worker unsigned firstAllowed = ci;
656*f6dc9357SAndroid Build Coastguard Worker
657*f6dc9357SAndroid Build Coastguard Worker for (;;)
658*f6dc9357SAndroid Build Coastguard Worker {
659*f6dc9357SAndroid Build Coastguard Worker const CCoderST &coder = _coders[ci];
660*f6dc9357SAndroid Build Coastguard Worker // break;
661*f6dc9357SAndroid Build Coastguard Worker
662*f6dc9357SAndroid Build Coastguard Worker if (ci != _bi.UnpackCoder)
663*f6dc9357SAndroid Build Coastguard Worker if (EncodeMode ? !coder.CanWrite : !coder.CanRead)
664*f6dc9357SAndroid Build Coastguard Worker {
665*f6dc9357SAndroid Build Coastguard Worker firstAllowed = ci;
666*f6dc9357SAndroid Build Coastguard Worker firstNonFilter = -2;
667*f6dc9357SAndroid Build Coastguard Worker }
668*f6dc9357SAndroid Build Coastguard Worker
669*f6dc9357SAndroid Build Coastguard Worker if (coder.NumStreams != 1)
670*f6dc9357SAndroid Build Coastguard Worker break;
671*f6dc9357SAndroid Build Coastguard Worker
672*f6dc9357SAndroid Build Coastguard Worker const UInt32 st = _bi.Coder_to_Stream[ci];
673*f6dc9357SAndroid Build Coastguard Worker if (_bi.IsStream_in_PackStreams(st))
674*f6dc9357SAndroid Build Coastguard Worker break;
675*f6dc9357SAndroid Build Coastguard Worker const int bond = _bi.FindBond_for_PackStream(st);
676*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
677*f6dc9357SAndroid Build Coastguard Worker throw 20150213;
678*f6dc9357SAndroid Build Coastguard Worker
679*f6dc9357SAndroid Build Coastguard Worker if (EncodeMode ? !coder.CanRead : !coder.CanWrite)
680*f6dc9357SAndroid Build Coastguard Worker break;
681*f6dc9357SAndroid Build Coastguard Worker
682*f6dc9357SAndroid Build Coastguard Worker if (firstNonFilter == -1 && !IsFilter_Vector[ci])
683*f6dc9357SAndroid Build Coastguard Worker firstNonFilter = (int)ci;
684*f6dc9357SAndroid Build Coastguard Worker
685*f6dc9357SAndroid Build Coastguard Worker ci = _bi.Bonds[(unsigned)bond].UnpackIndex;
686*f6dc9357SAndroid Build Coastguard Worker }
687*f6dc9357SAndroid Build Coastguard Worker
688*f6dc9357SAndroid Build Coastguard Worker if (useFirst)
689*f6dc9357SAndroid Build Coastguard Worker ci = firstAllowed;
690*f6dc9357SAndroid Build Coastguard Worker else if (firstNonFilter >= 0)
691*f6dc9357SAndroid Build Coastguard Worker ci = (unsigned)firstNonFilter;
692*f6dc9357SAndroid Build Coastguard Worker
693*f6dc9357SAndroid Build Coastguard Worker MainCoderIndex = ci;
694*f6dc9357SAndroid Build Coastguard Worker }
695*f6dc9357SAndroid Build Coastguard Worker
696*f6dc9357SAndroid Build Coastguard Worker
Code(ISequentialInStream * const * inStreams,ISequentialOutStream * const * outStreams,ICompressProgressInfo * progress,bool & dataAfterEnd_Error)697*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerST::Code(
698*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams,
699*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream * const *outStreams,
700*f6dc9357SAndroid Build Coastguard Worker ICompressProgressInfo *progress,
701*f6dc9357SAndroid Build Coastguard Worker bool &dataAfterEnd_Error)
702*f6dc9357SAndroid Build Coastguard Worker {
703*f6dc9357SAndroid Build Coastguard Worker // InternalPackSizeError = false;
704*f6dc9357SAndroid Build Coastguard Worker dataAfterEnd_Error = false;
705*f6dc9357SAndroid Build Coastguard Worker
706*f6dc9357SAndroid Build Coastguard Worker _binderStreams.Clear();
707*f6dc9357SAndroid Build Coastguard Worker const unsigned ci = MainCoderIndex;
708*f6dc9357SAndroid Build Coastguard Worker
709*f6dc9357SAndroid Build Coastguard Worker const CCoder &mainCoder = _coders[MainCoderIndex];
710*f6dc9357SAndroid Build Coastguard Worker
711*f6dc9357SAndroid Build Coastguard Worker CObjectVector< CMyComPtr<ISequentialInStream> > seqInStreams;
712*f6dc9357SAndroid Build Coastguard Worker CObjectVector< CMyComPtr<ISequentialOutStream> > seqOutStreams;
713*f6dc9357SAndroid Build Coastguard Worker
714*f6dc9357SAndroid Build Coastguard Worker const UInt32 numInStreams = EncodeMode ? 1 : mainCoder.NumStreams;
715*f6dc9357SAndroid Build Coastguard Worker const UInt32 numOutStreams = !EncodeMode ? 1 : mainCoder.NumStreams;
716*f6dc9357SAndroid Build Coastguard Worker
717*f6dc9357SAndroid Build Coastguard Worker const UInt32 startInIndex = EncodeMode ? ci : _bi.Coder_to_Stream[ci];
718*f6dc9357SAndroid Build Coastguard Worker const UInt32 startOutIndex = !EncodeMode ? ci : _bi.Coder_to_Stream[ci];
719*f6dc9357SAndroid Build Coastguard Worker
720*f6dc9357SAndroid Build Coastguard Worker UInt32 i;
721*f6dc9357SAndroid Build Coastguard Worker
722*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numInStreams; i++)
723*f6dc9357SAndroid Build Coastguard Worker {
724*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> seqInStream;
725*f6dc9357SAndroid Build Coastguard Worker RINOK(GetInStream(inStreams, /* inSizes, */ startInIndex + i, &seqInStream))
726*f6dc9357SAndroid Build Coastguard Worker seqInStreams.Add(seqInStream);
727*f6dc9357SAndroid Build Coastguard Worker }
728*f6dc9357SAndroid Build Coastguard Worker
729*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numOutStreams; i++)
730*f6dc9357SAndroid Build Coastguard Worker {
731*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> seqOutStream;
732*f6dc9357SAndroid Build Coastguard Worker RINOK(GetOutStream(outStreams, /* outSizes, */ startOutIndex + i, &seqOutStream))
733*f6dc9357SAndroid Build Coastguard Worker seqOutStreams.Add(seqOutStream);
734*f6dc9357SAndroid Build Coastguard Worker }
735*f6dc9357SAndroid Build Coastguard Worker
736*f6dc9357SAndroid Build Coastguard Worker CRecordVector< ISequentialInStream * > seqInStreamsSpec;
737*f6dc9357SAndroid Build Coastguard Worker CRecordVector< ISequentialOutStream * > seqOutStreamsSpec;
738*f6dc9357SAndroid Build Coastguard Worker
739*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numInStreams; i++)
740*f6dc9357SAndroid Build Coastguard Worker seqInStreamsSpec.Add(seqInStreams[i]);
741*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numOutStreams; i++)
742*f6dc9357SAndroid Build Coastguard Worker seqOutStreamsSpec.Add(seqOutStreams[i]);
743*f6dc9357SAndroid Build Coastguard Worker
744*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
745*f6dc9357SAndroid Build Coastguard Worker {
746*f6dc9357SAndroid Build Coastguard Worker if (i == ci)
747*f6dc9357SAndroid Build Coastguard Worker continue;
748*f6dc9357SAndroid Build Coastguard Worker
749*f6dc9357SAndroid Build Coastguard Worker CCoder &coder = _coders[i];
750*f6dc9357SAndroid Build Coastguard Worker
751*f6dc9357SAndroid Build Coastguard Worker if (EncodeMode)
752*f6dc9357SAndroid Build Coastguard Worker {
753*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressInitEncoder> initEncoder;
754*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_ICompressInitEncoder, (void **)&initEncoder);
755*f6dc9357SAndroid Build Coastguard Worker if (initEncoder)
756*f6dc9357SAndroid Build Coastguard Worker {
757*f6dc9357SAndroid Build Coastguard Worker RINOK(initEncoder->InitEncoder())
758*f6dc9357SAndroid Build Coastguard Worker }
759*f6dc9357SAndroid Build Coastguard Worker }
760*f6dc9357SAndroid Build Coastguard Worker else
761*f6dc9357SAndroid Build Coastguard Worker {
762*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
763*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_ICompressSetOutStreamSize, (void **)&setOutStreamSize);
764*f6dc9357SAndroid Build Coastguard Worker if (setOutStreamSize)
765*f6dc9357SAndroid Build Coastguard Worker {
766*f6dc9357SAndroid Build Coastguard Worker RINOK(setOutStreamSize->SetOutStreamSize(
767*f6dc9357SAndroid Build Coastguard Worker EncodeMode ? coder.PackSizePointers[0] : coder.UnpackSizePointer))
768*f6dc9357SAndroid Build Coastguard Worker }
769*f6dc9357SAndroid Build Coastguard Worker }
770*f6dc9357SAndroid Build Coastguard Worker }
771*f6dc9357SAndroid Build Coastguard Worker
772*f6dc9357SAndroid Build Coastguard Worker const UInt64 * const *isSizes2 = EncodeMode ? &mainCoder.UnpackSizePointer : mainCoder.PackSizePointers.ConstData();
773*f6dc9357SAndroid Build Coastguard Worker const UInt64 * const *outSizes2 = EncodeMode ? mainCoder.PackSizePointers.ConstData() : &mainCoder.UnpackSizePointer;
774*f6dc9357SAndroid Build Coastguard Worker
775*f6dc9357SAndroid Build Coastguard Worker HRESULT res;
776*f6dc9357SAndroid Build Coastguard Worker if (mainCoder.Coder)
777*f6dc9357SAndroid Build Coastguard Worker {
778*f6dc9357SAndroid Build Coastguard Worker res = mainCoder.Coder->Code(
779*f6dc9357SAndroid Build Coastguard Worker seqInStreamsSpec[0], seqOutStreamsSpec[0],
780*f6dc9357SAndroid Build Coastguard Worker isSizes2[0], outSizes2[0],
781*f6dc9357SAndroid Build Coastguard Worker progress);
782*f6dc9357SAndroid Build Coastguard Worker }
783*f6dc9357SAndroid Build Coastguard Worker else
784*f6dc9357SAndroid Build Coastguard Worker {
785*f6dc9357SAndroid Build Coastguard Worker res = mainCoder.Coder2->Code(
786*f6dc9357SAndroid Build Coastguard Worker seqInStreamsSpec.ConstData(), isSizes2, numInStreams,
787*f6dc9357SAndroid Build Coastguard Worker seqOutStreamsSpec.ConstData(), outSizes2, numOutStreams,
788*f6dc9357SAndroid Build Coastguard Worker progress);
789*f6dc9357SAndroid Build Coastguard Worker }
790*f6dc9357SAndroid Build Coastguard Worker
791*f6dc9357SAndroid Build Coastguard Worker if (res == k_My_HRESULT_WritingWasCut)
792*f6dc9357SAndroid Build Coastguard Worker res = S_OK;
793*f6dc9357SAndroid Build Coastguard Worker
794*f6dc9357SAndroid Build Coastguard Worker if (res == S_OK || res == S_FALSE)
795*f6dc9357SAndroid Build Coastguard Worker {
796*f6dc9357SAndroid Build Coastguard Worker res = GetError(res, FinishCoder(ci));
797*f6dc9357SAndroid Build Coastguard Worker }
798*f6dc9357SAndroid Build Coastguard Worker
799*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _binderStreams.Size(); i++)
800*f6dc9357SAndroid Build Coastguard Worker {
801*f6dc9357SAndroid Build Coastguard Worker const CStBinderStream &bs = _binderStreams[i];
802*f6dc9357SAndroid Build Coastguard Worker if (bs.InStreamSpec)
803*f6dc9357SAndroid Build Coastguard Worker bs.InStreamSpec->ReleaseStream();
804*f6dc9357SAndroid Build Coastguard Worker else
805*f6dc9357SAndroid Build Coastguard Worker bs.OutStreamSpec->ReleaseStream();
806*f6dc9357SAndroid Build Coastguard Worker }
807*f6dc9357SAndroid Build Coastguard Worker
808*f6dc9357SAndroid Build Coastguard Worker if (res == k_My_HRESULT_WritingWasCut)
809*f6dc9357SAndroid Build Coastguard Worker res = S_OK;
810*f6dc9357SAndroid Build Coastguard Worker
811*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
812*f6dc9357SAndroid Build Coastguard Worker return res;
813*f6dc9357SAndroid Build Coastguard Worker
814*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
815*f6dc9357SAndroid Build Coastguard Worker {
816*f6dc9357SAndroid Build Coastguard Worker RINOK(_coders[i].CheckDataAfterEnd(dataAfterEnd_Error /*, InternalPackSizeError */))
817*f6dc9357SAndroid Build Coastguard Worker }
818*f6dc9357SAndroid Build Coastguard Worker
819*f6dc9357SAndroid Build Coastguard Worker return S_OK;
820*f6dc9357SAndroid Build Coastguard Worker }
821*f6dc9357SAndroid Build Coastguard Worker
822*f6dc9357SAndroid Build Coastguard Worker
GetMainUnpackStream(ISequentialInStream * const * inStreams,ISequentialInStream ** inStreamRes)823*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerST::GetMainUnpackStream(
824*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams,
825*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream **inStreamRes)
826*f6dc9357SAndroid Build Coastguard Worker {
827*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> seqInStream;
828*f6dc9357SAndroid Build Coastguard Worker
829*f6dc9357SAndroid Build Coastguard Worker RINOK(GetInStream2(inStreams, /* inSizes, */
830*f6dc9357SAndroid Build Coastguard Worker _bi.UnpackCoder, &seqInStream))
831*f6dc9357SAndroid Build Coastguard Worker
832*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, _coders)
833*f6dc9357SAndroid Build Coastguard Worker {
834*f6dc9357SAndroid Build Coastguard Worker CCoder &coder = _coders[i];
835*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
836*f6dc9357SAndroid Build Coastguard Worker coder.QueryInterface(IID_ICompressSetOutStreamSize, (void **)&setOutStreamSize);
837*f6dc9357SAndroid Build Coastguard Worker if (setOutStreamSize)
838*f6dc9357SAndroid Build Coastguard Worker {
839*f6dc9357SAndroid Build Coastguard Worker RINOK(setOutStreamSize->SetOutStreamSize(coder.UnpackSizePointer))
840*f6dc9357SAndroid Build Coastguard Worker }
841*f6dc9357SAndroid Build Coastguard Worker }
842*f6dc9357SAndroid Build Coastguard Worker
843*f6dc9357SAndroid Build Coastguard Worker *inStreamRes = seqInStream.Detach();
844*f6dc9357SAndroid Build Coastguard Worker return S_OK;
845*f6dc9357SAndroid Build Coastguard Worker }
846*f6dc9357SAndroid Build Coastguard Worker
847*f6dc9357SAndroid Build Coastguard Worker
GetBondStreamSize(unsigned bondIndex) const848*f6dc9357SAndroid Build Coastguard Worker UInt64 CMixerST::GetBondStreamSize(unsigned bondIndex) const
849*f6dc9357SAndroid Build Coastguard Worker {
850*f6dc9357SAndroid Build Coastguard Worker const CStBinderStream &bs = _binderStreams[bondIndex];
851*f6dc9357SAndroid Build Coastguard Worker if (bs.InStreamSpec)
852*f6dc9357SAndroid Build Coastguard Worker return bs.InStreamSpec->GetSize();
853*f6dc9357SAndroid Build Coastguard Worker return bs.OutStreamSpec->GetSize();
854*f6dc9357SAndroid Build Coastguard Worker }
855*f6dc9357SAndroid Build Coastguard Worker
856*f6dc9357SAndroid Build Coastguard Worker #endif
857*f6dc9357SAndroid Build Coastguard Worker
858*f6dc9357SAndroid Build Coastguard Worker
859*f6dc9357SAndroid Build Coastguard Worker
860*f6dc9357SAndroid Build Coastguard Worker
861*f6dc9357SAndroid Build Coastguard Worker
862*f6dc9357SAndroid Build Coastguard Worker
863*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_MT
864*f6dc9357SAndroid Build Coastguard Worker
865*f6dc9357SAndroid Build Coastguard Worker
Execute()866*f6dc9357SAndroid Build Coastguard Worker void CCoderMT::Execute()
867*f6dc9357SAndroid Build Coastguard Worker {
868*f6dc9357SAndroid Build Coastguard Worker try
869*f6dc9357SAndroid Build Coastguard Worker {
870*f6dc9357SAndroid Build Coastguard Worker Code(NULL);
871*f6dc9357SAndroid Build Coastguard Worker }
872*f6dc9357SAndroid Build Coastguard Worker catch(...)
873*f6dc9357SAndroid Build Coastguard Worker {
874*f6dc9357SAndroid Build Coastguard Worker Result = E_FAIL;
875*f6dc9357SAndroid Build Coastguard Worker }
876*f6dc9357SAndroid Build Coastguard Worker }
877*f6dc9357SAndroid Build Coastguard Worker
Code(ICompressProgressInfo * progress)878*f6dc9357SAndroid Build Coastguard Worker void CCoderMT::Code(ICompressProgressInfo *progress)
879*f6dc9357SAndroid Build Coastguard Worker {
880*f6dc9357SAndroid Build Coastguard Worker unsigned numInStreams = EncodeMode ? 1 : NumStreams;
881*f6dc9357SAndroid Build Coastguard Worker unsigned numOutStreams = EncodeMode ? NumStreams : 1;
882*f6dc9357SAndroid Build Coastguard Worker
883*f6dc9357SAndroid Build Coastguard Worker InStreamPointers.ClearAndReserve(numInStreams);
884*f6dc9357SAndroid Build Coastguard Worker OutStreamPointers.ClearAndReserve(numOutStreams);
885*f6dc9357SAndroid Build Coastguard Worker
886*f6dc9357SAndroid Build Coastguard Worker unsigned i;
887*f6dc9357SAndroid Build Coastguard Worker
888*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numInStreams; i++)
889*f6dc9357SAndroid Build Coastguard Worker InStreamPointers.AddInReserved((ISequentialInStream *)InStreams[i]);
890*f6dc9357SAndroid Build Coastguard Worker
891*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numOutStreams; i++)
892*f6dc9357SAndroid Build Coastguard Worker OutStreamPointers.AddInReserved((ISequentialOutStream *)OutStreams[i]);
893*f6dc9357SAndroid Build Coastguard Worker
894*f6dc9357SAndroid Build Coastguard Worker // we suppose that UnpackSizePointer and PackSizePointers contain correct pointers.
895*f6dc9357SAndroid Build Coastguard Worker /*
896*f6dc9357SAndroid Build Coastguard Worker if (UnpackSizePointer)
897*f6dc9357SAndroid Build Coastguard Worker UnpackSizePointer = &UnpackSize;
898*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < NumStreams; i++)
899*f6dc9357SAndroid Build Coastguard Worker if (PackSizePointers[i])
900*f6dc9357SAndroid Build Coastguard Worker PackSizePointers[i] = &PackSizes[i];
901*f6dc9357SAndroid Build Coastguard Worker */
902*f6dc9357SAndroid Build Coastguard Worker
903*f6dc9357SAndroid Build Coastguard Worker CReleaser releaser(*this);
904*f6dc9357SAndroid Build Coastguard Worker
905*f6dc9357SAndroid Build Coastguard Worker if (Coder)
906*f6dc9357SAndroid Build Coastguard Worker Result = Coder->Code(InStreamPointers[0], OutStreamPointers[0],
907*f6dc9357SAndroid Build Coastguard Worker EncodeMode ? UnpackSizePointer : PackSizePointers[0],
908*f6dc9357SAndroid Build Coastguard Worker EncodeMode ? PackSizePointers[0] : UnpackSizePointer,
909*f6dc9357SAndroid Build Coastguard Worker progress);
910*f6dc9357SAndroid Build Coastguard Worker else
911*f6dc9357SAndroid Build Coastguard Worker Result = Coder2->Code(
912*f6dc9357SAndroid Build Coastguard Worker InStreamPointers.ConstData(), EncodeMode ? &UnpackSizePointer : PackSizePointers.ConstData(), numInStreams,
913*f6dc9357SAndroid Build Coastguard Worker OutStreamPointers.ConstData(), EncodeMode ? PackSizePointers.ConstData(): &UnpackSizePointer, numOutStreams,
914*f6dc9357SAndroid Build Coastguard Worker progress);
915*f6dc9357SAndroid Build Coastguard Worker }
916*f6dc9357SAndroid Build Coastguard Worker
SetBindInfo(const CBindInfo & bindInfo)917*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerMT::SetBindInfo(const CBindInfo &bindInfo)
918*f6dc9357SAndroid Build Coastguard Worker {
919*f6dc9357SAndroid Build Coastguard Worker CMixer::SetBindInfo(bindInfo);
920*f6dc9357SAndroid Build Coastguard Worker
921*f6dc9357SAndroid Build Coastguard Worker _streamBinders.Clear();
922*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, _bi.Bonds)
923*f6dc9357SAndroid Build Coastguard Worker {
924*f6dc9357SAndroid Build Coastguard Worker // RINOK(_streamBinders.AddNew().CreateEvents())
925*f6dc9357SAndroid Build Coastguard Worker _streamBinders.AddNew();
926*f6dc9357SAndroid Build Coastguard Worker }
927*f6dc9357SAndroid Build Coastguard Worker return S_OK;
928*f6dc9357SAndroid Build Coastguard Worker }
929*f6dc9357SAndroid Build Coastguard Worker
AddCoder(const CCreatedCoder & cod)930*f6dc9357SAndroid Build Coastguard Worker void CMixerMT::AddCoder(const CCreatedCoder &cod)
931*f6dc9357SAndroid Build Coastguard Worker {
932*f6dc9357SAndroid Build Coastguard Worker IsFilter_Vector.Add(cod.IsFilter);
933*f6dc9357SAndroid Build Coastguard Worker IsExternal_Vector.Add(cod.IsExternal);
934*f6dc9357SAndroid Build Coastguard Worker // const CCoderStreamsInfo &c = _bi.Coders[_coders.Size()];
935*f6dc9357SAndroid Build Coastguard Worker CCoderMT &c2 = _coders.AddNew();
936*f6dc9357SAndroid Build Coastguard Worker c2.NumStreams = cod.NumStreams;
937*f6dc9357SAndroid Build Coastguard Worker c2.Coder = cod.Coder;
938*f6dc9357SAndroid Build Coastguard Worker c2.Coder2 = cod.Coder2;
939*f6dc9357SAndroid Build Coastguard Worker c2.EncodeMode = EncodeMode;
940*f6dc9357SAndroid Build Coastguard Worker }
941*f6dc9357SAndroid Build Coastguard Worker
GetCoder(unsigned index)942*f6dc9357SAndroid Build Coastguard Worker CCoder &CMixerMT::GetCoder(unsigned index)
943*f6dc9357SAndroid Build Coastguard Worker {
944*f6dc9357SAndroid Build Coastguard Worker return _coders[index];
945*f6dc9357SAndroid Build Coastguard Worker }
946*f6dc9357SAndroid Build Coastguard Worker
ReInit2()947*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerMT::ReInit2()
948*f6dc9357SAndroid Build Coastguard Worker {
949*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, _streamBinders)
950*f6dc9357SAndroid Build Coastguard Worker {
951*f6dc9357SAndroid Build Coastguard Worker RINOK(_streamBinders[i].Create_ReInit())
952*f6dc9357SAndroid Build Coastguard Worker }
953*f6dc9357SAndroid Build Coastguard Worker return S_OK;
954*f6dc9357SAndroid Build Coastguard Worker }
955*f6dc9357SAndroid Build Coastguard Worker
SelectMainCoder(bool useFirst)956*f6dc9357SAndroid Build Coastguard Worker void CMixerMT::SelectMainCoder(bool useFirst)
957*f6dc9357SAndroid Build Coastguard Worker {
958*f6dc9357SAndroid Build Coastguard Worker unsigned ci = _bi.UnpackCoder;
959*f6dc9357SAndroid Build Coastguard Worker
960*f6dc9357SAndroid Build Coastguard Worker if (!useFirst)
961*f6dc9357SAndroid Build Coastguard Worker for (;;)
962*f6dc9357SAndroid Build Coastguard Worker {
963*f6dc9357SAndroid Build Coastguard Worker if (_coders[ci].NumStreams != 1)
964*f6dc9357SAndroid Build Coastguard Worker break;
965*f6dc9357SAndroid Build Coastguard Worker if (!IsFilter_Vector[ci])
966*f6dc9357SAndroid Build Coastguard Worker break;
967*f6dc9357SAndroid Build Coastguard Worker
968*f6dc9357SAndroid Build Coastguard Worker UInt32 st = _bi.Coder_to_Stream[ci];
969*f6dc9357SAndroid Build Coastguard Worker if (_bi.IsStream_in_PackStreams(st))
970*f6dc9357SAndroid Build Coastguard Worker break;
971*f6dc9357SAndroid Build Coastguard Worker const int bond = _bi.FindBond_for_PackStream(st);
972*f6dc9357SAndroid Build Coastguard Worker if (bond < 0)
973*f6dc9357SAndroid Build Coastguard Worker throw 20150213;
974*f6dc9357SAndroid Build Coastguard Worker ci = _bi.Bonds[(unsigned)bond].UnpackIndex;
975*f6dc9357SAndroid Build Coastguard Worker }
976*f6dc9357SAndroid Build Coastguard Worker
977*f6dc9357SAndroid Build Coastguard Worker MainCoderIndex = ci;
978*f6dc9357SAndroid Build Coastguard Worker }
979*f6dc9357SAndroid Build Coastguard Worker
Init(ISequentialInStream * const * inStreams,ISequentialOutStream * const * outStreams)980*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerMT::Init(ISequentialInStream * const *inStreams, ISequentialOutStream * const *outStreams)
981*f6dc9357SAndroid Build Coastguard Worker {
982*f6dc9357SAndroid Build Coastguard Worker unsigned i;
983*f6dc9357SAndroid Build Coastguard Worker
984*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
985*f6dc9357SAndroid Build Coastguard Worker {
986*f6dc9357SAndroid Build Coastguard Worker CCoderMT &coderInfo = _coders[i];
987*f6dc9357SAndroid Build Coastguard Worker const CCoderStreamsInfo &csi = _bi.Coders[i];
988*f6dc9357SAndroid Build Coastguard Worker
989*f6dc9357SAndroid Build Coastguard Worker UInt32 j;
990*f6dc9357SAndroid Build Coastguard Worker
991*f6dc9357SAndroid Build Coastguard Worker const unsigned numInStreams = EncodeMode ? 1 : csi.NumStreams;
992*f6dc9357SAndroid Build Coastguard Worker const unsigned numOutStreams = EncodeMode ? csi.NumStreams : 1;
993*f6dc9357SAndroid Build Coastguard Worker
994*f6dc9357SAndroid Build Coastguard Worker coderInfo.InStreams.Clear();
995*f6dc9357SAndroid Build Coastguard Worker for (j = 0; j < numInStreams; j++)
996*f6dc9357SAndroid Build Coastguard Worker coderInfo.InStreams.AddNew();
997*f6dc9357SAndroid Build Coastguard Worker
998*f6dc9357SAndroid Build Coastguard Worker coderInfo.OutStreams.Clear();
999*f6dc9357SAndroid Build Coastguard Worker for (j = 0; j < numOutStreams; j++)
1000*f6dc9357SAndroid Build Coastguard Worker coderInfo.OutStreams.AddNew();
1001*f6dc9357SAndroid Build Coastguard Worker }
1002*f6dc9357SAndroid Build Coastguard Worker
1003*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _bi.Bonds.Size(); i++)
1004*f6dc9357SAndroid Build Coastguard Worker {
1005*f6dc9357SAndroid Build Coastguard Worker const CBond &bond = _bi.Bonds[i];
1006*f6dc9357SAndroid Build Coastguard Worker
1007*f6dc9357SAndroid Build Coastguard Worker UInt32 inCoderIndex, inCoderStreamIndex;
1008*f6dc9357SAndroid Build Coastguard Worker UInt32 outCoderIndex, outCoderStreamIndex;
1009*f6dc9357SAndroid Build Coastguard Worker
1010*f6dc9357SAndroid Build Coastguard Worker {
1011*f6dc9357SAndroid Build Coastguard Worker UInt32 coderIndex, coderStreamIndex;
1012*f6dc9357SAndroid Build Coastguard Worker _bi.GetCoder_for_Stream(bond.PackIndex, coderIndex, coderStreamIndex);
1013*f6dc9357SAndroid Build Coastguard Worker
1014*f6dc9357SAndroid Build Coastguard Worker inCoderIndex = EncodeMode ? bond.UnpackIndex : coderIndex;
1015*f6dc9357SAndroid Build Coastguard Worker outCoderIndex = EncodeMode ? coderIndex : bond.UnpackIndex;
1016*f6dc9357SAndroid Build Coastguard Worker
1017*f6dc9357SAndroid Build Coastguard Worker inCoderStreamIndex = EncodeMode ? 0 : coderStreamIndex;
1018*f6dc9357SAndroid Build Coastguard Worker outCoderStreamIndex = EncodeMode ? coderStreamIndex : 0;
1019*f6dc9357SAndroid Build Coastguard Worker }
1020*f6dc9357SAndroid Build Coastguard Worker
1021*f6dc9357SAndroid Build Coastguard Worker _streamBinders[i].CreateStreams2(
1022*f6dc9357SAndroid Build Coastguard Worker _coders[inCoderIndex].InStreams[inCoderStreamIndex],
1023*f6dc9357SAndroid Build Coastguard Worker _coders[outCoderIndex].OutStreams[outCoderStreamIndex]);
1024*f6dc9357SAndroid Build Coastguard Worker
1025*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressSetBufSize> inSetSize, outSetSize;
1026*f6dc9357SAndroid Build Coastguard Worker _coders[inCoderIndex].QueryInterface(IID_ICompressSetBufSize, (void **)&inSetSize);
1027*f6dc9357SAndroid Build Coastguard Worker _coders[outCoderIndex].QueryInterface(IID_ICompressSetBufSize, (void **)&outSetSize);
1028*f6dc9357SAndroid Build Coastguard Worker if (inSetSize && outSetSize)
1029*f6dc9357SAndroid Build Coastguard Worker {
1030*f6dc9357SAndroid Build Coastguard Worker const UInt32 kBufSize = 1 << 19;
1031*f6dc9357SAndroid Build Coastguard Worker inSetSize->SetInBufSize(inCoderStreamIndex, kBufSize);
1032*f6dc9357SAndroid Build Coastguard Worker outSetSize->SetOutBufSize(outCoderStreamIndex, kBufSize);
1033*f6dc9357SAndroid Build Coastguard Worker }
1034*f6dc9357SAndroid Build Coastguard Worker }
1035*f6dc9357SAndroid Build Coastguard Worker
1036*f6dc9357SAndroid Build Coastguard Worker {
1037*f6dc9357SAndroid Build Coastguard Worker CCoderMT &cod = _coders[_bi.UnpackCoder];
1038*f6dc9357SAndroid Build Coastguard Worker if (EncodeMode)
1039*f6dc9357SAndroid Build Coastguard Worker cod.InStreams[0] = inStreams[0];
1040*f6dc9357SAndroid Build Coastguard Worker else
1041*f6dc9357SAndroid Build Coastguard Worker cod.OutStreams[0] = outStreams[0];
1042*f6dc9357SAndroid Build Coastguard Worker }
1043*f6dc9357SAndroid Build Coastguard Worker
1044*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _bi.PackStreams.Size(); i++)
1045*f6dc9357SAndroid Build Coastguard Worker {
1046*f6dc9357SAndroid Build Coastguard Worker UInt32 coderIndex, coderStreamIndex;
1047*f6dc9357SAndroid Build Coastguard Worker _bi.GetCoder_for_Stream(_bi.PackStreams[i], coderIndex, coderStreamIndex);
1048*f6dc9357SAndroid Build Coastguard Worker CCoderMT &cod = _coders[coderIndex];
1049*f6dc9357SAndroid Build Coastguard Worker if (EncodeMode)
1050*f6dc9357SAndroid Build Coastguard Worker cod.OutStreams[coderStreamIndex] = outStreams[i];
1051*f6dc9357SAndroid Build Coastguard Worker else
1052*f6dc9357SAndroid Build Coastguard Worker cod.InStreams[coderStreamIndex] = inStreams[i];
1053*f6dc9357SAndroid Build Coastguard Worker }
1054*f6dc9357SAndroid Build Coastguard Worker
1055*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1056*f6dc9357SAndroid Build Coastguard Worker }
1057*f6dc9357SAndroid Build Coastguard Worker
ReturnIfError(HRESULT code)1058*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerMT::ReturnIfError(HRESULT code)
1059*f6dc9357SAndroid Build Coastguard Worker {
1060*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, _coders)
1061*f6dc9357SAndroid Build Coastguard Worker if (_coders[i].Result == code)
1062*f6dc9357SAndroid Build Coastguard Worker return code;
1063*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1064*f6dc9357SAndroid Build Coastguard Worker }
1065*f6dc9357SAndroid Build Coastguard Worker
Code(ISequentialInStream * const * inStreams,ISequentialOutStream * const * outStreams,ICompressProgressInfo * progress,bool & dataAfterEnd_Error)1066*f6dc9357SAndroid Build Coastguard Worker HRESULT CMixerMT::Code(
1067*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams,
1068*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream * const *outStreams,
1069*f6dc9357SAndroid Build Coastguard Worker ICompressProgressInfo *progress,
1070*f6dc9357SAndroid Build Coastguard Worker bool &dataAfterEnd_Error)
1071*f6dc9357SAndroid Build Coastguard Worker {
1072*f6dc9357SAndroid Build Coastguard Worker // InternalPackSizeError = false;
1073*f6dc9357SAndroid Build Coastguard Worker dataAfterEnd_Error = false;
1074*f6dc9357SAndroid Build Coastguard Worker
1075*f6dc9357SAndroid Build Coastguard Worker Init(inStreams, outStreams);
1076*f6dc9357SAndroid Build Coastguard Worker
1077*f6dc9357SAndroid Build Coastguard Worker unsigned i;
1078*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
1079*f6dc9357SAndroid Build Coastguard Worker if (i != MainCoderIndex)
1080*f6dc9357SAndroid Build Coastguard Worker {
1081*f6dc9357SAndroid Build Coastguard Worker const WRes wres = _coders[i].Create();
1082*f6dc9357SAndroid Build Coastguard Worker if (wres != 0)
1083*f6dc9357SAndroid Build Coastguard Worker return HRESULT_FROM_WIN32(wres);
1084*f6dc9357SAndroid Build Coastguard Worker }
1085*f6dc9357SAndroid Build Coastguard Worker
1086*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
1087*f6dc9357SAndroid Build Coastguard Worker if (i != MainCoderIndex)
1088*f6dc9357SAndroid Build Coastguard Worker {
1089*f6dc9357SAndroid Build Coastguard Worker const WRes wres = _coders[i].Start();
1090*f6dc9357SAndroid Build Coastguard Worker if (wres != 0)
1091*f6dc9357SAndroid Build Coastguard Worker return HRESULT_FROM_WIN32(wres);
1092*f6dc9357SAndroid Build Coastguard Worker }
1093*f6dc9357SAndroid Build Coastguard Worker
1094*f6dc9357SAndroid Build Coastguard Worker _coders[MainCoderIndex].Code(progress);
1095*f6dc9357SAndroid Build Coastguard Worker
1096*f6dc9357SAndroid Build Coastguard Worker WRes wres = 0;
1097*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
1098*f6dc9357SAndroid Build Coastguard Worker if (i != MainCoderIndex)
1099*f6dc9357SAndroid Build Coastguard Worker {
1100*f6dc9357SAndroid Build Coastguard Worker WRes wres2 = _coders[i].WaitExecuteFinish();
1101*f6dc9357SAndroid Build Coastguard Worker if (wres == 0)
1102*f6dc9357SAndroid Build Coastguard Worker wres = wres2;
1103*f6dc9357SAndroid Build Coastguard Worker }
1104*f6dc9357SAndroid Build Coastguard Worker if (wres != 0)
1105*f6dc9357SAndroid Build Coastguard Worker return HRESULT_FROM_WIN32(wres);
1106*f6dc9357SAndroid Build Coastguard Worker
1107*f6dc9357SAndroid Build Coastguard Worker RINOK(ReturnIfError(E_ABORT))
1108*f6dc9357SAndroid Build Coastguard Worker RINOK(ReturnIfError(E_OUTOFMEMORY))
1109*f6dc9357SAndroid Build Coastguard Worker
1110*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
1111*f6dc9357SAndroid Build Coastguard Worker {
1112*f6dc9357SAndroid Build Coastguard Worker HRESULT result = _coders[i].Result;
1113*f6dc9357SAndroid Build Coastguard Worker if (result != S_OK
1114*f6dc9357SAndroid Build Coastguard Worker && result != k_My_HRESULT_WritingWasCut
1115*f6dc9357SAndroid Build Coastguard Worker && result != S_FALSE
1116*f6dc9357SAndroid Build Coastguard Worker && result != E_FAIL)
1117*f6dc9357SAndroid Build Coastguard Worker return result;
1118*f6dc9357SAndroid Build Coastguard Worker }
1119*f6dc9357SAndroid Build Coastguard Worker
1120*f6dc9357SAndroid Build Coastguard Worker RINOK(ReturnIfError(S_FALSE))
1121*f6dc9357SAndroid Build Coastguard Worker
1122*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
1123*f6dc9357SAndroid Build Coastguard Worker {
1124*f6dc9357SAndroid Build Coastguard Worker HRESULT result = _coders[i].Result;
1125*f6dc9357SAndroid Build Coastguard Worker if (result != S_OK && result != k_My_HRESULT_WritingWasCut)
1126*f6dc9357SAndroid Build Coastguard Worker return result;
1127*f6dc9357SAndroid Build Coastguard Worker }
1128*f6dc9357SAndroid Build Coastguard Worker
1129*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < _coders.Size(); i++)
1130*f6dc9357SAndroid Build Coastguard Worker {
1131*f6dc9357SAndroid Build Coastguard Worker RINOK(_coders[i].CheckDataAfterEnd(dataAfterEnd_Error /* , InternalPackSizeError */))
1132*f6dc9357SAndroid Build Coastguard Worker }
1133*f6dc9357SAndroid Build Coastguard Worker
1134*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1135*f6dc9357SAndroid Build Coastguard Worker }
1136*f6dc9357SAndroid Build Coastguard Worker
GetBondStreamSize(unsigned bondIndex) const1137*f6dc9357SAndroid Build Coastguard Worker UInt64 CMixerMT::GetBondStreamSize(unsigned bondIndex) const
1138*f6dc9357SAndroid Build Coastguard Worker {
1139*f6dc9357SAndroid Build Coastguard Worker return _streamBinders[bondIndex].ProcessedSize;
1140*f6dc9357SAndroid Build Coastguard Worker }
1141*f6dc9357SAndroid Build Coastguard Worker
1142*f6dc9357SAndroid Build Coastguard Worker #endif
1143*f6dc9357SAndroid Build Coastguard Worker
1144*f6dc9357SAndroid Build Coastguard Worker }
1145