1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// CoderMixer2MT.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "CoderMixer2MT.h"
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
7baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NCoderMixer {
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
9baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCCoder2::CCoder2(UInt32 numInStreams, UInt32 numOutStreams):
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CCoderInfo2(numInStreams, numOutStreams)
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InStreams.Reserve(NumInStreams);
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InStreamPointers.Reserve(NumInStreams);
14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  OutStreams.Reserve(NumOutStreams);
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  OutStreamPointers.Reserve(NumOutStreams);
16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
18baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CCoder2::Execute() { Code(NULL); }
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
20baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CCoder2::Code(ICompressProgressInfo *progress)
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InStreamPointers.Clear();
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  OutStreamPointers.Clear();
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt32 i;
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < NumInStreams; i++)
26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (InSizePointers[i] != NULL)
28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      InSizePointers[i] = &InSizes[i];
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    InStreamPointers.Add((ISequentialInStream *)InStreams[i]);
30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < NumOutStreams; i++)
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (OutSizePointers[i] != NULL)
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      OutSizePointers[i] = &OutSizes[i];
35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    OutStreamPointers.Add((ISequentialOutStream *)OutStreams[i]);
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (Coder)
38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    Result = Coder->Code(InStreamPointers[0], OutStreamPointers[0],
39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        InSizePointers[0], OutSizePointers[0], progress);
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  else
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    Result = Coder2->Code(&InStreamPointers.Front(), &InSizePointers.Front(), NumInStreams,
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      &OutStreamPointers.Front(), &OutSizePointers.Front(), NumOutStreams, progress);
43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    int i;
45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    for (i = 0; i < InStreams.Size(); i++)
46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      InStreams[i].Release();
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    for (i = 0; i < OutStreams.Size(); i++)
48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      OutStreams[i].Release();
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
52baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes,
53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems)
54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  sizes.Clear();
56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  sizePointers.Clear();
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (UInt32 i = 0; i < numItems; i++)
58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (srcSizes == 0 || srcSizes[i] == NULL)
60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      sizes.Add(0);
62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      sizePointers.Add(NULL);
63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    else
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      sizes.Add(*srcSizes[i]);
67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      sizePointers.Add(&sizes.Back());
68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
73baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CCoder2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes)
74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  SetSizes(inSizes, InSizes, InSizePointers, NumInStreams);
76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams);
77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync//////////////////////////////////////
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// CCoderMixer2MT
81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
82baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CCoderMixer2MT::SetBindInfo(const CBindInfo &bindInfo)
83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _bindInfo = bindInfo;
85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _streamBinders.Clear();
86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (int i = 0; i < _bindInfo.BindPairs.Size(); i++)
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _streamBinders.Add(CStreamBinder());
89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(_streamBinders.Back().CreateEvents());
90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
94baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CCoderMixer2MT::AddCoderCommon()
95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  const CCoderStreamsInfo &c = _bindInfo.Coders[_coders.Size()];
97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CCoder2 threadCoderInfo(c.NumInStreams, c.NumOutStreams);
98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _coders.Add(threadCoderInfo);
99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
101baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CCoderMixer2MT::AddCoder(ICompressCoder *coder)
102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  AddCoderCommon();
104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _coders.Back().Coder = coder;
105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
106baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
107baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CCoderMixer2MT::AddCoder2(ICompressCoder2 *coder)
108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  AddCoderCommon();
110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _coders.Back().Coder2 = coder;
111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
114baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CCoderMixer2MT::ReInit()
115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (int i = 0; i < _streamBinders.Size(); i++)
117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _streamBinders[i].ReInit();
118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
121baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CCoderMixer2MT::Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams)
122baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
123baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  /*
124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_coders.Size() != _bindInfo.Coders.Size())
125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    throw 0;
126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  */
127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  int i;
128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _coders.Size(); i++)
129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
130baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CCoder2 &coderInfo = _coders[i];
131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const CCoderStreamsInfo &coderStreamsInfo = _bindInfo.Coders[i];
132baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    coderInfo.InStreams.Clear();
133baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 j;
134baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    for (j = 0; j < coderStreamsInfo.NumInStreams; j++)
135baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      coderInfo.InStreams.Add(NULL);
136baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    coderInfo.OutStreams.Clear();
137baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    for (j = 0; j < coderStreamsInfo.NumOutStreams; j++)
138baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      coderInfo.OutStreams.Add(NULL);
139baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
140baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
141baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _bindInfo.BindPairs.Size(); i++)
142baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
143baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const CBindPair &bindPair = _bindInfo.BindPairs[i];
144baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 inCoderIndex, inCoderStreamIndex;
145baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 outCoderIndex, outCoderStreamIndex;
146baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bindInfo.FindInStream(bindPair.InIndex, inCoderIndex, inCoderStreamIndex);
147baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bindInfo.FindOutStream(bindPair.OutIndex, outCoderIndex, outCoderStreamIndex);
148baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
149baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _streamBinders[i].CreateStreams(
150baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        &_coders[inCoderIndex].InStreams[inCoderStreamIndex],
151baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        &_coders[outCoderIndex].OutStreams[outCoderStreamIndex]);
152baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
153baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CMyComPtr<ICompressSetBufSize> inSetSize, outSetSize;
154baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _coders[inCoderIndex].QueryInterface(IID_ICompressSetBufSize, (void **)&inSetSize);
155baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _coders[outCoderIndex].QueryInterface(IID_ICompressSetBufSize, (void **)&outSetSize);
156baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (inSetSize && outSetSize)
157baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
158baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      const UInt32 kBufSize = 1 << 19;
159baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      inSetSize->SetInBufSize(inCoderStreamIndex, kBufSize);
160baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      outSetSize->SetOutBufSize(outCoderStreamIndex, kBufSize);
161baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
162baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
163baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _bindInfo.InStreams.Size(); i++)
165baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 inCoderIndex, inCoderStreamIndex;
167baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bindInfo.FindInStream(_bindInfo.InStreams[i], inCoderIndex, inCoderStreamIndex);
168baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _coders[inCoderIndex].InStreams[inCoderStreamIndex] = inStreams[i];
169baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
170baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
171baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _bindInfo.OutStreams.Size(); i++)
172baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
173baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 outCoderIndex, outCoderStreamIndex;
174baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bindInfo.FindOutStream(_bindInfo.OutStreams[i], outCoderIndex, outCoderStreamIndex);
175baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _coders[outCoderIndex].OutStreams[outCoderStreamIndex] = outStreams[i];
176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
178baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
179baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
180baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CCoderMixer2MT::ReturnIfError(HRESULT code)
181baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
182baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (int i = 0; i < _coders.Size(); i++)
183baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (_coders[i].Result == code)
184baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return code;
185baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
186baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
187baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
188baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CCoderMixer2MT::Code(ISequentialInStream **inStreams,
189baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      const UInt64 ** /* inSizes */,
190baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      UInt32 numInStreams,
191baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      ISequentialOutStream **outStreams,
192baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      const UInt64 ** /* outSizes */,
193baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      UInt32 numOutStreams,
194baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      ICompressProgressInfo *progress)
195baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
196baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (numInStreams != (UInt32)_bindInfo.InStreams.Size() ||
197baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      numOutStreams != (UInt32)_bindInfo.OutStreams.Size())
198baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return E_INVALIDARG;
199baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
200baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  Init(inStreams, outStreams);
201baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
202baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  int i;
203baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _coders.Size(); i++)
204baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (i != _progressCoderIndex)
205baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
206baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      RINOK(_coders[i].Create());
207baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
208baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
209baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _coders.Size(); i++)
210baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (i != _progressCoderIndex)
211baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _coders[i].Start();
212baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
213baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _coders[_progressCoderIndex].Code(progress);
214baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
215baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _coders.Size(); i++)
216baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (i != _progressCoderIndex)
217baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _coders[i].WaitFinish();
218baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
219baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(ReturnIfError(E_ABORT));
220baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(ReturnIfError(E_OUTOFMEMORY));
221baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
222baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _coders.Size(); i++)
223baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
224baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    HRESULT result = _coders[i].Result;
225baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (result != S_OK && result != E_FAIL && result != S_FALSE)
226baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return result;
227baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
228baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
229baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(ReturnIfError(S_FALSE));
230baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
231baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (i = 0; i < _coders.Size(); i++)
232baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
233baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    HRESULT result = _coders[i].Result;
234baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (result != S_OK)
235baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return result;
236baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
237baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
238baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
239baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
240baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
241