1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// FilterCoder.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../../C/Alloc.h"
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../Common/Defs.h"
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "FilterCoder.h"
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StreamUtils.h"
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
12baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic const UInt32 kBufferSize = 1 << 17;
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
14baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCFilterCoder::CFilterCoder()
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _buffer = (Byte *)::MidAlloc(kBufferSize);
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_buffer == 0)
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    throw 1;
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
21baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCFilterCoder::~CFilterCoder()
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  ::MidFree(_buffer);
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
26baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CFilterCoder::WriteWithLimit(ISequentialOutStream *outStream, UInt32 size)
27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_outSizeIsDefined)
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt64 remSize = _outSize - _nowPos64;
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (size > remSize)
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      size = (UInt32)remSize;
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(WriteStream(outStream, _buffer, size));
35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _nowPos64 += size;
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
39baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  RINOK(Init());
43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt32 bufferPos = 0;
44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _outSizeIsDefined = (outSize != 0);
45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_outSizeIsDefined)
46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _outSize = *outSize;
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  while (!_outSizeIsDefined || _nowPos64 < _outSize)
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    size_t processedSize = kBufferSize - bufferPos;
51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    // Change it: It can be optimized using ReadPart
53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(ReadStream(inStream, _buffer + bufferPos, &processedSize));
54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 endPos = bufferPos + (UInt32)processedSize;
56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    bufferPos = Filter->Filter(_buffer, endPos);
58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (bufferPos > endPos)
59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      for (; endPos < bufferPos; endPos++)
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        _buffer[endPos] = 0;
62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      bufferPos = Filter->Filter(_buffer, endPos);
63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (bufferPos == 0)
66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (endPos == 0)
68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        return S_OK;
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return WriteWithLimit(outStream, endPos);
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(WriteWithLimit(outStream, bufferPos));
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (progress != NULL)
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      RINOK(progress->SetRatioInfo(&_nowPos64, &_nowPos64));
75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 i = 0;
77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    while (bufferPos < endPos)
78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _buffer[i++] = _buffer[bufferPos++];
79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    bufferPos = i;
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
84baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::SetOutStream(ISequentialOutStream *outStream)
85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _bufferPos = 0;
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _outStream = outStream;
88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return Init();
89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
91baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::ReleaseOutStream()
92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _outStream.Release();
94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
98baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::Write(const void *data, UInt32 size, UInt32 *processedSize)
99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (processedSize != NULL)
101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    *processedSize = 0;
102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  while (size > 0)
103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 sizeTemp = MyMin(size, kBufferSize - _bufferPos);
105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    memcpy(_buffer + _bufferPos, data, sizeTemp);
106baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    size -= sizeTemp;
107baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (processedSize != NULL)
108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      *processedSize += sizeTemp;
109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    data = (const Byte *)data + sizeTemp;
110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 endPos = _bufferPos + sizeTemp;
111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bufferPos = Filter->Filter(_buffer, endPos);
112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (_bufferPos == 0)
113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _bufferPos = endPos;
115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      break;
116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (_bufferPos > endPos)
118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (size != 0)
120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        return E_FAIL;
121baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      break;
122baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
123baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(WriteWithLimit(_outStream, _bufferPos));
124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 i = 0;
125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    while (_bufferPos < endPos)
126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _buffer[i++] = _buffer[_bufferPos++];
127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bufferPos = i;
128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
130baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
132baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::Flush()
133baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
134baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (_bufferPos != 0)
135baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
136baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    // _buffer contains only data refused by previous Filter->Filter call.
137baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 endPos = Filter->Filter(_buffer, _bufferPos);
138baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (endPos > _bufferPos)
139baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
140baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      for (; _bufferPos < endPos; _bufferPos++)
141baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        _buffer[_bufferPos] = 0;
142baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (Filter->Filter(_buffer, endPos) != endPos)
143baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        return E_FAIL;
144baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
145baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(WriteWithLimit(_outStream, _bufferPos));
146baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bufferPos = 0;
147baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
148baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<IOutStreamFlush> flush;
149baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _outStream.QueryInterface(IID_IOutStreamFlush, &flush);
150baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (flush)
151baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return flush->Flush();
152baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
153baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
154baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
155baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
156baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::SetInStream(ISequentialInStream *inStream)
157baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
158baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _convertedPosBegin = _convertedPosEnd = _bufferPos = 0;
159baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _inStream = inStream;
160baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return Init();
161baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
162baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
163baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::ReleaseInStream()
164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
165baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _inStream.Release();
166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
167baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
168baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
169baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::Read(void *data, UInt32 size, UInt32 *processedSize)
170baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
171baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (processedSize != NULL)
172baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    *processedSize = 0;
173baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  while (size > 0)
174baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
175baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (_convertedPosBegin != _convertedPosEnd)
176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      UInt32 sizeTemp = MyMin(size, _convertedPosEnd - _convertedPosBegin);
178baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      memcpy(data, _buffer + _convertedPosBegin, sizeTemp);
179baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _convertedPosBegin += sizeTemp;
180baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      data = (void *)((Byte *)data + sizeTemp);
181baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      size -= sizeTemp;
182baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (processedSize != NULL)
183baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        *processedSize += sizeTemp;
184baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      break;
185baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
186baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 i;
187baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    for (i = 0; _convertedPosEnd + i < _bufferPos; i++)
188baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _buffer[i] = _buffer[_convertedPosEnd + i];
189baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bufferPos = i;
190baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _convertedPosBegin = _convertedPosEnd = 0;
191baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    size_t processedSizeTemp = kBufferSize - _bufferPos;
192baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    RINOK(ReadStream(_inStream, _buffer + _bufferPos, &processedSizeTemp));
193baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _bufferPos += (UInt32)processedSizeTemp;
194baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _convertedPosEnd = Filter->Filter(_buffer, _bufferPos);
195baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (_convertedPosEnd == 0)
196baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
197baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (_bufferPos == 0)
198baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
199baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _convertedPosEnd = _bufferPos; // check it
200baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      continue;
201baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
202baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (_convertedPosEnd > _bufferPos)
203baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
204baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      for (; _bufferPos < _convertedPosEnd; _bufferPos++)
205baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        _buffer[_bufferPos] = 0;
206baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      _convertedPosEnd = Filter->Filter(_buffer, _bufferPos);
207baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
208baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
209baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
210baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
211baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
212baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef _NO_CRYPTO
213baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::CryptoSetPassword(const Byte *data, UInt32 size)
214baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
215baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return _setPassword->CryptoSetPassword(data, size);
216baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
217baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
218baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
219baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef EXTRACT_ONLY
220baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::SetCoderProperties(const PROPID *propIDs,
221baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      const PROPVARIANT *properties, UInt32 numProperties)
222baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
223baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return _SetCoderProperties->SetCoderProperties(propIDs, properties, numProperties);
224baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
225baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
226baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::WriteCoderProperties(ISequentialOutStream *outStream)
227baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
228baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return _writeCoderProperties->WriteCoderProperties(outStream);
229baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
230baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
231baa3858d3f5d128a5c8466b700098109edcad5f2repo sync/*
232baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::ResetSalt()
233baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
234baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return _CryptoResetSalt->ResetSalt();
235baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
236baa3858d3f5d128a5c8466b700098109edcad5f2repo sync*/
237baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
238baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::ResetInitVector()
239baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
240baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return _CryptoResetInitVector->ResetInitVector();
241baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
242baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
243baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
244baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::SetDecoderProperties2(const Byte *data, UInt32 size)
245baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
246baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return _setDecoderProperties->SetDecoderProperties2(data, size);
247baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
248